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);
104 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);
108 // Try to unlike it again, make sure it stays at 0
109 let unlike2 = await likePost(alpha, 0, postRes.post);
110 expect(unlike2.post.score).toBe(0);
112 // Make sure that post is unliked on beta
113 let searchBeta = await searchPost(beta, postRes.post);
114 let betaPost = searchBeta.posts[0];
115 expect(betaPost).toBeDefined();
116 expect(betaPost.community_local).toBe(true);
117 expect(betaPost.creator_local).toBe(false);
118 expect(betaPost.score).toBe(0);
119 assertPostFederation(betaPost, postRes.post);
122 test('Update a post', async () => {
123 let search = await searchForBetaCommunity(alpha);
124 let postRes = await createPost(alpha, search.communities[0].id);
127 let updatedName = 'A jest test federated post, updated';
128 let updatedPost = await updatePost(alpha, postRes.post);
129 expect(updatedPost.post.name).toBe(updatedName);
130 expect(updatedPost.post.community_local).toBe(false);
131 expect(updatedPost.post.creator_local).toBe(true);
134 // Make sure that post is updated on beta
135 let searchBeta = await searchPost(beta, postRes.post);
136 let betaPost = searchBeta.posts[0];
137 expect(betaPost.community_local).toBe(true);
138 expect(betaPost.creator_local).toBe(false);
139 expect(betaPost.name).toBe(updatedName);
140 assertPostFederation(betaPost, updatedPost.post);
143 // Make sure lemmy beta cannot update the post
144 let updatedPostBeta = await updatePost(beta, betaPost);
145 expect(updatedPostBeta).toStrictEqual({ error: 'no_post_edit_allowed' });
148 test('Sticky a post', async () => {
149 let search = await searchForBetaCommunity(alpha);
150 let postRes = await createPost(alpha, search.communities[0].id);
153 let stickiedPostRes = await stickyPost(alpha, true, postRes.post);
154 expect(stickiedPostRes.post.stickied).toBe(true);
157 // Make sure that post is stickied on beta
158 let searchBeta = await searchPost(beta, postRes.post);
159 let betaPost = searchBeta.posts[0];
160 expect(betaPost.community_local).toBe(true);
161 expect(betaPost.creator_local).toBe(false);
162 expect(betaPost.stickied).toBe(true);
166 let unstickiedPost = await stickyPost(alpha, false, postRes.post);
167 expect(unstickiedPost.post.stickied).toBe(false);
170 // Make sure that post is unstickied on beta
171 let searchBeta2 = await searchPost(beta, postRes.post);
172 let betaPost2 = searchBeta2.posts[0];
173 expect(betaPost2.community_local).toBe(true);
174 expect(betaPost2.creator_local).toBe(false);
175 expect(betaPost2.stickied).toBe(false);
178 // Make sure that gamma cannot sticky the post on beta
179 let searchGamma = await searchPost(gamma, postRes.post);
180 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);
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);
233 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);
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();
245 let undeletedPost = await deletePost(alpha, false, postRes.post);
246 expect(undeletedPost.post.deleted).toBe(false);
248 // Make sure lemmy beta sees post is undeleted
249 let searchBeta2 = await searchPost(beta, postRes.post);
250 let betaPost2 = searchBeta2.posts[0];
251 expect(betaPost2.deleted).toBe(false);
252 assertPostFederation(betaPost2, undeletedPost.post);
254 // Make sure lemmy beta cannot delete the post
255 let deletedPostBeta = await deletePost(beta, true, betaPost2);
256 expect(deletedPostBeta).toStrictEqual({ error: 'no_post_edit_allowed' });
259 test('Remove a post from admin and community on different instance', async () => {
260 let search = await searchForBetaCommunity(alpha);
262 let postRes = await createPost(alpha, search.communities[0].id);
265 let removedPost = await removePost(alpha, true, postRes.post);
266 expect(removedPost.post.removed).toBe(true);
269 // Make sure lemmy beta sees post is NOT removed
270 let searchBeta = await searchPost(beta, postRes.post);
271 let betaPost = searchBeta.posts[0];
272 expect(betaPost.removed).toBe(false);
276 let undeletedPost = await removePost(alpha, false, postRes.post);
277 expect(undeletedPost.post.removed).toBe(false);
280 // Make sure lemmy beta sees post is undeleted
281 let searchBeta2 = await searchPost(beta, postRes.post);
282 let betaPost2 = searchBeta2.posts[0];
283 expect(betaPost2.removed).toBe(false);
284 assertPostFederation(betaPost2, undeletedPost.post);
287 test('Remove a post from admin and community on same instance', async () => {
288 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);
316 expect(alphaPost2.post.removed).toBe(false);
317 assertPostFederation(alphaPost2.post, undeletedPost.post);
320 test('Search for a post', async () => {
321 let search = await searchForBetaCommunity(alpha);
323 let postRes = await createPost(alpha, search.communities[0].id);
325 let searchBeta = await searchPost(beta, postRes.post);
327 expect(searchBeta.posts[0].name).toBeDefined();
330 test('A and G subscribe to B (center) A posts, it gets announced to G', async () => {
331 let search = await searchForBetaCommunity(alpha);
332 let postRes = await createPost(alpha, search.communities[0].id);
335 let search2 = await searchPost(gamma, postRes.post);
336 expect(search2.posts[0].name).toBeDefined();
339 test('Enforce site ban for federated user', async () => {
341 let alphaShortname = `@lemmy_alpha@lemmy-alpha:8541`;
342 let userSearch = await searchForUser(beta, alphaShortname);
343 let alphaUser = userSearch.users[0];
344 expect(alphaUser).toBeDefined();
347 // ban alpha from beta site
348 let banAlpha = await banUserFromSite(beta, alphaUser.id, true);
349 expect(banAlpha.banned).toBe(true);
352 // Alpha makes post on beta
353 let search = await searchForBetaCommunity(alpha);
355 let postRes = await createPost(alpha, search.communities[0].id);
356 expect(postRes.post).toBeDefined();
357 expect(postRes.post.community_local).toBe(false);
358 expect(postRes.post.creator_local).toBe(true);
359 expect(postRes.post.score).toBe(1);
362 // Make sure that post doesn't make it to beta
363 let searchBeta = await searchPostLocal(beta, postRes.post);
364 let betaPost = searchBeta.posts[0];
365 expect(betaPost).toBeUndefined();
369 let unBanAlpha = await banUserFromSite(beta, alphaUser.id, false);
370 expect(unBanAlpha.banned).toBe(false);
373 test('Enforce community ban for federated user', async () => {
374 let alphaShortname = `@lemmy_alpha@lemmy-alpha:8541`;
375 let userSearch = await searchForUser(beta, alphaShortname);
376 let alphaUser = userSearch.users[0];
377 expect(alphaUser).toBeDefined();
380 // ban alpha from beta site
381 await banUserFromCommunity(beta, alphaUser.id, 2, false);
382 let banAlpha = await banUserFromCommunity(beta, alphaUser.id, 2, true);
383 expect(banAlpha.banned).toBe(true);
386 // Alpha makes post on beta
387 let search = await searchForBetaCommunity(alpha);
389 let postRes = await createPost(alpha, search.communities[0].id);
390 expect(postRes.post).toBeDefined();
391 expect(postRes.post.community_local).toBe(false);
392 expect(postRes.post.creator_local).toBe(true);
393 expect(postRes.post.score).toBe(1);
396 // Make sure that post doesn't make it to beta community
397 let searchBeta = await searchPostLocal(beta, postRes.post);
398 let betaPost = searchBeta.posts[0];
399 expect(betaPost).toBeUndefined();
402 let unBanAlpha = await banUserFromCommunity(beta, alphaUser.id, 2, false);
403 expect(unBanAlpha.banned).toBe(false);