testing : formaliser les factories de state d'agrégat dans les tests #18
Labels
No labels
bug
enhancement
pr-split
question
security
transaction-matcher
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
momsse/octant#18
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Issue de la review de la PR 04 (#34) — le pattern des factories de state commence à proliférer.
Constat
Chaque fichier de test d'agrégat redéfinit à la main ses factories de state en chaînant
aggregate.evolve:user.aggregate.test.ts(PR 04) : 7 factories (activeAliceState,aliceWithSessionState,aliceWithDiscordLinkedState,aliceWithDiscordTokensState,suspendedAliceState,anonymizedAliceState,deletedAliceState)feat/authentication, le même pattern se répète dans les 5 tests d'agrégats authorization (PRs 7-9) :activeAdminRoleState,defaultAdminRoleState,deletedAdminRoleState, etc.Coûts : duplication des chaînes
evolve(evolve(...))illisibles au-delà de 2 events, fixtures divergentes entre le test d'agrégat et les tests de use-cases pour « le même » état métier, et aucun endroit canonique où trouver « un user actif avec un compte Discord lié ».Proposition
Deux étages :
@octant/event-sourcing(ou@octant/testing) — les agrégats exposent déjàreconstitute(events, emptyState), il manque juste l'idiome :Les chaînes
evolve(evolve(...))deviennent une liste plate d'events — déjà plus lisible sans rien inventer.user.fixtures.tsà côté deuser.aggregate.test.ts, suffixe.fixtures.tsà ajouter aux conventions du CLAUDE.md « Domain package layout ») : le fichier exporte les factories nommées (activeAliceState(), …) construites sur le helper, et les tests de use-cases importent les mêmes fixtures que le test d'agrégat — un seul endroit définit ce qu'est « un user actif avec un compte Discord ».À arbitrer : fonction libre vs builder fluent (
givenUser(aliceId).created().linkedTo('discord').suspended()) — le builder est plus lisible pour les longs scénarios mais c'est une DSL à maintenir ; commencer par la liste plate d'events suffit probablement.Timing
Applicable dès la PR 05 (les tests de use-cases en profitent immédiatement) et rentabilisé sur les PRs 7-9 (5 agrégats authorization). Peut se faire en PR dédiée courte après le merge de #34, ou se glisser dans #16 (déjà dans
@octant/event-sourcing).