createMessage('idem-001'); $consumer($message); $consumer($message); // duplicate // Only one invoice should exist $invoice = $invoiceRepo->findByExternalOrderId('idem-001'); self::assertNotNull($invoice); self::assertSame('INV-000001', $invoice->invoiceNumber); } public function test_fulfillment_consumer_ignores_duplicate(): void { $shipmentRepo = new InMemoryShipmentRequestRepository(); $gateway = new FakeLegacyFulfillmentGateway(); $idempotencyStore = new InMemoryIdempotencyStore(); $consumer = new FulfillmentConsumer( new LegacyShipmentAcl(), new RequestShipmentFromSalesOrderHandler($shipmentRepo, $gateway, new SystemClock()), $idempotencyStore, ); $message = $this->createMessage('idem-002'); $consumer($message); $consumer($message); // duplicate // Only one shipment should exist, only one gateway call self::assertCount(1, $gateway->sentRequests()); } public function test_correlation_id_is_propagated(): void { $message = new OrderConfirmed( orderId: 'corr-001', customerId: 'cust-001', totalInCents: 1000, currency: 'EUR', lines: [['productName' => 'X', 'quantity' => 1, 'unitPriceInCents' => 1000, 'currency' => 'EUR']], correlationId: 'corr-id-abc-123', ); self::assertSame('corr-id-abc-123', $message->correlationId); } private function createMessage(string $orderId): OrderConfirmed { return new OrderConfirmed( orderId: $orderId, customerId: 'cust-001', totalInCents: 1500, currency: 'EUR', lines: [['productName' => 'Widget', 'quantity' => 1, 'unitPriceInCents' => 1500, 'currency' => 'EUR']], correlationId: 'test-correlation-id', ); } }