CaiWuXiTong/tests/Unit/EcommerceFinance/ProductPurchasePriceRepositoryTest.php

58 lines
2.5 KiB
PHP

<?php
namespace Tests\Unit\EcommerceFinance;
use Modules\EcommerceFinance\Repositories\ProductPurchasePriceRepository;
use Modules\EcommerceFinance\Services\UpstreamReadOnlyQuery;
use Modules\EcommerceFinance\Services\UpstreamReadOnlyQueryFactory;
use PHPUnit\Framework\TestCase;
class ProductPurchasePriceRepositoryTest extends TestCase
{
public function test_fixed_batch_query_uses_source_update_cursor_and_required_fields(): void
{
$query = new class extends UpstreamReadOnlyQuery {
public string $sql = '';
public array $bindings = [];
public function __construct() { parent::__construct('jiansun'); }
public function select(string $sql, array $bindings = []): array
{
$this->sql = $sql;
$this->bindings = $bindings;
return [];
}
};
$factory = new class($query) extends UpstreamReadOnlyQueryFactory {
public function __construct(private readonly UpstreamReadOnlyQuery $query) {}
public function forSource(string $source): UpstreamReadOnlyQuery
{
TestCase::assertSame('jiansun', $source);
return $this->query;
}
};
(new ProductPurchasePriceRepository($factory))->mirrorBatch(
['updated_at' => '2026-08-20T10:00:00.000', 'item_id' => 100],
'2026-08-19T00:00:00.000',
'2026-08-21T00:00:00.000',
1000,
);
$this->assertStringContainsString('SELECT TOP (1000)', $query->sql);
$this->assertStringContainsString('[dbo].[jst_purchase] p', $query->sql);
$this->assertStringContainsString('[dbo].[jst_purchaseItem] i', $query->sql);
$this->assertStringContainsString('i.[po_id] = p.[po_id]', $query->sql);
$this->assertStringContainsString('p.[source_o_id]', $query->sql);
$this->assertStringContainsString('p.[seller] AS supplier_name', $query->sql);
$this->assertStringContainsString('i.[qty] AS quantity', $query->sql);
$this->assertStringContainsString('p.[createTime]', $query->sql);
$this->assertStringContainsString('p.[updateTime] >= ?', $query->sql);
$this->assertStringContainsString('p.[updateTime] = ? AND i.[Id] > ?', $query->sql);
$this->assertStringContainsString('ORDER BY p.[updateTime], i.[Id]', $query->sql);
$this->assertStringNotContainsString("p.[status] = 'Finished'", $query->sql);
$this->assertSame(100, $query->bindings[4]);
}
}