'Widget', 'quantity' => 2, 'unitPriceInCents' => 1500, 'currency' => 'EUR'], ['productName' => 'Gadget', 'quantity' => 1, 'unitPriceInCents' => 2500, 'currency' => 'EUR'], ], ); self::assertSame('order-001', $event->orderId); self::assertSame('cust-001', $event->customerId); self::assertSame(5500, $event->totalInCents); self::assertSame('EUR', $event->currency); self::assertCount(2, $event->lines); } public function test_contract_serializes_to_stable_json(): void { $event = new OrderConfirmed( orderId: 'order-001', customerId: 'cust-001', totalInCents: 5500, currency: 'EUR', 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('lines', $decoded); } public function test_lines_contain_required_fields(): void { $event = new OrderConfirmed( orderId: 'order-001', customerId: 'cust-001', totalInCents: 3000, currency: 'EUR', 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); $line = $decoded['lines'][0]; self::assertArrayHasKey('productName', $line); self::assertArrayHasKey('quantity', $line); self::assertArrayHasKey('unitPriceInCents', $line); self::assertArrayHasKey('currency', $line); } }