'Widget', 'quantity' => 2, 'unitPriceInCents' => 1500, 'currency' => 'EUR', 'lineTotalInCents' => 3000], ], ); self::assertSame('order-001', $view->orderId); self::assertSame('confirmed', $view->status); self::assertSame(5500, $view->totalInCents); self::assertCount(1, $view->lines); } public function test_contract_serializes_to_stable_json(): void { $view = new OrderView( orderId: 'order-001', customerId: 'cust-001', status: 'placed', totalInCents: 3000, currency: 'EUR', lines: [ ['productName' => 'Widget', 'quantity' => 2, 'unitPriceInCents' => 1500, 'currency' => 'EUR', 'lineTotalInCents' => 3000], ], ); $json = json_encode($view, JSON_THROW_ON_ERROR); $decoded = json_decode($json, true, flags: JSON_THROW_ON_ERROR); self::assertArrayHasKey('orderId', $decoded); self::assertArrayHasKey('customerId', $decoded); self::assertArrayHasKey('status', $decoded); self::assertArrayHasKey('totalInCents', $decoded); self::assertArrayHasKey('currency', $decoded); self::assertArrayHasKey('lines', $decoded); } }