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];
183 let gammaTrySticky = await stickyPost(gamma, true, gammaPost);
185 let searchBeta3 = await searchPost(beta, postRes.post);
186 let betaPost3 = searchBeta3.posts[0];
187 expect(gammaTrySticky.post.stickied).toBe(true);
188 expect(betaPost3.stickied).toBe(false);
191 test('Lock a post', async () => {
192 let search = await searchForBetaCommunity(alpha);
194 let postRes = await createPost(alpha, search.communities[0].id);
198 let lockedPostRes = await lockPost(alpha, true, postRes.post);
199 expect(lockedPostRes.post.locked).toBe(true);
202 // Make sure that post is locked on beta
203 let searchBeta = await searchPostLocal(beta, postRes.post);
204 let betaPost1 = searchBeta.posts[0];
205 expect(betaPost1.locked).toBe(true);
208 // Try to make a new comment there, on alpha
209 let comment = await createComment(alpha, postRes.post.id);
210 expect(comment['error']).toBe('locked');
214 let unlockedPost = await lockPost(alpha, false, postRes.post);
215 expect(unlockedPost.post.locked).toBe(false);
218 // Make sure that post is unlocked on beta
219 let searchBeta2 = await searchPost(beta, postRes.post);
220 let betaPost2 = searchBeta2.posts[0];
221 expect(betaPost2.community_local).toBe(true);
222 expect(betaPost2.creator_local).toBe(false);
223 expect(betaPost2.locked).toBe(false);
225 // Try to create a new comment, on beta
226 let commentBeta = await createComment(beta, betaPost2.id);
227 expect(commentBeta).toBeDefined();
230 test('Delete a post', async () => {
231 let search = await searchForBetaCommunity(alpha);
232 let postRes = await createPost(alpha, search.communities[0].id);
235 let deletedPost = await deletePost(alpha, true, postRes.post);
236 expect(deletedPost.post.deleted).toBe(true);
239 // Make sure lemmy beta sees post is deleted
240 let searchBeta = await searchPost(beta, postRes.post);
241 let betaPost = searchBeta.posts[0];
242 // This will be undefined because of the tombstone
243 expect(betaPost).toBeUndefined();
247 let undeletedPost = await deletePost(alpha, false, postRes.post);
248 expect(undeletedPost.post.deleted).toBe(false);
251 // Make sure lemmy beta sees post is undeleted
252 let searchBeta2 = await searchPost(beta, postRes.post);
253 let betaPost2 = searchBeta2.posts[0];
254 expect(betaPost2.deleted).toBe(false);
255 assertPostFederation(betaPost2, undeletedPost.post);
257 // Make sure lemmy beta cannot delete the post
258 let deletedPostBeta = await deletePost(beta, true, betaPost2);
259 expect(deletedPostBeta).toStrictEqual({ error: 'no_post_edit_allowed' });
262 test('Remove a post from admin and community on different instance', async () => {
263 let search = await searchForBetaCommunity(alpha);
264 let postRes = await createPost(alpha, search.communities[0].id);
267 let removedPost = await removePost(alpha, true, postRes.post);
268 expect(removedPost.post.removed).toBe(true);
271 // Make sure lemmy beta sees post is NOT removed
272 let searchBeta = await searchPost(beta, postRes.post);
273 let betaPost = searchBeta.posts[0];
274 expect(betaPost.removed).toBe(false);
278 let undeletedPost = await removePost(alpha, false, postRes.post);
279 expect(undeletedPost.post.removed).toBe(false);
282 // Make sure lemmy beta sees post is undeleted
283 let searchBeta2 = await searchPost(beta, postRes.post);
284 let betaPost2 = searchBeta2.posts[0];
285 expect(betaPost2.removed).toBe(false);
286 assertPostFederation(betaPost2, undeletedPost.post);
289 test('Remove a post from admin and community on same instance', async () => {
290 let search = await searchForBetaCommunity(alpha);
292 let postRes = await createPost(alpha, search.communities[0].id);
295 // Get the id for beta
296 let searchBeta = await searchPost(beta, postRes.post);
297 let betaPost = searchBeta.posts[0];
300 // The beta admin removes it (the community lives on beta)
301 let removePostRes = await removePost(beta, true, betaPost);
302 expect(removePostRes.post.removed).toBe(true);
305 // Make sure lemmy alpha sees post is removed
306 let alphaPost = await getPost(alpha, postRes.post.id);
307 expect(alphaPost.post.removed).toBe(true);
308 assertPostFederation(alphaPost.post, removePostRes.post);
312 let undeletedPost = await removePost(beta, false, betaPost);
313 expect(undeletedPost.post.removed).toBe(false);
316 // Make sure lemmy alpha sees post is undeleted
317 let alphaPost2 = await getPost(alpha, postRes.post.id);
319 expect(alphaPost2.post.removed).toBe(false);
320 assertPostFederation(alphaPost2.post, undeletedPost.post);
323 test('Search for a post', async () => {
324 let search = await searchForBetaCommunity(alpha);
326 let postRes = await createPost(alpha, search.communities[0].id);
328 let searchBeta = await searchPost(beta, postRes.post);
330 expect(searchBeta.posts[0].name).toBeDefined();
333 test('A and G subscribe to B (center) A posts, it gets announced to G', async () => {
334 let search = await searchForBetaCommunity(alpha);
335 let postRes = await createPost(alpha, search.communities[0].id);
338 let search2 = await searchPost(gamma, postRes.post);
339 expect(search2.posts[0].name).toBeDefined();
342 test('Enforce site ban for federated user', async () => {
344 let alphaShortname = `@lemmy_alpha@lemmy-alpha:8541`;
345 let userSearch = await searchForUser(beta, alphaShortname);
346 let alphaUser = userSearch.users[0];
347 expect(alphaUser).toBeDefined();
350 // ban alpha from beta site
351 let banAlpha = await banUserFromSite(beta, alphaUser.id, true);
352 expect(banAlpha.banned).toBe(true);
355 // Alpha makes post on beta
356 let search = await searchForBetaCommunity(alpha);
358 let postRes = await createPost(alpha, search.communities[0].id);
359 expect(postRes.post).toBeDefined();
360 expect(postRes.post.community_local).toBe(false);
361 expect(postRes.post.creator_local).toBe(true);
362 expect(postRes.post.score).toBe(1);
365 // Make sure that post doesn't make it to beta
366 let searchBeta = await searchPostLocal(beta, postRes.post);
367 let betaPost = searchBeta.posts[0];
368 expect(betaPost).toBeUndefined();
372 let unBanAlpha = await banUserFromSite(beta, alphaUser.id, false);
373 expect(unBanAlpha.banned).toBe(false);
376 test('Enforce community ban for federated user', async () => {
377 let alphaShortname = `@lemmy_alpha@lemmy-alpha:8541`;
378 let userSearch = await searchForUser(beta, alphaShortname);
379 let alphaUser = userSearch.users[0];
380 expect(alphaUser).toBeDefined();
383 // ban alpha from beta site
384 await banUserFromCommunity(beta, alphaUser.id, 2, false);
385 let banAlpha = await banUserFromCommunity(beta, alphaUser.id, 2, true);
386 expect(banAlpha.banned).toBe(true);
389 // Alpha makes post on beta
390 let search = await searchForBetaCommunity(alpha);
392 let postRes = await createPost(alpha, search.communities[0].id);
393 expect(postRes.post).toBeDefined();
394 expect(postRes.post.community_local).toBe(false);
395 expect(postRes.post.creator_local).toBe(true);
396 expect(postRes.post.score).toBe(1);
399 // Make sure that post doesn't make it to beta community
400 let searchBeta = await searchPostLocal(beta, postRes.post);
401 let betaPost = searchBeta.posts[0];
402 expect(betaPost).toBeUndefined();
405 let unBanAlpha = await banUserFromCommunity(beta, alphaUser.id, 2, false);
406 expect(unBanAlpha.banned).toBe(false);