fix: persister le token même dans le chemin d'erreur de get_informations/get_messages

Cause racine : quand pronotepy reçoit une PronoteAPIError (ex. code 20 « page
expirée »), il appelle refresh() en interne, qui peut roter le token en mémoire
(client.password mis à jour avec un nouveau jetonConnexionAppliMobile). Le retry
peut aussi échouer — l'exception atteint get_informations()/get_messages() qui
l'attrapent et retournent [] (mode dégradé). Mais _persist_credentials()
n'était appelé que dans le chemin de SUCCÈS — le token rafraîchi en mémoire
n'était jamais persisté. Au run suivant, token_login utilisait le token
périmé → échec KeyError 'dataSec' → PronoteAuthRotationError.

Correction : appeler _persist_credentials() aussi dans le chemin d'erreur de
get_informations() et get_messages(), avant le return []. L'ancien token est
déjà invalidé côté serveur lors du refresh — ne pas persister le nouveau token
garantit la perte du seul token valide.

Tests : 3 nouveaux tests (persistance dans le chemin d'erreur, sauvegarde du
token rafraîchi sur erreur). 694 passés, couverture 94.93%.
This commit is contained in:
2026-09-10 13:34:51 +02:00
parent d26cef8d3d
commit 4df930bfe6
2 changed files with 95 additions and 0 deletions

View File

@@ -455,6 +455,7 @@ class PronoteClient:
"Échec de la récupération des messages Pronote : %s",
redact_exception(exc),
)
self._persist_credentials()
return []
def get_informations(self) -> list[Message]:
@@ -494,6 +495,7 @@ class PronoteClient:
"Échec de la récupération des informations Pronote : %s",
redact_exception(exc),
)
self._persist_credentials()
return []
def get_lessons(self, start: date, end: date) -> list[Lesson]: