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);
116 let betaPost = searchBeta.posts[0];
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);
125 test('Update a post', async () => {
126 let search = await searchForBetaCommunity(alpha);
127 let postRes = await createPost(alpha, search.communities[0].id);
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);
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);
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' });
151 test('Sticky a post', async () => {
152 let search = await searchForBetaCommunity(alpha);
153 let postRes = await createPost(alpha, search.communities[0].id);
156 let stickiedPostRes = await stickyPost(alpha, true, postRes.post);
157 expect(stickiedPostRes.post.stickied).toBe(true);
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);
169 let unstickiedPost = await stickyPost(alpha, false, postRes.post);
170 expect(unstickiedPost.post.stickied).toBe(false);
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);
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];
185 let gammaTrySticky = await stickyPost(gamma, true, gammaPost);
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);
193 test('Lock a post', async () => {
194 let search = await searchForBetaCommunity(alpha);
196 let postRes = await createPost(alpha, search.communities[0].id);
200 let lockedPostRes = await lockPost(alpha, true, postRes.post);
201 expect(lockedPostRes.post.locked).toBe(true);
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);
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');
216 let unlockedPost = await lockPost(alpha, false, postRes.post);
217 expect(unlockedPost.post.locked).toBe(false);
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);
227 // Try to create a new comment, on beta
228 let commentBeta = await createComment(beta, betaPost2.id);
229 expect(commentBeta).toBeDefined();
232 test('Delete a post', async () => {
233 let search = await searchForBetaCommunity(alpha);
234 let postRes = await createPost(alpha, search.communities[0].id);
237 let deletedPost = await deletePost(alpha, true, postRes.post);
238 expect(deletedPost.post.deleted).toBe(true);
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();
249 let undeletedPost = await deletePost(alpha, false, postRes.post);
250 expect(undeletedPost.post.deleted).toBe(false);
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);
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' });
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);
269 let removedPost = await removePost(alpha, true, postRes.post);
270 expect(removedPost.post.removed).toBe(true);
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);
280 let undeletedPost = await removePost(alpha, false, postRes.post);
281 expect(undeletedPost.post.removed).toBe(false);
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);
291 test('Remove a post from admin and community on same instance', async () => {
292 let search = await searchForBetaCommunity(alpha);
294 let postRes = await createPost(alpha, search.communities[0].id);
297 // Get the id for beta
298 let searchBeta = await searchPost(beta, postRes.post);
300 let betaPost = searchBeta.posts[0];
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);
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);
315 let undeletedPost = await removePost(beta, false, betaPost);
316 expect(undeletedPost.post.removed).toBe(false);
319 // Make sure lemmy alpha sees post is undeleted
320 let alphaPost2 = await getPost(alpha, postRes.post.id);
322 expect(alphaPost2.post.removed).toBe(false);
323 assertPostFederation(alphaPost2.post, undeletedPost.post);
326 test('Search for a post', async () => {
327 let search = await searchForBetaCommunity(alpha);
329 let postRes = await createPost(alpha, search.communities[0].id);
331 let searchBeta = await searchPost(beta, postRes.post);
333 expect(searchBeta.posts[0].name).toBeDefined();
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);
341 let search2 = await searchPost(gamma, postRes.post);
342 expect(search2.posts[0].name).toBeDefined();
345 test('Enforce site ban for federated user', async () => {
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();
353 // ban alpha from beta site
354 let banAlpha = await banUserFromSite(beta, alphaUser.id, true);
355 expect(banAlpha.banned).toBe(true);
358 // Alpha makes post on beta
359 let search = await searchForBetaCommunity(alpha);
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);
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();
375 let unBanAlpha = await banUserFromSite(beta, alphaUser.id, false);
376 expect(unBanAlpha.banned).toBe(false);
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();
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);
392 // Alpha makes post on beta
393 let search = await searchForBetaCommunity(alpha);
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);
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();
408 let unBanAlpha = await banUserFromCommunity(beta, alphaUser.id, 2, false);
409 expect(unBanAlpha.banned).toBe(false);