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.
56 lines
2 KiB
Python
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
|