]> Untitled Git - lemmy.git/blob - api_tests/src/post.spec.ts
5845d7f88a963258a7627bb04959e1c5a9012a12
[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 longDelay();
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   let postRes = await createPost(alpha, search.communities[0].id);
104   await delay();
105   let unlike = await likePost(alpha, 0, postRes.post);
106   expect(unlike.post.score).toBe(0);
107   await longDelay();
108
109   // Try to unlike it again, make sure it stays at 0
110   let unlike2 = await likePost(alpha, 0, postRes.post);
111   expect(unlike2.post.score).toBe(0);
112   await longDelay();
113
114   // Make sure that post is unliked on beta
115   let searchBeta = await searchPost(beta, postRes.post);
116   let betaPost = searchBeta.posts[0];
117
118   expect(betaPost).toBeDefined();
119   expect(betaPost.community_local).toBe(true);
120   expect(betaPost.creator_local).toBe(false);
121   expect(betaPost.score).toBe(0);
122   assertPostFederation(betaPost, postRes.post);
123 });
124
125 test('Update a post', async () => {
126   let search = await searchForBetaCommunity(alpha);
127   let postRes = await createPost(alpha, search.communities[0].id);
128   await delay();
129
130   let updatedName = 'A jest test federated post, updated';
131   let updatedPost = await updatePost(alpha, postRes.post);
132   expect(updatedPost.post.name).toBe(updatedName);
133   expect(updatedPost.post.community_local).toBe(false);
134   expect(updatedPost.post.creator_local).toBe(true);
135   await delay();
136
137   // Make sure that post is updated on beta
138   let searchBeta = await searchPost(beta, postRes.post);
139   let betaPost = searchBeta.posts[0];
140   expect(betaPost.community_local).toBe(true);
141   expect(betaPost.creator_local).toBe(false);
142   expect(betaPost.name).toBe(updatedName);
143   assertPostFederation(betaPost, updatedPost.post);
144   await delay();
145
146   // Make sure lemmy beta cannot update the post
147   let updatedPostBeta = await updatePost(beta, betaPost);
148   expect(updatedPostBeta).toStrictEqual({ error: 'no_post_edit_allowed' });
149 });
150
151 test('Sticky a post', async () => {
152   let search = await searchForBetaCommunity(alpha);
153   let postRes = await createPost(alpha, search.communities[0].id);
154   await delay();
155
156   let stickiedPostRes = await stickyPost(alpha, true, postRes.post);
157   expect(stickiedPostRes.post.stickied).toBe(true);
158   await delay();
159
160   // Make sure that post is stickied on beta
161   let searchBeta = await searchPost(beta, postRes.post);
162   let betaPost = searchBeta.posts[0];
163   expect(betaPost.community_local).toBe(true);
164   expect(betaPost.creator_local).toBe(false);
165   expect(betaPost.stickied).toBe(true);
166   await delay();
167
168   // Unsticky a post
169   let unstickiedPost = await stickyPost(alpha, false, postRes.post);
170   expect(unstickiedPost.post.stickied).toBe(false);
171   await longDelay();
172
173   // Make sure that post is unstickied on beta
174   let searchBeta2 = await searchPost(beta, postRes.post);
175   let betaPost2 = searchBeta2.posts[0];
176   expect(betaPost2.community_local).toBe(true);
177   expect(betaPost2.creator_local).toBe(false);
178   expect(betaPost2.stickied).toBe(false);
179   await delay();
180
181   // Make sure that gamma cannot sticky the post on beta
182   let searchGamma = await searchPost(gamma, postRes.post);
183   let gammaPost = searchGamma.posts[0];
184   await delay();
185   let gammaTrySticky = await stickyPost(gamma, true, gammaPost);
186   await delay();
187   let searchBeta3 = await searchPost(beta, postRes.post);
188   let betaPost3 = searchBeta3.posts[0];
189   expect(gammaTrySticky.post.stickied).toBe(true);
190   expect(betaPost3.stickied).toBe(false);
191 });
192
193 test('Lock a post', async () => {
194   let search = await searchForBetaCommunity(alpha);
195   await delay();
196   let postRes = await createPost(alpha, search.communities[0].id);
197   await delay();
198
199   // Lock the post
200   let lockedPostRes = await lockPost(alpha, true, postRes.post);
201   expect(lockedPostRes.post.locked).toBe(true);
202   await longDelay();
203
204   // Make sure that post is locked on beta
205   let searchBeta = await searchPostLocal(beta, postRes.post);
206   let betaPost1 = searchBeta.posts[0];
207   expect(betaPost1.locked).toBe(true);
208   await longDelay();
209
210   // Try to make a new comment there, on alpha
211   let comment = await createComment(alpha, postRes.post.id);
212   expect(comment['error']).toBe('locked');
213   await delay();
214
215   // Unlock a post
216   let unlockedPost = await lockPost(alpha, false, postRes.post);
217   expect(unlockedPost.post.locked).toBe(false);
218   await longDelay();
219
220   // Make sure that post is unlocked on beta
221   let searchBeta2 = await searchPost(beta, postRes.post);
222   let betaPost2 = searchBeta2.posts[0];
223   expect(betaPost2.community_local).toBe(true);
224   expect(betaPost2.creator_local).toBe(false);
225   expect(betaPost2.locked).toBe(false);
226
227   // Try to create a new comment, on beta
228   let commentBeta = await createComment(beta, betaPost2.id);
229   expect(commentBeta).toBeDefined();
230 });
231
232 test('Delete a post', async () => {
233   let search = await searchForBetaCommunity(alpha);
234   let postRes = await createPost(alpha, search.communities[0].id);
235   await delay();
236
237   let deletedPost = await deletePost(alpha, true, postRes.post);
238   expect(deletedPost.post.deleted).toBe(true);
239   await delay();
240
241   // Make sure lemmy beta sees post is deleted
242   let searchBeta = await searchPost(beta, postRes.post);
243   let betaPost = searchBeta.posts[0];
244   // This will be undefined because of the tombstone
245   expect(betaPost).toBeUndefined();
246   await delay();
247
248   // Undelete
249   let undeletedPost = await deletePost(alpha, false, postRes.post);
250   expect(undeletedPost.post.deleted).toBe(false);
251   await delay();
252
253   // Make sure lemmy beta sees post is undeleted
254   let searchBeta2 = await searchPost(beta, postRes.post);
255   let betaPost2 = searchBeta2.posts[0];
256   expect(betaPost2.deleted).toBe(false);
257   assertPostFederation(betaPost2, undeletedPost.post);
258
259   // Make sure lemmy beta cannot delete the post
260   let deletedPostBeta = await deletePost(beta, true, betaPost2);
261   expect(deletedPostBeta).toStrictEqual({ error: 'no_post_edit_allowed' });
262 });
263
264 test('Remove a post from admin and community on different instance', async () => {
265   let search = await searchForBetaCommunity(alpha);
266   let postRes = await createPost(alpha, search.communities[0].id);
267   await delay();
268
269   let removedPost = await removePost(alpha, true, postRes.post);
270   expect(removedPost.post.removed).toBe(true);
271   await delay();
272
273   // Make sure lemmy beta sees post is NOT removed
274   let searchBeta = await searchPost(beta, postRes.post);
275   let betaPost = searchBeta.posts[0];
276   expect(betaPost.removed).toBe(false);
277   await delay();
278
279   // Undelete
280   let undeletedPost = await removePost(alpha, false, postRes.post);
281   expect(undeletedPost.post.removed).toBe(false);
282   await delay();
283
284   // Make sure lemmy beta sees post is undeleted
285   let searchBeta2 = await searchPost(beta, postRes.post);
286   let betaPost2 = searchBeta2.posts[0];
287   expect(betaPost2.removed).toBe(false);
288   assertPostFederation(betaPost2, undeletedPost.post);
289 });
290
291 test('Remove a post from admin and community on same instance', async () => {
292   let search = await searchForBetaCommunity(alpha);
293   await longDelay();
294   let postRes = await createPost(alpha, search.communities[0].id);
295   await longDelay();
296
297   // Get the id for beta
298   let searchBeta = await searchPost(beta, postRes.post);
299   await longDelay();
300   let betaPost = searchBeta.posts[0];
301   await longDelay();
302
303   // The beta admin removes it (the community lives on beta)
304   let removePostRes = await removePost(beta, true, betaPost);
305   expect(removePostRes.post.removed).toBe(true);
306   await longDelay();
307
308   // Make sure lemmy alpha sees post is removed
309   let alphaPost = await getPost(alpha, postRes.post.id);
310   expect(alphaPost.post.removed).toBe(true);
311   assertPostFederation(alphaPost.post, removePostRes.post);
312   await longDelay();
313
314   // Undelete
315   let undeletedPost = await removePost(beta, false, betaPost);
316   expect(undeletedPost.post.removed).toBe(false);
317   await longDelay();
318
319   // Make sure lemmy alpha sees post is undeleted
320   let alphaPost2 = await getPost(alpha, postRes.post.id);
321   await delay();
322   expect(alphaPost2.post.removed).toBe(false);
323   assertPostFederation(alphaPost2.post, undeletedPost.post);
324 });
325
326 test('Search for a post', async () => {
327   let search = await searchForBetaCommunity(alpha);
328   await delay();
329   let postRes = await createPost(alpha, search.communities[0].id);
330   await delay();
331   let searchBeta = await searchPost(beta, postRes.post);
332
333   expect(searchBeta.posts[0].name).toBeDefined();
334 });
335
336 test('A and G subscribe to B (center) A posts, it gets announced to G', async () => {
337   let search = await searchForBetaCommunity(alpha);
338   let postRes = await createPost(alpha, search.communities[0].id);
339   await delay();
340
341   let search2 = await searchPost(gamma, postRes.post);
342   expect(search2.posts[0].name).toBeDefined();
343 });
344
345 test('Enforce site ban for federated user', async () => {
346
347   let alphaShortname = `@lemmy_alpha@lemmy-alpha:8541`;
348   let userSearch = await searchForUser(beta, alphaShortname);
349   let alphaUser = userSearch.users[0];
350   expect(alphaUser).toBeDefined();
351   await delay();
352
353   // ban alpha from beta site
354   let banAlpha = await banUserFromSite(beta, alphaUser.id, true);
355   expect(banAlpha.banned).toBe(true);
356   await longDelay();
357
358   // Alpha makes post on beta
359   let search = await searchForBetaCommunity(alpha);
360   await delay();
361   let postRes = await createPost(alpha, search.communities[0].id);
362   expect(postRes.post).toBeDefined();
363   expect(postRes.post.community_local).toBe(false);
364   expect(postRes.post.creator_local).toBe(true);
365   expect(postRes.post.score).toBe(1);
366   await longDelay();
367
368   // Make sure that post doesn't make it to beta
369   let searchBeta = await searchPostLocal(beta, postRes.post);
370   let betaPost = searchBeta.posts[0];
371   expect(betaPost).toBeUndefined();
372   await delay();
373
374   // Unban alpha
375   let unBanAlpha = await banUserFromSite(beta, alphaUser.id, false);
376   expect(unBanAlpha.banned).toBe(false);
377 });
378
379 test('Enforce community ban for federated user', async () => {
380   let alphaShortname = `@lemmy_alpha@lemmy-alpha:8541`;
381   let userSearch = await searchForUser(beta, alphaShortname);
382   let alphaUser = userSearch.users[0];
383   expect(alphaUser).toBeDefined();
384   await delay();
385
386   // ban alpha from beta site
387   await banUserFromCommunity(beta, alphaUser.id, 2, false);
388   let banAlpha = await banUserFromCommunity(beta, alphaUser.id, 2, true);
389   expect(banAlpha.banned).toBe(true);
390   await longDelay();
391
392   // Alpha makes post on beta
393   let search = await searchForBetaCommunity(alpha);
394   await delay();
395   let postRes = await createPost(alpha, search.communities[0].id);
396   expect(postRes.post).toBeDefined();
397   expect(postRes.post.community_local).toBe(false);
398   expect(postRes.post.creator_local).toBe(true);
399   expect(postRes.post.score).toBe(1);
400   await longDelay();
401
402   // Make sure that post doesn't make it to beta community
403   let searchBeta = await searchPostLocal(beta, postRes.post);
404   let betaPost = searchBeta.posts[0];
405   expect(betaPost).toBeUndefined();
406
407   // Unban alpha
408   let unBanAlpha = await banUserFromCommunity(beta, alphaUser.id, 2, false);
409   expect(unBanAlpha.banned).toBe(false);
410 });