fix: og:image et twitter:image en URL absolue (v7.69.1)
Les meta `og:image` / `twitter:image` ajoutés en v7.69.0 pointaient vers une URL relative (`/static/img/logo-512.jpg`). Les crawlers — LinkedIn, Slack, Discord, iMessage — ignorent une URL relative : la carte de partage de FlowDeck était donc vide partout où un lien est collé. Correction via le motif déjà en place dans `app/templating.py` : un global Jinja `app_base_url()` construit à partir de `settings.app_base_url`, qui est LA MÊME source que les liens de partage de pages (`collaboration.py:32`). Si cette valeur est mal renseignée, ces liens l'étaient déjà — comportement cohérent plutôt qu'une deuxième source de vérité à maintenir. Lecture paresseuse de `settings` dans la fonction, à l'image de `_plugin_enabled` : un import au chargement du module créerait un import circulaire. Rendu vérifié sur l'instance déployée : og:image" content="http://localhost:8080/static/img/logo-512.jpg Tests : `test_og_image_url_is_absolute_via_base_url` vérifie le global ET l'absence de la forme relative dans les deux templates. Piège évité au passage — la forme absolue CONTIENT l'ancienne en sous-chaîne, donc l'assertion négative porte sur `content="/static/img/` (le guillemet avant la barre) et non sur l'URL complète. pytest 1413 passed / 0 failed · ruff OK · OpenAPI 526 chemins / 7.69.1 e2e 14/14 verts sur l'instance redéployée
This commit is contained in:
@@ -123,10 +123,22 @@ class TestBranding:
|
||||
|
||||
def test_base_head_declares_open_graph(self):
|
||||
base = (ROOT / "app" / "templates" / "base.html").read_text(encoding="utf-8")
|
||||
assert 'property="og:image" content="/static/img/logo-512.jpg"' in base
|
||||
# URL ABSOLUE : les crawlers ignorent les URL relatives
|
||||
assert 'content="{{ app_base_url() }}/static/img/logo-512.jpg"' in base
|
||||
assert 'name="twitter:card" content="summary_large_image"' in base
|
||||
assert '<meta name="description"' in base
|
||||
|
||||
def test_og_image_url_is_absolute_via_base_url(self):
|
||||
# le global expose la même source que les liens de partage de pages
|
||||
templating = (ROOT / "app" / "templating.py").read_text(encoding="utf-8")
|
||||
assert 'ENV.globals["app_base_url"]' in templating
|
||||
for tpl in ("base.html", "landing.html"):
|
||||
src = (ROOT / "app" / "templates" / tpl).read_text(encoding="utf-8")
|
||||
assert 'content="{{ app_base_url() }}/static/img/logo-512.jpg"' in src, tpl
|
||||
# forme RELATIVE interdite (le guillemet avant la barre est ce qui
|
||||
# distingue : la bonne valeur contient l'ancienne en sous-chaîne)
|
||||
assert 'content="/static/img/' not in src, tpl
|
||||
|
||||
def test_landing_shows_logo_and_banner(self):
|
||||
landing = (ROOT / "app" / "templates" / "landing.html").read_text(encoding="utf-8")
|
||||
# le logo remplace l'icône générique dans la barre de navigation
|
||||
|
||||
Reference in New Issue
Block a user