后端新增预算模型、端点和服务模块,支持预算 CRUD 和余额 查询,清理旧生成规则文件并替换为按严重等级分类的差旅风 险规则库,优化认证权限和报销单访问策略,新增财务规则目 录和演示数据构建脚本,前端预算中心增加对话框交互,完善 审计页面运行时模型和元数据展示,补充单元测试。
94 lines
4.2 KiB
JavaScript
94 lines
4.2 KiB
JavaScript
import assert from 'node:assert/strict'
|
|
import test from 'node:test'
|
|
|
|
import {
|
|
canApproveLeaderExpenseClaims,
|
|
canAccessAppView,
|
|
canDeleteArchivedExpenseClaims,
|
|
canEditBudgetCenter,
|
|
canManageExpenseClaims,
|
|
canReturnExpenseClaims,
|
|
canSwitchBudgetDepartments
|
|
} from '../src/utils/accessControl.js'
|
|
import { canProcessApprovalRequest } from '../src/utils/approvalInbox.js'
|
|
|
|
test('direct approvers can return claims without receiving delete permissions', () => {
|
|
const managerUser = { roleCodes: ['manager'] }
|
|
const approverUser = { roleCodes: ['approver'] }
|
|
|
|
assert.equal(canReturnExpenseClaims(managerUser), true)
|
|
assert.equal(canReturnExpenseClaims(approverUser), true)
|
|
assert.equal(canApproveLeaderExpenseClaims(managerUser), true)
|
|
assert.equal(canApproveLeaderExpenseClaims(approverUser), true)
|
|
assert.equal(canManageExpenseClaims(managerUser), false)
|
|
assert.equal(canManageExpenseClaims(approverUser), false)
|
|
})
|
|
|
|
test('finance can return and final approve, but only executives can manage delete permissions', () => {
|
|
assert.equal(canReturnExpenseClaims({ roleCodes: ['finance'] }), true)
|
|
assert.equal(canApproveLeaderExpenseClaims({ roleCodes: ['finance'] }), false)
|
|
assert.equal(canManageExpenseClaims({ roleCodes: ['finance'] }), false)
|
|
assert.equal(canReturnExpenseClaims({ roleCodes: ['executive'] }), true)
|
|
assert.equal(canManageExpenseClaims({ roleCodes: ['executive'] }), true)
|
|
})
|
|
|
|
test('archived claims can only be deleted by admin users', () => {
|
|
assert.equal(canDeleteArchivedExpenseClaims({ roleCodes: ['executive'] }), false)
|
|
assert.equal(canDeleteArchivedExpenseClaims({ roleCodes: ['finance'] }), false)
|
|
assert.equal(canDeleteArchivedExpenseClaims({ isAdmin: true, roleCodes: ['manager'] }), true)
|
|
})
|
|
|
|
test('legacy reimbursement approval and archive centers are no longer accessible app views', () => {
|
|
const adminUser = { isAdmin: true, roleCodes: ['manager', 'finance'] }
|
|
|
|
assert.equal(canAccessAppView(adminUser, 'requests'), false)
|
|
assert.equal(canAccessAppView(adminUser, 'approval'), false)
|
|
assert.equal(canAccessAppView(adminUser, 'archive'), false)
|
|
assert.equal(canAccessAppView(adminUser, 'documents'), true)
|
|
})
|
|
|
|
test('budget center is visible to platform admin, budget monitor, and executive roles only', () => {
|
|
assert.equal(canAccessAppView({ isAdmin: true, roleCodes: ['manager'] }, 'budget'), true)
|
|
assert.equal(canAccessAppView({ username: 'admin', roleCodes: ['manager'] }, 'budget'), true)
|
|
assert.equal(canAccessAppView({ roleCodes: ['budget_monitor'] }, 'budget'), true)
|
|
assert.equal(canAccessAppView({ roleCodes: ['auditor'] }, 'budget'), true)
|
|
assert.equal(canAccessAppView({ roleCodes: ['executive'] }, 'budget'), true)
|
|
assert.equal(canAccessAppView({ roleCodes: ['finance'] }, 'budget'), false)
|
|
assert.equal(canAccessAppView({ roleCodes: ['manager'] }, 'budget'), false)
|
|
})
|
|
|
|
test('budget edit and department switching are limited to admin and senior finance', () => {
|
|
assert.equal(canEditBudgetCenter({ username: 'admin', roleCodes: ['manager'] }), true)
|
|
assert.equal(canSwitchBudgetDepartments({ username: 'admin', roleCodes: ['manager'] }), true)
|
|
assert.equal(canEditBudgetCenter({ roleCodes: ['executive'] }), true)
|
|
assert.equal(canSwitchBudgetDepartments({ roleCodes: ['executive'] }), true)
|
|
assert.equal(canEditBudgetCenter({ roleCodes: ['budget_monitor'] }), false)
|
|
assert.equal(canSwitchBudgetDepartments({ roleCodes: ['budget_monitor'] }), false)
|
|
})
|
|
|
|
test('finance approval inbox only processes finance-stage requests', () => {
|
|
const financeUser = { roleCodes: ['finance'], name: '财务' }
|
|
|
|
assert.equal(
|
|
canProcessApprovalRequest({ workflowNode: '财务审批', person: '张三' }, financeUser),
|
|
true
|
|
)
|
|
assert.equal(
|
|
canProcessApprovalRequest({ workflowNode: '直属领导审批', person: '张三' }, financeUser),
|
|
false
|
|
)
|
|
})
|
|
|
|
test('users with both finance and manager roles can process both relevant stages', () => {
|
|
const financeManagerUser = { roleCodes: ['finance', 'manager'], name: '李经理' }
|
|
|
|
assert.equal(
|
|
canProcessApprovalRequest({ workflowNode: '财务审批', person: '张三' }, financeManagerUser),
|
|
true
|
|
)
|
|
assert.equal(
|
|
canProcessApprovalRequest({ workflowNode: '直属领导审批', person: '张三' }, financeManagerUser),
|
|
true
|
|
)
|
|
})
|