- 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
103 lines
4.0 KiB
Python
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
|