@@ -37,93 +37,37 @@ class Order extends AggregateRoot<OrderId> {
3737 throw StateError ('Order can only be placed when pending' );
3838 }
3939 status = OrderStatus .placed;
40- recordEvent (OrderPlaced (id, at));
4140 }
4241
4342 void ship () {
4443 if (status != OrderStatus .placed) {
4544 throw StateError ('Order can only be shipped when placed' );
4645 }
4746 status = OrderStatus .shipped;
48- recordEvent (OrderShipped (id));
4947 }
5048}
5149
5250void main () {
5351 group ('AggregateRoot' , () {
54- test ('aggregate can record domain events during transitions' , () {
52+ test ('aggregate can perform state transitions' , () {
5553 final order = Order (const OrderId ('order-123' ));
5654 final placedAt = DateTime (2026 , 1 , 21 );
5755
5856 order.place (placedAt);
5957
60- expect (order.events, hasLength (1 ));
61- expect (order.events.first, isA <OrderPlaced >());
62- final event = order.events.first as OrderPlaced ;
63- expect (event.orderId, equals (order.id));
64- expect (event.placedAt, equals (placedAt));
58+ expect (order.status, equals (OrderStatus .placed));
6559 });
6660
67- test ('aggregate records multiple events ' , () {
61+ test ('aggregate can perform multiple transitions ' , () {
6862 final order = Order (const OrderId ('order-123' ));
6963
7064 order.place (DateTime .now ());
7165 order.ship ();
7266
73- expect (order.events, hasLength (2 ));
74- expect (order.events[0 ], isA <OrderPlaced >());
75- expect (order.events[1 ], isA <OrderShipped >());
67+ expect (order.status, equals (OrderStatus .shipped));
7668 });
7769
78- test ('events property returns read-only view' , () {
79- final order = Order (const OrderId ('order-123' ));
80- order.place (DateTime .now ());
81-
82- final events = order.events;
83- expect (() => (events as List ).add (OrderShipped (order.id)), throwsUnsupportedError);
84- });
85-
86- test ('clearEvents removes all recorded events' , () {
87- final order = Order (const OrderId ('order-123' ));
88- order.place (DateTime .now ());
89-
90- expect (order.events, hasLength (1 ));
91-
92- order.clearEvents ();
93-
94- expect (order.events, isEmpty);
95- });
96-
97- test ('pullEvents drains events in order and clears' , () {
98- final order = Order (const OrderId ('order-123' ));
99-
100- order.place (DateTime (2026 , 1 , 21 ));
101- order.ship ();
102-
103- final drained = order.pullEvents ();
104-
105- expect (drained, hasLength (2 ));
106- expect (drained[0 ], isA <OrderPlaced >());
107- expect (drained[1 ], isA <OrderShipped >());
108- expect (order.events, isEmpty);
109- });
110-
111- test ('pullEvents returns empty list when no events are recorded' , () {
112- final order = Order (const OrderId ('order-123' ));
113-
114- final drained = order.pullEvents ();
115-
116- expect (drained, isEmpty);
117- expect (order.events, isEmpty);
118- });
119-
120- test ('aggregate starts with no events' , () {
121- final order = Order (const OrderId ('order-123' ));
122-
123- expect (order.events, isEmpty);
124- });
125-
126- test ('aggregate enforces invariants without infrastructure' , () {
70+ test ('aggregate enforces invariants' , () {
12771 final order = Order (const OrderId ('order-123' ));
12872
12973 // Cannot ship without placing first
0 commit comments