CaiWuXiTong/tests/Feature/Business/FinanceLedgerNavigationTest.php
shanshi 2c1bea34e0 feat(财务台账): 支持逐行修改动账账户关联 (#456)
动账明细账户简称支持输入搜索和逐行修改,映射、流水及余额同步重算。
2026-10-22 11:49:52 +08:00

142 lines
5.1 KiB
PHP

<?php
namespace Tests\Feature\Business;
use App\Models\Auth\Permission;
use App\Models\Auth\Role;
use App\Models\Auth\User;
use App\Utilities\BusinessNavigation;
use App\Utilities\SidebarMenu;
use App\Utilities\SidebarPermissions;
use Tests\Feature\FeatureTestCase;
class FinanceLedgerNavigationTest extends FeatureTestCase
{
public function test_ledger_is_the_last_page_under_financial_operations(): void
{
$navigation = collect(BusinessNavigation::all())->keyBy('slug');
$financialOperations = $navigation->get('financial-operations');
$this->assertNotNull($financialOperations);
$this->assertSame('ledger', collect($financialOperations['pages'])->last()['slug']);
$this->assertFalse($navigation->has('financial-ledger'));
}
public function test_ledger_is_the_first_quick_link_under_operating_reports(): void
{
$this->loginAs();
$reports = collect(SidebarMenu::groups($this->user))->firstWhere('title', '经营报表');
$this->assertNotNull($reports);
$this->assertSame([
'section' => 'financial-operations',
'page' => 'ledger',
'title' => '财务台账',
'icon' => 'menu_book',
], $reports['items'][0]);
}
public function test_ledger_page_and_legacy_link_open_under_financial_operations(): void
{
$this->loginAs();
$target = route('business.pages.show', [
'section' => 'financial-operations',
'page' => 'ledger',
]);
$response = $this->get($target . '?tab=flows')
->assertOk()
->assertSeeText('财务经营报表')
->assertSeeText('财务台账')
->assertSee('data-ledger-page', false)
->assertSee('data-ledger-tab="flows"', false)
->assertSee($target . '?tab=accounts', false);
$this->assertSame(1, substr_count($response->getContent(), 'href="' . e($target) . '"'));
$legacy = route('business.pages.show', [
'section' => 'financial-ledger',
'page' => 'ledger',
]);
$this->get($legacy . '?tab=flows')->assertRedirect($target . '?tab=flows');
$this->get($legacy . '/flows')->assertRedirect($target . '?tab=flows');
$this->get(route('business.financial-ledger.accounts.template'))->assertOk();
}
public function test_ledger_actions_use_financial_operations_permission(): void
{
foreach ([
'business.financial-operations.ledger.mapping.update',
'business.financial-ledger.mapping.update',
'business.financial-ledger.accounts.status',
'business.financial-ledger.accounts.type',
'business.financial-ledger.accounts.template',
'business.financial-ledger.transactions.account.update',
'business.financial-ledger.mapping.shop.preview',
'business.financial-ledger.mapping.shop.apply',
'business.financial-ledger.mapping.payable.preview',
'business.financial-ledger.mapping.payable.apply',
] as $routeName) {
$route = app('router')->getRoutes()->getByName($routeName);
$this->assertNotNull($route, $routeName);
$this->assertContains(
'business.page:financial-operations,ledger',
$route->gatherMiddleware(),
$routeName
);
}
}
public function test_legacy_ledger_permissions_follow_the_page(): void
{
$regular = $this->regularAccount();
$subject = 'user_' . $regular->id;
foreach (['financial-ledger', 'financial-ledger/ledger'] as $legacyKey) {
setting()->set('system.sidebar_permissions', [
'configured' => [$subject],
'subjects' => [$subject => [$legacyKey]],
]);
$this->assertSame(
['financial-operations/ledger'],
SidebarPermissions::allowedKeys($regular)
);
$navigation = SidebarPermissions::navigationFor($regular);
$this->assertSame(['financial-operations'], array_column($navigation, 'slug'));
$this->assertSame(['ledger'], array_column($navigation[0]['pages'], 'slug'));
}
$this->loginAs($regular)
->get(route('business.pages.show', [
'section' => 'financial-operations',
'page' => 'ledger',
]))
->assertOk()
->assertSee('data-ledger-page', false);
}
private function regularAccount(): User
{
$name = 'fixture-finance-ledger-' . User::count();
$user = User::create([
'name' => $name,
'email' => $name . '@example.test',
'password' => 'fixture-unused-password',
'enabled' => true,
'locale' => 'zh-CN',
'landing_page' => 'dashboard',
]);
$user->roles()->attach(Role::where('name', 'user')->firstOrFail()->id);
$user->permissions()->attach(Permission::where('name', 'read-admin-panel')->firstOrFail()->id);
$user->companies()->attach($this->company->id);
return $user;
}
}