Mentionify tests and some fixtures
This commit is contained in:
parent
0d1e09fbcd
commit
a80e0f117a
@ -167,25 +167,24 @@ class Post(StatorModel):
|
||||
"""
|
||||
|
||||
def replacer(match):
|
||||
print(match)
|
||||
precursor = match.group(1)
|
||||
handle = match.group(2)
|
||||
# If the handle has no domain, try to match it with a mention
|
||||
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:
|
||||
url = identity.urls.view
|
||||
else:
|
||||
url = None
|
||||
url = f"/@{username}/"
|
||||
else:
|
||||
url = f"/{handle}/"
|
||||
# If we have a URL, link to it, otherwise don't link
|
||||
if url:
|
||||
return f"{precursor}<a href='{url}'>{handle}</a>"
|
||||
return f'{precursor}<a href="{url}">{handle}</a>'
|
||||
else:
|
||||
return match.group()
|
||||
|
||||
print(f"replacing on {content!r}")
|
||||
return mark_safe(self.mention_regex.sub(replacer, content))
|
||||
|
||||
@property
|
||||
|
@ -8,7 +8,7 @@ profile = black
|
||||
multi_line_output = 3
|
||||
|
||||
[tool:pytest]
|
||||
addopts = --tb=short --ds=takahe.settings.testing
|
||||
addopts = --tb=short --ds=takahe.settings.testing --import-mode=importlib
|
||||
filterwarnings =
|
||||
ignore:There is no current event loop
|
||||
|
||||
|
@ -29,3 +29,35 @@ def test_fetch_post(httpx_mock: HTTPXMock):
|
||||
assert post.author.actor_uri == "https://example.com/test-actor"
|
||||
# Fetch again with a DB hit
|
||||
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>'
|
||||
|
@ -1,6 +1,7 @@
|
||||
import pytest
|
||||
|
||||
from core.models import Config
|
||||
from users.models import Domain, Identity, User
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
@ -57,3 +58,37 @@ def config_system(keypair):
|
||||
system_actor_public_key=keypair["public_key"],
|
||||
)
|
||||
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,
|
||||
)
|
||||
|
Reference in New Issue
Block a user