1 jest.setTimeout(120000);
16 searchForBetaCommunity,
27 } from 'lemmy-js-client';
29 beforeAll(async () => {
31 await followBeta(alpha);
32 await followBeta(gamma);
33 await followBeta(delta);
34 await followBeta(epsilon);
38 afterAll(async () => {
39 await unfollowRemotes(alpha);
40 await unfollowRemotes(gamma);
41 await unfollowRemotes(delta);
42 await unfollowRemotes(epsilon);
45 function assertPostFederation(
48 expect(postOne.ap_id).toBe(postTwo.ap_id);
49 expect(postOne.name).toBe(postTwo.name);
50 expect(postOne.body).toBe(postTwo.body);
51 expect(postOne.url).toBe(postTwo.url);
52 expect(postOne.nsfw).toBe(postTwo.nsfw);
53 expect(postOne.embed_title).toBe(postTwo.embed_title);
54 expect(postOne.embed_description).toBe(postTwo.embed_description);
55 expect(postOne.embed_html).toBe(postTwo.embed_html);
56 expect(postOne.published).toBe(postTwo.published);
57 expect(postOne.community_actor_id).toBe(postTwo.community_actor_id);
58 expect(postOne.locked).toBe(postTwo.locked);
59 expect(postOne.removed).toBe(postTwo.removed);
60 expect(postOne.deleted).toBe(postTwo.deleted);
63 test('Create a post', async () => {
64 let search = await searchForBetaCommunity(alpha);
66 let postRes = await createPost(alpha, search.communities[0].id);
67 expect(postRes.post).toBeDefined();
68 expect(postRes.post.community_local).toBe(false);
69 expect(postRes.post.creator_local).toBe(true);
70 expect(postRes.post.score).toBe(1);
73 // Make sure that post is liked on beta
74 let searchBeta = await searchPost(beta, postRes.post);
75 let betaPost = searchBeta.posts[0];
77 expect(betaPost).toBeDefined();
78 expect(betaPost.community_local).toBe(true);
79 expect(betaPost.creator_local).toBe(false);
80 expect(betaPost.score).toBe(1);
81 assertPostFederation(betaPost, postRes.post);
83 // Delta only follows beta, so it should not see an alpha ap_id
84 let searchDelta = await searchPost(delta, postRes.post);
85 expect(searchDelta.posts[0]).toBeUndefined();
87 // Epsilon has alpha blocked, it should not see the alpha post
88 let searchEpsilon = await searchPost(epsilon, postRes.post);
89 expect(searchEpsilon.posts[0]).toBeUndefined();
92 test('Create a post in a non-existent community', async () => {
93 let postRes = await createPost(alpha, -2);
94 expect(postRes).toStrictEqual({ error: 'couldnt_create_post' });
97 test('Unlike a post', async () => {
98 let search = await searchForBetaCommunity(alpha);
99 let postRes = await createPost(alpha, search.communities[0].id);
101 let unlike = await likePost(alpha, 0, postRes.post);
102 expect(unlike.post.score).toBe(0);
105 // Try to unlike it again, make sure it stays at 0
106 let unlike2 = await likePost(alpha, 0, postRes.post);
107 expect(unlike2.post.score).toBe(0);
110 // Make sure that post is unliked on beta
111 let searchBeta = await searchPost(beta, postRes.post);
112 let betaPost = searchBeta.posts[0];
114 expect(betaPost).toBeDefined();
115 expect(betaPost.community_local).toBe(true);
116 expect(betaPost.creator_local).toBe(false);
117 expect(betaPost.score).toBe(0);
118 assertPostFederation(betaPost, postRes.post);
121 test('Update a post', async () => {
122 let search = await searchForBetaCommunity(alpha);
123 let postRes = await createPost(alpha, search.communities[0].id);
126 let updatedName = 'A jest test federated post, updated';
127 let updatedPost = await updatePost(alpha, postRes.post);
128 expect(updatedPost.post.name).toBe(updatedName);
129 expect(updatedPost.post.community_local).toBe(false);
130 expect(updatedPost.post.creator_local).toBe(true);
133 // Make sure that post is updated on beta
134 let searchBeta = await searchPost(beta, postRes.post);
135 let betaPost = searchBeta.posts[0];
136 expect(betaPost.community_local).toBe(true);
137 expect(betaPost.creator_local).toBe(false);
138 expect(betaPost.name).toBe(updatedName);
139 assertPostFederation(betaPost, updatedPost.post);
142 // Make sure lemmy beta cannot update the post
143 let updatedPostBeta = await updatePost(beta, betaPost);
144 expect(updatedPostBeta).toStrictEqual({ error: 'no_post_edit_allowed' });
147 test('Sticky a post', async () => {
148 let search = await searchForBetaCommunity(alpha);
149 let postRes = await createPost(alpha, search.communities[0].id);
152 let stickiedPostRes = await stickyPost(alpha, true, postRes.post);
153 expect(stickiedPostRes.post.stickied).toBe(true);
156 // Make sure that post is stickied on beta
157 let searchBeta = await searchPost(beta, postRes.post);
158 let betaPost = searchBeta.posts[0];
159 expect(betaPost.community_local).toBe(true);
160 expect(betaPost.creator_local).toBe(false);
161 expect(betaPost.stickied).toBe(true);
164 let unstickiedPost = await stickyPost(alpha, false, postRes.post);
165 expect(unstickiedPost.post.stickied).toBe(false);
168 // Make sure that post is unstickied on beta
169 let searchBeta2 = await searchPost(beta, postRes.post);
170 let betaPost2 = searchBeta2.posts[0];
171 expect(betaPost2.community_local).toBe(true);
172 expect(betaPost2.creator_local).toBe(false);
173 expect(betaPost2.stickied).toBe(false);
175 // Make sure that gamma cannot sticky the post on beta
176 let searchGamma = await searchPost(gamma, postRes.post);
177 let gammaPost = searchGamma.posts[0];
178 let gammaTrySticky = await stickyPost(gamma, true, gammaPost);
180 let searchBeta3 = await searchPost(beta, postRes.post);
181 let betaPost3 = searchBeta3.posts[0];
182 expect(gammaTrySticky.post.stickied).toBe(true);
183 expect(betaPost3.stickied).toBe(false);
186 test('Lock a post', async () => {
187 let search = await searchForBetaCommunity(alpha);
189 let postRes = await createPost(alpha, search.communities[0].id);
192 let lockedPostRes = await lockPost(alpha, true, postRes.post);
193 expect(lockedPostRes.post.locked).toBe(true);
196 // Make sure that post is locked on beta
197 let searchBeta = await searchPost(beta, postRes.post);
198 let betaPost = searchBeta.posts[0];
199 expect(betaPost.community_local).toBe(true);
200 expect(betaPost.creator_local).toBe(false);
201 expect(betaPost.locked).toBe(true);
203 // Try to make a new comment there, on alpha
204 let comment = await createComment(alpha, postRes.post.id);
205 expect(comment['error']).toBe('locked');
208 // Try to create a new comment, on beta
209 let commentBeta = await createComment(beta, betaPost.id);
210 expect(commentBeta['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);
226 test('Delete a post', async () => {
227 let search = await searchForBetaCommunity(alpha);
228 let postRes = await createPost(alpha, search.communities[0].id);
231 let deletedPost = await deletePost(alpha, true, postRes.post);
232 expect(deletedPost.post.deleted).toBe(true);
235 // Make sure lemmy beta sees post is deleted
236 let searchBeta = await searchPost(beta, postRes.post);
237 let betaPost = searchBeta.posts[0];
238 // This will be undefined because of the tombstone
239 expect(betaPost).toBeUndefined();
243 let undeletedPost = await deletePost(alpha, false, postRes.post);
244 expect(undeletedPost.post.deleted).toBe(false);
247 // Make sure lemmy beta sees post is undeleted
248 let searchBeta2 = await searchPost(beta, postRes.post);
249 let betaPost2 = searchBeta2.posts[0];
250 expect(betaPost2.deleted).toBe(false);
251 assertPostFederation(betaPost2, undeletedPost.post);
253 // Make sure lemmy beta cannot delete the post
254 let deletedPostBeta = await deletePost(beta, true, betaPost2);
255 expect(deletedPostBeta).toStrictEqual({ error: 'no_post_edit_allowed' });
258 test('Remove a post from admin and community on different instance', async () => {
259 let search = await searchForBetaCommunity(alpha);
260 let postRes = await createPost(alpha, search.communities[0].id);
263 let removedPost = await removePost(alpha, true, postRes.post);
264 expect(removedPost.post.removed).toBe(true);
267 // Make sure lemmy beta sees post is NOT removed
268 let searchBeta = await searchPost(beta, postRes.post);
269 let betaPost = searchBeta.posts[0];
270 expect(betaPost.removed).toBe(false);
274 let undeletedPost = await removePost(alpha, false, postRes.post);
275 expect(undeletedPost.post.removed).toBe(false);
278 // Make sure lemmy beta sees post is undeleted
279 let searchBeta2 = await searchPost(beta, postRes.post);
280 let betaPost2 = searchBeta2.posts[0];
281 expect(betaPost2.removed).toBe(false);
282 assertPostFederation(betaPost2, undeletedPost.post);
285 test('Remove a post from admin and community on same instance', async () => {
286 let search = await searchForBetaCommunity(alpha);
287 let postRes = await createPost(alpha, search.communities[0].id);
290 // Get the id for beta
291 let searchBeta = await searchPost(beta, postRes.post);
292 let betaPost = searchBeta.posts[0];
295 // The beta admin removes it (the community lives on beta)
296 let removePostRes = await removePost(beta, true, betaPost);
297 expect(removePostRes.post.removed).toBe(true);
300 // Make sure lemmy alpha sees post is removed
301 let alphaPost = await getPost(alpha, postRes.post.id);
302 expect(alphaPost.post.removed).toBe(true);
303 assertPostFederation(alphaPost.post, removePostRes.post);
307 let undeletedPost = await removePost(beta, false, betaPost);
308 expect(undeletedPost.post.removed).toBe(false);
311 // Make sure lemmy alpha sees post is undeleted
312 let alphaPost2 = await getPost(alpha, postRes.post.id);
314 expect(alphaPost2.post.removed).toBe(false);
315 assertPostFederation(alphaPost2.post, undeletedPost.post);
318 test('Search for a post', async () => {
319 let search = await searchForBetaCommunity(alpha);
321 let postRes = await createPost(alpha, search.communities[0].id);
323 let searchBeta = await searchPost(beta, postRes.post);
325 expect(searchBeta.posts[0].name).toBeDefined();
328 test('A and G subscribe to B (center) A posts, it gets announced to G', async () => {
329 let search = await searchForBetaCommunity(alpha);
330 let postRes = await createPost(alpha, search.communities[0].id);
333 let search2 = await searchPost(gamma, postRes.post);
334 expect(search2.posts[0].name).toBeDefined();