Files
esun3d/app/code/Esun/LingxingErp/Test/Unit/Model/Sync/LogWriterTest.php
T
2026-09-15 10:35:56 +08:00

95 lines
3.7 KiB
PHP

<?php
declare(strict_types=1);
namespace Esun\LingxingErp\Test\Unit\Model\Sync;
use Esun\LingxingErp\Model\Sync\LogWriter;
use Magento\Framework\App\ResourceConnection;
use Magento\Framework\DB\Adapter\AdapterInterface;
use PHPUnit\Framework\TestCase;
class LogWriterTest extends TestCase
{
public function testSuccessfulPayloadIsStoredAsCompactSummary(): void
{
$inserted = $this->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<string, mixed> */
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;
}
}