Semaine parfaite : célébration kitsch quand tout boucle à +0h00

La dernière heure saisie qui clôt la semaine à +0h00 pile, sans
aucune demi-journée restante, déclenche une fête assumée : fond disco
en rotation de teintes, pluie d'une fourgonnée de confettis (emojis
et rectangles), trophée bondissant et titre doré défilant. Une seule
fois par semaine et par onglet, fermeture au clic ou après 8 s, et
animation réduite pour prefers-reduced-motion.

Le serveur pose un drapeau data-perfect (solde nul, plus rien à
remplir, heures dues non nulles) sur les soldes re-rendus à chaque
saisie et rafraîchissement ; le client le détecte et célèbre.

💘 Generated with Crush

Assisted-by: Crush:glm-5.2
This commit is contained in:
Jacquin Antoine
2026-09-11 15:29:46 +02:00
parent 59a04ea07f
commit edf52acdc9
9 changed files with 167 additions and 1 deletions

View File

@ -150,3 +150,31 @@ def test_refresh_regenerere_les_cibles_en_fonction_de_lheure(monkeypatch):
# Le panneau aujourd'hui est rafraîchi avec la même sortie cible
assert "today-panel" in r.text
assert "19:00" in r.text
def test_semaine_parfaite_marquee_pour_la_celebration(monkeypatch):
"""La dernière heure saisie qui boucle la semaine à +0h00 pile pose le
drapeau data-perfect (clé semaine) sur les soldes : le client déclenche la
célébration. Semaine incomplète ou solde non nul → pas de drapeau."""
monkeypatch.setattr(main, "datetime", _FrozenDatetime)
cookies = _login("u-ui-perfect")
jours = {"matin_entree": "09:00", "matin_sortie": "12:24",
"aprem_entree": "13:30", "aprem_sortie": "17:54"} # 7h48 pile
for d in ("2026-07-13", "2026-07-14", "2026-07-15", "2026-07-16"):
client.post(f"/pointage/{d}", cookies=cookies, data=jours,
headers={"HX-Request": "true"}, follow_redirects=False)
# Semaine incomplète (vendredi vide) : pas de drapeau
r = client.post(f"/pointage/{TODAY}", cookies=cookies,
data={"matin_entree": "09:00", "matin_sortie": "12:24",
"aprem_entree": "13:30", "aprem_sortie": "17:54"},
headers={"HX-Request": "true"}, follow_redirects=False)
assert r.status_code == 200
assert 'data-perfect="2026-W29"' in r.text # 5×7h48 = 39h00 pile : parfait !
# Solde non nul (vendredi écourté) : le drapeau disparaît
r = client.post(f"/pointage/{TODAY}", cookies=cookies,
data={"matin_entree": "09:00", "matin_sortie": "12:24",
"aprem_entree": "13:30", "aprem_sortie": "17:00"},
headers={"HX-Request": "true"}, follow_redirects=False)
assert r.status_code == 200
assert "data-perfect" not in r.text