Cibles : reprise ancrée au présent et rafraîchissement en direct
L'heure de reprise de pause n'est qu'indicative : le jour même, une
fois l'heure désirée passée, la cible d'un après-midi non commencé
ancre la reprise à maintenant et la sortie s'ajuste au reste à faire —
suivre les cibles mène au solde 0 exact, et aucune cible ne recommande
de reprendre dans le passé.
La page semaine rafraîchit cibles, panneau Aujourd'hui et compteurs
toutes les 30 s, et immédiatement au retour sur l'onglet (les
minuteurs des navigateurs sont gelés en arrière-plan, l'affichage ne
peit plus rester périmé).
💘 Generated with Crush
Assisted-by: Crush:glm-5.2
This commit is contained in:
@ -113,3 +113,40 @@ def test_forfait_bonifie_journee_affiche_dans_le_recap(monkeypatch):
|
||||
assert "forfait 1h00 → 1h30 pondérées" in r.text # ligne du jour (bloc AS)
|
||||
assert "forfaits 1h00 → 1h30 pondérés" in r.text # totaux du récapitulatif
|
||||
assert "considéré réalisé en journée" in r.text # explication au survol
|
||||
|
||||
def test_refresh_regenerere_les_cibles_en_fonction_de_lheure(monkeypatch):
|
||||
"""Le poll /refresh (toutes les 30 s, et au retour sur l'onglet) régénère
|
||||
les cibles OOB avec l'heure courante : à 14:12, l'après-midi non commencé
|
||||
du vendredi ancre sa reprise à maintenant — jamais à l'heure désirée 13:30
|
||||
passée — et la sortie s'ajuste au reste à faire de la semaine."""
|
||||
class _Frozen14(dt_module.datetime):
|
||||
@classmethod
|
||||
def today(cls):
|
||||
return cls(2026, 7, 17, 14, 12)
|
||||
|
||||
monkeypatch.setattr(main, "datetime", _Frozen14)
|
||||
import calcul
|
||||
monkeypatch.setattr(calcul, "datetime", _Frozen14)
|
||||
cookies = _login("u-ui-refresh")
|
||||
# Lundi-jeudi complets, vendredi matin seulement : reste 4h42,
|
||||
# seul créneau ouvert = vendredi aprem, reprise ancrée à 14:12.
|
||||
for d in ("2026-07-13", "2026-07-14", "2026-07-15", "2026-07-16"):
|
||||
client.post(f"/pointage/{d}", 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)
|
||||
client.post(f"/pointage/{TODAY}", cookies=cookies,
|
||||
data={"matin_entree": "09:00", "matin_sortie": "12:00"},
|
||||
headers={"HX-Request": "true"}, follow_redirects=False)
|
||||
|
||||
r = client.get(f"/refresh/{TODAY}", cookies=cookies, follow_redirects=False)
|
||||
assert r.status_code == 200
|
||||
# Cible du jour régénérée, ancrée à maintenant (14:12), pas à 13:30
|
||||
assert f'id="calc-{TODAY}-cible"' in r.text
|
||||
assert "A 14:12 → 19:00" in r.text
|
||||
# Toutes les cibles de la semaine suivent (swaps OOB), pas seulement le jour
|
||||
for d in ("2026-07-13", "2026-07-14", "2026-07-15", "2026-07-16"):
|
||||
assert f'id="calc-{d}-cible"' in r.text
|
||||
# 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
|
||||
|
||||
Reference in New Issue
Block a user