95 lines
3.7 KiB
PHP
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;
|
|
}
|
|
}
|