captureInsert([ 'status' => 'success', 'operation' => 'order_create', 'request_payload' => ['order_no' => '100001', 'items' => [['sku' => 'A'], ['sku' => 'B']]], 'response_payload' => ['code' => 0, 'request_id' => 'REQ-1', 'data' => ['id' => 99]], ]); $request = json_decode((string)$inserted['request_payload'], true, 512, JSON_THROW_ON_ERROR); $response = json_decode((string)$inserted['response_payload'], true, 512, JSON_THROW_ON_ERROR); self::assertSame('Success payload omitted by retention policy.', $request['_summary']); self::assertSame(2, $request['items_count']); self::assertArrayNotHasKey('order_no', $request); self::assertSame(0, $response['code']); self::assertSame('REQ-1', $response['request_id']); self::assertSame(1, $response['data_count']); } public function testFailedPayloadRemainsAvailableAndSanitized(): void { $inserted = $this->captureInsert([ 'status' => 'failed', 'operation' => 'order_create', 'request_payload' => [ 'order_no' => '100001', 'phone' => '123456', 'receiver_mobile' => '123456', 'postal_code' => '78701', 'buyer_email' => 'buyer@example.com', 'buyer_name' => 'Buyer Name', ], ]); $request = json_decode((string)$inserted['request_payload'], true, 512, JSON_THROW_ON_ERROR); self::assertSame('100001', $request['order_no']); self::assertSame('[REDACTED]', $request['phone']); self::assertSame('[REDACTED]', $request['receiver_mobile']); self::assertSame('[REDACTED]', $request['postal_code']); self::assertSame('[REDACTED]', $request['buyer_email']); self::assertSame('[REDACTED]', $request['buyer_name']); } public function testInventoryProtectionCountsRemainInSuccessSummary(): void { $inserted = $this->captureInsert([ 'status' => 'success', 'operation' => 'inventory_sync', 'response_payload' => [ 'items' => 10, 'unmapped' => 2, 'zeroed' => 3, 'preserved_without_erp_sku' => 4, ], ]); $response = json_decode((string)$inserted['response_payload'], true, 512, JSON_THROW_ON_ERROR); self::assertSame(2, $response['unmapped']); self::assertSame(3, $response['zeroed']); self::assertSame(4, $response['preserved_without_erp_sku']); } /** @return array */ private function captureInsert(array $data): array { $inserted = []; $connection = $this->createMock(AdapterInterface::class); $connection->expects(self::once())->method('insert')->willReturnCallback( static function (string $table, array $row) use (&$inserted): int { self::assertSame('esun_lingxing_sync_log', $table); $inserted = $row; return 1; } ); $resource = $this->createMock(ResourceConnection::class); $resource->method('getConnection')->willReturn($connection); $resource->method('getTableName')->willReturnArgument(0); (new LogWriter($resource))->write($data); return $inserted; } }