IT-Stock/tests/test_planification.py
maxsoch 11da706573 Planification du résumé de stock modifiable depuis l'interface
L'horaire de l'email récapitulatif se configure maintenant sur
/destinataires (raccourcis courants + expression cron personnalisée) au
lieu de .env, avec reprogrammation immédiate sans redémarrage. Stocké en
base (ParametrePlanification) plutôt que dans un fichier de config.
Défaut changé pour tous les lundis à 9h.

Les exemples et le code n'utilisent que des noms de jours (mon, tue, ...)
dans les expressions cron : vérifié empiriquement qu'APScheduler ne suit
pas la convention Unix pour les jours numériques (0=lundi chez lui, pas
0=dimanche), ce qui rendrait "0 9 * * 1" trompeur.
2026-07-14 19:37:36 +02:00

56 lines
2 KiB
Python

"""
Tests de la planification de l'email récapitulatif, modifiable depuis
/destinataires : lecture/écriture de l'expression cron en base, et
validation (APScheduler a sa propre convention de jour de la semaine, donc
la validation doit accepter les noms de jours comme "mon" sans ambiguïté).
"""
from app.scheduler import EXPRESSION_PAR_DEFAUT, obtenir_expression_cron, valider_expression_cron
def test_expression_par_defaut_est_tous_les_lundis(session):
assert obtenir_expression_cron(session) == EXPRESSION_PAR_DEFAUT == "0 9 * * mon"
def test_valider_expression_cron_accepte_les_noms_de_jours():
assert valider_expression_cron("0 9 * * mon") is True
assert valider_expression_cron("0 8 * * mon-fri") is True
assert valider_expression_cron("0 */6 * * *") is True
def test_valider_expression_cron_rejette_une_expression_invalide():
assert valider_expression_cron("pas une expression cron") is False
assert valider_expression_cron("0 25 * * *") is False # heure hors plage
def test_modifier_planification_avec_une_expression_valide(client, session):
reponse = client.post(
"/destinataires/planification",
data={"expression_cron": "0 8 * * *"},
follow_redirects=False,
)
assert reponse.status_code == 303
assert obtenir_expression_cron(session) == "0 8 * * *"
def test_modifier_planification_avec_une_expression_invalide_ne_sauvegarde_pas(client, session):
expression_avant = obtenir_expression_cron(session)
reponse = client.post(
"/destinataires/planification",
data={"expression_cron": "n'importe quoi"},
)
assert reponse.status_code == 200
assert "invalide" in reponse.text.lower()
assert obtenir_expression_cron(session) == expression_avant
def test_page_destinataires_affiche_les_exemples_cron(client, session):
reponse = client.get("/destinataires")
assert reponse.status_code == 200
assert "Tous les lundis à 9h" in reponse.text
assert "0 9 * * mon" in reponse.text