"""BUG-118 — barre d'apps commune en mobile (Fusion ACC-1, #215). Retours de Bruno (2026-10-21) sur téléphone : la barre débordait (pastilles domaines et onglets entiers affichés) et son bouton ☰ ne faisait rien — il cliquait le bouton bureau ``sidebar-toggle-btn`` au lieu du vrai hamburger mobile ``hamburger-btn``. Correctifs verrouillés ici : CSS commune v0.1.2 (palier 700 px resserré selon la spec) et rail contextuel dans index.html (mobile ≤ 768 px → hamburger-btn). """ from pathlib import Path FRONTEND = Path(__file__).resolve().parent.parent / "frontend" def _css() -> str: return (FRONTEND / "draco-barre.css").read_text(encoding="utf-8") def _index() -> str: return (FRONTEND / "index.html").read_text(encoding="utf-8") def test_palier_mobile_resserre_v012(): css = _css() assert "@media (max-width: 900px)" in css # Seul l'onglet de l'app courante reste visible en mobile. assert '.draco-bar[data-current="obsigate"] .draco-apptab[data-app="obsigate"]' in css # Domaines et boutons icônes (rail, menu) masqués en mobile. bloc = css.split("@media (max-width: 900px)", 1)[1] assert ".draco-domaines" in bloc assert "display: none" in bloc def test_menu_des_applications_par_la_marque(): # v0.1.3 : la marque ✦ ouvre le menu des 4 applications # (changement d'app en mobile), logo à 24 px. html = _index() assert 'data-act="apps"' in html js = (FRONTEND / "draco-barre.js").read_text(encoding="utf-8") assert "draco-apps-menu" in js assert "font-size: 24px" in _css() def test_panneau_spark_integre_218(): # #218 : le bouton Spark de la barre ouvre le panneau de l'agent # commun (mêmes assets partagés que TikTak / Flowdeck / Kanbante). html = _index() assert (FRONTEND / "draco-panneau.js").is_file() assert (FRONTEND / "draco-panneau.css").is_file() assert '' in html assert '' in html # L'action spark bascule sur le panneau — plus le message d'attente. assert "window.DRACO_PANNEAU.toggle()" in html assert "arrive en phase 4 du programme Fusion" not in html panneau = (FRONTEND / "draco-panneau.js").read_text(encoding="utf-8") assert "https://agent.dracodev.net" in panneau def test_panneau_bouton_console_221(): # #221 : le panneau Spark (asset vendangé, octet-identique dans # les 4 apps) porte un bouton « Console » qui mène à la console # web du service, sur la discussion courante (?disc=) et avec # l'app d'origine (?app= déduite du sous-domaine : og → obsigate). # Révisé par #222 : l'ouverture en nouvel onglet a disparu (la # console s'ouvre en surimpression, voir le test #222) ; le lien # profond, lui, subsiste via urlConsole(). panneau = (FRONTEND / "draco-panneau.js").read_text(encoding="utf-8") assert 'data-disc="console"' in panneau assert "ouvrirConsole" in panneau assert "urlConsole" in panneau assert '"disc=" + encodeURIComponent(id)' in panneau assert '"app=" + encodeURIComponent(app)' in panneau assert 'og: "obsigate"' in panneau assert 'window.open(' not in panneau def test_panneau_console_surimpression_222(): # #222 : le bouton « Console ⤢ » ouvre la console dans la même # page, en surimpression née à la largeur du panneau et étendue # à toute la fenêtre (transition sur la largeur), avec deux # sorties : « Mode sidebar » et « Fermer l'agent ». L'URL de # l'iframe garde le lien profond de #221 (urlConsole()). panneau = (FRONTEND / "draco-panneau.js").read_text(encoding="utf-8") assert "Console ⤢" in panneau assert "draco-console-sur" in panneau assert "assurerSurimpression" in panneau assert "draco-console-styles" in panneau assert 'surCadre.src = urlConsole()' in panneau assert 'surEl.style.width = "100%"' in panneau assert 'data-dc="sidebar"' in panneau assert "Mode sidebar" in panneau assert "modeSidebarConsole" in panneau assert 'data-dc="fermer"' in panneau assert "Fermer l'agent" in panneau assert "fermerAgentConsole" in panneau def test_csp_ouvre_le_service_d_agents_218(): # Le panneau parle au service d'agents : la CSP doit nommer son # hôte en connect-src, sans ouvrir de générique supplémentaire. main = (Path(__file__).resolve().parent.parent / "backend" / "main.py").read_text(encoding="utf-8") ligne = next(l for l in main.splitlines() if "connect-src" in l) assert "https://agent.dracodev.net" in ligne def test_rail_mobile_vers_le_vrai_hamburger(): html = _index() assert 'matchMedia("(max-width: 768px)")' in html assert '"hamburger-btn"' in html assert '"sidebar-toggle-btn"' in html