Files
flowdeck/tests/test_draco_bar_texte.py
Spark e7c65b6f49
FlowDeck CI / test (push) Failing after 3s
FlowDeck CI / docker (push) Skipped
FlowDeck CI / lint (push) Failing after 14s
FlowDeck CI / lint (pull_request) Failing after 5s
FlowDeck CI / test (pull_request) Failing after 2s
FlowDeck CI / docker (pull_request) Skipped
Flowdeck 7.84.14 : garde v0.4.0 corrigée (clés JS quotées dans MENU_ICONES)
2026-11-05 05:05:32 +00:00

105 lines
4.8 KiB
Python

"""Barre d'apps Flowdeck : aucun texte de chantier rendu hors commentaire.
Defaut 5 : les lignes « Chantier 5 (fusion #69/#71, sans bump) : ... »
etaient placees APRES la fermeture `#}` du commentaire Jinja d'en-tete
de `app/templates/_draco_bar.html` (lignes 9-11) : elles etaient donc
rendues telles quelles, juste au-dessus du <header> de la barre, sur
toutes les pages (la barre est incluse par base.html).
Test sans dependance (lecture du gabarit seul, comme
test_draco_alertes.py) : il tourne sans serveur ni base, donc aussi
en sandbox. La note documentaire peut vivre DANS le commentaire Jinja
(jamais rendu) ; elle ne doit jamais en sortir.
"""
import re
from pathlib import Path
ROOT = Path(__file__).resolve().parent.parent
def _hors_commentaires(texte):
"""Texte du gabarit sans les commentaires Jinja {# ... #}."""
return re.sub(r"\{#.*?#\}", "", texte, flags=re.S)
def test_aucun_texte_chantier_rendu():
gabarit = (ROOT / "app/templates/_draco_bar.html").read_text()
rendu = _hors_commentaires(gabarit)
assert "Chantier 5 (fusion" not in rendu
assert "sans bump" not in rendu
# Aucune ligne de texte libre entre le commentaire d'en-tete et <link> :
# le rendu doit commencer (apres commentaires) par <link> ou <header>.
assert rendu.lstrip().startswith("<link")
def test_barre_v020_onglet_shaarit_et_garde_data_theme():
"""Barre v0.2.0 (commons @70c837a) : onglet ShaarIt entre Kanbante
et l'onglet agent, logo fourni tel quel, CSS vendangé verbatim
avec la garde data-theme sur prefers-color-scheme."""
gabarit = (ROOT / "app/templates/_draco_bar.html").read_text()
rendu = _hors_commentaires(gabarit)
nav = rendu.split('<nav class="draco-apptabs"')[1].split("</nav>")[0]
assert nav.index('data-app="kanbante"') < nav.index('data-app="shaarit"')
assert nav.index('data-app="shaarit"') < nav.index('data-app="agent"')
assert 'href="{{ draco_urls().shaarit }}/"' in nav
assert 'data-icon="shaarit"><img src="/static/img/logos/shaarit.svg"' in nav
assert (ROOT / "static/img/logos/shaarit.svg").is_file()
css = (ROOT / "static/css/draco-barre.css").read_text()
assert "html:not([data-theme]) .draco-bar {" in css
assert "html:not([data-theme]) .draco-bar .draco-brand-mark img" in css
js = (ROOT / "static/js/vendor/draco-barre.js").read_text()
assert 'shaarit: "https://shaarit.dracodev.net/"' in js
assert 'shaarit: "https://shaarit-dev.dracodev.net/"' in js
def test_barre_v030_liens_hub_menu_compte():
"""Barre v0.3.0 (commons, HUB-1 / fusion #115) : JS vendangé avec
la clé hub (défaut + dérivation hub-dev) et les liens du menu
compte ; le gabarit passe draco_urls().hub en urls.hub."""
js = (ROOT / "static/js/vendor/draco-barre.js").read_text()
assert 'hub: "https://hub.dracodev.net/"' in js
assert 'hub: "https://hub-dev.dracodev.net/"' in js
assert '"telecharger", "Télécharger"' in js
assert '"a-propos", "À Propos"' in js
assert '"aide", "Aides"' in js
assert '"profil", "Profil"' in js
assert "data-hub-link" in js
assert 'data-compte-act", "profil"' not in js
assert 'data-compte-act", "deconnexion"' in js
gabarit = (ROOT / "app/templates/_draco_bar.html").read_text()
rendu = _hors_commentaires(gabarit)
assert 'urls: { hub: "{{ draco_urls().hub }}/" }' in rendu
def test_barre_v040_icones_menu_compte():
"""Barre v0.4.0 (commons, HUB-11 / fusion #125) : les items du
menu compte portent des icônes SVG monoline (construites en DOM,
currentColor, sans remplissage) ; le libellé reste un nœud
texte ; l'en-tête d'identité reste sans icône."""
js = (ROOT / "static/js/vendor/draco-barre.js").read_text()
assert "MENU_ICONES" in js
for nom in ("telecharger", "a-propos", "aide", "profil", "deconnexion"):
assert f'"{nom}"' in js
assert "draco-menu-icone" in js
assert 'setAttribute("stroke", "currentColor")' in js
assert 'setAttribute("fill", "none")' in js
css = (ROOT / "static/css/draco-barre.css").read_text()
assert ".draco-menu-icone" in css
assert "width: 18px" in css
def test_barre_intacte_apres_suppression():
"""Le 5e onglet Console Spark et la marque survivent a la suppression."""
gabarit = (ROOT / "app/templates/_draco_bar.html").read_text()
rendu = _hors_commentaires(gabarit)
nav = rendu.split('<nav class="draco-apptabs"')[1].split("</nav>")[0]
assert nav.index('data-app="kanbante"') < nav.index('data-app="agent"')
assert "Console Spark" in nav
assert 'data-app="agent"' in nav
assert 'class="draco-brand"' in rendu
# L'entree « Console Spark » du menu de la marque est construite par
# draco-barre.js depuis les onglets : l'onglet agent suffit a l'alimenter.
js_barre = (ROOT / "static/js/vendor/draco-barre.js").read_text()
assert "Console Spark" in js_barre