CaiWuXiTong/tests/Unit/EcommerceFinance/InventoryRepositoryTest.php

93 lines
4.1 KiB
PHP

<?php
namespace Tests\Unit\EcommerceFinance;
use Modules\EcommerceFinance\Repositories\InventoryRepository;
use Modules\EcommerceFinance\Services\UpstreamReadOnlyQuery;
use Modules\EcommerceFinance\Services\UpstreamReadOnlyQueryFactory;
use PHPUnit\Framework\TestCase;
class InventoryRepositoryTest extends TestCase
{
public function test_board_inventory_uses_latest_raw_board_snapshot_and_calculates_amounts(): void
{
$query = $this->createMock(UpstreamReadOnlyQuery::class);
$query->expects($this->once())->method('select')->willReturnCallback(
function (string $sql, array $bindings): array {
UpstreamReadOnlyQuery::assertReadOnlySql($sql);
$this->assertStringContainsString('[dbo].[pm_boardInventoryDetail_snapshot]', $sql);
$this->assertStringContainsString('s.stockType = ?', $sql);
$this->assertStringContainsString('MAX(latest.[month])', $sql);
$this->assertStringContainsString('AS stock_in_amount', $sql);
$this->assertStringContainsString('AS closing_remaining_value', $sql);
$this->assertStringContainsString('AS previous_remaining_value', $sql);
$this->assertStringContainsString('AS stock_out_amount', $sql);
$this->assertSame(
['素板', '素板', '%苏阳%', '%15密度板%', '%15MDF%', '2026-06-01', '2026-06-30', 26, 50],
$bindings,
);
return [[
'manufacturer' => '苏阳',
'specification' => '15密度板',
'stock_in_amount' => '590.04',
'closing_remaining_value' => '283428.10',
'summary_opening_balance' => '12060.00',
'summary_stock_in' => '18.00',
'summary_lamination_out' => '3415.00',
'summary_inventory' => '8645.00',
'summary_remaining_value' => '507270.50',
'summary_stock_in_amount' => '590.04',
'summary_closing_remaining_value' => '283428.10',
'summary_previous_remaining_value' => '395326.80',
'summary_stock_out_amount' => '111933.70',
'total_count' => 51,
]];
},
);
$factory = $this->createMock(UpstreamReadOnlyQueryFactory::class);
$factory->expects($this->once())->method('forSource')->with('jiansun')->willReturn($query);
$result = (new InventoryRepository($factory))->boardInventoryDetails([
'manufacturer' => '苏阳',
'specification' => '15密度板',
'matching_value' => '15MDF',
'date_from' => '2026-06-01',
'date_to' => '2026-06-30',
], 2, 25);
$this->assertSame(51, $result['total']);
$this->assertSame('苏阳', $result['data'][0]['manufacturer']);
$this->assertSame(8645.0, $result['totals']['inventory']);
$this->assertSame(283428.1, $result['totals']['closing_remaining_value']);
$this->assertArrayNotHasKey('total_count', $result['data'][0]);
$this->assertArrayNotHasKey('summary_inventory', $result['data'][0]);
}
public function test_board_inventory_escapes_like_filters_and_caps_page_size(): void
{
$query = $this->createMock(UpstreamReadOnlyQuery::class);
$query->expects($this->once())->method('select')->willReturnCallback(
function (string $sql, array $bindings): array {
UpstreamReadOnlyQuery::assertReadOnlySql($sql);
$this->assertSame(['素板', '素板', '%A\\%B\\_C%', 1, 100], $bindings);
return [];
},
);
$factory = $this->createMock(UpstreamReadOnlyQueryFactory::class);
$factory->method('forSource')->willReturn($query);
$result = (new InventoryRepository($factory))->boardInventoryDetails([
'manufacturer' => 'A%B_C',
], 0, 1000);
$this->assertSame(0, $result['total']);
$this->assertSame([], $result['data']);
$this->assertSame(0.0, $result['totals']['inventory']);
}
}