]> Untitled Git - lemmy.git/blob - api_tests/src/post.spec.ts
Trying to fix post test again.
[lemmy.git] / api_tests / src / post.spec.ts
1 jest.setTimeout(120000);
2 import {
3   alpha,
4   beta,
5   gamma,
6   delta,
7   epsilon,
8   setupLogins,
9   createPost,
10   updatePost,
11   stickyPost,
12   lockPost,
13   searchPost,
14   likePost,
15   followBeta,
16   searchForBetaCommunity,
17   createComment,
18   deletePost,
19   removePost,
20   getPost,
21   unfollowRemotes,
22   delay,
23   longDelay,
24   searchForUser,
25   banUserFromSite,
26   searchPostLocal,
27   banUserFromCommunity,
28 } from './shared';
29 import {
30   Post,
31 } from 'lemmy-js-client';
32
33 beforeAll(async () => {
34   await setupLogins();
35   await followBeta(alpha);
36   await followBeta(gamma);
37   await followBeta(delta);
38   await followBeta(epsilon);
39   await longDelay();
40 });
41
42 afterAll(async () => {
43   await unfollowRemotes(alpha);
44   await unfollowRemotes(gamma);
45   await unfollowRemotes(delta);
46   await unfollowRemotes(epsilon);
47 });
48
49 function assertPostFederation(
50   postOne: Post,
51   postTwo: Post) {
52   expect(postOne.ap_id).toBe(postTwo.ap_id);
53   expect(postOne.name).toBe(postTwo.name);
54   expect(postOne.body).toBe(postTwo.body);
55   expect(postOne.url).toBe(postTwo.url);
56   expect(postOne.nsfw).toBe(postTwo.nsfw);
57   expect(postOne.embed_title).toBe(postTwo.embed_title);
58   expect(postOne.embed_description).toBe(postTwo.embed_description);
59   expect(postOne.embed_html).toBe(postTwo.embed_html);
60   expect(postOne.published).toBe(postTwo.published);
61   expect(postOne.community_actor_id).toBe(postTwo.community_actor_id);
62   expect(postOne.locked).toBe(postTwo.locked);
63   expect(postOne.removed).toBe(postTwo.removed);
64   expect(postOne.deleted).toBe(postTwo.deleted);
65 }
66
67 test('Create a post', async () => {
68   let search = await searchForBetaCommunity(alpha);
69   await delay();
70   let postRes = await createPost(alpha, search.communities[0].id);
71   expect(postRes.post).toBeDefined();
72   expect(postRes.post.community_local).toBe(false);
73   expect(postRes.post.creator_local).toBe(true);
74   expect(postRes.post.score).toBe(1);
75   await delay();
76
77   // Make sure that post is liked on beta
78   let searchBeta = await searchPost(beta, postRes.post);
79   let betaPost = searchBeta.posts[0];
80
81   expect(betaPost).toBeDefined();
82   expect(betaPost.community_local).toBe(true);
83   expect(betaPost.creator_local).toBe(false);
84   expect(betaPost.score).toBe(1);
85   assertPostFederation(betaPost, postRes.post);
86
87   // Delta only follows beta, so it should not see an alpha ap_id
88   let searchDelta = await searchPost(delta, postRes.post);
89   expect(searchDelta.posts[0]).toBeUndefined();
90
91   // Epsilon has alpha blocked, it should not see the alpha post
92   let searchEpsilon = await searchPost(epsilon, postRes.post);
93   expect(searchEpsilon.posts[0]).toBeUndefined();
94 });
95
96 test('Create a post in a non-existent community', async () => {
97   let postRes = await createPost(alpha, -2);
98   expect(postRes).toStrictEqual({ error: 'couldnt_create_post' });
99 });
100
101 test('Unlike a post', async () => {
102   let search = await searchForBetaCommunity(alpha);
103   await delay();
104   let postRes = await createPost(alpha, search.communities[0].id);
105   let unlike = await likePost(alpha, 0, postRes.post);
106   expect(unlike.post.score).toBe(0);
107
108   // Try to unlike it again, make sure it stays at 0
109   let unlike2 = await likePost(alpha, 0, postRes.post);
110   expect(unlike2.post.score).toBe(0);
111
112   // Make sure that post is unliked on beta
113   let searchBeta = await searchPost(beta, postRes.post);
114   let betaPost = searchBeta.posts[0];
115   expect(betaPost).toBeDefined();
116   expect(betaPost.community_local).toBe(true);
117   expect(betaPost.creator_local).toBe(false);
118   expect(betaPost.score).toBe(0);
119   assertPostFederation(betaPost, postRes.post);
120 });
121
122 test('Update a post', async () => {
123   let search = await searchForBetaCommunity(alpha);
124   let postRes = await createPost(alpha, search.communities[0].id);
125   await delay();
126
127   let updatedName = 'A jest test federated post, updated';
128   let updatedPost = await updatePost(alpha, postRes.post);
129   expect(updatedPost.post.name).toBe(updatedName);
130   expect(updatedPost.post.community_local).toBe(false);
131   expect(updatedPost.post.creator_local).toBe(true);
132   await delay();
133
134   // Make sure that post is updated on beta
135   let searchBeta = await searchPost(beta, postRes.post);
136   let betaPost = searchBeta.posts[0];
137   expect(betaPost.community_local).toBe(true);
138   expect(betaPost.creator_local).toBe(false);
139   expect(betaPost.name).toBe(updatedName);
140   assertPostFederation(betaPost, updatedPost.post);
141   await delay();
142
143   // Make sure lemmy beta cannot update the post
144   let updatedPostBeta = await updatePost(beta, betaPost);
145   expect(updatedPostBeta).toStrictEqual({ error: 'no_post_edit_allowed' });
146 });
147
148 test('Sticky a post', async () => {
149   let search = await searchForBetaCommunity(alpha);
150   let postRes = await createPost(alpha, search.communities[0].id);
151
152   let stickiedPostRes = await stickyPost(alpha, true, postRes.post);
153   expect(stickiedPostRes.post.stickied).toBe(true);
154
155   // Make sure that post is stickied on beta
156   let searchBeta = await searchPost(beta, postRes.post);
157   let betaPost = searchBeta.posts[0];
158   expect(betaPost.community_local).toBe(true);
159   expect(betaPost.creator_local).toBe(false);
160   expect(betaPost.stickied).toBe(true);
161
162   // Unsticky a post
163   let unstickiedPost = await stickyPost(alpha, false, postRes.post);
164   expect(unstickiedPost.post.stickied).toBe(false);
165   await delay();
166
167   // Make sure that post is unstickied on beta
168   let searchBeta2 = await searchPost(beta, postRes.post);
169   let betaPost2 = searchBeta2.posts[0];
170   expect(betaPost2.community_local).toBe(true);
171   expect(betaPost2.creator_local).toBe(false);
172   expect(betaPost2.stickied).toBe(false);
173
174   // Make sure that gamma cannot sticky the post on beta
175   let searchGamma = await searchPost(gamma, postRes.post);
176   let gammaPost = searchGamma.posts[0];
177   await delay();
178   let gammaTrySticky = await stickyPost(gamma, true, gammaPost);
179   await delay();
180   let searchBeta3 = await searchPost(beta, postRes.post);
181   let betaPost3 = searchBeta3.posts[0];
182   expect(gammaTrySticky.post.stickied).toBe(true);
183   expect(betaPost3.stickied).toBe(false);
184 });
185
186 test('Lock a post', async () => {
187   let search = await searchForBetaCommunity(alpha);
188   let postRes = await createPost(alpha, search.communities[0].id);
189   await delay();
190
191   // Lock the post
192   let lockedPostRes = await lockPost(alpha, true, postRes.post);
193   expect(lockedPostRes.post.locked).toBe(true);
194   await delay();
195
196   // Make sure that post is locked on beta
197   let searchBeta = await searchPostLocal(beta, postRes.post);
198   let betaPost1 = searchBeta.posts[0];
199   expect(betaPost1.locked).toBe(true);
200   await delay();
201
202   // Try to make a new comment there, on alpha
203   let comment = await createComment(alpha, postRes.post.id);
204   expect(comment['error']).toBe('locked');
205   await delay();
206
207   // Unlock a post
208   let unlockedPost = await lockPost(alpha, false, postRes.post);
209   expect(unlockedPost.post.locked).toBe(false);
210   await delay();
211
212   // Make sure that post is unlocked on beta
213   let searchBeta2 = await searchPost(beta, postRes.post);
214   let betaPost2 = searchBeta2.posts[0];
215   expect(betaPost2.community_local).toBe(true);
216   expect(betaPost2.creator_local).toBe(false);
217   expect(betaPost2.locked).toBe(false);
218   await delay();
219
220   // Try to create a new comment, on beta
221   let commentBeta = await createComment(beta, betaPost2.id);
222   expect(commentBeta).toBeDefined();
223 });
224
225 test('Delete a post', async () => {
226   let search = await searchForBetaCommunity(alpha);
227   await delay();
228   let postRes = await createPost(alpha, search.communities[0].id);
229
230   let deletedPost = await deletePost(alpha, true, postRes.post);
231   expect(deletedPost.post.deleted).toBe(true);
232
233   // Make sure lemmy beta sees post is deleted
234   let searchBeta = await searchPost(beta, postRes.post);
235   let betaPost = searchBeta.posts[0];
236   // This will be undefined because of the tombstone
237   expect(betaPost).toBeUndefined();
238
239   // Undelete
240   let undeletedPost = await deletePost(alpha, false, postRes.post);
241   expect(undeletedPost.post.deleted).toBe(false);
242
243   // Make sure lemmy beta sees post is undeleted
244   let searchBeta2 = await searchPost(beta, postRes.post);
245   let betaPost2 = searchBeta2.posts[0];
246   expect(betaPost2.deleted).toBe(false);
247   assertPostFederation(betaPost2, undeletedPost.post);
248
249   // Make sure lemmy beta cannot delete the post
250   let deletedPostBeta = await deletePost(beta, true, betaPost2);
251   expect(deletedPostBeta).toStrictEqual({ error: 'no_post_edit_allowed' });
252 });
253
254 test('Remove a post from admin and community on different instance', async () => {
255   let search = await searchForBetaCommunity(alpha);
256   await delay();
257   let postRes = await createPost(alpha, search.communities[0].id);
258   await delay();
259
260   let removedPost = await removePost(alpha, true, postRes.post);
261   expect(removedPost.post.removed).toBe(true);
262   await delay();
263
264   // Make sure lemmy beta sees post is NOT removed
265   let searchBeta = await searchPost(beta, postRes.post);
266   let betaPost = searchBeta.posts[0];
267   expect(betaPost.removed).toBe(false);
268   await delay();
269
270   // Undelete
271   let undeletedPost = await removePost(alpha, false, postRes.post);
272   expect(undeletedPost.post.removed).toBe(false);
273   await delay();
274
275   // Make sure lemmy beta sees post is undeleted
276   let searchBeta2 = await searchPost(beta, postRes.post);
277   let betaPost2 = searchBeta2.posts[0];
278   expect(betaPost2.removed).toBe(false);
279   assertPostFederation(betaPost2, undeletedPost.post);
280 });
281
282 test('Remove a post from admin and community on same instance', async () => {
283   let search = await searchForBetaCommunity(alpha);
284   let postRes = await createPost(alpha, search.communities[0].id);
285   await delay();
286
287   // Get the id for beta
288   let searchBeta = await searchPost(beta, postRes.post);
289   let betaPost = searchBeta.posts[0];
290   await delay();
291
292   // The beta admin removes it (the community lives on beta)
293   let removePostRes = await removePost(beta, true, betaPost);
294   expect(removePostRes.post.removed).toBe(true);
295   await delay();
296
297   // Make sure lemmy alpha sees post is removed
298   let alphaPost = await getPost(alpha, postRes.post.id);
299   expect(alphaPost.post.removed).toBe(true);
300   assertPostFederation(alphaPost.post, removePostRes.post);
301   await delay();
302
303   // Undelete
304   let undeletedPost = await removePost(beta, false, betaPost);
305   expect(undeletedPost.post.removed).toBe(false);
306   await delay();
307
308   // Make sure lemmy alpha sees post is undeleted
309   let alphaPost2 = await getPost(alpha, postRes.post.id);
310   expect(alphaPost2.post.removed).toBe(false);
311   assertPostFederation(alphaPost2.post, undeletedPost.post);
312 });
313
314 test('Search for a post', async () => {
315   let search = await searchForBetaCommunity(alpha);
316   await delay();
317   let postRes = await createPost(alpha, search.communities[0].id);
318   await delay();
319   let searchBeta = await searchPost(beta, postRes.post);
320
321   expect(searchBeta.posts[0].name).toBeDefined();
322 });
323
324 test('A and G subscribe to B (center) A posts, it gets announced to G', async () => {
325   let search = await searchForBetaCommunity(alpha);
326   let postRes = await createPost(alpha, search.communities[0].id);
327   await delay();
328
329   let search2 = await searchPost(gamma, postRes.post);
330   expect(search2.posts[0].name).toBeDefined();
331 });
332
333 test('Enforce site ban for federated user', async () => {
334
335   let alphaShortname = `@lemmy_alpha@lemmy-alpha:8541`;
336   let userSearch = await searchForUser(beta, alphaShortname);
337   let alphaUser = userSearch.users[0];
338   expect(alphaUser).toBeDefined();
339   await delay();
340
341   // ban alpha from beta site
342   let banAlpha = await banUserFromSite(beta, alphaUser.id, true);
343   expect(banAlpha.banned).toBe(true);
344   await delay();
345
346   // Alpha makes post on beta
347   let search = await searchForBetaCommunity(alpha);
348   await delay();
349   let postRes = await createPost(alpha, search.communities[0].id);
350   expect(postRes.post).toBeDefined();
351   expect(postRes.post.community_local).toBe(false);
352   expect(postRes.post.creator_local).toBe(true);
353   expect(postRes.post.score).toBe(1);
354   await delay();
355
356   // Make sure that post doesn't make it to beta
357   let searchBeta = await searchPostLocal(beta, postRes.post);
358   let betaPost = searchBeta.posts[0];
359   expect(betaPost).toBeUndefined();
360   await delay();
361
362   // Unban alpha
363   let unBanAlpha = await banUserFromSite(beta, alphaUser.id, false);
364   expect(unBanAlpha.banned).toBe(false);
365 });
366
367 test('Enforce community ban for federated user', async () => {
368   let alphaShortname = `@lemmy_alpha@lemmy-alpha:8541`;
369   let userSearch = await searchForUser(beta, alphaShortname);
370   let alphaUser = userSearch.users[0];
371   expect(alphaUser).toBeDefined();
372   await delay();
373
374   // ban alpha from beta site
375   await banUserFromCommunity(beta, alphaUser.id, 2, false);
376   let banAlpha = await banUserFromCommunity(beta, alphaUser.id, 2, true);
377   expect(banAlpha.banned).toBe(true);
378   await delay();
379
380   // Alpha makes post on beta
381   let search = await searchForBetaCommunity(alpha);
382   await delay();
383   let postRes = await createPost(alpha, search.communities[0].id);
384   expect(postRes.post).toBeDefined();
385   expect(postRes.post.community_local).toBe(false);
386   expect(postRes.post.creator_local).toBe(true);
387   expect(postRes.post.score).toBe(1);
388   await delay();
389
390   // Make sure that post doesn't make it to beta community
391   let searchBeta = await searchPostLocal(beta, postRes.post);
392   let betaPost = searchBeta.posts[0];
393   expect(betaPost).toBeUndefined();
394
395   // Unban alpha
396   let unBanAlpha = await banUserFromCommunity(beta, alphaUser.id, 2, false);
397   expect(unBanAlpha.banned).toBe(false);
398 });