Files
flowdeck/tests/test_v7693_help_positioning.py
T
bruno 162eb257c7
FlowDeck CI / lint (push) Successful in 1m32s
FlowDeck CI / test (push) Failing after 16m17s
FlowDeck CI / docker (push) Skipped
fix: la section Aide est positionnée comme Settings (v7.69.3)
La section Aide et la section Settings partagent le même gabarit
(`.settings-overlay` / `.settings-panel`) et la même feuille de style
(`static/css/settings.css`), mais affichaient deux rendus différents.

Cause : `help.html` neutralisait son overlay via un style INLINE sur la balise
— `position:static`, `background:none`, `backdrop-filter:none`, `padding:0` —
et imposait par-dessus un panneau `width:100%;max-width:1050px;
height:calc(100vh - 120px);margin:0 auto`. Settings, lui, laissait
`settings.css` faire son travail : overlay `fixed;inset:0` avec fond flouté,
panneau `85vh` centré par `margin:auto`.

Résultat perçu : Aide s'affichait comme un bloc posé dans la page, Settings
comme une modale centrée floutant l'arrière-plan — malgré un code quasi
identique.

Correctif : les surcharges inline sont retirées de `help.html`. La géométrie
vient désormais entièrement de `settings.css`, commun aux deux pages. Aucune
valeur n'est dupliquée ; les deux balises sont strictement identiques.

Vérifié en e2e en comparant les géométries CALCULÉES des deux pages (pas des
valeurs de code) : overlay `fixed` avec fond opère des deux côtés, panneau
1050x765 centré à top:68px, bouton close à 13/13px du coin du panneau — les
deux jeux de mesures sont identiques.

Tests : `tests/test_v7693_help_positioning.py` (5) verrouille l'absence de
surcharges inline et l'identité de balise avec Settings ;
`e2e/v7693_help_positioning.spec.js` compare les géométries calculées.

NON INCLUS — double-clic sur le bouton close de Settings :
le bug a été REPRODUIT en e2e et sa cause racine identifiée, mais le correctif
n'est volontairement PAS dans ce commit. Voir ROADMAP.md § v7.69.3 pour le
relevé complet et la prochaine étape.

pytest 1421 passed / 0 failed · ruff OK · e2e 15/15 verts sur l'instance déployée
2026-10-08 21:07:17 -04:00

54 lines
2.5 KiB
Python

"""v7.69.3 — la section Aide doit être positionnée comme la section Settings.
Auparavant `help.html` neutralisait l'overlay en inline
(`position:static;background:none;backdrop-filter:none`) et forçait un panneau
`1050px / 100vh-120px` : Aide s'affichait comme un bloc posé dans la page
tandis que Settings était une modale centrée. Le même gabarit partagé
(`.settings-overlay` / `.settings-panel`) produisait donc deux rendus.
"""
from pathlib import Path
ROOT = Path(__file__).resolve().parents[1]
SETTINGS = (ROOT / "app" / "templates" / "settings.html").read_text(encoding="utf-8")
HELP = (ROOT / "app" / "templates" / "help.html").read_text(encoding="utf-8")
def _opening_tag(src: str, css_class: str) -> str:
"""La balise d'ouverture qui porte cette classe, sans ses attributs."""
line = next(row for row in src.splitlines() if f'class="{css_class}"' in row)
# coupe avant x-data ET avant n'importe quel handler @keydown(.escape)
return line.split(" x-data=")[0].split(" @keydown")[0].strip()
class TestHelpMatchesSettingsPositioning:
def test_help_overlay_no_longer_disables_itself(self):
# l'overlay d'Aide EST celui de Settings : aucune surcharge inline ne
# peut subsister sur cette balise (le positionnement vient du CSS
# partagé). On asserte sur la BALISE, pas sur le fichier entier — le
# commentaire de tête du template mentionne ces valeurs à l'infinitif.
assert _opening_tag(HELP, "settings-overlay") == '<div class="settings-overlay"'
def test_overlay_markup_is_identical(self):
assert _opening_tag(HELP, "settings-overlay") == _opening_tag(
SETTINGS, "settings-overlay"
)
def test_panel_carries_no_inline_geometry(self):
# toute la géométrie vient de settings.css, partagé avec Settings
assert _opening_tag(HELP, "settings-panel") == '<div class="settings-panel"'
assert "max-width:1050px" not in HELP
assert "calc(100vh - 120px)" not in HELP
def test_both_pages_use_the_shared_stylesheet(self):
# le CSS qui pose l'overlay centré est bien chargé par les deux
base = (ROOT / "app" / "templates" / "base.html").read_text(encoding="utf-8")
assert "/static/css/settings.css" in base
def test_close_button_keeps_the_same_slot(self):
# même classe que Settings -> même position absolue dans le panneau
for src, name in ((HELP, "help"), (SETTINGS, "settings")):
assert 'class="settings-close"' in src, name