Hello
", + author=identity, + local=True, + ) + targets = async_to_sync(post.aget_targets)() + assert targets == {identity} + + # Test remote reply targets original post author + Post.objects.create( + content="Reply
", + author=remote_identity, + local=False, + in_reply_to=post.absolute_object_uri(), + ) + targets = async_to_sync(post.aget_targets)() + assert targets == {identity} + + # Test a post with local and remote mentions + post = Post.objects.create( + content="Hello @test and @other
", + author=identity, + local=True, + ) + # Mentions are targeted + post.mentions.add(remote_identity) + post.mentions.add(other_identity) + targets = async_to_sync(post.aget_targets)() + # Targets everyone + assert targets == {identity, other_identity, remote_identity} + + # Test remote post with mentions + post.local = False + post.save() + targets = async_to_sync(post.aget_targets)() + # Only targets locals + assert targets == {identity, other_identity} + + +@pytest.mark.django_db +def test_post_local_only(identity, other_identity, remote_identity): + """ + Tests that a simple top level post returns the correct targets. + """ + # Test a short username (remote) + post = Post.objects.create( + content="Hello @test and @other
", + author=identity, + local=True, + visibility=Post.Visibilities.local_only, + ) + post.mentions.add(remote_identity) + post.mentions.add(other_identity) + + # Remote mention is not targeted + post.mentions.add(remote_identity) + targets = async_to_sync(post.aget_targets)() + assert targets == {identity, other_identity} + + +@pytest.mark.django_db +def test_post_followers(identity, other_identity, remote_identity): + + Follow.objects.create(source=other_identity, target=identity) + Follow.objects.create(source=remote_identity, target=identity) + + # Test Public post w/o mentions targets self and followers + post = Post.objects.create( + content="Hello
", + author=identity, + local=True, + visibility=Post.Visibilities.public, + ) + targets = async_to_sync(post.aget_targets)() + assert targets == {identity, other_identity, remote_identity} + + # Remote post only targets local followers + post.local = False + post.save() + targets = async_to_sync(post.aget_targets)() + assert targets == {identity, other_identity} + + # Local Only post only targets local followers + post.local = True + post.visibility = Post.Visibilities.local_only + post.save() + targets = async_to_sync(post.aget_targets)() + assert targets == {identity, other_identity} + + # Mentioned posts do not target unmentioned followers + post.visibility = Post.Visibilities.mentioned + post.save() + targets = async_to_sync(post.aget_targets)() + assert targets == {identity} diff --git a/tests/conftest.py b/tests/conftest.py index 48ee95a..d506c5c 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -68,11 +68,16 @@ def user() -> User: @pytest.fixture @pytest.mark.django_db -def identity(user): +def domain() -> Domain: + return Domain.objects.create(domain="example.com", local=True, public=True) + + +@pytest.fixture +@pytest.mark.django_db +def identity(user, domain) -> Identity: """ Creates a basic test identity with a user and domain. """ - domain = Domain.objects.create(domain="example.com", local=True, public=True) identity = Identity.objects.create( actor_uri="https://example.com/@test@example.com/", username="test", @@ -84,9 +89,25 @@ def identity(user): return identity +@pytest.fixture +def other_identity(user, domain) -> Identity: + """ + Creates a different basic test identity with a user and domain. + """ + identity = Identity.objects.create( + actor_uri="https://example.com/@other@example.com/", + username="other", + domain=domain, + name="Other User", + local=True, + ) + identity.users.set([user]) + return identity + + @pytest.fixture @pytest.mark.django_db -def remote_identity(): +def remote_identity() -> Identity: """ Creates a basic remote test identity with a domain. """