Mentionify tests and some fixtures

This commit is contained in:
Andrew Godwin 2022-11-21 20:25:00 -07:00
parent 0d1e09fbcd
commit a80e0f117a
4 changed files with 72 additions and 6 deletions

View file

@ -167,25 +167,24 @@ class Post(StatorModel):
""" """
def replacer(match): def replacer(match):
print(match)
precursor = match.group(1) precursor = match.group(1)
handle = match.group(2) handle = match.group(2)
# If the handle has no domain, try to match it with a mention # If the handle has no domain, try to match it with a mention
if "@" not in handle.lstrip("@"): if "@" not in handle.lstrip("@"):
identity = self.mentions.filter(username=handle.lstrip("@")).first() username = handle.lstrip("@")
identity = self.mentions.filter(username=username).first()
if identity: if identity:
url = identity.urls.view url = identity.urls.view
else: else:
url = None url = f"/@{username}/"
else: else:
url = f"/{handle}/" url = f"/{handle}/"
# If we have a URL, link to it, otherwise don't link # If we have a URL, link to it, otherwise don't link
if url: if url:
return f"{precursor}<a href='{url}'>{handle}</a>" return f'{precursor}<a href="{url}">{handle}</a>'
else: else:
return match.group() return match.group()
print(f"replacing on {content!r}")
return mark_safe(self.mention_regex.sub(replacer, content)) return mark_safe(self.mention_regex.sub(replacer, content))
@property @property

View file

@ -8,7 +8,7 @@ profile = black
multi_line_output = 3 multi_line_output = 3
[tool:pytest] [tool:pytest]
addopts = --tb=short --ds=takahe.settings.testing addopts = --tb=short --ds=takahe.settings.testing --import-mode=importlib
filterwarnings = filterwarnings =
ignore:There is no current event loop ignore:There is no current event loop

View file

@ -29,3 +29,35 @@ def test_fetch_post(httpx_mock: HTTPXMock):
assert post.author.actor_uri == "https://example.com/test-actor" assert post.author.actor_uri == "https://example.com/test-actor"
# Fetch again with a DB hit # Fetch again with a DB hit
assert Post.by_object_uri("https://example.com/test-post").id == post.id assert Post.by_object_uri("https://example.com/test-post").id == post.id
@pytest.mark.django_db
def test_linkify_mentions(identity, remote_identity):
"""
Tests that we can linkify post mentions properly
"""
# Test a short username without a mention (presumed local)
post = Post.objects.create(
content="<p>Hello @test</p>",
author=identity,
local=True,
)
assert post.safe_content == '<p>Hello <a href="/@test/">@test</a></p>'
# Test a full username
post = Post.objects.create(
content="<p>@test@example.com, welcome!</p>",
author=identity,
local=True,
)
assert (
post.safe_content
== '<p><a href="/@test@example.com/">@test@example.com</a>, welcome!</p>'
)
# Test a short username with a mention resolving to remote
post = Post.objects.create(
content="<p>Hello @test</p>",
author=identity,
local=True,
)
post.mentions.add(remote_identity)
assert post.safe_content == '<p>Hello <a href="/@test@remote.test/">@test</a></p>'

View file

@ -1,6 +1,7 @@
import pytest import pytest
from core.models import Config from core.models import Config
from users.models import Domain, Identity, User
@pytest.fixture @pytest.fixture
@ -57,3 +58,37 @@ def config_system(keypair):
system_actor_public_key=keypair["public_key"], system_actor_public_key=keypair["public_key"],
) )
yield Config.system yield Config.system
@pytest.fixture
@pytest.mark.django_db
def identity():
"""
Creates a basic test identity with a user and domain.
"""
user = User.objects.create(email="test@example.com")
domain = Domain.objects.create(domain="example.com", local=True, public=True)
return Identity.objects.create(
actor_uri="https://example.com/test-actor/",
username="test",
domain=domain,
user=user,
name="Test User",
local=True,
)
@pytest.fixture
@pytest.mark.django_db
def remote_identity():
"""
Creates a basic remote test identity with a domain.
"""
domain = Domain.objects.create(domain="remote.test", local=False)
return Identity.objects.create(
actor_uri="https://remote.test/test-actor/",
username="test",
domain=domain,
name="Test Remote User",
local=False,
)