FlowDeck CI / lint (pull_request) Failing after 1s
FlowDeck CI / test (pull_request) Failing after 1s
FlowDeck CI / docker (pull_request) Skipped
FlowDeck CI / lint (push) Failing after 2s
FlowDeck CI / test (push) Failing after 1s
FlowDeck CI / docker (push) Skipped
118 lines
5.4 KiB
Python
118 lines
5.4 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_v041_correctif_icones_espace_de_noms_svg():
|
|
"""Barre v0.4.1 (commons, correctif fusion #125) : les icônes
|
|
du menu compte sont créées via createElementNS (espace de
|
|
noms SVG). En v0.4.0, createElement() les créait dans
|
|
l'espace de noms HTML : jamais dessinées par le navigateur,
|
|
libellés décalés d'un cran d'icône sans aucun glyphe."""
|
|
js = (ROOT / "static/js/vendor/draco-barre.js").read_text()
|
|
assert 'createElementNS(SVG_NS, "svg")' in js
|
|
assert "createElementNS(SVG_NS, spec[0])" in js
|
|
assert 'createElement("svg")' not in js
|
|
assert "createElement(spec[0])" not in js
|
|
|
|
|
|
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
|