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