One visibility rule for every public read
VisibilityPolicy.IsPublic is the single expression for "anyone may see this" (Public or Unlisted, not deleted); the outbox, the object and activity endpoints, the HTML pages and NodeInfo all use it instead of spelling it out. CanSee answers for a persona: the author, a mentioned local persona, a conversation member for Direct, a circle member for Circle; followers-only waits for P1.2's follows. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012CzABvBkbcFqoHdmi8b9WB
This commit is contained in:
1 parent
5a13597c00
commit
1c78da34a9
5 files changed
+97
-15
No files matched your search
@@ -0,0 +1,42 @@
|
||||
using MongoDB.Entities;
|
||||
|
||||
using PrivaPub.Domain.Privacy;
|
||||
using PrivaPub.Models.Group;
|
||||
using PrivaPub.Models.Post;
|
||||
using PrivaPub.Tests.Support;
|
||||
|
||||
using GroupEntity = PrivaPub.Models.Group.Group;
|
||||
|
||||
namespace PrivaPub.Tests.Domain
|
||||
{
|
||||
[Trait("Category", "Integration")]
|
||||
public class VisibilityPolicyTests
|
||||
{
|
||||
[Fact]
|
||||
public async Task Who_sees_what()
|
||||
{
|
||||
Assert.SkipUnless(MongoFixture.Enabled, MongoFixture.Skip);
|
||||
var token = TestContext.Current.CancellationToken;
|
||||
var conversation = new DmGroup { Members = new() { new GroupMember { AvatarId = "alice" }, new GroupMember { AvatarId = "https://r.example/u/bob", IsForeign = true } } };
|
||||
var circle = new GroupEntity { UserName = $"c{Guid.NewGuid():N}"[..20], Members = new() { new GroupMember { AvatarId = "carol" } } };
|
||||
await DB.Default.SaveAsync(conversation, token);
|
||||
await DB.Default.SaveAsync(circle, token);
|
||||
|
||||
var direct = new Post { Visibility = PostVisibility.Direct, ConversationId = conversation.ID, GroupUserId = "dave" };
|
||||
var circlePost = new Post { Visibility = PostVisibility.Circle, GroupId = circle.ID };
|
||||
var followersOnly = new Post { Visibility = PostVisibility.FollowersOnly, Mentions = new() { new PostMention { IsLocal = true, AccountId = "erin" } } };
|
||||
var deleted = new Post { Visibility = PostVisibility.Public, DeletedAt = DateTime.UtcNow };
|
||||
|
||||
Assert.True(await VisibilityPolicy.CanSee(new Post(), default, token));
|
||||
Assert.True(await VisibilityPolicy.CanSee(direct, "alice", token));
|
||||
Assert.True(await VisibilityPolicy.CanSee(direct, "dave", token));
|
||||
Assert.False(await VisibilityPolicy.CanSee(direct, "carol", token));
|
||||
Assert.False(await VisibilityPolicy.CanSee(direct, default, token));
|
||||
Assert.True(await VisibilityPolicy.CanSee(circlePost, "carol", token));
|
||||
Assert.False(await VisibilityPolicy.CanSee(circlePost, "alice", token));
|
||||
Assert.True(await VisibilityPolicy.CanSee(followersOnly, "erin", token));
|
||||
Assert.False(await VisibilityPolicy.CanSee(followersOnly, "alice", token));
|
||||
Assert.False(await VisibilityPolicy.CanSee(deleted, "alice", token));
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user