'Widget', 'quantity' => 2, 'unitPriceInCents' => 1500, 'currency' => 'EUR'], ], ); self::assertSame('order-001', $event->orderId); self::assertSame('cust-001', $event->customerId); self::assertSame(3000, $event->totalInCents); self::assertSame('EUR', $event->currency); self::assertSame('2026-01-15T10:30:00+00:00', $event->placedAt); self::assertCount(1, $event->lines); } public function test_contract_serializes_to_stable_json(): void { $event = new OrderPlaced( orderId: 'order-001', customerId: 'cust-001', totalInCents: 3000, currency: 'EUR', placedAt: '2026-01-15T10:30:00+00:00', lines: [ ['productName' => 'Widget', 'quantity' => 2, 'unitPriceInCents' => 1500, 'currency' => 'EUR'], ], ); $json = json_encode($event, JSON_THROW_ON_ERROR); $decoded = json_decode($json, true, flags: JSON_THROW_ON_ERROR); self::assertArrayHasKey('orderId', $decoded); self::assertArrayHasKey('customerId', $decoded); self::assertArrayHasKey('totalInCents', $decoded); self::assertArrayHasKey('currency', $decoded); self::assertArrayHasKey('placedAt', $decoded); self::assertArrayHasKey('lines', $decoded); } public function test_contract_deserializes_from_json(): void { $json = '{"orderId":"order-001","customerId":"cust-001","totalInCents":3000,"currency":"EUR","placedAt":"2026-01-15T10:30:00+00:00","lines":[{"productName":"Widget","quantity":2,"unitPriceInCents":1500,"currency":"EUR"}]}'; $decoded = json_decode($json, true, flags: JSON_THROW_ON_ERROR); $event = new OrderPlaced( orderId: $decoded['orderId'], customerId: $decoded['customerId'], totalInCents: $decoded['totalInCents'], currency: $decoded['currency'], placedAt: $decoded['placedAt'], lines: $decoded['lines'], ); self::assertSame('order-001', $event->orderId); self::assertSame(3000, $event->totalInCents); } }