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
43 lines
2.0 KiB
C#
43 lines
2.0 KiB
C#
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));
|
|
}
|
|
}
|
|
}
|