1 jest.setTimeout(120000);
16 searchForBetaCommunity,
31 } from 'lemmy-js-client';
33 beforeAll(async () => {
35 await followBeta(alpha);
36 await followBeta(gamma);
37 await followBeta(delta);
38 await followBeta(epsilon);
42 afterAll(async () => {
43 await unfollowRemotes(alpha);
44 await unfollowRemotes(gamma);
45 await unfollowRemotes(delta);
46 await unfollowRemotes(epsilon);
49 function assertPostFederation(
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);
67 test('Create a post', async () => {
68 let search = await searchForBetaCommunity(alpha);
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);
77 // Make sure that post is liked on beta
78 let searchBeta = await searchPost(beta, postRes.post);
79 let betaPost = searchBeta.posts[0];
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);
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();
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();
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' });
101 test('Unlike a post', async () => {
102 let search = await searchForBetaCommunity(alpha);
103 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);
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);
114 // Make sure that post is unliked on beta
115 let searchBeta = await searchPost(beta, postRes.post);
117 let betaPost = searchBeta.posts[0];
119 expect(betaPost).toBeDefined();
120 expect(betaPost.community_local).toBe(true);
121 expect(betaPost.creator_local).toBe(false);
122 expect(betaPost.score).toBe(0);
123 assertPostFederation(betaPost, postRes.post);
126 test('Update a post', async () => {
127 let search = await searchForBetaCommunity(alpha);
128 let postRes = await createPost(alpha, search.communities[0].id);
131 let updatedName = 'A jest test federated post, updated';
132 let updatedPost = await updatePost(alpha, postRes.post);
133 expect(updatedPost.post.name).toBe(updatedName);
134 expect(updatedPost.post.community_local).toBe(false);
135 expect(updatedPost.post.creator_local).toBe(true);
138 // Make sure that post is updated on beta
139 let searchBeta = await searchPost(beta, postRes.post);
140 let betaPost = searchBeta.posts[0];
141 expect(betaPost.community_local).toBe(true);
142 expect(betaPost.creator_local).toBe(false);
143 expect(betaPost.name).toBe(updatedName);
144 assertPostFederation(betaPost, updatedPost.post);
147 // Make sure lemmy beta cannot update the post
148 let updatedPostBeta = await updatePost(beta, betaPost);
149 expect(updatedPostBeta).toStrictEqual({ error: 'no_post_edit_allowed' });
152 test('Sticky a post', async () => {
153 let search = await searchForBetaCommunity(alpha);
154 let postRes = await createPost(alpha, search.communities[0].id);
157 let stickiedPostRes = await stickyPost(alpha, true, postRes.post);
158 expect(stickiedPostRes.post.stickied).toBe(true);
161 // Make sure that post is stickied on beta
162 let searchBeta = await searchPost(beta, postRes.post);
163 let betaPost = searchBeta.posts[0];
164 expect(betaPost.community_local).toBe(true);
165 expect(betaPost.creator_local).toBe(false);
166 expect(betaPost.stickied).toBe(true);
170 let unstickiedPost = await stickyPost(alpha, false, postRes.post);
171 expect(unstickiedPost.post.stickied).toBe(false);
174 // Make sure that post is unstickied on beta
175 let searchBeta2 = await searchPost(beta, postRes.post);
176 let betaPost2 = searchBeta2.posts[0];
177 expect(betaPost2.community_local).toBe(true);
178 expect(betaPost2.creator_local).toBe(false);
179 expect(betaPost2.stickied).toBe(false);
182 // Make sure that gamma cannot sticky the post on beta
183 let searchGamma = await searchPost(gamma, postRes.post);
184 let gammaPost = searchGamma.posts[0];
186 let gammaTrySticky = await stickyPost(gamma, true, gammaPost);
188 let searchBeta3 = await searchPost(beta, postRes.post);
189 let betaPost3 = searchBeta3.posts[0];
190 expect(gammaTrySticky.post.stickied).toBe(true);
191 expect(betaPost3.stickied).toBe(false);
194 test('Lock a post', async () => {
195 let search = await searchForBetaCommunity(alpha);
197 let postRes = await createPost(alpha, search.communities[0].id);
201 let lockedPostRes = await lockPost(alpha, true, postRes.post);
202 expect(lockedPostRes.post.locked).toBe(true);
205 // Make sure that post is locked on beta
206 let searchBeta = await searchPostLocal(beta, postRes.post);
207 let betaPost1 = searchBeta.posts[0];
208 expect(betaPost1.locked).toBe(true);
211 // Try to make a new comment there, on alpha
212 let comment = await createComment(alpha, postRes.post.id);
213 expect(comment['error']).toBe('locked');
217 let unlockedPost = await lockPost(alpha, false, postRes.post);
218 expect(unlockedPost.post.locked).toBe(false);
221 // Make sure that post is unlocked on beta
222 let searchBeta2 = await searchPost(beta, postRes.post);
223 let betaPost2 = searchBeta2.posts[0];
224 expect(betaPost2.community_local).toBe(true);
225 expect(betaPost2.creator_local).toBe(false);
226 expect(betaPost2.locked).toBe(false);
228 // Try to create a new comment, on beta
229 let commentBeta = await createComment(beta, betaPost2.id);
230 expect(commentBeta).toBeDefined();
233 test('Delete a post', async () => {
234 let search = await searchForBetaCommunity(alpha);
235 let postRes = await createPost(alpha, search.communities[0].id);
238 let deletedPost = await deletePost(alpha, true, postRes.post);
239 expect(deletedPost.post.deleted).toBe(true);
242 // Make sure lemmy beta sees post is deleted
243 let searchBeta = await searchPost(beta, postRes.post);
244 let betaPost = searchBeta.posts[0];
245 // This will be undefined because of the tombstone
246 expect(betaPost).toBeUndefined();
250 let undeletedPost = await deletePost(alpha, false, postRes.post);
251 expect(undeletedPost.post.deleted).toBe(false);
254 // Make sure lemmy beta sees post is undeleted
255 let searchBeta2 = await searchPost(beta, postRes.post);
256 let betaPost2 = searchBeta2.posts[0];
257 expect(betaPost2.deleted).toBe(false);
258 assertPostFederation(betaPost2, undeletedPost.post);
260 // Make sure lemmy beta cannot delete the post
261 let deletedPostBeta = await deletePost(beta, true, betaPost2);
262 expect(deletedPostBeta).toStrictEqual({ error: 'no_post_edit_allowed' });
265 test('Remove a post from admin and community on different instance', async () => {
266 let search = await searchForBetaCommunity(alpha);
267 let postRes = await createPost(alpha, search.communities[0].id);
270 let removedPost = await removePost(alpha, true, postRes.post);
271 expect(removedPost.post.removed).toBe(true);
274 // Make sure lemmy beta sees post is NOT removed
275 let searchBeta = await searchPost(beta, postRes.post);
276 let betaPost = searchBeta.posts[0];
277 expect(betaPost.removed).toBe(false);
281 let undeletedPost = await removePost(alpha, false, postRes.post);
282 expect(undeletedPost.post.removed).toBe(false);
285 // Make sure lemmy beta sees post is undeleted
286 let searchBeta2 = await searchPost(beta, postRes.post);
287 let betaPost2 = searchBeta2.posts[0];
288 expect(betaPost2.removed).toBe(false);
289 assertPostFederation(betaPost2, undeletedPost.post);
292 test('Remove a post from admin and community on same instance', async () => {
293 let search = await searchForBetaCommunity(alpha);
295 let postRes = await createPost(alpha, search.communities[0].id);
298 // Get the id for beta
299 let searchBeta = await searchPost(beta, postRes.post);
301 let betaPost = searchBeta.posts[0];
304 // The beta admin removes it (the community lives on beta)
305 let removePostRes = await removePost(beta, true, betaPost);
306 expect(removePostRes.post.removed).toBe(true);
309 // Make sure lemmy alpha sees post is removed
310 let alphaPost = await getPost(alpha, postRes.post.id);
311 expect(alphaPost.post.removed).toBe(true);
312 assertPostFederation(alphaPost.post, removePostRes.post);
316 let undeletedPost = await removePost(beta, false, betaPost);
317 expect(undeletedPost.post.removed).toBe(false);
320 // Make sure lemmy alpha sees post is undeleted
321 let alphaPost2 = await getPost(alpha, postRes.post.id);
323 expect(alphaPost2.post.removed).toBe(false);
324 assertPostFederation(alphaPost2.post, undeletedPost.post);
327 test('Search for a post', async () => {
328 let search = await searchForBetaCommunity(alpha);
330 let postRes = await createPost(alpha, search.communities[0].id);
332 let searchBeta = await searchPost(beta, postRes.post);
334 expect(searchBeta.posts[0].name).toBeDefined();
337 test('A and G subscribe to B (center) A posts, it gets announced to G', async () => {
338 let search = await searchForBetaCommunity(alpha);
339 let postRes = await createPost(alpha, search.communities[0].id);
342 let search2 = await searchPost(gamma, postRes.post);
343 expect(search2.posts[0].name).toBeDefined();
346 test('Enforce site ban for federated user', async () => {
348 let alphaShortname = `@lemmy_alpha@lemmy-alpha:8541`;
349 let userSearch = await searchForUser(beta, alphaShortname);
350 let alphaUser = userSearch.users[0];
351 expect(alphaUser).toBeDefined();
354 // ban alpha from beta site
355 let banAlpha = await banUserFromSite(beta, alphaUser.id, true);
356 expect(banAlpha.banned).toBe(true);
359 // Alpha makes post on beta
360 let search = await searchForBetaCommunity(alpha);
362 let postRes = await createPost(alpha, search.communities[0].id);
363 expect(postRes.post).toBeDefined();
364 expect(postRes.post.community_local).toBe(false);
365 expect(postRes.post.creator_local).toBe(true);
366 expect(postRes.post.score).toBe(1);
369 // Make sure that post doesn't make it to beta
370 let searchBeta = await searchPostLocal(beta, postRes.post);
371 let betaPost = searchBeta.posts[0];
372 expect(betaPost).toBeUndefined();
376 let unBanAlpha = await banUserFromSite(beta, alphaUser.id, false);
377 expect(unBanAlpha.banned).toBe(false);
380 test('Enforce community ban for federated user', async () => {
381 let alphaShortname = `@lemmy_alpha@lemmy-alpha:8541`;
382 let userSearch = await searchForUser(beta, alphaShortname);
383 let alphaUser = userSearch.users[0];
384 expect(alphaUser).toBeDefined();
387 // ban alpha from beta site
388 await banUserFromCommunity(beta, alphaUser.id, 2, false);
389 let banAlpha = await banUserFromCommunity(beta, alphaUser.id, 2, true);
390 expect(banAlpha.banned).toBe(true);
393 // Alpha makes post on beta
394 let search = await searchForBetaCommunity(alpha);
396 let postRes = await createPost(alpha, search.communities[0].id);
397 expect(postRes.post).toBeDefined();
398 expect(postRes.post.community_local).toBe(false);
399 expect(postRes.post.creator_local).toBe(true);
400 expect(postRes.post.score).toBe(1);
403 // Make sure that post doesn't make it to beta community
404 let searchBeta = await searchPostLocal(beta, postRes.post);
405 let betaPost = searchBeta.posts[0];
406 expect(betaPost).toBeUndefined();
409 let unBanAlpha = await banUserFromCommunity(beta, alphaUser.id, 2, false);
410 expect(unBanAlpha.banned).toBe(false);