新增合同主体(乙方)与签订公司(甲方)只读展示和导出;协议签署自动带出唯一乙方,缺失或冲突留空核对。19项直接相关测试与实际浏览器联动验证通过。无权限、金额、数据库结构或配置改动。
126 lines
5.8 KiB
PHP
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['快递公司名称']);
|
|
}
|
|
}
|