summaryrefslogtreecommitdiffstats
path: root/ui/src/api_tests
diff options
context:
space:
mode:
Diffstat (limited to 'ui/src/api_tests')
-rw-r--r--ui/src/api_tests/api.spec.ts1487
1 files changed, 1487 insertions, 0 deletions
diff --git a/ui/src/api_tests/api.spec.ts b/ui/src/api_tests/api.spec.ts
new file mode 100644
index 00000000..7337201c
--- /dev/null
+++ b/ui/src/api_tests/api.spec.ts
@@ -0,0 +1,1487 @@
+import fetch from 'node-fetch';
+
+import {
+ LoginForm,
+ LoginResponse,
+ PostForm,
+ PostResponse,
+ SearchResponse,
+ FollowCommunityForm,
+ CommunityResponse,
+ GetFollowedCommunitiesResponse,
+ GetPostForm,
+ GetPostResponse,
+ CommentForm,
+ CommentResponse,
+ CommunityForm,
+ GetCommunityForm,
+ GetCommunityResponse,
+ CommentLikeForm,
+ CreatePostLikeForm,
+ PrivateMessageForm,
+ EditPrivateMessageForm,
+ PrivateMessageResponse,
+ PrivateMessagesResponse,
+ GetUserMentionsResponse,
+} from '../interfaces';
+
+let lemmyAlphaUrl = 'http://localhost:8540';
+let lemmyAlphaApiUrl = `${lemmyAlphaUrl}/api/v1`;
+let lemmyAlphaAuth: string;
+
+let lemmyBetaUrl = 'http://localhost:8550';
+let lemmyBetaApiUrl = `${lemmyBetaUrl}/api/v1`;
+let lemmyBetaAuth: string;
+
+let lemmyGammaUrl = 'http://localhost:8560';
+let lemmyGammaApiUrl = `${lemmyGammaUrl}/api/v1`;
+let lemmyGammaAuth: string;
+
+// Workaround for tests being run before beforeAll() is finished
+// https://github.com/facebook/jest/issues/9527#issuecomment-592406108
+describe('main', () => {
+ beforeAll(async () => {
+ console.log('Logging in as lemmy_alpha');
+ let form: LoginForm = {
+ username_or_email: 'lemmy_alpha',
+ password: 'lemmy',
+ };
+
+ let res: LoginResponse = await fetch(`${lemmyAlphaApiUrl}/user/login`, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: wrapper(form),
+ }).then(d => d.json());
+
+ lemmyAlphaAuth = res.jwt;
+
+ console.log('Logging in as lemmy_beta');
+ let formB = {
+ username_or_email: 'lemmy_beta',
+ password: 'lemmy',
+ };
+
+ let resB: LoginResponse = await fetch(`${lemmyBetaApiUrl}/user/login`, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: wrapper(formB),
+ }).then(d => d.json());
+
+ lemmyBetaAuth = resB.jwt;
+
+ console.log('Logging in as lemmy_gamma');
+ let formC = {
+ username_or_email: 'lemmy_gamma',
+ password: 'lemmy',
+ };
+
+ let resG: LoginResponse = await fetch(`${lemmyGammaApiUrl}/user/login`, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: wrapper(formC),
+ }).then(d => d.json());
+
+ lemmyGammaAuth = resG.jwt;
+ });
+
+ describe('post_search', () => {
+ test('Create test post on alpha and fetch it on beta', async () => {
+ let name = 'A jest test post';
+ let postForm: PostForm = {
+ name,
+ auth: lemmyAlphaAuth,
+ community_id: 2,
+ creator_id: 2,
+ nsfw: false,
+ };
+
+ let createPostRes: PostResponse = await fetch(
+ `${lemmyAlphaApiUrl}/post`,
+ {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: wrapper(postForm),
+ }
+ ).then(d => d.json());
+ expect(createPostRes.post.name).toBe(name);
+
+ let searchUrl = `${lemmyBetaApiUrl}/search?q=${createPostRes.post.ap_id}&type_=All&sort=TopAll`;
+ let searchResponse: SearchResponse = await fetch(searchUrl, {
+ method: 'GET',
+ }).then(d => d.json());
+
+ // TODO: check more fields
+ expect(searchResponse.posts[0].name).toBe(name);
+ });
+ });
+
+ describe('follow_accept', () => {
+ test('/u/lemmy_alpha follows and accepts lemmy_beta/c/main', async () => {
+ // Make sure lemmy_beta/c/main is cached on lemmy_alpha
+ // Use short-hand search url
+ let searchUrl = `${lemmyAlphaApiUrl}/search?q=!main@lemmy_beta:8550&type_=All&sort=TopAll`;
+
+ let searchResponse: SearchResponse = await fetch(searchUrl, {
+ method: 'GET',
+ }).then(d => d.json());
+
+ expect(searchResponse.communities[0].name).toBe('main');
+
+ let followForm: FollowCommunityForm = {
+ community_id: searchResponse.communities[0].id,
+ follow: true,
+ auth: lemmyAlphaAuth,
+ };
+
+ let followRes: CommunityResponse = await fetch(
+ `${lemmyAlphaApiUrl}/community/follow`,
+ {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: wrapper(followForm),
+ }
+ ).then(d => d.json());
+
+ // Make sure the follow response went through
+ expect(followRes.community.local).toBe(false);
+ expect(followRes.community.name).toBe('main');
+
+ // Check that you are subscribed to it locally
+ let followedCommunitiesUrl = `${lemmyAlphaApiUrl}/user/followed_communities?&auth=${lemmyAlphaAuth}`;
+ let followedCommunitiesRes: GetFollowedCommunitiesResponse = await fetch(
+ followedCommunitiesUrl,
+ {
+ method: 'GET',
+ }
+ ).then(d => d.json());
+
+ expect(followedCommunitiesRes.communities[1].community_local).toBe(false);
+
+ // Test out unfollowing
+ let unfollowForm: FollowCommunityForm = {
+ community_id: searchResponse.communities[0].id,
+ follow: false,
+ auth: lemmyAlphaAuth,
+ };
+
+ let unfollowRes: CommunityResponse = await fetch(
+ `${lemmyAlphaApiUrl}/community/follow`,
+ {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: wrapper(unfollowForm),
+ }
+ ).then(d => d.json());
+ expect(unfollowRes.community.local).toBe(false);
+
+ // Check that you are unsubscribed to it locally
+ let followedCommunitiesResAgain: GetFollowedCommunitiesResponse = await fetch(
+ followedCommunitiesUrl,
+ {
+ method: 'GET',
+ }
+ ).then(d => d.json());
+
+ expect(followedCommunitiesResAgain.communities.length).toBe(1);
+
+ // Follow again, for other tests
+ let followResAgain: CommunityResponse = await fetch(
+ `${lemmyAlphaApiUrl}/community/follow`,
+ {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: wrapper(followForm),
+ }
+ ).then(d => d.json());
+
+ // Make sure the follow response went through
+ expect(followResAgain.community.local).toBe(false);
+ expect(followResAgain.community.name).toBe('main');
+
+ // Also make G follow B
+
+ // Use short-hand search url
+ let searchUrlG = `${lemmyGammaApiUrl}/search?q=!main@lemmy_beta:8550&type_=All&sort=TopAll`;
+
+ let searchResponseG: SearchResponse = await fetch(searchUrlG, {
+ method: 'GET',
+ }).then(d => d.json());
+
+ expect(searchResponseG.communities[0].name).toBe('main');
+
+ let followFormG: FollowCommunityForm = {
+ community_id: searchResponseG.communities[0].id,
+ follow: true,
+ auth: lemmyGammaAuth,
+ };
+
+ let followResG: CommunityResponse = await fetch(
+ `${lemmyGammaApiUrl}/community/follow`,
+ {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: wrapper(followFormG),
+ }
+ ).then(d => d.json());
+
+ // Make sure the follow response went through
+ expect(followResG.community.local).toBe(false);
+ expect(followResG.community.name).toBe('main');
+
+ // Check that you are subscribed to it locally
+ let followedCommunitiesUrlG = `${lemmyGammaApiUrl}/user/followed_communities?&auth=${lemmyGammaAuth}`;
+ let followedCommunitiesResG: GetFollowedCommunitiesResponse = await fetch(
+ followedCommunitiesUrlG,
+ {
+ method: 'GET',
+ }
+ ).then(d => d.json());
+
+ expect(followedCommunitiesResG.communities[1].community_local).toBe(
+ false
+ );
+ });
+ });
+
+ describe('create test post', () => {
+ test('/u/lemmy_alpha creates a post on /c/lemmy_beta/main, its on both instances', async () => {
+ let name = 'A jest test federated post';
+ let postForm: PostForm = {
+ name,
+ auth: lemmyAlphaAuth,
+ community_id: 3,
+ creator_id: 2,
+ nsfw: false,
+ };
+
+ let createResponse: PostResponse = await fetch(
+ `${lemmyAlphaApiUrl}/post`,
+ {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: wrapper(postForm),
+ }
+ ).then(d => d.json());
+
+ let unlikePostForm: CreatePostLikeForm = {
+ post_id: createResponse.post.id,
+ score: 0,
+ auth: lemmyAlphaAuth,
+ };
+ expect(createResponse.post.name).toBe(name);
+ expect(createResponse.post.community_local).toBe(false);
+ expect(createResponse.post.creator_local).toBe(true);
+ expect(createResponse.post.score).toBe(1);
+
+ let unlikePostRes: PostResponse = await fetch(
+ `${lemmyAlphaApiUrl}/post/like`,
+ {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: wrapper(unlikePostForm),
+ }
+ ).then(d => d.json());
+ expect(unlikePostRes.post.score).toBe(0);
+
+ let getPostUrl = `${lemmyBetaApiUrl}/post?id=2`;
+ let getPostRes: GetPostResponse = await fetch(getPostUrl, {
+ method: 'GET',
+ }).then(d => d.json());
+
+ expect(getPostRes.post.name).toBe(name);
+ expect(getPostRes.post.community_local).toBe(true);
+ expect(getPostRes.post.creator_local).toBe(false);
+ expect(getPostRes.post.score).toBe(0);
+ });
+ });
+
+ describe('update test post', () => {
+ test('/u/lemmy_alpha updates a post on /c/lemmy_beta/main, the update is on both', async () => {
+ let name = 'A jest test federated post, updated';
+ let postForm: PostForm = {
+ name,
+ edit_id: 2,
+ auth: lemmyAlphaAuth,
+ community_id: 3,
+ creator_id: 2,
+ nsfw: false,
+ };
+
+ let updateResponse: PostResponse = await fetch(
+ `${lemmyAlphaApiUrl}/post`,
+ {
+ method: 'PUT',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: wrapper(postForm),
+ }
+ ).then(d => d.json());
+
+ expect(updateResponse.post.name).toBe(name);
+ expect(updateResponse.post.community_local).toBe(false);
+ expect(updateResponse.post.creator_local).toBe(true);
+
+ let getPostUrl = `${lemmyBetaApiUrl}/post?id=2`;
+ let getPostRes: GetPostResponse = await fetch(getPostUrl, {
+ method: 'GET',
+ }).then(d => d.json());
+
+ expect(getPostRes.post.name).toBe(name);
+ expect(getPostRes.post.community_local).toBe(true);
+ expect(getPostRes.post.creator_local).toBe(false);
+ });
+ });
+
+ describe('create test comment', () => {
+ test('/u/lemmy_alpha creates a comment on /c/lemmy_beta/main, its on both instances', async () => {
+ let content = 'A jest test federated comment';
+ let commentForm: CommentForm = {
+ content,
+ post_id: 2,
+ auth: lemmyAlphaAuth,
+ };
+
+ let createResponse: CommentResponse = await fetch(
+ `${lemmyAlphaApiUrl}/comment`,
+ {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: wrapper(commentForm),
+ }
+ ).then(d => d.json());
+
+ expect(createResponse.comment.content).toBe(content);
+ expect(createResponse.comment.community_local).toBe(false);
+ expect(createResponse.comment.creator_local).toBe(true);
+ expect(createResponse.comment.score).toBe(1);
+
+ // Do an unlike, to test it
+ let unlikeCommentForm: CommentLikeForm = {
+ comment_id: createResponse.comment.id,
+ score: 0,
+ post_id: 2,
+ auth: lemmyAlphaAuth,
+ };
+
+ let unlikeCommentRes: CommentResponse = await fetch(
+ `${lemmyAlphaApiUrl}/comment/like`,
+ {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: wrapper(unlikeCommentForm),
+ }
+ ).then(d => d.json());
+
+ expect(unlikeCommentRes.comment.score).toBe(0);
+
+ let getPostUrl = `${lemmyBetaApiUrl}/post?id=2`;
+ let getPostRes: GetPostResponse = await fetch(getPostUrl, {
+ method: 'GET',
+ }).then(d => d.json());
+
+ expect(getPostRes.comments[0].content).toBe(content);
+ expect(getPostRes.comments[0].community_local).toBe(true);
+ expect(getPostRes.comments[0].creator_local).toBe(false);
+ expect(getPostRes.comments[0].score).toBe(0);
+
+ // Now do beta replying to that comment, as a child comment
+ let contentBeta = 'A child federated comment from beta';
+ let commentFormBeta: CommentForm = {
+ content: contentBeta,
+ post_id: getPostRes.post.id,
+ parent_id: getPostRes.comments[0].id,
+ auth: lemmyBetaAuth,
+ };
+
+ let createResponseBeta: CommentResponse = await fetch(
+ `${lemmyBetaApiUrl}/comment`,
+ {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: wrapper(commentFormBeta),
+ }
+ ).then(d => d.json());
+
+ expect(createResponseBeta.comment.content).toBe(contentBeta);
+ expect(createResponseBeta.comment.community_local).toBe(true);
+ expect(createResponseBeta.comment.creator_local).toBe(true);
+ expect(createResponseBeta.comment.parent_id).toBe(1);
+ expect(createResponseBeta.comment.score).toBe(1);
+
+ // Make sure lemmy alpha sees that new child comment from beta
+ let getPostUrlAlpha = `${lemmyAlphaApiUrl}/post?id=2`;
+ let getPostResAlpha: GetPostResponse = await fetch(getPostUrlAlpha, {
+ method: 'GET',
+ }).then(d => d.json());
+
+ // The newest show up first
+ expect(getPostResAlpha.comments[0].content).toBe(contentBeta);
+ expect(getPostResAlpha.comments[0].community_local).toBe(false);
+ expect(getPostResAlpha.comments[0].creator_local).toBe(false);
+ expect(getPostResAlpha.comments[0].score).toBe(1);
+
+ // Lemmy alpha responds to their own comment, but mentions lemmy beta.
+ // Make sure lemmy beta gets that in their inbox.
+ let mentionContent = 'A test mention of @lemmy_beta@lemmy_beta:8550';
+ let mentionCommentForm: CommentForm = {
+ content: mentionContent,
+ post_id: 2,
+ parent_id: createResponse.comment.id,
+ auth: lemmyAlphaAuth,
+ };
+
+ let createMentionRes: CommentResponse = await fetch(
+ `${lemmyAlphaApiUrl}/comment`,
+ {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: wrapper(mentionCommentForm),
+ }
+ ).then(d => d.json());
+
+ expect(createMentionRes.comment.content).toBe(mentionContent);
+ expect(createMentionRes.comment.community_local).toBe(false);
+ expect(createMentionRes.comment.creator_local).toBe(true);
+ expect(createMentionRes.comment.score).toBe(1);
+
+ // Make sure lemmy beta sees that new mention
+ let getMentionUrl = `${lemmyBetaApiUrl}/user/mention?sort=New&unread_only=false&auth=${lemmyBetaAuth}`;
+ let getMentionsRes: GetUserMentionsResponse = await fetch(getMentionUrl, {
+ method: 'GET',
+ }).then(d => d.json());
+
+ // The newest show up first
+ expect(getMentionsRes.mentions[0].content).toBe(mentionContent);
+ expect(getMentionsRes.mentions[0].community_local).toBe(true);
+ expect(getMentionsRes.mentions[0].creator_local).toBe(false);
+ expect(getMentionsRes.mentions[0].score).toBe(1);
+ });
+ });
+
+ describe('update test comment', () => {
+ test('/u/lemmy_alpha updates a comment on /c/lemmy_beta/main, its on both instances', async () => {
+ let content = 'A jest test federated comment update';
+ let commentForm: CommentForm = {
+ content,
+ post_id: 2,
+ edit_id: 1,
+ auth: lemmyAlphaAuth,
+ creator_id: 2,
+ };
+
+ let updateResponse: CommentResponse = await fetch(
+ `${lemmyAlphaApiUrl}/comment`,
+ {
+ method: 'PUT',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: wrapper(commentForm),
+ }
+ ).then(d => d.json());
+
+ expect(updateResponse.comment.content).toBe(content);
+ expect(updateResponse.comment.community_local).toBe(false);
+ expect(updateResponse.comment.creator_local).toBe(true);
+
+ let getPostUrl = `${lemmyBetaApiUrl}/post?id=2`;
+ let getPostRes: GetPostResponse = await fetch(getPostUrl, {
+ method: 'GET',
+ }).then(d => d.json());
+
+ expect(getPostRes.comments[2].content).toBe(content);
+ expect(getPostRes.comments[2].community_local).toBe(true);
+ expect(getPostRes.comments[2].creator_local).toBe(false);
+ });
+ });
+
+ describe('delete things', () => {
+ test('/u/lemmy_beta deletes and undeletes a federated comment, post, and community, lemmy_alpha sees its deleted.', async () => {
+ // Create a test community
+ let communityName = 'test_community';
+ let communityForm: CommunityForm = {
+ name: communityName,
+ title: communityName,
+ category_id: 1,
+ nsfw: false,
+ auth: lemmyBetaAuth,
+ };
+
+ let createCommunityRes: CommunityResponse = await fetch(
+ `${lemmyBetaApiUrl}/community`,
+ {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: wrapper(communityForm),
+ }
+ ).then(d => d.json());
+
+ expect(createCommunityRes.community.name).toBe(communityName);
+
+ // Cache it on lemmy_alpha
+ let searchUrl = `${lemmyAlphaApiUrl}/search?q=http://lemmy_beta:8550/c/${communityName}&type_=All&sort=TopAll`;
+ let searchResponse: SearchResponse = await fetch(searchUrl, {
+ method: 'GET',
+ }).then(d => d.json());
+
+ let communityOnAlphaId = searchResponse.communities[0].id;
+
+ // Follow it
+ let followForm: FollowCommunityForm = {
+ community_id: communityOnAlphaId,
+ follow: true,
+ auth: lemmyAlphaAuth,
+ };
+
+ let followRes: CommunityResponse = await fetch(
+ `${lemmyAlphaApiUrl}/community/follow`,
+ {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: wrapper(followForm),
+ }
+ ).then(d => d.json());
+
+ // Make sure the follow response went through
+ expect(followRes.community.local).toBe(false);
+ expect(followRes.community.name).toBe(communityName);
+
+ // Lemmy beta creates a test post
+ let postName = 'A jest test post with delete';
+ let createPostForm: PostForm = {
+ name: postName,
+ auth: lemmyBetaAuth,
+ community_id: createCommunityRes.community.id,
+ creator_id: 2,
+ nsfw: false,
+ };
+
+ let createPostRes: PostResponse = await fetch(`${lemmyBetaApiUrl}/post`, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: wrapper(createPostForm),
+ }).then(d => d.json());
+ expect(createPostRes.post.name).toBe(postName);
+
+ // Lemmy beta creates a test comment
+ let commentContent = 'A jest test federated comment with delete';
+ let createCommentForm: CommentForm = {
+ content: commentContent,
+ post_id: createPostRes.post.id,
+ auth: lemmyBetaAuth,
+ };
+
+ let createCommentRes: CommentResponse = await fetch(
+ `${lemmyBetaApiUrl}/comment`,
+ {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: wrapper(createCommentForm),
+ }
+ ).then(d => d.json());
+
+ expect(createCommentRes.comment.content).toBe(commentContent);
+
+ // lemmy_beta deletes the comment
+ let deleteCommentForm: CommentForm = {
+ content: commentContent,
+ edit_id: createCommentRes.comment.id,
+ post_id: createPostRes.post.id,
+ deleted: true,
+ auth: lemmyBetaAuth,
+ creator_id: createCommentRes.comment.creator_id,
+ };
+
+ let deleteCommentRes: CommentResponse = await fetch(
+ `${lemmyBetaApiUrl}/comment`,
+ {
+ method: 'PUT',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: wrapper(deleteCommentForm),
+ }
+ ).then(d => d.json());
+ expect(deleteCommentRes.comment.deleted).toBe(true);
+
+ // lemmy_alpha sees that the comment is deleted
+ let getPostUrl = `${lemmyAlphaApiUrl}/post?id=3`;
+ let getPostRes: GetPostResponse = await fetch(getPostUrl, {
+ method: 'GET',
+ }).then(d => d.json());
+ expect(getPostRes.comments[0].deleted).toBe(true);
+
+ // lemmy_beta undeletes the comment
+ let undeleteCommentForm: CommentForm = {
+ content: commentContent,
+ edit_id: createCommentRes.comment.id,
+ post_id: createPostRes.post.id,
+ deleted: false,
+ auth: lemmyBetaAuth,
+ creator_id: createCommentRes.comment.creator_id,
+ };
+
+ let undeleteCommentRes: CommentResponse = await fetch(
+ `${lemmyBetaApiUrl}/comment`,
+ {
+ method: 'PUT',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: wrapper(undeleteCommentForm),
+ }
+ ).then(d => d.json());
+ expect(undeleteCommentRes.comment.deleted).toBe(false);
+
+ // lemmy_alpha sees that the comment is undeleted
+ let getPostUndeleteRes: GetPostResponse = await fetch(getPostUrl, {
+ method: 'GET',
+ }).then(d => d.json());
+ expect(getPostUndeleteRes.comments[0].deleted).toBe(false);
+
+ // lemmy_beta deletes the post
+ let deletePostForm: PostForm = {
+ name: postName,
+ edit_id: createPostRes.post.id,
+ auth: lemmyBetaAuth,
+ community_id: createPostRes.post.community_id,
+ creator_id: createPostRes.post.creator_id,
+ nsfw: false,
+ deleted: true,
+ };
+
+ let deletePostRes: PostResponse = await fetch(`${lemmyBetaApiUrl}/post`, {
+ method: 'PUT',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: wrapper(deletePostForm),
+ }).then(d => d.json());
+ expect(deletePostRes.post.deleted).toBe(true);
+
+ // Make sure lemmy_alpha sees the post is deleted
+ let getPostResAgain: GetPostResponse = await fetch(getPostUrl, {
+ method: 'GET',
+ }).then(d => d.json());
+ expect(getPostResAgain.post.deleted).toBe(true);
+
+ // lemmy_beta undeletes the post
+ let undeletePostForm: PostForm = {
+ name: postName,
+ edit_id: createPostRes.post.id,
+ auth: lemmyBetaAuth,
+ community_id: createPostRes.post.community_id,
+ creator_id: createPostRes.post.creator_id,
+ nsfw: false,
+ deleted: false,
+ };
+
+ let undeletePostRes: PostResponse = await fetch(
+ `${lemmyBetaApiUrl}/post`,
+ {
+ method: 'PUT',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: wrapper(undeletePostForm),
+ }
+ ).then(d => d.json());
+ expect(undeletePostRes.post.deleted).toBe(false);
+
+ // Make sure lemmy_alpha sees the post is undeleted
+ let getPostResAgainTwo: GetPostResponse = await fetch(getPostUrl, {
+ method: 'GET',
+ }).then(d => d.json());
+ expect(getPostResAgainTwo.post.deleted).toBe(false);
+
+ // lemmy_beta deletes the community
+ let deleteCommunityForm: CommunityForm = {
+ name: communityName,
+ title: communityName,
+ category_id: 1,
+ edit_id: createCommunityRes.community.id,
+ nsfw: false,
+ deleted: true,
+ auth: lemmyBetaAuth,
+ };
+
+ let deleteResponse: CommunityResponse = await fetch(
+ `${lemmyBetaApiUrl}/community`,
+ {
+ method: 'PUT',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: wrapper(deleteCommunityForm),
+ }
+ ).then(d => d.json());
+
+ // Make sure the delete went through
+ expect(deleteResponse.community.deleted).toBe(true);
+
+ // Re-get it from alpha, make sure its deleted there too
+ let getCommunityUrl = `${lemmyAlphaApiUrl}/community?id=${communityOnAlphaId}&auth=${lemmyAlphaAuth}`;
+ let getCommunityRes: GetCommunityResponse = await fetch(getCommunityUrl, {
+ method: 'GET',
+ }).then(d => d.json());
+
+ expect(getCommunityRes.community.deleted).toBe(true);
+
+ // lemmy_beta undeletes the community
+ let undeleteCommunityForm: CommunityForm = {
+ name: communityName,
+ title: communityName,
+ category_id: 1,
+ edit_id: createCommunityRes.community.id,
+ nsfw: false,
+ deleted: false,
+ auth: lemmyBetaAuth,
+ };
+
+ let undeleteCommunityRes: CommunityResponse = await fetch(
+ `${lemmyBetaApiUrl}/community`,
+ {
+ method: 'PUT',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: wrapper(undeleteCommunityForm),
+ }
+ ).then(d => d.json());
+
+ // Make sure the delete went through
+ expect(undeleteCommunityRes.community.deleted).toBe(false);
+
+ // Re-get it from alpha, make sure its deleted there too
+ let getCommunityResAgain: GetCommunityResponse = await fetch(
+ getCommunityUrl,
+ {
+ method: 'GET',
+ }
+ ).then(d => d.json());
+ expect(getCommunityResAgain.community.deleted).toBe(false);
+ });
+ });
+
+ describe('remove things', () => {
+ test('/u/lemmy_beta removes and unremoves a federated comment, post, and community, lemmy_alpha sees its removed.', async () => {
+ // Create a test community
+ let communityName = 'test_community_rem';
+ let communityForm: CommunityForm = {
+ name: communityName,
+ title: communityName,
+ category_id: 1,
+ nsfw: false,
+ auth: lemmyBetaAuth,
+ };
+
+ let createCommunityRes: CommunityResponse = await fetch(
+ `${lemmyBetaApiUrl}/community`,
+ {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: wrapper(communityForm),
+ }
+ ).then(d => d.json());
+
+ expect(createCommunityRes.community.name).toBe(communityName);
+
+ // Cache it on lemmy_alpha
+ let searchUrl = `${lemmyAlphaApiUrl}/search?q=http://lemmy_beta:8550/c/${communityName}&type_=All&sort=TopAll`;
+ let searchResponse: SearchResponse = await fetch(searchUrl, {
+ method: 'GET',
+ }).then(d => d.json());
+
+ let communityOnAlphaId = searchResponse.communities[0].id;
+
+ // Follow it
+ let followForm: FollowCommunityForm = {
+ community_id: communityOnAlphaId,
+ follow: true,
+ auth: lemmyAlphaAuth,
+ };
+
+ let followRes: CommunityResponse = await fetch(
+ `${lemmyAlphaApiUrl}/community/follow`,
+ {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: wrapper(followForm),
+ }
+ ).then(d => d.json());
+
+ // Make sure the follow response went through
+ expect(followRes.community.local).toBe(false);
+ expect(followRes.community.name).toBe(communityName);
+
+ // Lemmy beta creates a test post
+ let postName = 'A jest test post with remove';
+ let createPostForm: PostForm = {
+ name: postName,
+ auth: lemmyBetaAuth,
+ community_id: createCommunityRes.community.id,
+ creator_id: 2,
+ nsfw: false,
+ };
+
+ let createPostRes: PostResponse = await fetch(`${lemmyBetaApiUrl}/post`, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: wrapper(createPostForm),
+ }).then(d => d.json());
+ expect(createPostRes.post.name).toBe(postName);
+
+ // Lemmy beta creates a test comment
+ let commentContent = 'A jest test federated comment with remove';
+ let createCommentForm: CommentForm = {
+ content: commentContent,
+ post_id: createPostRes.post.id,
+ auth: lemmyBetaAuth,
+ };
+
+ let createCommentRes: CommentResponse = await fetch(
+ `${lemmyBetaApiUrl}/comment`,
+ {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: wrapper(createCommentForm),
+ }
+ ).then(d => d.json());
+
+ expect(createCommentRes.comment.content).toBe(commentContent);
+
+ // lemmy_beta removes the comment
+ let removeCommentForm: CommentForm = {
+ content: commentContent,
+ edit_id: createCommentRes.comment.id,
+ post_id: createPostRes.post.id,
+ removed: true,
+ auth: lemmyBetaAuth,
+ creator_id: createCommentRes.comment.creator_id,
+ };
+
+ let removeCommentRes: CommentResponse = await fetch(
+ `${lemmyBetaApiUrl}/comment`,
+ {
+ method: 'PUT',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: wrapper(removeCommentForm),
+ }
+ ).then(d => d.json());
+ expect(removeCommentRes.comment.removed).toBe(true);
+
+ // lemmy_alpha sees that the comment is removed
+ let getPostUrl = `${lemmyAlphaApiUrl}/post?id=4`;
+ let getPostRes: GetPostResponse = await fetch(getPostUrl, {
+ method: 'GET',
+ }).then(d => d.json());
+ expect(getPostRes.comments[0].removed).toBe(true);
+
+ // lemmy_beta undeletes the comment
+ let unremoveCommentForm: CommentForm = {
+ content: commentContent,
+ edit_id: createCommentRes.comment.id,
+ post_id: createPostRes.post.id,
+ removed: false,
+ auth: lemmyBetaAuth,
+ creator_id: createCommentRes.comment.creator_id,
+ };
+
+ let unremoveCommentRes: CommentResponse = await fetch(
+ `${lemmyBetaApiUrl}/comment`,
+ {
+ method: 'PUT',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: wrapper(unremoveCommentForm),
+ }
+ ).then(d => d.json());
+ expect(unremoveCommentRes.comment.removed).toBe(false);
+
+ // lemmy_alpha sees that the comment is undeleted
+ let getPostUnremoveRes: GetPostResponse = await fetch(getPostUrl, {
+ method: 'GET',
+ }).then(d => d.json());
+ expect(getPostUnremoveRes.comments[0].removed).toBe(false);
+
+ // lemmy_beta deletes the post
+ let removePostForm: PostForm = {
+ name: postName,
+ edit_id: createPostRes.post.id,
+ auth: lemmyBetaAuth,
+ community_id: createPostRes.post.community_id,
+ creator_id: createPostRes.post.creator_id,
+ nsfw: false,
+ removed: true,
+ };
+
+ let removePostRes: PostResponse = await fetch(`${lemmyBetaApiUrl}/post`, {
+ method: 'PUT',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: wrapper(removePostForm),
+ }).then(d => d.json());
+ expect(removePostRes.post.removed).toBe(true);
+
+ // Make sure lemmy_alpha sees the post is deleted
+ let getPostResAgain: GetPostResponse = await fetch(getPostUrl, {
+ method: 'GET',
+ }).then(d => d.json());
+ expect(getPostResAgain.post.removed).toBe(true);
+
+ // lemmy_beta unremoves the post
+ let unremovePostForm: PostForm = {
+ name: postName,
+ edit_id: createPostRes.post.id,
+ auth: lemmyBetaAuth,
+ community_id: createPostRes.post.community_id,
+ creator_id: createPostRes.post.creator_id,
+ nsfw: false,
+ removed: false,
+ };
+
+ let unremovePostRes: PostResponse = await fetch(
+ `${lemmyBetaApiUrl}/post`,
+ {
+ method: 'PUT',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: wrapper(unremovePostForm),
+ }
+ ).then(d => d.json());
+ expect(unremovePostRes.post.removed).toBe(false);
+
+ // Make sure lemmy_alpha sees the post is unremoved
+ let getPostResAgainTwo: GetPostResponse = await fetch(getPostUrl, {
+ method: 'GET',
+ }).then(d => d.json());
+ expect(getPostResAgainTwo.post.removed).toBe(false);
+
+ // lemmy_beta deletes the community
+ let removeCommunityForm: CommunityForm = {
+ name: communityName,
+ title: communityName,
+ category_id: 1,
+ edit_id: createCommunityRes.community.id,
+ nsfw: false,
+ removed: true,
+ auth: lemmyBetaAuth,
+ };
+
+ let removeCommunityRes: CommunityResponse = await fetch(
+ `${lemmyBetaApiUrl}/community`,
+ {
+ method: 'PUT',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: wrapper(removeCommunityForm),
+ }
+ ).then(d => d.json());
+
+ // Make sure the delete went through
+ expect(removeCommunityRes.community.removed).toBe(true);
+
+ // Re-get it from alpha, make sure its removed there too
+ let getCommunityUrl = `${lemmyAlphaApiUrl}/community?id=${communityOnAlphaId}&auth=${lemmyAlphaAuth}`;
+ let getCommunityRes: GetCommunityResponse = await fetch(getCommunityUrl, {
+ method: 'GET',
+ }).then(d => d.json());
+
+ expect(getCommunityRes.community.removed).toBe(true);
+
+ // lemmy_beta unremoves the community
+ let unremoveCommunityForm: CommunityForm = {
+ name: communityName,
+ title: communityName,
+ category_id: 1,
+ edit_id: createCommunityRes.community.id,
+ nsfw: false,
+ removed: false,
+ auth: lemmyBetaAuth,
+ };
+
+ let unremoveCommunityRes: CommunityResponse = await fetch(
+ `${lemmyBetaApiUrl}/community`,
+ {
+ method: 'PUT',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: wrapper(unremoveCommunityForm),
+ }
+ ).then(d => d.json());
+
+ // Make sure the delete went through
+ expect(unremoveCommunityRes.community.removed).toBe(false);
+
+ // Re-get it from alpha, make sure its deleted there too
+ let getCommunityResAgain: GetCommunityResponse = await fetch(
+ getCommunityUrl,
+ {
+ method: 'GET',
+ }
+ ).then(d => d.json());
+ expect(getCommunityResAgain.community.removed).toBe(false);
+ });
+ }