]> Untitled Git - lemmy.git/blob - api_tests/src/post.spec.ts
Merge branch 'main' into federated-moderation
[lemmy.git] / api_tests / src / post.spec.ts
1 jest.setTimeout(120000);
2 import {
3   alpha,
4   beta,
5   gamma,
6   delta,
7   epsilon,
8   setupLogins,
9   createPost,
10   editPost,
11   stickyPost,
12   lockPost,
13   searchPost,
14   likePost,
15   followBeta,
16   searchForBetaCommunity,
17   createComment,
18   deletePost,
19   removePost,
20   getPost,
21   unfollowRemotes,
22   searchForUser,
23   banPersonFromSite,
24   searchPostLocal,
25   followCommunity,
26   banPersonFromCommunity,
27 } from './shared';
28 import { PostView, CommunityView } from 'lemmy-js-client';
29
30 let betaCommunity: CommunityView;
31
32 beforeAll(async () => {
33   await setupLogins();
34   let search = await searchForBetaCommunity(alpha);
35   betaCommunity = search.communities[0];
36   await unfollows();
37 });
38
39 afterAll(async () => {
40   await unfollows();
41 });
42
43 async function unfollows() {
44   await unfollowRemotes(alpha);
45   await unfollowRemotes(gamma);
46   await unfollowRemotes(delta);
47   await unfollowRemotes(epsilon);
48 }
49
50 function assertPostFederation(postOne: PostView, postTwo: PostView) {
51   expect(postOne.post.ap_id).toBe(postTwo.post.ap_id);
52   expect(postOne.post.name).toBe(postTwo.post.name);
53   expect(postOne.post.body).toBe(postTwo.post.body);
54   expect(postOne.post.url).toBe(postTwo.post.url);
55   expect(postOne.post.nsfw).toBe(postTwo.post.nsfw);
56   expect(postOne.post.embed_title).toBe(postTwo.post.embed_title);
57   expect(postOne.post.embed_description).toBe(postTwo.post.embed_description);
58   expect(postOne.post.embed_html).toBe(postTwo.post.embed_html);
59   expect(postOne.post.published).toBe(postTwo.post.published);
60   expect(postOne.community.actor_id).toBe(postTwo.community.actor_id);
61   expect(postOne.post.locked).toBe(postTwo.post.locked);
62   expect(postOne.post.removed).toBe(postTwo.post.removed);
63   expect(postOne.post.deleted).toBe(postTwo.post.deleted);
64 }
65
66 test('Create a post', async () => {
67   let postRes = await createPost(alpha, betaCommunity.community.id);
68   expect(postRes.post_view.post).toBeDefined();
69   expect(postRes.post_view.community.local).toBe(false);
70   expect(postRes.post_view.creator.local).toBe(true);
71   expect(postRes.post_view.counts.score).toBe(1);
72
73   // Make sure that post is liked on beta
74   let searchBeta = await searchPost(beta, postRes.post_view.post);
75   let betaPost = searchBeta.posts[0];
76
77   expect(betaPost).toBeDefined();
78   expect(betaPost.community.local).toBe(true);
79   expect(betaPost.creator.local).toBe(false);
80   expect(betaPost.counts.score).toBe(1);
81   assertPostFederation(betaPost, postRes.post_view);
82
83   // Delta only follows beta, so it should not see an alpha ap_id
84   let searchDelta = await searchPost(delta, postRes.post_view.post);
85   expect(searchDelta.posts[0]).toBeUndefined();
86
87   // Epsilon has alpha blocked, it should not see the alpha post
88   let searchEpsilon = await searchPost(epsilon, postRes.post_view.post);
89   expect(searchEpsilon.posts[0]).toBeUndefined();
90 });
91
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' });
95 });
96
97 test('Unlike a post', async () => {
98   let postRes = await createPost(alpha, betaCommunity.community.id);
99   let unlike = await likePost(alpha, 0, postRes.post_view.post);
100   expect(unlike.post_view.counts.score).toBe(0);
101
102   // Try to unlike it again, make sure it stays at 0
103   let unlike2 = await likePost(alpha, 0, postRes.post_view.post);
104   expect(unlike2.post_view.counts.score).toBe(0);
105
106   // Make sure that post is unliked on beta
107   let searchBeta = await searchPost(beta, postRes.post_view.post);
108   let betaPost = searchBeta.posts[0];
109   expect(betaPost).toBeDefined();
110   expect(betaPost.community.local).toBe(true);
111   expect(betaPost.creator.local).toBe(false);
112   expect(betaPost.counts.score).toBe(0);
113   assertPostFederation(betaPost, postRes.post_view);
114 });
115
116 test('Update a post', async () => {
117   let postRes = await createPost(alpha, betaCommunity.community.id);
118
119   let updatedName = 'A jest test federated post, updated';
120   let updatedPost = await editPost(alpha, postRes.post_view.post);
121   expect(updatedPost.post_view.post.name).toBe(updatedName);
122   expect(updatedPost.post_view.community.local).toBe(false);
123   expect(updatedPost.post_view.creator.local).toBe(true);
124
125   // Make sure that post is updated on beta
126   let searchBeta = await searchPost(beta, postRes.post_view.post);
127   let betaPost = searchBeta.posts[0];
128   expect(betaPost.community.local).toBe(true);
129   expect(betaPost.creator.local).toBe(false);
130   expect(betaPost.post.name).toBe(updatedName);
131   assertPostFederation(betaPost, updatedPost.post_view);
132
133   // Make sure lemmy beta cannot update the post
134   let updatedPostBeta = await editPost(beta, betaPost.post);
135   expect(updatedPostBeta).toStrictEqual({ error: 'no_post_edit_allowed' });
136 });
137
138 test('Sticky a post', async () => {
139   let postRes = await createPost(alpha, betaCommunity.community.id);
140
141   let stickiedPostRes = await stickyPost(alpha, true, postRes.post_view.post);
142   expect(stickiedPostRes.post_view.post.stickied).toBe(true);
143
144   // Make sure that post is stickied on beta
145   let searchBeta = await searchPost(beta, postRes.post_view.post);
146   let betaPost = searchBeta.posts[0];
147   expect(betaPost.community.local).toBe(true);
148   expect(betaPost.creator.local).toBe(false);
149   expect(betaPost.post.stickied).toBe(true);
150
151   // Unsticky a post
152   let unstickiedPost = await stickyPost(alpha, false, postRes.post_view.post);
153   expect(unstickiedPost.post_view.post.stickied).toBe(false);
154
155   // Make sure that post is unstickied on beta
156   let searchBeta2 = await searchPost(beta, postRes.post_view.post);
157   let betaPost2 = searchBeta2.posts[0];
158   expect(betaPost2.community.local).toBe(true);
159   expect(betaPost2.creator.local).toBe(false);
160   expect(betaPost2.post.stickied).toBe(false);
161
162   // Make sure that gamma cannot sticky the post on beta
163   let searchGamma = await searchPost(gamma, postRes.post_view.post);
164   let gammaPost = searchGamma.posts[0];
165   let gammaTrySticky = await stickyPost(gamma, true, gammaPost.post);
166   let searchBeta3 = await searchPost(beta, postRes.post_view.post);
167   let betaPost3 = searchBeta3.posts[0];
168   expect(gammaTrySticky.post_view.post.stickied).toBe(true);
169   expect(betaPost3.post.stickied).toBe(false);
170 });
171
172 test('Lock a post', async () => {
173   await followCommunity(alpha, true, betaCommunity.community.id);
174   let postRes = await createPost(alpha, betaCommunity.community.id);
175
176   // Lock the post
177   let searchBeta = await searchPost(beta, postRes.post_view.post);
178   let betaPost1 = searchBeta.posts[0];
179   let lockedPostRes = await lockPost(beta, true, betaPost1.post);
180   expect(lockedPostRes.post_view.post.locked).toBe(true);
181
182   // Make sure that post is locked on alpha
183   let searchAlpha = await searchPostLocal(alpha, postRes.post_view.post);
184   let alphaPost1 = searchAlpha.posts[0];
185   expect(alphaPost1.post.locked).toBe(true);
186
187   // Try to make a new comment there, on alpha
188   let comment: any = await createComment(alpha, alphaPost1.post.id);
189   expect(comment['error']).toBe('locked');
190
191   // Unlock a post
192   let unlockedPost = await lockPost(beta, false, betaPost1.post);
193   expect(unlockedPost.post_view.post.locked).toBe(false);
194
195   // Make sure that post is unlocked on alpha
196   let searchAlpha2 = await searchPostLocal(alpha, postRes.post_view.post);
197   let alphaPost2 = searchAlpha2.posts[0];
198   expect(alphaPost2.community.local).toBe(false);
199   expect(alphaPost2.creator.local).toBe(true);
200   expect(alphaPost2.post.locked).toBe(false);
201
202   // Try to create a new comment, on alpha
203   let commentAlpha = await createComment(alpha, alphaPost1.post.id);
204   expect(commentAlpha).toBeDefined();
205 });
206
207 test('Delete a post', async () => {
208   let postRes = await createPost(alpha, betaCommunity.community.id);
209   expect(postRes.post_view.post).toBeDefined();
210
211   let deletedPost = await deletePost(alpha, true, postRes.post_view.post);
212   expect(deletedPost.post_view.post.deleted).toBe(true);
213
214   // Make sure lemmy beta sees post is deleted
215   let searchBeta = await searchPost(beta, postRes.post_view.post);
216   let betaPost = searchBeta.posts[0];
217   // This will be undefined because of the tombstone
218   expect(betaPost).toBeUndefined();
219
220   // Undelete
221   let undeletedPost = await deletePost(alpha, false, postRes.post_view.post);
222   expect(undeletedPost.post_view.post.deleted).toBe(false);
223
224   // Make sure lemmy beta sees post is undeleted
225   let searchBeta2 = await searchPost(beta, postRes.post_view.post);
226   let betaPost2 = searchBeta2.posts[0];
227   expect(betaPost2.post.deleted).toBe(false);
228   assertPostFederation(betaPost2, undeletedPost.post_view);
229
230   // Make sure lemmy beta cannot delete the post
231   let deletedPostBeta = await deletePost(beta, true, betaPost2.post);
232   expect(deletedPostBeta).toStrictEqual({ error: 'no_post_edit_allowed' });
233 });
234
235 test('Remove a post from admin and community on different instance', async () => {
236   let postRes = await createPost(alpha, betaCommunity.community.id);
237
238   let removedPost = await removePost(alpha, true, postRes.post_view.post);
239   expect(removedPost.post_view.post.removed).toBe(true);
240
241   // Make sure lemmy beta sees post is NOT removed
242   let searchBeta = await searchPost(beta, postRes.post_view.post);
243   let betaPost = searchBeta.posts[0];
244   expect(betaPost.post.removed).toBe(false);
245
246   // Undelete
247   let undeletedPost = await removePost(alpha, false, postRes.post_view.post);
248   expect(undeletedPost.post_view.post.removed).toBe(false);
249
250   // Make sure lemmy beta sees post is undeleted
251   let searchBeta2 = await searchPost(beta, postRes.post_view.post);
252   let betaPost2 = searchBeta2.posts[0];
253   expect(betaPost2.post.removed).toBe(false);
254   assertPostFederation(betaPost2, undeletedPost.post_view);
255 });
256
257 test('Remove a post from admin and community on same instance', async () => {
258   await followBeta(alpha);
259   let postRes = await createPost(alpha, betaCommunity.community.id);
260   expect(postRes.post_view.post).toBeDefined();
261
262   // Get the id for beta
263   let searchBeta = await searchPostLocal(beta, postRes.post_view.post);
264   let betaPost = searchBeta.posts[0];
265   expect(betaPost).toBeDefined();
266
267   // The beta admin removes it (the community lives on beta)
268   let removePostRes = await removePost(beta, true, betaPost.post);
269   expect(removePostRes.post_view.post.removed).toBe(true);
270
271   // Make sure lemmy alpha sees post is removed
272   let alphaPost = await getPost(alpha, postRes.post_view.post.id);
273   // expect(alphaPost.post_view.post.removed).toBe(true); // TODO this shouldn't be commented
274   // assertPostFederation(alphaPost.post_view, removePostRes.post_view);
275
276   // Undelete
277   let undeletedPost = await removePost(beta, false, betaPost.post);
278   expect(undeletedPost.post_view.post.removed).toBe(false);
279
280   // Make sure lemmy alpha sees post is undeleted
281   let alphaPost2 = await getPost(alpha, postRes.post_view.post.id);
282   expect(alphaPost2.post_view.post.removed).toBe(false);
283   assertPostFederation(alphaPost2.post_view, undeletedPost.post_view);
284   await unfollowRemotes(alpha);
285 });
286
287 test('Search for a post', async () => {
288   await unfollowRemotes(alpha);
289   let postRes = await createPost(alpha, betaCommunity.community.id);
290   expect(postRes.post_view.post).toBeDefined();
291
292   let searchBeta = await searchPost(beta, postRes.post_view.post);
293
294   expect(searchBeta.posts[0].post.name).toBeDefined();
295 });
296
297 test('A and G subscribe to B (center) A posts, it gets announced to G', async () => {
298   let postRes = await createPost(alpha, betaCommunity.community.id);
299   expect(postRes.post_view.post).toBeDefined();
300
301   let search2 = await searchPost(gamma, postRes.post_view.post);
302   expect(search2.posts[0].post.name).toBeDefined();
303 });
304
305 test('Enforce site ban for federated user', async () => {
306   let alphaShortname = `@lemmy_alpha@lemmy-alpha:8541`;
307   let userSearch = await searchForUser(beta, alphaShortname);
308   let alphaUser = userSearch.users[0];
309   expect(alphaUser).toBeDefined();
310
311   // ban alpha from beta site
312   let banAlpha = await banPersonFromSite(beta, alphaUser.person.id, true);
313   expect(banAlpha.banned).toBe(true);
314
315   // Alpha makes post on beta
316   let postRes = await createPost(alpha, betaCommunity.community.id);
317   expect(postRes.post_view.post).toBeDefined();
318   expect(postRes.post_view.community.local).toBe(false);
319   expect(postRes.post_view.creator.local).toBe(true);
320   expect(postRes.post_view.counts.score).toBe(1);
321
322   // Make sure that post doesn't make it to beta
323   let searchBeta = await searchPostLocal(beta, postRes.post_view.post);
324   let betaPost = searchBeta.posts[0];
325   expect(betaPost).toBeUndefined();
326
327   // Unban alpha
328   let unBanAlpha = await banPersonFromSite(beta, alphaUser.person.id, false);
329   expect(unBanAlpha.banned).toBe(false);
330 });
331
332 test('Enforce community ban for federated user', async () => {
333   let alphaShortname = `@lemmy_alpha@lemmy-alpha:8541`;
334   let userSearch = await searchForUser(beta, alphaShortname);
335   let alphaUser = userSearch.users[0];
336   expect(alphaUser).toBeDefined();
337
338   // ban alpha from beta site
339   await banPersonFromCommunity(beta, alphaUser.person.id, 2, false);
340   let banAlpha = await banPersonFromCommunity(beta, alphaUser.person.id, 2, true);
341   expect(banAlpha.banned).toBe(true);
342
343   // Alpha makes post on beta
344   let postRes = await createPost(alpha, betaCommunity.community.id);
345   expect(postRes.post_view.post).toBeDefined();
346   expect(postRes.post_view.community.local).toBe(false);
347   expect(postRes.post_view.creator.local).toBe(true);
348   expect(postRes.post_view.counts.score).toBe(1);
349
350   // Make sure that post doesn't make it to beta community
351   let searchBeta = await searchPostLocal(beta, postRes.post_view.post);
352   let betaPost = searchBeta.posts[0];
353   expect(betaPost).toBeUndefined();
354
355   // Unban alpha
356   let unBanAlpha = await banPersonFromCommunity(
357     beta,
358     alphaUser.person.id,
359     2,
360     false
361   );
362   expect(unBanAlpha.banned).toBe(false);
363 });