Files
admin-web/src/modules/finance/pages/FinancePresentation.test.ts
T
2026-08-17 16:45:46 +08:00

160 lines
9.5 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { readFileSync } from 'node:fs'
import { resolve } from 'node:path'
import { describe, expect, it } from 'vitest'
const settlement = readFileSync(resolve(process.cwd(), 'src/modules/finance/pages/FinanceFormalSettlementPage.vue'), 'utf8')
const financeRoutes = readFileSync(resolve(process.cwd(), 'src/modules/finance/routes.ts'), 'utf8')
const accounts = readFileSync(resolve(process.cwd(), 'src/modules/finance/pages/FinanceCustomerAccountsView.vue'), 'utf8')
const statements = readFileSync(resolve(process.cwd(), 'src/modules/finance/pages/FinanceCustomerStatementsView.vue'), 'utf8')
const arap = readFileSync(resolve(process.cwd(), 'src/modules/finance/pages/FinanceCustomerArapView.vue'), 'utf8')
const manual = readFileSync(resolve(process.cwd(), 'src/modules/finance/pages/FinanceManualPage.vue'), 'utf8')
describe('finance presentation governance', () => {
it('shows customer names instead of internal customer IDs in formal settlements', () => {
expect(settlement).toContain('customerName(detail.value.customerId, detail.value.customerName)')
expect(settlement).toContain('detailPartyName()')
expect(settlement).toContain('activeCustomers.value.map')
expect(settlement).not.toContain('{{ selected.customerId }}')
})
it('uses prototype-defined standalone settlement details and modal partial payments', () => {
expect(financeRoutes).toContain("finance/settlement-receivables/:settlementId")
expect(financeRoutes).toContain("finance/settlement-payables/:settlementId")
expect(financeRoutes).toContain('showPageHeading: false')
expect(settlement).toContain('class="settlement-detail-page surface-panel"')
expect(settlement).toContain('返回列表')
expect(settlement).not.toContain('AppDrawer')
expect(settlement).toContain('登记后剩余余额')
expect(settlement).toContain('remainingAfter(receiptForm.amount)')
expect(settlement).toContain('remainingAfter(paymentForm.amount)')
})
it('uses one continuous desktop detail surface with balanced summary and scroll-safe tables', () => {
expect(settlement).toContain('<DetailPageLayout v-else-if="detailMode" class="settlement-detail-page surface-panel"')
expect(settlement).toContain('class="settlement-detail-content"')
expect(settlement).toContain('min-height: 54px;')
expect(settlement).toContain('align-items: center;')
expect(settlement).toContain('justify-content: space-between')
expect(settlement).toContain('<el-descriptions :column="4" class="settlement-detail-info">')
for (const title of ['基本信息', '费用明细', '修订记录']) expect(settlement).toContain(`title="${title}"`)
expect(settlement).toContain(':title="kind === \'receivable\' ? \'收款记录\' : \'付款记录\'"')
expect(settlement.match(/class="detail-table-scroll"/g)).toHaveLength(3)
expect(settlement).toContain('grid-template-columns: repeat(4, minmax(0, 1fr))')
expect(settlement).toContain(':deep(.detail-table-scroll .el-table) { min-width: 920px; }')
expect(settlement).not.toContain('class="detail-section surface-panel"')
expect(settlement.match(/width="min\(760px, 94vw\)"/g)).toHaveLength(2)
expect(settlement.match(/class="settlement-operation-form"/g)).toHaveLength(2)
expect(settlement).toContain('grid-template-columns: repeat(5, minmax(0, 1fr))')
expect(settlement).toContain('grid-template-columns: repeat(2, minmax(0, 1fr));')
expect(settlement).toContain('column-gap: 14px;')
})
it('keeps settlement totals and list actions in one compact toolbar', () => {
expect(settlement).toContain('class="settlement-list-toolbar"')
expect(settlement).toContain('class="settlement-summary" aria-label="结算汇总"')
expect(settlement).toContain('class="settlement-list-actions"')
expect(settlement).toContain('min-height: 54px; align-items: center; justify-content: space-between')
expect(settlement).toContain('.settlement-summary .summary-item + .summary-item')
expect(settlement).not.toContain('<template #toolbar-actions>')
})
it('keeps settlement details focused on finance-facing labels and fields', () => {
expect(settlement).toContain('financeSourceTypeLabel(scope.row.sourceType)')
expect(settlement).toContain('financeOperationActionLabel(scope.row.action)')
expect(settlement).toContain('displayDateTime(scope.row.occurredAt)')
expect(settlement).not.toContain('label="来源版本"')
})
it('uses optional all-customer filters without a customer-selection blocker', () => {
for (const source of [settlement, statements, arap]) {
expect(source).toContain("placeholder: '全部客户'")
expect(source).not.toContain('全客户查询暂不可用')
expect(source).not.toContain('empty-text="请选择客户查询')
}
})
it('uses active-customer name selectors across all formal finance pages', () => {
for (const source of [accounts, arap, statements, settlement]) {
expect(source).toContain("type: 'select'")
expect(source).toContain("label: '客户名称'")
expect(source).toContain('label: item.tenantName')
expect(source).not.toContain('tenantCode} · ${item.tenantName')
}
expect(accounts).not.toContain("key: 'keyword', type: 'input'")
})
it('translates source codes and provides reason placeholders', () => {
expect(arap).toContain('sourceTypeDisplay(detail.sourceType)')
expect(arap).toContain('financeOperationActionLabel(log.action)')
expect(arap).toContain('financeOperationResultLabel(log.result)')
expect(arap).toContain('financeDirectionLabel(row.direction)')
expect(arap).toContain('financeDirectionLabel(detail.direction)')
expect(arap).not.toContain("detail.direction === 'RECEIVABLE' ? '应收' : '应付'")
expect(arap).toContain('请填写驳回原因')
expect(arap).toContain('请说明参与或排除结算的原因')
})
it('does not expose the uploaded voucher file ID in the form', () => {
expect(manual).toContain('凭证已上传,创建失败时可直接重试')
expect(manual).not.toContain('凭证 fileId:')
})
it('exposes frozen G3 controls without unavailable placeholders', () => {
expect(settlement).not.toContain('生成{{ title }}')
expect(settlement).not.toContain('接口尚未提供,暂不可操作')
expect(statements).toContain('生成对账单')
expect(statements).toContain('createReconciliationStatement')
expect(statements).toContain('actionReconciliationStatement')
expect(statements).toContain('<template #toolbar-actions>')
expect(statements).toContain('aria-label="更多对账单操作"')
expect(statements).toContain('adjustmentLines: selected.map')
expect(statements).not.toContain('disabled title="接口尚未提供')
})
it('uses bordered striped tables for statement business details', () => {
expect(statements).toContain(':data="detail.lines" size="small" border stripe')
expect(statements).toContain(':data="detail.revisions" size="small" border stripe')
expect(statements).toContain(':data="adjustLines" size="small" max-height="420" border stripe')
})
it('opens statement details on a compact dedicated route instead of below the list', () => {
expect(statements).toContain('v-else-if="isDetailRoute" class="surface-panel statement-detail-page"')
expect(statements).toContain('@row-click="openDetail"')
expect(statements).toContain("name: 'finance-customer-statement-detail'")
expect(statements).toContain('.statement-detail-page :deep(.detail-page-layout) { gap: 0; }')
expect(statements).toContain('返回客户对账单')
expect(statements).not.toContain('aria-label="所选对账单联动明细"')
expect(statements).not.toContain('核对账期、金额和结清状态后查看下方业务明细。')
expect(statements).not.toContain('展示当前对账单版本中的业务与计费明细。')
expect(statements).not.toContain('只读展示当前对账单关联的有效收款记录。')
})
it('uses a compact financial summary row for customer accounts', () => {
expect(accounts).toContain('.finance-account-detail__layout :deep(.detail-page-layout)')
expect(accounts).toContain('gap: 0;')
expect(accounts).toContain('.account-metric + .account-metric')
expect(accounts).toContain('border-left: 1px solid')
expect(accounts).toContain('.account-metric::before')
expect(accounts).toContain('display: none;')
expect(accounts).toContain(':deep(.ledger-query.query-toolbar)')
expect(accounts).toContain('padding: 0;')
expect(accounts).toContain('border: 0;')
expect(accounts).toContain('background: transparent;')
expect(accounts).not.toContain('展示应收、应付及每次变动后的未收金额。')
expect(accounts).not.toContain('到期日按账单日期加客户账期计算;每个客户独立设置,默认 30 天。')
})
it('keeps fee-source details continuous without nested metric and section cards', () => {
expect(arap).toContain('.finance-arap-detail__layout :deep(.detail-page-layout)')
expect(arap).toContain('.arap-metric + .arap-metric')
expect(arap).toContain('border-left: 1px solid')
expect(arap).toContain('.arap-settlement {')
expect(arap).toContain('padding-left: 16px;')
expect(arap).toContain('border-left: 1px solid')
expect(arap).not.toContain('.arap-metric.is-amount { border-color:')
expect(arap).not.toContain('description="费用来源与关联业务摘要"')
expect(arap).not.toContain('description="当前审核、参与结算和出账状态"')
expect(arap).not.toContain('description="按时间查看审核与结算调整记录"')
})
})