diff --git a/src/pages/compte/abonnement_mes_infos.py b/src/pages/compte/abonnement_mes_infos.py index 83aaed7..8ce7dc7 100644 --- a/src/pages/compte/abonnement_mes_infos.py +++ b/src/pages/compte/abonnement_mes_infos.py @@ -128,40 +128,44 @@ def _legal_note(): ) -def _consent_checklists(): - return [ - dcc.Checklist( - id="inf-cb-retractation", - options=[ - { - "label": "Je renonce à mon droit de rétractation légal de 14 jours.", - "value": "ok", - } - ], - value=[], - className="mb-2", - ), - dcc.Checklist( - id="inf-cb-cgu", - options=[ - { - "label": [ - "J'ai lu et accepte les ", - html.A( - "conditions générales d'utilisation du service", - href="#", - id="inf-cgu-link", - style={"cursor": "pointer"}, - ), - ".", - ], - "value": "ok", - } - ], - value=[], - className="mb-4", - ), - ] +def _consent_checklists(hidden: bool = False): + default_value = ["ok"] if hidden else [] + return html.Div( + [ + dcc.Checklist( + id="inf-cb-retractation", + options=[ + { + "label": "Je renonce à mon droit de rétractation légal de 14 jours.", + "value": "ok", + } + ], + value=default_value, + className="mb-2", + ), + dcc.Checklist( + id="inf-cb-cgu", + options=[ + { + "label": [ + "J'ai lu et accepte les ", + html.A( + "conditions générales d'utilisation du service", + href="#", + id="inf-cgu-link", + style={"cursor": "pointer"}, + ), + ".", + ], + "value": "ok", + } + ], + value=default_value, + className="mb-4", + ), + ], + className="d-none" if hidden else None, + ) def _cgu_modal(): @@ -356,7 +360,7 @@ def layout(**query): ), dbc.Row([col1, col2], className="g-4 mb-4"), _legal_note(), - *(_consent_checklists() if mode == "subscribe" else []), + _consent_checklists(hidden=(mode == "configure")), _submit_button(mode), ], ) @@ -374,7 +378,7 @@ def layout(**query): if prefill else None, form, - _cgu_modal() if mode == "subscribe" else None, + _cgu_modal(), ] ), ) diff --git a/tests/subscriptions/test_mes_infos_plan.py b/tests/subscriptions/test_mes_infos_plan.py index 6474b91..50ff472 100644 --- a/tests/subscriptions/test_mes_infos_plan.py +++ b/tests/subscriptions/test_mes_infos_plan.py @@ -116,3 +116,36 @@ def test_change_hint_hidden_in_subscribe_mode(): cls, _ = m._change_hint("soutien", {}) assert cls == "d-none" + + +def test_consent_checklists_ids_always_present_in_configure_mode(): + # Régression : le callback _toggle_submit référence inf-cb-retractation + # et inf-cb-cgu en Input inconditionnellement, donc ces composants + # doivent exister dans le layout même en mode "configure" (sinon Dash + # lève "A nonexistent object was used in an Input"). + from src.pages.compte import abonnement_mes_infos as m + + div = m._consent_checklists(hidden=True) + text = str(div) + assert "inf-cb-retractation" in text + assert "inf-cb-cgu" in text + assert "d-none" in div.className + + +def test_consent_checklists_pre_accepted_when_hidden(): + from src.pages.compte import abonnement_mes_infos as m + + div = m._consent_checklists(hidden=True) + retractation, cgu = div.children + assert retractation.value == ["ok"] + assert cgu.value == ["ok"] + + +def test_consent_checklists_visible_and_empty_in_subscribe_mode(): + from src.pages.compte import abonnement_mes_infos as m + + div = m._consent_checklists(hidden=False) + retractation, cgu = div.children + assert retractation.value == [] + assert cgu.value == [] + assert div.className is None