Mentionify tests and some fixtures
This commit is contained in:
parent
0d1e09fbcd
commit
a80e0f117a
@ -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
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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>'
|
||||||
|
@ -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,
|
||||||
|
)
|
||||||
|
Reference in New Issue
Block a user