Files
pointeuse-optimisator/app/tests/test_astreinte_pref.py
Jacquin Antoine 3d38abd853 Astreinte : préférence personnelle et retour aligné sur les quarts d'horloge
- La gestion des astreintes devient un réglage par compte (Réglages →
  « Gestion des astreintes », actif par défaut) : désactivée, le bouton AS,
  les interventions, forfaits, repos de 11h, récapitulatif, ratios, stats
  et exports n'en parlent plus — sans rien supprimer, réactiver retrouve tout
- L'heure de retour au bureau tombe désormais toujours sur un quart d'heure
  d'horloge fixe (:00, :15, :30, :45), arrondie au supérieur après les 11h
  de repos (ex. fin comptée 23:54 → retour 11:00)
- Corrigé : enregistrer ses plages horaires écrasait le forfait d'astreinte

💘 Generated with Crush

Assisted-by: Crush:glm-5.2
2026-09-09 20:48:59 +02:00

103 lines
4.0 KiB
Python

"""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