From 25450ea090313618a0302ed71fa94d52650f494f Mon Sep 17 00:00:00 2001 From: Nutomic Date: Fri, 17 Nov 2023 10:55:26 +0100 Subject: [PATCH] Fix following local communities stuck on pending (fixes #4160) (#4161) * Fix following local communities stuck on pending (fixes #4160) * fmt * remove import --------- Co-authored-by: Dessalines --- api_tests/package.json | 1 + api_tests/src/follow.spec.ts | 37 ++++++++++++++++++- api_tests/src/shared.ts | 5 ++- crates/api/src/community/follow.rs | 15 ++++---- .../apub/src/activities/following/follow.rs | 9 ----- 5 files changed, 48 insertions(+), 19 deletions(-) diff --git a/api_tests/package.json b/api_tests/package.json index 653d57e32..bd6681535 100644 --- a/api_tests/package.json +++ b/api_tests/package.json @@ -10,6 +10,7 @@ "lint": "tsc --noEmit && eslint --report-unused-disable-directives --ext .js,.ts,.tsx src && prettier --check 'src/**/*.ts'", "fix": "prettier --write src && eslint --fix src", "api-test": "jest -i follow.spec.ts && jest -i post.spec.ts && jest -i comment.spec.ts && jest -i private_message.spec.ts && jest -i user.spec.ts && jest -i community.spec.ts && jest -i image.spec.ts", + "api-test-follow": "jest -i follow.spec.ts", "api-test-comment": "jest -i comment.spec.ts", "api-test-post": "jest -i post.spec.ts", "api-test-user": "jest -i user.spec.ts", diff --git a/api_tests/src/follow.spec.ts b/api_tests/src/follow.spec.ts index 89d078848..60ec98991 100644 --- a/api_tests/src/follow.spec.ts +++ b/api_tests/src/follow.spec.ts @@ -1,5 +1,6 @@ jest.setTimeout(120000); +import { LemmyHttp } from "lemmy-js-client"; import { alpha, setupLogins, @@ -8,6 +9,9 @@ import { unfollowRemotes, getSite, waitUntil, + beta, + registerUser, + betaUrl, } from "./shared"; beforeAll(setupLogins); @@ -16,12 +20,35 @@ afterAll(() => { unfollowRemotes(alpha); }); +test("Follow local community", async () => { + let userRes = await registerUser(beta); + expect(userRes.jwt).toBeDefined(); + let user = new LemmyHttp(betaUrl, { + headers: { Authorization: `Bearer ${userRes.jwt ?? ""}` }, + }); + + let community = (await resolveBetaCommunity(user)).community!; + expect(community.counts.subscribers).toBe(1); + let follow = await followCommunity(user, true, community.community.id); + + // Make sure the follow response went through + expect(follow.community_view.community.local).toBe(true); + expect(follow.community_view.subscribed).toBe("Subscribed"); + expect(follow.community_view.counts.subscribers).toBe(2); + + // Test an unfollow + let unfollow = await followCommunity(user, false, community.community.id); + expect(unfollow.community_view.subscribed).toBe("NotSubscribed"); + expect(unfollow.community_view.counts.subscribers).toBe(1); +}); + test("Follow federated community", async () => { let betaCommunity = (await resolveBetaCommunity(alpha)).community; if (!betaCommunity) { throw "Missing beta community"; } - await followCommunity(alpha, true, betaCommunity.community.id); + let follow = await followCommunity(alpha, true, betaCommunity.community.id); + expect(follow.community_view.subscribed).toBe("Pending"); betaCommunity = ( await waitUntil( () => resolveBetaCommunity(alpha), @@ -34,6 +61,10 @@ test("Follow federated community", async () => { expect(betaCommunity?.community.name).toBe("main"); expect(betaCommunity?.subscribed).toBe("Subscribed"); + // check that unfollow was federated + let communityOnBeta1 = await resolveBetaCommunity(beta); + expect(communityOnBeta1.community?.counts.subscribers).toBe(2); + // Check it from local let site = await getSite(alpha); let remoteCommunityId = site.my_user?.follows.find( @@ -53,4 +84,8 @@ test("Follow federated community", async () => { // Make sure you are unsubbed locally let siteUnfollowCheck = await getSite(alpha); expect(siteUnfollowCheck.my_user?.follows.length).toBe(1); + + // check that unfollow was federated + let communityOnBeta2 = await resolveBetaCommunity(beta); + expect(communityOnBeta2.community?.counts.subscribers).toBe(1); }); diff --git a/api_tests/src/shared.ts b/api_tests/src/shared.ts index 5a6a82ed2..f6668be08 100644 --- a/api_tests/src/shared.ts +++ b/api_tests/src/shared.ts @@ -425,8 +425,9 @@ export async function followCommunity( }; const res = await api.followCommunity(form); await waitUntil( - () => resolveCommunity(api, res.community_view.community.actor_id), - g => g.community?.subscribed === (follow ? "Subscribed" : "NotSubscribed"), + () => getCommunity(api, res.community_view.community.id), + g => + g.community_view.subscribed === (follow ? "Subscribed" : "NotSubscribed"), ); // wait FOLLOW_ADDITIONS_RECHECK_DELAY (there's no API to wait for this currently) await delay(2000); diff --git a/crates/api/src/community/follow.rs b/crates/api/src/community/follow.rs index 497aa83cf..bb7b80f00 100644 --- a/crates/api/src/community/follow.rs +++ b/crates/api/src/community/follow.rs @@ -45,18 +45,19 @@ pub async fn follow_community( .await .with_lemmy_type(LemmyErrorType::CommunityFollowerAlreadyExists)?; } - } - if !data.follow { + } else { CommunityFollower::unfollow(&mut context.pool(), &community_follower_form) .await .with_lemmy_type(LemmyErrorType::CommunityFollowerAlreadyExists)?; } - ActivityChannel::submit_activity( - SendActivityData::FollowCommunity(community, local_user_view.person.clone(), data.follow), - &context, - ) - .await?; + if !community.local { + ActivityChannel::submit_activity( + SendActivityData::FollowCommunity(community, local_user_view.person.clone(), data.follow), + &context, + ) + .await?; + } let community_id = data.community_id; let person_id = local_user_view.person.id; diff --git a/crates/apub/src/activities/following/follow.rs b/crates/apub/src/activities/following/follow.rs index 6f6e2718f..2b439f1f5 100644 --- a/crates/apub/src/activities/following/follow.rs +++ b/crates/apub/src/activities/following/follow.rs @@ -52,15 +52,6 @@ impl Follow { community: &ApubCommunity, context: &Data, ) -> Result<(), LemmyError> { - let community_follower_form = CommunityFollowerForm { - community_id: community.id, - person_id: actor.id, - pending: true, - }; - CommunityFollower::follow(&mut context.pool(), &community_follower_form) - .await - .ok(); - let follow = Follow::new(actor, community, context)?; let inbox = if community.local { ActivitySendTargets::empty()