"""La gestion des astreintes est une préférence personnelle (plages.json, active par défaut) : désactivée, le compte ne voit plus rien qui les concerne (bouton AS, sous-lignes d'intervention, forfait, repos de 11h, récapitulatif, ratios) et les POST directs de bascule sont refusés — sans rien supprimer.""" import sys import models # noqa: F401 (DATA_DIR temporaire posé par conftest) sys.path.insert(0, ".") import main from fastapi.testclient import TestClient client = TestClient(main.app) PLAGES_OK = { "matin_debut": "09:00", "matin_fin": "12:00", "aprem_debut": "14:00", "aprem_fin": "17:00", "pause_dejeuner_fin": "13:30", "arrivee_visee": "", "depart_vise": "", } def _login(uid: str) -> dict: import bcrypt models.save_auth(uid, email=f"{uid}@x.fr", password_hash=bcrypt.hashpw(b"x" * 12, bcrypt.gensalt()).decode()) r = client.post("/login/password", data={"email": f"{uid}@x.fr", "password": "x" * 12}, follow_redirects=False) assert r.status_code == 302, r.text return {"user_id": r.cookies.get("user_id")} def _desactive(uid): plages = models.load_plages(uid) plages["astreinte_active"] = False models.save_plages(uid, plages) def test_bascule_de_la_preference(): uid = "u-as-pref" cookies = _login(uid) assert models.astreinte_active(uid) is True # active par défaut r = client.post("/settings/astreinte-active", cookies=cookies, follow_redirects=False) assert r.status_code == 303 assert models.astreinte_active(uid) is False r = client.post("/settings/astreinte-active", cookies=cookies, data={"astreinte_active": "1"}, follow_redirects=False) assert r.status_code == 303 assert models.astreinte_active(uid) is True def test_desactivee_masque_interface_et_refuse_les_post(): uid = "u-as-off" cookies = _login(uid) models.toggle_astreinte("2026-07-15", uid) # des données existent déjà _desactive(uid) r = client.get("/semaine/2026/29", cookies=cookies, follow_redirects=False) assert r.status_code == 200 assert 'cg-opt-chip as">AS<' not in r.text # pas de bascule AS assert "/astreinte/2026-07-15/toggle" not in r.text assert 'class="as-decompte"' not in r.text # pas de récapitulatif assert "retour ≥" not in r.text # pas de repos de 11h # POST direct refusé : données conservées mais inertes r = client.post("/astreinte/2026-07-15/toggle", cookies=cookies, follow_redirects=False) assert r.status_code == 303 assert models.load_astreintes(uid) == ["2026-07-15"] assert models.load_astreintes_effectives(uid) == [] # Réglages : cartes astreinte masquées, case décochée r = client.get("/settings", cookies=cookies, follow_redirects=False) assert "Gestion des astreintes" in r.text assert "Forfait par jour d'astreinte" not in r.text assert "Ratios des heures d'astreinte" not in r.text assert 'name="astreinte_active" value="1" checked' not in r.text def test_reactivation_retrouve_l_interface(): uid = "u-as-on" cookies = _login(uid) models.toggle_astreinte("2026-07-15", uid) r = client.get("/semaine/2026/29", cookies=cookies, follow_redirects=False) assert 'cg-opt-chip as">AS<' in r.text # bascule présente assert 'cg-chip st-as">AS<' in r.text # pastille du jour marqué def test_sauvegarde_plages_conserve_preference_et_forfait(): uid = "u-as-merge" cookies = _login(uid) plages = models.load_plages(uid) plages["astreinte_forfait"] = "01:30" plages["astreinte_active"] = False models.save_plages(uid, plages) r = client.post("/settings/plages", cookies=cookies, data=PLAGES_OK, follow_redirects=False) assert r.status_code == 303, r.text plages = models.load_plages(uid) assert plages["astreinte_forfait"] == "01:30" assert plages["astreinte_active"] is False