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]); } }