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);
168 let unstickiedPost = await stickyPost(alpha, false, postRes.post);
169 expect(unstickiedPost.post.stickied).toBe(false);
172 // Make sure that post is unstickied on beta
173 let searchBeta2 = await searchPost(beta, postRes.post);
174 let betaPost2 = searchBeta2.posts[0];
175 expect(betaPost2.community_local).toBe(true);
176 expect(betaPost2.creator_local).toBe(false);
177 expect(betaPost2.stickied).toBe(false);
179 // Make sure that gamma cannot sticky the post on beta
180 let searchGamma = await searchPost(gamma, postRes.post);
181 let gammaPost = searchGamma.posts[0];
182 let gammaTrySticky = await stickyPost(gamma, true, gammaPost);
184 let searchBeta3 = await searchPost(beta, postRes.post);
185 let betaPost3 = searchBeta3.posts[0];
186 expect(gammaTrySticky.post.stickied).toBe(true);
187 expect(betaPost3.stickied).toBe(false);
190 test('Lock a post', async () => {
191 let search = await searchForBetaCommunity(alpha);
193 let postRes = await createPost(alpha, search.communities[0].id);
197 let lockedPostRes = await lockPost(alpha, true, postRes.post);
198 expect(lockedPostRes.post.locked).toBe(true);
201 // Make sure that post is locked on beta
202 let searchBeta = await searchPostLocal(beta, postRes.post);
203 let betaPost1 = searchBeta.posts[0];
204 expect(betaPost1.locked).toBe(true);
207 // Try to make a new comment there, on alpha
208 let comment = await createComment(alpha, postRes.post.id);
209 expect(comment['error']).toBe('locked');
213 let unlockedPost = await lockPost(alpha, false, postRes.post);
214 expect(unlockedPost.post.locked).toBe(false);
217 // Make sure that post is unlocked on beta
218 let searchBeta2 = await searchPost(beta, postRes.post);
219 let betaPost2 = searchBeta2.posts[0];
220 expect(betaPost2.community_local).toBe(true);
221 expect(betaPost2.creator_local).toBe(false);
222 expect(betaPost2.locked).toBe(false);
224 // Try to create a new comment, on beta
225 let commentBeta = await createComment(beta, betaPost2.id);
226 expect(commentBeta).toBeDefined();
229 test('Delete a post', async () => {
230 let search = await searchForBetaCommunity(alpha);
231 let postRes = await createPost(alpha, search.communities[0].id);
234 let deletedPost = await deletePost(alpha, true, postRes.post);
235 expect(deletedPost.post.deleted).toBe(true);
238 // Make sure lemmy beta sees post is deleted
239 let searchBeta = await searchPost(beta, postRes.post);
240 let betaPost = searchBeta.posts[0];
241 // This will be undefined because of the tombstone
242 expect(betaPost).toBeUndefined();
246 let undeletedPost = await deletePost(alpha, false, postRes.post);
247 expect(undeletedPost.post.deleted).toBe(false);
250 // Make sure lemmy beta sees post is undeleted
251 let searchBeta2 = await searchPost(beta, postRes.post);
252 let betaPost2 = searchBeta2.posts[0];
253 expect(betaPost2.deleted).toBe(false);
254 assertPostFederation(betaPost2, undeletedPost.post);
256 // Make sure lemmy beta cannot delete the post
257 let deletedPostBeta = await deletePost(beta, true, betaPost2);
258 expect(deletedPostBeta).toStrictEqual({ error: 'no_post_edit_allowed' });
261 test('Remove a post from admin and community on different instance', async () => {
262 let search = await searchForBetaCommunity(alpha);
263 let postRes = await createPost(alpha, search.communities[0].id);
266 let removedPost = await removePost(alpha, true, postRes.post);
267 expect(removedPost.post.removed).toBe(true);
270 // Make sure lemmy beta sees post is NOT removed
271 let searchBeta = await searchPost(beta, postRes.post);
272 let betaPost = searchBeta.posts[0];
273 expect(betaPost.removed).toBe(false);
277 let undeletedPost = await removePost(alpha, false, postRes.post);
278 expect(undeletedPost.post.removed).toBe(false);
281 // Make sure lemmy beta sees post is undeleted
282 let searchBeta2 = await searchPost(beta, postRes.post);
283 let betaPost2 = searchBeta2.posts[0];
284 expect(betaPost2.removed).toBe(false);
285 assertPostFederation(betaPost2, undeletedPost.post);
288 test('Remove a post from admin and community on same instance', async () => {
289 let search = await searchForBetaCommunity(alpha);
290 let postRes = await createPost(alpha, search.communities[0].id);
293 // Get the id for beta
294 let searchBeta = await searchPost(beta, postRes.post);
295 let betaPost = searchBeta.posts[0];
298 // The beta admin removes it (the community lives on beta)
299 let removePostRes = await removePost(beta, true, betaPost);
300 expect(removePostRes.post.removed).toBe(true);
303 // Make sure lemmy alpha sees post is removed
304 let alphaPost = await getPost(alpha, postRes.post.id);
305 expect(alphaPost.post.removed).toBe(true);
306 assertPostFederation(alphaPost.post, removePostRes.post);
310 let undeletedPost = await removePost(beta, false, betaPost);
311 expect(undeletedPost.post.removed).toBe(false);
314 // Make sure lemmy alpha sees post is undeleted
315 let alphaPost2 = await getPost(alpha, postRes.post.id);
317 expect(alphaPost2.post.removed).toBe(false);
318 assertPostFederation(alphaPost2.post, undeletedPost.post);
321 test('Search for a post', async () => {
322 let search = await searchForBetaCommunity(alpha);
324 let postRes = await createPost(alpha, search.communities[0].id);
326 let searchBeta = await searchPost(beta, postRes.post);
328 expect(searchBeta.posts[0].name).toBeDefined();
331 test('A and G subscribe to B (center) A posts, it gets announced to G', async () => {
332 let search = await searchForBetaCommunity(alpha);
333 let postRes = await createPost(alpha, search.communities[0].id);
336 let search2 = await searchPost(gamma, postRes.post);
337 expect(search2.posts[0].name).toBeDefined();
340 test('Enforce site ban for federated user', async () => {
342 let alphaShortname = `@lemmy_alpha@lemmy-alpha:8541`;
343 let userSearch = await searchForUser(beta, alphaShortname);
344 let alphaUser = userSearch.users[0];
345 expect(alphaUser).toBeDefined();
348 // ban alpha from beta site
349 let banAlpha = await banUserFromSite(beta, alphaUser.id, true);
350 expect(banAlpha.banned).toBe(true);
353 // Alpha makes post on beta
354 let search = await searchForBetaCommunity(alpha);
356 let postRes = await createPost(alpha, search.communities[0].id);
357 expect(postRes.post).toBeDefined();
358 expect(postRes.post.community_local).toBe(false);
359 expect(postRes.post.creator_local).toBe(true);
360 expect(postRes.post.score).toBe(1);
363 // Make sure that post doesn't make it to beta
364 let searchBeta = await searchPostLocal(beta, postRes.post);
365 let betaPost = searchBeta.posts[0];
366 expect(betaPost).toBeUndefined();
370 let unBanAlpha = await banUserFromSite(beta, alphaUser.id, false);
371 expect(unBanAlpha.banned).toBe(false);
374 test('Enforce community ban for federated user', async () => {
375 let alphaShortname = `@lemmy_alpha@lemmy-alpha:8541`;
376 let userSearch = await searchForUser(beta, alphaShortname);
377 let alphaUser = userSearch.users[0];
378 expect(alphaUser).toBeDefined();
381 // ban alpha from beta site
382 await banUserFromCommunity(beta, alphaUser.id, 2, false);
383 let banAlpha = await banUserFromCommunity(beta, alphaUser.id, 2, true);
384 expect(banAlpha.banned).toBe(true);
387 // Alpha makes post on beta
388 let search = await searchForBetaCommunity(alpha);
390 let postRes = await createPost(alpha, search.communities[0].id);
391 expect(postRes.post).toBeDefined();
392 expect(postRes.post.community_local).toBe(false);
393 expect(postRes.post.creator_local).toBe(true);
394 expect(postRes.post.score).toBe(1);
397 // Make sure that post doesn't make it to beta community
398 let searchBeta = await searchPostLocal(beta, postRes.post);
399 let betaPost = searchBeta.posts[0];
400 expect(betaPost).toBeUndefined();
403 let unBanAlpha = await banUserFromCommunity(beta, alphaUser.id, 2, false);
404 expect(unBanAlpha.banned).toBe(false);