A community's vote on our reply counts, followed or not
Lemmy sends a vote to the community alone, which relays it to the post's server. A persona's reply in a thread of a community nobody here follows lost its Lemmy upvotes: the relay was dropped as "not followed". Such a relay is now taken when the vote (or its undo) is on one of our posts in a thread rooted in that community; from any other unfollowed group it is still dropped. For that, a post keeps the community its `audience` names (FEP-1b12) however it arrived, fetched for a thread as well as announced. Found by the town's village (p191: 1 like counted of 2). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LsXgEaXee4GCU1hwYgPJXw
This commit is contained in:
1 parent
8686275b69
commit
7e37f56db6
4 files changed
+62
-2
No files matched your search
@@ -209,6 +209,36 @@ namespace PrivaPub.Tests.Federation
|
||||
Assert.False(await DB.Default.Find<Favourite>().Match(f => f.PostId == post.ID).ExecuteAnyAsync(token));
|
||||
}
|
||||
|
||||
// Lemmy sends a vote to the community alone: a vote on our reply in a thread of a community nobody here follows still
|
||||
// reaches us through it, and only through that community (found by the town's village)
|
||||
[Fact]
|
||||
public async Task A_vote_on_our_reply_in_an_unfollowed_communitys_thread_counts_through_that_community_only()
|
||||
{
|
||||
var token = TestContext.Current.CancellationToken;
|
||||
var (_, alice) = await _harness.Persona("alice");
|
||||
var community = new RemoteActor(_harness.Peer, "cats", type: "Group");
|
||||
var other = new RemoteActor(_harness.Peer, "dogs", type: "Group");
|
||||
var poster = new RemoteActor(_harness.Peer, "poster");
|
||||
var voter = new RemoteActor(_harness.Peer, "voter");
|
||||
var page = PublicNote(poster, "<p>a thread</p>", community.Id);
|
||||
page["type"] = "Page";
|
||||
page["name"] = "a thread";
|
||||
page["audience"] = community.Id;
|
||||
_harness.Peer.Serve(new Uri(IdOf(page)).AbsolutePath, page.ToJsonString());
|
||||
var root = await _harness.RemotePosts.StoreContext(IdOf(page), 0, token);
|
||||
Assert.Equal(community.Id, root.AudienceURI);
|
||||
var reply = (await _harness.Statuses.Publish(alice, new StatusDraft { Text = "my answer", InReplyTo = root.ID }, token)).Post;
|
||||
var like = new JsonObject { ["id"] = NewId(voter, "likes"), ["type"] = "Like", ["actor"] = voter.Id, ["object"] = reply.ObjectURI };
|
||||
|
||||
await _harness.Deliver(other, "/human-centipede", Activity(other, "Announce", like));
|
||||
Assert.Equal(("dropped", "not-followed"), (Processed("Announce").Outcome, Processed("Announce").Reason));
|
||||
await _harness.Deliver(community, "/human-centipede", Activity(community, "Announce", like));
|
||||
Assert.Equal("accepted", Processed("Announce").Outcome);
|
||||
Assert.Equal(1, (await DB.Default.Find<Post>().OneAsync(reply.ID, token)).FavouritesCount);
|
||||
await _harness.Deliver(community, "/human-centipede", Activity(community, "Announce", Activity(voter, "Undo", like)));
|
||||
Assert.Equal(0, (await DB.Default.Find<Post>().OneAsync(reply.ID, token)).FavouritesCount);
|
||||
}
|
||||
|
||||
// Lemmy's moderators lock a community's post and ban members, and the community relays both inside its Announce
|
||||
// (G-0006): a locked post takes no reply, a banned persona posts nothing there, until the Undo
|
||||
[Fact]
|
||||
|
||||
Reference in new issue
Block a user