]> Untitled Git - lemmy.git/blob - api_tests/src/post.spec.ts
Fixing ResolveObject API and unit tests (#1713)
[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   resolvePost,
14   likePost,
15   followBeta,
16   resolveBetaCommunity,
17   createComment,
18   deletePost,
19   removePost,
20   getPost,
21   unfollowRemotes,
22   resolvePerson,
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   betaCommunity = (await resolveBetaCommunity(alpha)).community;
35   expect(betaCommunity).toBeDefined();
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 betaPost = (await resolvePost(beta, postRes.post_view.post)).post;
75
76   expect(betaPost).toBeDefined();
77   expect(betaPost.community.local).toBe(true);
78   expect(betaPost.creator.local).toBe(false);
79   expect(betaPost.counts.score).toBe(1);
80   assertPostFederation(betaPost, postRes.post_view);
81
82   // Delta only follows beta, so it should not see an alpha ap_id
83   let deltaPost = (await resolvePost(delta, postRes.post_view.post)).post;
84   expect(deltaPost).toBeUndefined();
85
86   // Epsilon has alpha blocked, it should not see the alpha post
87   let epsilonPost = (await resolvePost(epsilon, postRes.post_view.post)).post;
88   expect(epsilonPost).toBeUndefined();
89 });
90
91 test('Create a post in a non-existent community', async () => {
92   let postRes = await createPost(alpha, -2);
93   expect(postRes).toStrictEqual({ error: 'couldnt_create_post' });
94 });
95
96 test('Unlike a post', async () => {
97   let postRes = await createPost(alpha, betaCommunity.community.id);
98   let unlike = await likePost(alpha, 0, postRes.post_view.post);
99   expect(unlike.post_view.counts.score).toBe(0);
100
101   // Try to unlike it again, make sure it stays at 0
102   let unlike2 = await likePost(alpha, 0, postRes.post_view.post);
103   expect(unlike2.post_view.counts.score).toBe(0);
104
105   // Make sure that post is unliked on beta
106   let betaPost = (await resolvePost(beta, postRes.post_view.post)).post;
107   expect(betaPost).toBeDefined();
108   expect(betaPost.community.local).toBe(true);
109   expect(betaPost.creator.local).toBe(false);
110   expect(betaPost.counts.score).toBe(0);
111   assertPostFederation(betaPost, postRes.post_view);
112 });
113
114 test('Update a post', async () => {
115   let postRes = await createPost(alpha, betaCommunity.community.id);
116
117   let updatedName = 'A jest test federated post, updated';
118   let updatedPost = await editPost(alpha, postRes.post_view.post);
119   expect(updatedPost.post_view.post.name).toBe(updatedName);
120   expect(updatedPost.post_view.community.local).toBe(false);
121   expect(updatedPost.post_view.creator.local).toBe(true);
122
123   // Make sure that post is updated on beta
124   let betaPost = (await resolvePost(beta, postRes.post_view.post)).post;
125   expect(betaPost.community.local).toBe(true);
126   expect(betaPost.creator.local).toBe(false);
127   expect(betaPost.post.name).toBe(updatedName);
128   assertPostFederation(betaPost, updatedPost.post_view);
129
130   // Make sure lemmy beta cannot update the post
131   let updatedPostBeta = await editPost(beta, betaPost.post);
132   expect(updatedPostBeta).toStrictEqual({ error: 'no_post_edit_allowed' });
133 });
134
135 test('Sticky a post', async () => {
136   let postRes = await createPost(alpha, betaCommunity.community.id);
137
138   let stickiedPostRes = await stickyPost(alpha, true, postRes.post_view.post);
139   expect(stickiedPostRes.post_view.post.stickied).toBe(true);
140
141   // Make sure that post is stickied on beta
142   let betaPost = (await resolvePost(beta, postRes.post_view.post)).post;
143   expect(betaPost.community.local).toBe(true);
144   expect(betaPost.creator.local).toBe(false);
145   expect(betaPost.post.stickied).toBe(true);
146
147   // Unsticky a post
148   let unstickiedPost = await stickyPost(alpha, false, postRes.post_view.post);
149   expect(unstickiedPost.post_view.post.stickied).toBe(false);
150
151   // Make sure that post is unstickied on beta
152   let betaPost2 = (await resolvePost(beta, postRes.post_view.post)).post;
153   expect(betaPost2.community.local).toBe(true);
154   expect(betaPost2.creator.local).toBe(false);
155   expect(betaPost2.post.stickied).toBe(false);
156
157   // Make sure that gamma cannot sticky the post on beta
158   let gammaPost = (await resolvePost(gamma, postRes.post_view.post)).post;
159   let gammaTrySticky = await stickyPost(gamma, true, gammaPost.post);
160   let betaPost3 = (await resolvePost(beta, postRes.post_view.post)).post;
161   expect(gammaTrySticky.post_view.post.stickied).toBe(true);
162   expect(betaPost3.post.stickied).toBe(false);
163 });
164
165 test('Lock a post', async () => {
166   await followCommunity(alpha, true, betaCommunity.community.id);
167   let postRes = await createPost(alpha, betaCommunity.community.id);
168
169   // Lock the post
170   let betaPost1 = (await resolvePost(beta, postRes.post_view.post)).post;
171   let lockedPostRes = await lockPost(beta, true, betaPost1.post);
172   expect(lockedPostRes.post_view.post.locked).toBe(true);
173
174   // Make sure that post is locked on alpha
175   let searchAlpha = await searchPostLocal(alpha, postRes.post_view.post);
176   let alphaPost1 = searchAlpha.posts[0];
177   expect(alphaPost1.post.locked).toBe(true);
178
179   // Try to make a new comment there, on alpha
180   let comment: any = await createComment(alpha, alphaPost1.post.id);
181   expect(comment['error']).toBe('locked');
182
183   // Unlock a post
184   let unlockedPost = await lockPost(beta, false, betaPost1.post);
185   expect(unlockedPost.post_view.post.locked).toBe(false);
186
187   // Make sure that post is unlocked on alpha
188   let searchAlpha2 = await searchPostLocal(alpha, postRes.post_view.post);
189   let alphaPost2 = searchAlpha2.posts[0];
190   expect(alphaPost2.community.local).toBe(false);
191   expect(alphaPost2.creator.local).toBe(true);
192   expect(alphaPost2.post.locked).toBe(false);
193
194   // Try to create a new comment, on alpha
195   let commentAlpha = await createComment(alpha, alphaPost1.post.id);
196   expect(commentAlpha).toBeDefined();
197 });
198
199 test('Delete a post', async () => {
200   let postRes = await createPost(alpha, betaCommunity.community.id);
201   expect(postRes.post_view.post).toBeDefined();
202
203   let deletedPost = await deletePost(alpha, true, postRes.post_view.post);
204   expect(deletedPost.post_view.post.deleted).toBe(true);
205   expect(deletedPost.post_view.post.name).toBe("");
206
207   // Make sure lemmy beta sees post is deleted
208   let betaPost = (await resolvePost(beta, postRes.post_view.post)).post;
209   // This will be undefined because of the tombstone
210   expect(betaPost).toBeUndefined();
211
212   // Undelete
213   let undeletedPost = await deletePost(alpha, false, postRes.post_view.post);
214   expect(undeletedPost.post_view.post.deleted).toBe(false);
215
216   // Make sure lemmy beta sees post is undeleted
217   let betaPost2 = (await resolvePost(beta, postRes.post_view.post)).post;
218   expect(betaPost2.post.deleted).toBe(false);
219   assertPostFederation(betaPost2, undeletedPost.post_view);
220
221   // Make sure lemmy beta cannot delete the post
222   let deletedPostBeta = await deletePost(beta, true, betaPost2.post);
223   expect(deletedPostBeta).toStrictEqual({ error: 'no_post_edit_allowed' });
224 });
225
226 test('Remove a post from admin and community on different instance', async () => {
227   let postRes = await createPost(alpha, betaCommunity.community.id);
228
229   let removedPost = await removePost(alpha, true, postRes.post_view.post);
230   expect(removedPost.post_view.post.removed).toBe(true);
231   expect(removedPost.post_view.post.name).toBe("");
232
233   // Make sure lemmy beta sees post is NOT removed
234   let betaPost = (await resolvePost(beta, postRes.post_view.post)).post;
235   expect(betaPost.post.removed).toBe(false);
236
237   // Undelete
238   let undeletedPost = await removePost(alpha, false, postRes.post_view.post);
239   expect(undeletedPost.post_view.post.removed).toBe(false);
240
241   // Make sure lemmy beta sees post is undeleted
242   let betaPost2 = (await resolvePost(beta, postRes.post_view.post)).post;
243   expect(betaPost2.post.removed).toBe(false);
244   assertPostFederation(betaPost2, undeletedPost.post_view);
245 });
246
247 test('Remove a post from admin and community on same instance', async () => {
248   await followBeta(alpha);
249   let postRes = await createPost(alpha, betaCommunity.community.id);
250   expect(postRes.post_view.post).toBeDefined();
251
252   // Get the id for beta
253   let searchBeta = await searchPostLocal(beta, postRes.post_view.post);
254   let betaPost = searchBeta.posts[0];
255   expect(betaPost).toBeDefined();
256
257   // The beta admin removes it (the community lives on beta)
258   let removePostRes = await removePost(beta, true, betaPost.post);
259   expect(removePostRes.post_view.post.removed).toBe(true);
260
261   // Make sure lemmy alpha sees post is removed
262   let alphaPost = await getPost(alpha, postRes.post_view.post.id);
263   // expect(alphaPost.post_view.post.removed).toBe(true); // TODO this shouldn't be commented
264   // assertPostFederation(alphaPost.post_view, removePostRes.post_view);
265
266   // Undelete
267   let undeletedPost = await removePost(beta, false, betaPost.post);
268   expect(undeletedPost.post_view.post.removed).toBe(false);
269
270   // Make sure lemmy alpha sees post is undeleted
271   let alphaPost2 = await getPost(alpha, postRes.post_view.post.id);
272   expect(alphaPost2.post_view.post.removed).toBe(false);
273   assertPostFederation(alphaPost2.post_view, undeletedPost.post_view);
274   await unfollowRemotes(alpha);
275 });
276
277 test('Search for a post', async () => {
278   await unfollowRemotes(alpha);
279   let postRes = await createPost(alpha, betaCommunity.community.id);
280   expect(postRes.post_view.post).toBeDefined();
281
282   let betaPost = (await resolvePost(beta, postRes.post_view.post)).post;
283
284   expect(betaPost.post.name).toBeDefined();
285 });
286
287 test('A and G subscribe to B (center) A posts, it gets announced to G', async () => {
288   let postRes = await createPost(alpha, betaCommunity.community.id);
289   expect(postRes.post_view.post).toBeDefined();
290
291   let betaPost = (await resolvePost(gamma, postRes.post_view.post)).post;
292   expect(betaPost.post.name).toBeDefined();
293 });
294
295 test('Enforce site ban for federated user', async () => {
296   let alphaShortname = `@lemmy_alpha@lemmy-alpha:8541`;
297   let alphaPerson = (await resolvePerson(beta, alphaShortname)).person;
298   expect(alphaPerson).toBeDefined();
299
300   // ban alpha from beta site
301   let banAlpha = await banPersonFromSite(beta, alphaPerson.person.id, true);
302   expect(banAlpha.banned).toBe(true);
303
304   // Alpha makes post on beta
305   let postRes = await createPost(alpha, betaCommunity.community.id);
306   expect(postRes.post_view.post).toBeDefined();
307   expect(postRes.post_view.community.local).toBe(false);
308   expect(postRes.post_view.creator.local).toBe(true);
309   expect(postRes.post_view.counts.score).toBe(1);
310
311   // Make sure that post doesn't make it to beta
312   let searchBeta = await searchPostLocal(beta, postRes.post_view.post);
313   let betaPost = searchBeta.posts[0];
314   expect(betaPost).toBeUndefined();
315
316   // Unban alpha
317   let unBanAlpha = await banPersonFromSite(beta, alphaPerson.person.id, false);
318   expect(unBanAlpha.banned).toBe(false);
319 });
320
321 test('Enforce community ban for federated user', async () => {
322   let alphaShortname = `@lemmy_alpha@lemmy-alpha:8541`;
323   let alphaPerson = (await resolvePerson(beta, alphaShortname)).person;
324   expect(alphaPerson).toBeDefined();
325
326   // ban alpha from beta site
327   await banPersonFromCommunity(beta, alphaPerson.person.id, 2, false);
328   let banAlpha = await banPersonFromCommunity(beta, alphaPerson.person.id, 2, true);
329   expect(banAlpha.banned).toBe(true);
330
331   // Alpha tries to make post on beta, but it fails because of ban
332   let postRes = await createPost(alpha, betaCommunity.community.id);
333   expect(postRes.post_view).toBeUndefined();
334
335   // Unban alpha
336   let unBanAlpha = await banPersonFromCommunity(
337     beta,
338     alphaPerson.person.id,
339     2,
340     false
341   );
342   expect(unBanAlpha.banned).toBe(false);
343   let postRes2 = await createPost(alpha, betaCommunity.community.id);
344   expect(postRes2.post_view.post).toBeDefined();
345   expect(postRes2.post_view.community.local).toBe(false);
346   expect(postRes2.post_view.creator.local).toBe(true);
347   expect(postRes2.post_view.counts.score).toBe(1);
348
349   // Make sure that post makes it to beta community
350   let searchBeta = await searchPostLocal(beta, postRes2.post_view.post);
351   let betaPost = searchBeta.posts[0];
352   expect(betaPost).toBeDefined();
353 });