Sitemap, Open Graph-metadata og --follow-historikk

- sitemap.xml med forside, innlegg (lastmod) og gjesteoversikter.
- Open Graph/Twitter-kort på alle sider; innlegg får article-type,
  utdrag som beskrivelse, første bilde som og:image og canonical.
  Absolutte URL-er via SOAPBOX_SITE_URL.
- Historikk per innlegg kombinerer `git log --follow` på index.md med
  loggen for mappen, så utkast-lagringer fra før slug-omdøpingen vises.
  Diffen begrenses ikke lenger til nåværende sti av samme grunn.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JcEy43fNYpwg6K6oTKakWR
This commit is contained in:
Ole-Morten Duesund 2026-08-26 14:39:29 +02:00
commit 2f74de4a32
6 changed files with 106 additions and 18 deletions

View file

@ -180,6 +180,7 @@ def test_post_history(client, cfg):
html = client.get(f"/admin/history/{pid}").text
assert "Publiserte: Hist" in html and "Lagret: Hist" in html
assert "Opprettet utkast" in html # fra før slug-omdøpingen (--follow)
sha = re.search(r"sha=([0-9a-f]{40})", html).group(1)
diff = client.get(f"/admin/history/{pid}?sha={sha}").text
assert '<span class="add">+andre</span>' in diff and '<span class="del">-første</span>' in diff
@ -264,3 +265,34 @@ def test_logo_links_to_blog_root(client):
assert '<a class="brand" href="/"' in client.get("/admin/").text
# offentlig tema: relativt til roten fra hvilken som helst dybde
assert 'class="site-title" href="./"' in client.get("/").text
def test_sitemap_and_open_graph(client, cfg):
post_id = _create_post(client)
token = csrf(client)
client.post(
f"/admin/upload/{post_id}",
data={"file": (__import__("io").BytesIO(png_bytes((10, 10))), "b.png")},
headers={"X-CSRF": token},
content_type="multipart/form-data",
)
client.post(
f"/admin/edit/{post_id}",
data={
"csrf": token,
"title": "OG-test",
"body": "Første *avsnitt* her.\n\n![x](b.png)",
"action": "publish",
},
)
html = client.get("/og-test/").text
assert '<meta property="og:type" content="article">' in html
assert '<meta property="og:title" content="OG-test">' in html
assert '<meta property="og:url" content="https://blog.example.no/og-test/">' in html
assert '<meta property="og:image" content="https://blog.example.no/og-test/b.png">' in html
assert '<meta property="og:description" content="Første avsnitt her.">' in html
assert '<meta property="og:type" content="website">' in client.get("/").text
sm = client.get("/sitemap.xml")
assert sm.status_code == 200
assert "<loc>https://blog.example.no/</loc>" in sm.text
assert "<loc>https://blog.example.no/og-test/</loc>" in sm.text