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(), ); } }