]> Untitled Git - lemmy.git/blob - api_tests/src/post.spec.ts
Trying to add some long delays.
[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   updatePost,
11   stickyPost,
12   lockPost,
13   searchPost,
14   likePost,
15   followBeta,
16   searchForBetaCommunity,
17   createComment,
18   deletePost,
19   removePost,
20   getPost,
21   unfollowRemotes,
22   delay,
23   longDelay,
24 } from './shared';
25 import {
26   Post,
27 } from 'lemmy-js-client';
28
29 beforeAll(async () => {
30   await setupLogins();
31   await followBeta(alpha);
32   await followBeta(gamma);
33   await followBeta(delta);
34   await followBeta(epsilon);
35   await longDelay();
36 });
37
38 afterAll(async () => {
39   await unfollowRemotes(alpha);
40   await unfollowRemotes(gamma);
41   await unfollowRemotes(delta);
42   await unfollowRemotes(epsilon);
43 });
44
45 function assertPostFederation(
46   postOne: Post,
47   postTwo: Post) {
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);
61 }
62
63 test('Create a post', async () => {
64   let search = await searchForBetaCommunity(alpha);
65   await delay();
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);
71   await longDelay();
72
73   // Make sure that post is liked on beta
74   let searchBeta = await searchPost(beta, postRes.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.score).toBe(1);
81   assertPostFederation(betaPost, postRes.post);
82
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();
86
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();
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 search = await searchForBetaCommunity(alpha);
99   let postRes = await createPost(alpha, search.communities[0].id);
100   await delay();
101   let unlike = await likePost(alpha, 0, postRes.post);
102   expect(unlike.post.score).toBe(0);
103   await delay();
104
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);
108   await longDelay();
109
110   // Make sure that post is unliked on beta
111   let searchBeta = await searchPost(beta, postRes.post);
112   let betaPost = searchBeta.posts[0];
113
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);
119 });
120
121 test('Update a post', async () => {
122   let search = await searchForBetaCommunity(alpha);
123   let postRes = await createPost(alpha, search.communities[0].id);
124   await delay();
125
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);
131   await delay();
132
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);
140   await delay();
141
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' });
145 });
146
147 test('Sticky a post', async () => {
148   let search = await searchForBetaCommunity(alpha);
149   let postRes = await createPost(alpha, search.communities[0].id);
150   await delay();
151
152   let stickiedPostRes = await stickyPost(alpha, true, postRes.post);
153   expect(stickiedPostRes.post.stickied).toBe(true);
154   await delay();
155
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);
162
163   // Unsticky a post
164   let unstickiedPost = await stickyPost(alpha, false, postRes.post);
165   expect(unstickiedPost.post.stickied).toBe(false);
166   await delay();
167
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);
174
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);
179   await delay();
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);
184 });
185
186 test('Lock a post', async () => {
187   let search = await searchForBetaCommunity(alpha);
188   await delay();
189   let postRes = await createPost(alpha, search.communities[0].id);
190   await delay();
191
192   let lockedPostRes = await lockPost(alpha, true, postRes.post);
193   expect(lockedPostRes.post.locked).toBe(true);
194   await delay();
195
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);
202
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');
206   await delay();
207
208   // Try to create a new comment, on beta
209   let commentBeta = await createComment(beta, betaPost.id);
210   expect(commentBeta['error']).toBe('locked');
211   await delay();
212
213   // Unlock a post
214   let unlockedPost = await lockPost(alpha, false, postRes.post);
215   expect(unlockedPost.post.locked).toBe(false);
216   await delay();
217
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);
224 });
225
226 test('Delete a post', async () => {
227   let search = await searchForBetaCommunity(alpha);
228   let postRes = await createPost(alpha, search.communities[0].id);
229   await delay();
230
231   let deletedPost = await deletePost(alpha, true, postRes.post);
232   expect(deletedPost.post.deleted).toBe(true);
233   await delay();
234
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();
240   await delay();
241
242   // Undelete
243   let undeletedPost = await deletePost(alpha, false, postRes.post);
244   expect(undeletedPost.post.deleted).toBe(false);
245   await delay();
246
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);
252
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' });
256 });
257
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);
261   await delay();
262
263   let removedPost = await removePost(alpha, true, postRes.post);
264   expect(removedPost.post.removed).toBe(true);
265   await delay();
266
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);
271   await delay();
272
273   // Undelete
274   let undeletedPost = await removePost(alpha, false, postRes.post);
275   expect(undeletedPost.post.removed).toBe(false);
276   await delay();
277
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);
283 });
284
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);
288   await longDelay();
289
290   // Get the id for beta
291   let searchBeta = await searchPost(beta, postRes.post);
292   let betaPost = searchBeta.posts[0];
293   await longDelay();
294
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);
298   await longDelay();
299
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);
304   await longDelay();
305
306   // Undelete
307   let undeletedPost = await removePost(beta, false, betaPost);
308   expect(undeletedPost.post.removed).toBe(false);
309   await longDelay();
310
311   // Make sure lemmy alpha sees post is undeleted
312   let alphaPost2 = await getPost(alpha, postRes.post.id);
313   await delay();
314   expect(alphaPost2.post.removed).toBe(false);
315   assertPostFederation(alphaPost2.post, undeletedPost.post);
316 });
317
318 test('Search for a post', async () => {
319   let search = await searchForBetaCommunity(alpha);
320   await delay();
321   let postRes = await createPost(alpha, search.communities[0].id);
322   await delay();
323   let searchBeta = await searchPost(beta, postRes.post);
324
325   expect(searchBeta.posts[0].name).toBeDefined();
326 });
327
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);
331   await delay();
332
333   let search2 = await searchPost(gamma, postRes.post);
334   expect(search2.posts[0].name).toBeDefined();
335 });