"""Garde-fou : l'onglet Configuration doit couvrir les sections de la maquette V6.""" from __future__ import annotations import pytest pytest.importorskip("customtkinter") from gui_v6.tabs.tab_config import ( CONFIG_INTERACTION_CONTRACT, CONFIG_MOCKUP_SECTIONS, MINI_TOGGLE_HEIGHT, MINI_TOGGLE_HINT_FONT_SIZE, MINI_TOGGLE_LABEL_FONT_SIZE, _DETECTION_OPTIONS, ) def test_config_mockup_sections_cover_admin_surface(): assert CONFIG_MOCKUP_SECTIONS == { "reglages": [ "Profil d'anonymisation", "Moteurs NER", "Données à détecter", "Termes à toujours conserver", "Termes à toujours masquer", "Masque manuel obligatoire", "Template de masque manuel", ], "masquage": [ "Couleur de masquage (PDF)", "Style des marqueurs (texte)", "Épaisseur du masque", "Codes de remplacement", "Masques de zones fixes", "Éditeur interactif de masques", ], "partage": ["Exporter la configuration", "Importer une configuration"], "regles": ["Règles actives", "Testeur de règle"], } def test_config_interaction_contract_prebuilds_panels_and_mask_editor(): assert CONFIG_INTERACTION_CONTRACT["subtabs"] == "prebuilt_panels" assert CONFIG_INTERACTION_CONTRACT["reglages_columns"] == 3 assert CONFIG_INTERACTION_CONTRACT["mask_editor"] == [ "open_pdf", "draw_rectangle", "delete_rectangle_on_click", "zoom", "save_template_json", "load_template_json_or_yaml", "clear_page", "apply_template_selection", ] def test_detection_options_fields_match_category_fields(): """Garde-fou anti-dérive : les champs déclarés dans _DETECTION_OPTIONS doivent rester alignés (mêmes champs ET même ordre) sur CATEGORY_FIELDS, sinon un toggle pointerait vers un attribut ConfigState inexistant (AttributeError au lancement de la GUI au lieu d'un échec de test).""" from gui_v6.config_state import CATEGORY_FIELDS, ConfigState fields = [field for _l, _h, field in _DETECTION_OPTIONS] assert fields == list(CATEGORY_FIELDS) # mêmes champs ET même ordre (ordre UI = ordre catégories) for f in fields: # chacun est bien un booléen réel de ConfigState assert isinstance(getattr(ConfigState(), f), bool) def test_detection_rows_are_readable_in_light_theme(): """Retour Dom : les sous-labels de la colonne détection doivent rester lisibles.""" # Chaque ligne est désormais (libellé, aide, champ ConfigState) ; on ne # vérifie ici que le couple (libellé, aide) reste lisible. label_hint = [(label, hint) for label, hint, _field in _DETECTION_OPTIONS] assert ("Noms et prénoms", "Annuaire + IA") in label_hint assert ("Noms et prénoms", "Bases de données + IA") not in label_hint assert MINI_TOGGLE_HEIGHT >= 44 assert MINI_TOGGLE_LABEL_FONT_SIZE >= 12 assert MINI_TOGGLE_HINT_FONT_SIZE >= 11