mirror of
https://github.com/LemmyNet/lemmy.git
synced 2024-11-29 15:51:20 +00:00
More test coverage for private community, fix some bugs
This commit is contained in:
parent
797aac7281
commit
0f7c9a6586
4 changed files with 145 additions and 3 deletions
|
@ -21,6 +21,9 @@ import {
|
||||||
resolveComment,
|
resolveComment,
|
||||||
likeComment,
|
likeComment,
|
||||||
waitUntil,
|
waitUntil,
|
||||||
|
gamma,
|
||||||
|
getPosts,
|
||||||
|
getComments,
|
||||||
} from "./shared";
|
} from "./shared";
|
||||||
|
|
||||||
beforeAll(setupLogins);
|
beforeAll(setupLogins);
|
||||||
|
@ -47,6 +50,7 @@ test("Follow a private community", async () => {
|
||||||
await resolveCommunity(user, community.community_view.community.actor_id)
|
await resolveCommunity(user, community.community_view.community.actor_id)
|
||||||
).community;
|
).community;
|
||||||
expect(betaCommunity).toBeDefined();
|
expect(betaCommunity).toBeDefined();
|
||||||
|
expect(betaCommunity?.community.visibility).toBe('Private');
|
||||||
const betaCommunityId = betaCommunity!.community.id;
|
const betaCommunityId = betaCommunity!.community.id;
|
||||||
const follow_form: FollowCommunity = {
|
const follow_form: FollowCommunity = {
|
||||||
community_id: betaCommunityId,
|
community_id: betaCommunityId,
|
||||||
|
@ -212,3 +216,136 @@ test("Reject follower", async () => {
|
||||||
c => c.community_view.subscribed == "NotSubscribed",
|
c => c.community_view.subscribed == "NotSubscribed",
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test("Follow a private community and receive activities", async () => {
|
||||||
|
// create private community
|
||||||
|
const community = await createCommunity(alpha, randomString(10), "Private");
|
||||||
|
expect(community.community_view.community.visibility).toBe("Private");
|
||||||
|
const alphaCommunityId = community.community_view.community.id;
|
||||||
|
|
||||||
|
// follow with users from beta and gamma
|
||||||
|
const user = await registerUser(beta, betaUrl);
|
||||||
|
const betaCommunity = (
|
||||||
|
await resolveCommunity(user, community.community_view.community.actor_id)
|
||||||
|
).community;
|
||||||
|
expect(betaCommunity).toBeDefined();
|
||||||
|
const betaCommunityId = betaCommunity!.community.id;
|
||||||
|
const follow_form_beta: FollowCommunity = {
|
||||||
|
community_id: betaCommunityId,
|
||||||
|
follow: true,
|
||||||
|
};
|
||||||
|
await user.followCommunity(follow_form_beta);
|
||||||
|
|
||||||
|
const gammaCommunityId = (
|
||||||
|
await resolveCommunity(gamma, community.community_view.community.actor_id)
|
||||||
|
).community!.community.id;
|
||||||
|
const follow_form_gamma: FollowCommunity = {
|
||||||
|
community_id: gammaCommunityId,
|
||||||
|
follow: true,
|
||||||
|
};
|
||||||
|
await gamma.followCommunity(follow_form_gamma);
|
||||||
|
|
||||||
|
// Wait for follow to federate, shown as pending
|
||||||
|
let pendingFollows1 = await waitUntil(
|
||||||
|
() => listCommunityPendingFollows(alpha),
|
||||||
|
f => f.items.length == 2,
|
||||||
|
);
|
||||||
|
|
||||||
|
// Approve the follow
|
||||||
|
const approve1 = await approveCommunityPendingFollow(
|
||||||
|
alpha,
|
||||||
|
alphaCommunityId,
|
||||||
|
pendingFollows1.items[0].person.id,
|
||||||
|
);
|
||||||
|
expect(approve1.success).toBe(true);
|
||||||
|
const approve2 = await approveCommunityPendingFollow(
|
||||||
|
alpha,
|
||||||
|
alphaCommunityId,
|
||||||
|
pendingFollows1.items[1].person.id,
|
||||||
|
);
|
||||||
|
expect(approve2.success).toBe(true);
|
||||||
|
|
||||||
|
// Follow is confirmed
|
||||||
|
// Follow is confirmed
|
||||||
|
await waitUntil(
|
||||||
|
() => getCommunity(user, betaCommunityId),
|
||||||
|
c => c.community_view.subscribed == "Subscribed",
|
||||||
|
);
|
||||||
|
await waitUntil(
|
||||||
|
() => getCommunity(gamma, gammaCommunityId),
|
||||||
|
c => c.community_view.subscribed == "Subscribed",
|
||||||
|
);
|
||||||
|
|
||||||
|
// create a post and comment from gamma
|
||||||
|
const post = await createPost(gamma, gammaCommunityId);
|
||||||
|
const post_id = post.post_view.post.id;
|
||||||
|
expect(post_id).toBeDefined();
|
||||||
|
const comment = await createComment(gamma, post_id);
|
||||||
|
const comment_id = comment.comment_view.comment.id;
|
||||||
|
expect(comment_id).toBeDefined();
|
||||||
|
|
||||||
|
// post and comment were federated to beta
|
||||||
|
let posts = await waitUntil(
|
||||||
|
() => getPosts(user, 'All', betaCommunityId),
|
||||||
|
c => c.posts.length == 1,
|
||||||
|
);
|
||||||
|
expect(posts.posts[0].post.ap_id).toBe(post.post_view.post.ap_id);
|
||||||
|
expect(posts.posts[0].post.name).toBe(post.post_view.post.name);
|
||||||
|
let comments = await waitUntil(
|
||||||
|
() => getComments(user, posts.posts[0].post.id),
|
||||||
|
c => c.comments.length == 1,
|
||||||
|
);
|
||||||
|
expect(comments.comments[0].comment.ap_id).toBe(comment.comment_view.comment.ap_id);
|
||||||
|
expect(comments.comments[0].comment.content).toBe(comment.comment_view.comment.content);
|
||||||
|
});
|
||||||
|
|
||||||
|
test("Fetch remote content in private community", async () => {
|
||||||
|
// create private community
|
||||||
|
const community = await createCommunity(alpha, randomString(10), "Private");
|
||||||
|
expect(community.community_view.community.visibility).toBe("Private");
|
||||||
|
const alphaCommunityId = community.community_view.community.id;
|
||||||
|
|
||||||
|
// create post and comment
|
||||||
|
const betaCommunityId = (
|
||||||
|
await resolveCommunity(beta, community.community_view.community.actor_id)
|
||||||
|
).community!.community.id;
|
||||||
|
const post = await createPost(beta, betaCommunityId);
|
||||||
|
const post_id = post.post_view.post.id;
|
||||||
|
expect(post_id).toBeDefined();
|
||||||
|
const comment = await createComment(beta, post_id);
|
||||||
|
const comment_id = comment.comment_view.comment.id;
|
||||||
|
expect(comment_id).toBeDefined();
|
||||||
|
|
||||||
|
// user is not following the community and cannot view nor create posts
|
||||||
|
const user = await registerUser(gamma, betaUrl);
|
||||||
|
const gammaCommunityId = (
|
||||||
|
await resolveCommunity(user, community.community_view.community.actor_id)
|
||||||
|
).community!.community.id;
|
||||||
|
|
||||||
|
// follow the community and approve
|
||||||
|
const follow_form: FollowCommunity = {
|
||||||
|
community_id: gammaCommunityId,
|
||||||
|
follow: true,
|
||||||
|
};
|
||||||
|
await user.followCommunity(follow_form);
|
||||||
|
const pendingFollows1 = await waitUntil(
|
||||||
|
() => listCommunityPendingFollows(alpha),
|
||||||
|
f => f.items.length == 1,
|
||||||
|
);
|
||||||
|
const approve = await approveCommunityPendingFollow(
|
||||||
|
alpha,
|
||||||
|
alphaCommunityId,
|
||||||
|
pendingFollows1.items[0].person.id,
|
||||||
|
);
|
||||||
|
expect(approve.success).toBe(true);
|
||||||
|
|
||||||
|
// now user can fetch posts and comments in community (using signed fetch), and create posts
|
||||||
|
await waitUntil(
|
||||||
|
() => resolvePost(user, post.post_view.post),
|
||||||
|
p => p?.post?.post.id != undefined,
|
||||||
|
);
|
||||||
|
const resolvedComment = (
|
||||||
|
await resolveComment(user, comment.comment_view.comment)
|
||||||
|
).comment;
|
||||||
|
expect(resolvedComment?.comment.id).toBeDefined();
|
||||||
|
});
|
||||||
|
|
|
@ -215,7 +215,7 @@ async fn can_accept_activity_in_community(
|
||||||
) -> LemmyResult<()> {
|
) -> LemmyResult<()> {
|
||||||
if let Some(community) = community {
|
if let Some(community) = community {
|
||||||
// Local only community can't federate
|
// Local only community can't federate
|
||||||
if community.visibility != CommunityVisibility::Public {
|
if community.visibility == CommunityVisibility::LocalOnly {
|
||||||
return Err(LemmyErrorType::NotFound.into());
|
return Err(LemmyErrorType::NotFound.into());
|
||||||
}
|
}
|
||||||
if !community.local {
|
if !community.local {
|
||||||
|
|
|
@ -42,7 +42,7 @@ pub(crate) async fn send_activity_in_community(
|
||||||
context: &Data<LemmyContext>,
|
context: &Data<LemmyContext>,
|
||||||
) -> LemmyResult<()> {
|
) -> LemmyResult<()> {
|
||||||
// If community is local only, don't send anything out
|
// If community is local only, don't send anything out
|
||||||
if community.visibility != CommunityVisibility::Public {
|
if community.visibility == CommunityVisibility::LocalOnly {
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -171,7 +171,12 @@ impl ActivityHandler for CreateOrUpdateNote {
|
||||||
// TODO: for compatibility with other projects, it would be much better to read this from cc or
|
// TODO: for compatibility with other projects, it would be much better to read this from cc or
|
||||||
// tags
|
// tags
|
||||||
let mentions = scrape_text_for_mentions(&comment.content);
|
let mentions = scrape_text_for_mentions(&comment.content);
|
||||||
send_local_notifs(mentions, comment.id, &actor, do_send_email, context, None).await?;
|
|
||||||
|
// TODO: this fails in local community comment as CommentView::read() returns nothing
|
||||||
|
// without passing LocalUser
|
||||||
|
send_local_notifs(mentions, comment.id, &actor, do_send_email, context, None)
|
||||||
|
.await
|
||||||
|
.ok();
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue