More test coverage for private community, fix some bugs

This commit is contained in:
Felix Ableitner 2024-11-18 11:33:25 +01:00
parent 797aac7281
commit 0f7c9a6586
4 changed files with 145 additions and 3 deletions

View file

@ -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();
});

View file

@ -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 {

View file

@ -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(());
} }

View file

@ -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(())
} }
} }