CaiWuXiTong/tests/Feature/Business/CourierInformationPageTest.php
limeng 288184c8dc feat: 快递资料合同甲乙方与协议签署联动 (#341)
新增合同主体(乙方)与签订公司(甲方)只读展示和导出;协议签署自动带出唯一乙方,缺失或冲突留空核对。19项直接相关测试与实际浏览器联动验证通过。无权限、金额、数据库结构或配置改动。
2026-10-15 17:00:21 +08:00

126 lines
5.8 KiB
PHP

<?php
namespace Tests\Feature\Business;
use App\Models\Auth\Permission;
use Mockery;
use Modules\EcommerceFinance\Repositories\CourierInformationMirrorRepository;
use Tests\Feature\FeatureTestCase;
class CourierInformationPageTest extends FeatureTestCase
{
public function test_page_explains_when_courier_mirror_is_not_available(): void
{
$this->user->attachPermission(
Permission::where('name', 'read-admin-panel')->firstOrFail()
);
$repository = Mockery::mock(CourierInformationMirrorRepository::class);
$repository->shouldReceive('relatedAvailability')->once()->andReturn([
'main' => false, 'networks' => false, 'accounts' => false,
'network_ready' => false, 'account_ready' => false,
]);
$repository->shouldReceive('available')->once()->andReturnFalse();
$repository->shouldNotReceive('state');
$repository->shouldNotReceive('syncStatus');
$repository->shouldNotReceive('ready');
$repository->shouldNotReceive('paginate');
$this->app->instance(CourierInformationMirrorRepository::class, $repository);
$this->loginAs()
->get(route('business.pages.show', [
'section' => 'courier-payables',
'page' => 'courier-information',
'courier_tab' => 'express',
]))
->assertOk()
->assertSeeText('快递资料')
->assertSeeText('共享业务镜像尚未建立,快递资料暂时无法读取。')
->assertSeeText('网点')
->assertSeeText('打款信息')
->assertSeeText('操作日志');
}
public function test_page_renders_mirrored_courier_rows_and_filters(): void
{
$this->user->attachPermission(
Permission::where('name', 'read-admin-panel')->firstOrFail()
);
$repository = Mockery::mock(CourierInformationMirrorRepository::class);
$repository->shouldReceive('relatedAvailability')->once()->andReturn([
'main' => true, 'networks' => false, 'accounts' => false,
'network_ready' => false, 'account_ready' => false,
]);
$repository->shouldReceive('available')->once()->andReturnTrue();
$repository->shouldReceive('state')->once()->andReturn([
'status' => 'succeeded',
'initial_completed_at' => '2026-08-28 10:00:00',
'last_succeeded_at' => '2026-08-28 10:00:00',
'mirror_row_count' => 1,
]);
$repository->shouldReceive('syncStatus')->once()->andReturn(['code' => 'healthy', 'lag_minutes' => 3]);
$repository->shouldReceive('ready')->once()->andReturnTrue();
$repository->shouldReceive('paginate')->once()->withArgs(function (array $filters, int $page, int $limit): bool {
return $filters['expcode'] === 'SF' && $filters['status'] === '1' && $page === 1 && $limit > 0;
})->andReturn([
'data' => [(object) [
'Id' => 1,
'expcode' => 'SF',
'expname' => '顺丰速运',
'status' => 1,
'tradebody' => '乙方顺丰物流有限公司',
'signcom' => '甲方商贸有限公司',
'tradebtime' => '2026-01-01 00:00:00',
]],
'total' => 1,
]);
$this->app->instance(CourierInformationMirrorRepository::class, $repository);
$response = $this->loginAs()
->get(route('business.pages.show', [
'section' => 'courier-payables',
'page' => 'courier-information',
'courier_tab' => 'express',
'expcode' => 'SF',
'status' => '1',
]))
->assertOk()
->assertSeeText('顺丰速运')
->assertSeeText('SF')
->assertSeeText('同步正常')
->assertSeeText('可达服务')
->assertSeeText('合同主体')->assertSeeText('乙方顺丰物流有限公司')
->assertSeeText('签订公司')->assertSeeText('甲方商贸有限公司')
->assertSeeText('第 1 / 1 页,本页 1 条,共 1 条')
->assertSee('name="expcode"', false);
$this->assertMatchesRegularExpression(
'/<div class="courier-information-table-panel">\s*<div class="courier-information-table-wrap">.*?<\/table>\s*<\/div>\s*<div class="courier-information-footer">/s',
$response->getContent()
);
}
public function test_export_keeps_contract_parties_in_their_own_columns(): void
{
$this->user->attachPermission(Permission::where('name', 'read-admin-panel')->firstOrFail());
$repository = Mockery::mock(CourierInformationMirrorRepository::class);
$repository->shouldReceive('available')->once()->andReturnTrue();
$repository->shouldReceive('ready')->once()->andReturnTrue();
$repository->shouldReceive('exportRows')->once()->andReturnUsing(static function (): \Generator {
yield (object) [
'Id' => 1, 'expcode' => 'EXP-1', 'expname' => '导出快递简称',
'tradebody' => '导出乙方有限公司', 'signcom' => '=甲方公式样式名称',
];
});
$this->app->instance(CourierInformationMirrorRepository::class, $repository);
$response = $this->loginAs()->get(route('business.courier-payables.courier-information.export'))->assertOk();
$lines = preg_split('/\r?\n/', ltrim($response->streamedContent(), "\xEF\xBB\xBF"));
$headers = str_getcsv($lines[0]);
$row = array_combine($headers, str_getcsv($lines[1]));
$this->assertSame('导出乙方有限公司', $row['合同主体']);
$this->assertSame("'=甲方公式样式名称", $row['签订公司']);
$this->assertSame('导出快递简称', $row['快递公司名称']);
}
}