CaiWuXiTong/tests/Feature/Business/ShippingDataPageTest.php

116 lines
4.8 KiB
PHP

<?php
namespace Tests\Feature\Business;
use App\Models\Auth\Permission;
use Mockery;
use Modules\EcommerceFinance\Repositories\ShippingOrderRepository;
use Tests\Feature\FeatureTestCase;
class ShippingDataPageTest extends FeatureTestCase
{
public function test_page_passes_all_filters_and_renders_export_and_date_pickers(): void
{
$this->grantPermission();
$repository = Mockery::mock(ShippingOrderRepository::class);
$repository->shouldReceive('paginate')->once()->withArgs(function (array $filters, int $page, int $limit): bool {
return $filters === [
'express_no' => 'EXP-001',
'sourceno' => 'TRADE-001',
'barcode' => 'BAR-001',
'supplier_name' => '新北供应商',
'shop_name' => '测试店铺',
'warehouse_name' => '一号仓',
'express_company' => '顺丰',
'ship_from' => '2026-09-01',
'ship_to' => '2026-09-16',
] && $page === 1 && $limit > 0;
})->andReturn(['data' => [], 'total' => 0]);
$repository->shouldReceive('syncStatus')->once()->andReturn([
'code' => 'succeeded',
'last_succeeded_at' => '2026-09-16 10:16:36',
]);
$this->app->instance(ShippingOrderRepository::class, $repository);
$this->loginAs()->get(route('business.pages.show', [
'section' => 'courier-payables',
'page' => 'shipping-data',
'express_no' => 'EXP-001',
'sourceno' => 'TRADE-001',
'barcode' => 'BAR-001',
'supplier_name' => '新北供应商',
'shop_name' => '测试店铺',
'warehouse_name' => '一号仓',
'express_company' => '顺丰',
'ship_from' => '2026-09-01',
'ship_to' => '2026-09-16',
]))
->assertOk()
->assertSee('name="barcode"', false)
->assertSee('name="supplier_name"', false)
->assertSee('name="shop_name"', false)
->assertSee('name="warehouse_name"', false)
->assertSee('name="express_company"', false)
->assertSee('type="date" name="ship_from"', false)
->assertSee('data-date-picker-input="shipping-from"', false)
->assertSeeText('导出');
}
public function test_export_uses_current_filters_and_preserves_identifiers_as_text(): void
{
$this->grantPermission();
$repository = Mockery::mock(ShippingOrderRepository::class);
$repository->shouldReceive('exportRows')->once()->withArgs(function (array $filters): bool {
return $filters['barcode'] === '6901234567890'
&& $filters['supplier_name'] === '新北供应商'
&& $filters['shop_name'] === '测试店铺'
&& $filters['warehouse_name'] === '一号仓'
&& $filters['express_company'] === '顺丰'
&& $filters['ship_from'] === '2026-09-01'
&& $filters['ship_to'] === '2026-09-16';
})->andReturn((static function (): \Generator {
yield [
'express_no' => '01234567890123456789',
'trade_no' => 'TRADE-001',
'barcode' => '6901234567890',
'product_name' => '测试商品',
'qty' => 2,
'shop_name' => '测试店铺',
'warehouse_name' => '一号仓',
'supplier_name' => '新北供应商',
'express_name1' => '顺丰速运',
'ship_time' => '2026-09-10 12:00:00',
];
})());
$this->app->instance(ShippingOrderRepository::class, $repository);
$response = $this->loginAs()->get(route('business.courier-payables.shipping-data.export', [
'barcode' => '6901234567890',
'supplier_name' => '新北供应商',
'shop_name' => '测试店铺',
'warehouse_name' => '一号仓',
'express_company' => '顺丰',
'ship_from' => '2026-09-01',
'ship_to' => '2026-09-16',
]));
$response->assertOk();
$this->assertStringContainsString('attachment;', (string) $response->headers->get('content-disposition'));
$content = $response->streamedContent();
$this->assertStringStartsWith(chr(0xEF) . chr(0xBB) . chr(0xBF), $content);
$this->assertStringContainsString('快递单号', $content);
$this->assertStringContainsString("'01234567890123456789", $content);
$this->assertStringContainsString("'6901234567890", $content);
$this->assertStringContainsString('新北供应商', $content);
}
private function grantPermission(): void
{
$this->user->attachPermission(
Permission::where('name', 'read-admin-panel')->firstOrFail(),
);
}
}