"""Shell GUI V6 : robustesse du changement de thème, libellés d'onglets, aide. Smokes headless (Xvfb) — skip propre si pas de display. """ from __future__ import annotations import pytest @pytest.fixture def app(): pytest.importorskip("customtkinter") try: from gui_v6.app import AnonymisationApp a = AnonymisationApp() except Exception as exc: # pas de display pytest.skip(f"display Tk indisponible: {exc}") a.withdraw() try: yield a finally: try: a.destroy() except Exception: pass def test_usage_tab_survives_theme_change(app): """Retour Dom #1 : l'onglet Utilisation ne doit pas se vider au changement de thème (le cache d'onglets ne doit pas conserver de widgets détruits).""" app._show("use") app.update_idletasks() assert app._active == "use" other = "clair" if app._theme_name != "clair" else "sombre" app.set_theme(other) app.update_idletasks() assert app._active == "use" assert "use" in app._tab_frames frame = app._tab_frames["use"] assert frame.winfo_exists() # onglet recréé et vivant, pas un widget mort def test_main_tab_renamed_to_administration(): """Retour Dom #2 : l'onglet principal Configuration devient Administration.""" pytest.importorskip("customtkinter") from gui_v6.app import _TABS labels = [label for _, label in _TABS] assert any("Administration" in lbl for lbl in labels) assert not any("Configuration" in lbl for lbl in labels) def test_no_separate_rules_subtab(): """Retour Dom : les règles appartiennent au profil → plus de sous-onglet « Règles » séparé (et donc plus de « Règles 2 » incompréhensible).""" pytest.importorskip("customtkinter") from gui_v6.tabs.tab_config import _SUBTABS keys = [key for key, _ in _SUBTABS] labels = [label for _, label in _SUBTABS] assert "rul" not in keys assert not any("Règles" in lbl for lbl in labels) def test_help_button_opens_help_window(app): """Retours Dom #4/#5 : affordance d'aide « ? » réutilisable qui ouvre une fenêtre d'aide en français.""" from gui_v6 import theme as theme_mod from gui_v6 import ui_kit p = theme_mod.get_palette(theme_mod.DEFAULT_THEME) btn = ui_kit.help_button(app, p, "Cette section reste 100 % locale.", title="Aide test") assert btn.cget("text") == "?" win = btn.open_help() app.update_idletasks() assert win.winfo_exists() win.destroy() def _all_texts(widget) -> list: out = [] try: out.append(str(widget.cget("text"))) except Exception: pass for child in widget.winfo_children(): out += _all_texts(child) return out def test_beta_label_in_product_identity(app): """Addendum Dom : indiquer « bêta » à côté du nom produit (en-tête + titre).""" app.update_idletasks() assert "bêta" in app.title().lower() or "beta" in app.title().lower() texts = [t.lower() for t in _all_texts(app)] assert any("aivanonym" in t for t in texts) assert any("bêta" in t or "beta" in t for t in texts) def test_default_theme_is_light(): """Retour Dom : le thème clair est le thème par défaut de la GUI.""" from gui_v6 import theme as theme_mod assert theme_mod.DEFAULT_THEME == "clair" def test_about_uses_user_facing_database_label(app): """Retour Dom : éviter le terme technique anglais « Gazetteers » dans À propos.""" app._show("about") app.update_idletasks() texts = _all_texts(app._tab_frames["about"]) joined = " | ".join(texts) assert "bases de données" in joined.lower() assert "Gazetteers" not in joined assert "Rechercher une mise à jour" in joined def _count_help_buttons(widget) -> int: from gui_v6.ui_kit import HelpButton total = 1 if isinstance(widget, HelpButton) else 0 for child in widget.winfo_children(): total += _count_help_buttons(child) return total def test_each_tab_exposes_help(app): """Retour Dom #5 : une affordance d'aide « ? » est présente sur chaque onglet.""" for key in ("use", "cfg", "about"): app._show(key) app.update_idletasks() assert _count_help_buttons(app._tab_frames[key]) >= 1, key def test_navigation_and_theme_change_keep_tabs_alive(app): """Navigation + changement de thème : aucun onglet vide/mort.""" for key in ("use", "cfg", "about"): app._show(key) app.update_idletasks() assert app._tab_frames[key].winfo_exists() app.set_theme("medical") app.update_idletasks() for key in ("use", "cfg", "about"): app._show(key) app.update_idletasks() assert app._tab_frames[key].winfo_exists()