[!IMPORTANT] Chaque donnée, règle et résultat de calcul de ce laboratoire est synthétique et non contraignant. Rien ici ne représente un produit, un tarif ou une police Desjardins réel, et aucun organisme de réglementation ni assureur n’a révisé ou approuvé ce contenu.
Aperçu
| Élément | Valeur |
|---|---|
| Durée | 40 minutes |
| Niveau | Intermédiaire |
| Prérequis | Atelier 01 |
Objectifs d’apprentissage
À la fin de ce laboratoire, vous serez capable de :
- Décrire la machine à états d’
ApprovalRepository: DRAFT, PENDING_REVIEW, APPROVED, REJECTED - Expliquer pourquoi la personne qui révise un dossier ne peut jamais être celle qui l’a préparé
- Déclencher et intercepter vous-même une
SelfApprovalError - Confirmer qu’une révision d’un dossier déjà tranché le remet à DRAFT et efface la décision précédente
Exercices
Exercice 3.1 : Lire la machine à états
Ouvrez apps/workshop/approval_repository.py et lisez le docstring du module ainsi que la classe ApprovalRepository. Repérez :
create_draftcrée un dossier en étatDRAFTà la révision 1submit_for_reviewfait passerDRAFTàPENDING_REVIEWapproveetrejectappellent tous deux la méthode privée_decide, qui fait passerPENDING_REVIEWàAPPROVEDouREJECTEDrevisecrée une nouvelle révision à partir de n’importe quel état, la remettant àDRAFTet effaçant le réviseur ainsi que l’horodatage d’approbation
Exercice 3.2 : Exécuter les tests existants
python -m pytest apps/workshop/tests/test_approval_repository.py -v
Résultat attendu : tous les tests réussissent, couvrant l’ensemble de la machine à états et le comportement d’invalidation de révision.
Exercice 3.3 (pratique) : Déclencher un refus d’auto-approbation
Dans un shell Python, créez une ébauche avec une personne préparatrice, soumettez-la pour révision, puis tentez de l’approuver avec cette même personne comme réviseure.
python -c "
import sys
sys.path.insert(0, 'apps/workshop')
from approval_repository import ApprovalRepository, SelfApprovalError
repo = ApprovalRepository()
repo.create_draft('CASE-LAB-001', preparer_id='EMP-001')
repo.submit_for_review('CASE-LAB-001', actor_id='EMP-001')
try:
repo.approve('CASE-LAB-001', reviewer_id='EMP-001')
print('INATTENDU : l’auto-approbation a réussi')
except SelfApprovalError as exc:
print(f'Bloqué comme prévu : {exc}')
record = repo.approve('CASE-LAB-001', reviewer_id='EMP-002')
print(f'Approuvé par un réviseur distinct : state={record.state}')
"
Résultat attendu : le premier appel à approve lève SelfApprovalError. Le second appel, avec un reviewer_id différent, réussit et rapporte state=APPROVED.
Exercice 3.4 (pratique) : Réviser un dossier approuvé
En poursuivant dans la même session de shell, appelez repo.revise('CASE-LAB-001', actor_id='EMP-001') et inspectez l’enregistrement retourné.
Résultat attendu : state est revenu à DRAFT, revision a été incrémenté, et reviewer_id/approved_at sont effacés. L’approbation précédente ne s’applique plus à la nouvelle révision.
Liste de vérification
pytest apps/workshop/tests/test_approval_repository.py -vréussit- Vous avez déclenché et intercepté
SelfApprovalErroravec unreviewer_idégal aupreparer_iddu dossier - Un
reviewer_iddistinct a approuvé le même dossier avec succès reviseaprèsAPPROVEDa remis le dossier àDRAFTet effacé le réviseur ainsi que l’horodatage d’approbation
Vérification des connaissances
- Pourquoi
_decidevérifie-t-ilreviewer_id == record.preparer_idavant de vérifier l’état actuel du dossier ? - Que se passe-t-il si vous appelez
approvedeux fois de suite avec le mêmereviewer_idsur un dossier déjà approuvé ? Relisez_decidesi vous n’êtes pas certain.
Étapes suivantes
Poursuivez avec l’Atelier 04 : Le serveur MCP d’application.