soapbox/tests/test_core.py
Ole-Morten Duesund 50722bf7c2 Utdrag på forsiden og forenklet favicon
Forsiden viser første avsnitt av hvert innlegg som ren tekst (nytt
Jinja-filter `excerpt`, tilgjengelig for egne temaer). Favicon har
færre og større former med tykkere streker så det holder seg ved 16 px.
Siste to punkter fra UI-gjennomgangen.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JcEy43fNYpwg6K6oTKakWR
2026-08-26 14:14:25 +02:00

70 lines
2.5 KiB
Python

from datetime import UTC, datetime
from soapbox import db
from soapbox.content import dump_frontmatter, parse_frontmatter
from soapbox.images import process_image
from soapbox.render import relative_to, render_markdown
from soapbox.slug import slugify, unique_slug
from tests.conftest import png_bytes
def test_slugify_norwegian():
assert slugify("Grønt er skjønt: blåbær & øl!") == "grønt-er-skjønt-blåbær-øl"
assert slugify("Hello, World_2!") == "hello-world-2"
assert slugify("Blåbær") == slugify("Bla\u030abær") # NFD → NFC
assert slugify("日本語 タイトル") == "日本語-タイトル"
assert slugify(" ") == "post"
assert unique_slug("a", {"a", "a-2"}) == "a-3"
def test_frontmatter_roundtrip():
meta = {"title": 'Tittel: med "anførsel"', "date": "2026-01-01T00:00:00+00:00", "draft": True}
text = dump_frontmatter(meta, "# Hei\n\nbrødtekst")
parsed, body = parse_frontmatter(text)
assert parsed == meta
assert body.strip() == "# Hei\n\nbrødtekst"
def test_relative_paths():
assert relative_to("", "post1/") == "post1/"
assert relative_to("post1/", "") == "../"
assert relative_to("gjest/post1/", "post2/") == "../../post2/"
assert relative_to("gjest/post1/", "theme/style.css") == "../../theme/style.css"
def test_markdown_safe_and_relative():
html = render_markdown("<script>x</script>\n\n[a](/post2/#x) ![](b.jpg)", "g/p/")
assert "<script>" not in html
assert 'href="../../post2/#x"' in html
assert 'src="b.jpg"' in html
assert "//example.com" in render_markdown("[x](//example.com)")
def test_image_downscale():
data, ext = process_image(png_bytes((3000, 1500)), 2000)
import io
from PIL import Image
img = Image.open(io.BytesIO(data))
assert ext == ".png" and img.size == (2000, 1000)
def test_password_hashing(tmp_path):
conn = db.connect(tmp_path / "x.sqlite")
db.create_user(conn, "a", "passord123", db.ROLE_OWNER)
assert db.authenticate(conn, "a", "passord123")
assert db.authenticate(conn, "a", "feil") is None
assert db.has_owner(conn)
assert datetime.now(UTC) # sanity: UTC alias tilgjengelig
def test_excerpt_plain_text():
from soapbox.render import excerpt
assert (
excerpt("Hei **verden**. Se [forsiden](/) og ![alt](x.jpg) _her_.")
== "Hei verden. Se forsiden og her."
)
assert excerpt("# Overskrift\n\n```\nkode\n```\n\nTekst") == "Tekst"
assert excerpt("x " * 200, 50).endswith("")