Ajoute la régénèse du token de présence Tasker et élargit le bandeau de test ntfy

Le bouton "Régénérer le token" de la carte Tasker crée un nouveau token
secret et invalide immédiatement les anciennes URLs, au cas où elles
auraient fuité. La fonction regenerate_presence_token préserve les
autres réglages notif (topic, serveur, jeton d'accès, plage). Au passage
le message de retour du bouton de test ntfy occupe désormais toute la
largeur de la carte au lieu d'être limité à 420px.

💘 Generated with Crush

Assisted-by: Crush:glm-5.2
This commit is contained in:
Jacquin Antoine
2026-07-20 00:05:34 +02:00
parent 076b5a4fa2
commit 1d8a273ffb
4 changed files with 113 additions and 8 deletions

View File

@ -250,3 +250,52 @@ def test_settings_save_persists_ntfy_token():
cfg = models.load_notif_config("alice")
assert cfg["ntfy_token"] == "tk_persisted_123"
assert cfg["ntfy_topic"] == "topic-persisted"
# ── Régénération du token de présence (Tasker) ───────────────────────────────
def test_regenerate_presence_token_requires_auth():
unauth = TestClient(main.app)
r = unauth.post("/settings/regenerate-presence-token", follow_redirects=False)
assert r.status_code == 302
assert "/login" in r.headers["location"]
def test_regenerate_presence_token_invalidates_old_urls():
"""Le nouveau token remplace l'ancien : les anciennes URLs ne marchent plus."""
old_token = models.load_notif_config("alice")["token"]
r = client.post("/settings/regenerate-presence-token", cookies=COOKIES)
assert r.status_code == 200
# Le HTML retourné contient de nouvelles URLs avec un nouveau token
assert old_token not in r.text
assert "/presence/" in r.text
assert "Token régénéré" in r.text
# L'ancienne URL doit maintenant renvoyer 404 (token inconnu)
r_old = client.get(f"/presence/{old_token}/arrivee")
assert r_old.status_code == 404
# La nouvelle URL doit fonctionner
new_cfg = models.load_notif_config("alice")
r_new = client.get(f"/presence/{new_cfg['token']}/arrivee")
assert r_new.status_code == 200
assert r_new.json() == {"ok": True}
def test_regenerate_preserves_other_notif_fields():
"""La régénération ne doit pas effacer topic/server/token ntfy."""
models.save_notif_config(
"alice", ntfy_topic="topic-x", ntfy_server="https://ntfy.arkel.fr",
ntfy_token="tk_xyz",
)
before = models.load_notif_config("alice")
new_token = models.regenerate_presence_token("alice")
after = models.load_notif_config("alice")
assert after["token"] == new_token
assert before["token"] != new_token
# Les autres champs sont préservés
assert after["ntfy_topic"] == "topic-x"
assert after["ntfy_server"] == "https://ntfy.arkel.fr"
assert after["ntfy_token"] == "tk_xyz"