178 lines
11 KiB
TypeScript
178 lines
11 KiB
TypeScript
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 density = readFileSync(resolve(process.cwd(), 'src/styles/adminDensity.css'), 'utf8')
|
|
const workbench = readFileSync(resolve(process.cwd(), 'src/styles/adminWorkbench.css'), 'utf8')
|
|
const financeDensity = readFileSync(resolve(process.cwd(), 'src/modules/finance/financeDensity.css'), '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')
|
|
|
|
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("finance/receivable-statistics")
|
|
expect(financeRoutes).toContain("platform:finance:receivable-statistics:list")
|
|
expect(financeRoutes).toContain('showPageHeading: false')
|
|
expect(settlement).toContain('class="settlement-detail-page surface-panel finance-density-detail workbench-panel is-flush is-page-surface"')
|
|
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 shared summaries and scroll-safe tables', () => {
|
|
expect(settlement).toContain('class="settlement-detail-page surface-panel finance-density-detail workbench-panel is-flush is-page-surface"')
|
|
expect(settlement).toContain('class="settlement-detail-content"')
|
|
expect(settlement).toContain('class="settlement-detail-info density-descriptions"')
|
|
for (const title of ['基本信息', '费用明细', '修订记录']) expect(settlement).toContain('title="' + title + '"')
|
|
expect(settlement).toContain(':title="kind === \'receivable\' ? \'收款记录\' : \'付款记录\'"')
|
|
expect(settlement.match(/class="detail-table-scroll workbench-table"/g)).toHaveLength(3)
|
|
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 density-form"/g)).toHaveLength(2)
|
|
expect(settlement).toContain('density-table density-table--editable settlement-operation-table')
|
|
expect(settlement).toContain('.settlement-operation-table td:not([colspan]) { width: 50%; }')
|
|
})
|
|
|
|
it('keeps settlement totals and list actions in the table toolbar', () => {
|
|
expect(settlement).toContain('<template #toolbar-start>')
|
|
expect(settlement).toContain('class="density-detail-overview settlement-summary" aria-label="结算汇总"')
|
|
expect(settlement).toContain('<template #toolbar-actions>')
|
|
expect(settlement).toContain('class="settlement-list-actions"')
|
|
expect(financeDensity).toContain('.settlement-summary.density-detail-overview { padding: 0; border: 0; }')
|
|
expect(settlement).not.toContain('class="settlement-list-toolbar"')
|
|
})
|
|
|
|
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]) {
|
|
expect(source).toContain("placeholder: '全部客户'")
|
|
expect(source).not.toContain('全客户查询暂不可用')
|
|
expect(source).not.toContain('empty-text="请选择客户查询')
|
|
}
|
|
expect(arap).toContain("placeholder: '请选择客户'")
|
|
expect(arap).not.toContain("placeholder: '全部客户'")
|
|
expect(statements).toContain("placeholder: '请选择客户'")
|
|
expect(statements).toContain("placeholder: '请选择对账单状态'")
|
|
expect(statements).toContain(':search-on-clear="false"')
|
|
expect(statements).toContain("placeholder: '请选择结清状态'")
|
|
expect(statements).toContain("startPlaceholder: '请选择开始日期'")
|
|
expect(statements).toContain("endPlaceholder: '请选择结束日期'")
|
|
expect(statements).not.toContain("placeholder: '全部客户'")
|
|
expect(settlement).toContain(':search-on-clear="false"')
|
|
})
|
|
|
|
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('keeps customer arap selector text within a stable dropdown layout', () => {
|
|
expect(arap).toContain("class: 'finance-customer-select'")
|
|
expect(arap).toContain("popperClass: 'finance-customer-arap-popper'")
|
|
expect(arap).toContain('teleported: false')
|
|
expect(arap).toContain('onVisibleChange: onCustomerSelectVisible')
|
|
expect(arap).toContain("document.addEventListener('scroll', closeCustomerSelectOnScroll, true)")
|
|
expect(arap).toContain('.finance-customer-arap-popper .el-select-dropdown__item')
|
|
expect(arap).toContain('text-overflow: ellipsis;')
|
|
})
|
|
|
|
it('keeps the customer arap table body independently scrollable', () => {
|
|
expect(arap).toContain('max-height="calc(100vh - 300px)"')
|
|
})
|
|
|
|
it('translates source codes and provides reason placeholders', () => {
|
|
expect(arap).toContain('sourceTypeDisplay(detail.sourceType)')
|
|
expect(arap).toContain('financeOperationActionLabel(row.action)')
|
|
expect(arap).toContain('financeOperationResultLabel(row.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('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(':more-label="`更多对账单操作 · ${(row as FinanceStatementReadModel).billNo}`"')
|
|
expect(statements).toContain('adjustmentLines: selected.map')
|
|
expect(statements).not.toContain('disabled title="接口尚未提供')
|
|
})
|
|
|
|
it('keeps bordered statement details and lets the adjustment editor scroll with its dialog', () => {
|
|
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" border stripe row-key="statementLineId"')
|
|
expect(statements).not.toContain('max-height="420"')
|
|
})
|
|
|
|
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 finance-density-detail workbench-panel is-flush is-page-surface"')
|
|
expect(statements).toContain('@row-click="openDetail"')
|
|
expect(statements).toContain("name: 'finance-customer-statement-detail'")
|
|
expect(financeDensity).toContain('.detail-page-layout.finance-density-detail { 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 shared compact financial summary row for customer accounts', () => {
|
|
expect(accounts).toContain('class="density-detail-overview account-metrics"')
|
|
expect(financeDensity).toContain('.detail-page-layout.finance-density-detail { gap: 0; }')
|
|
expect(density).toContain('.density-detail-overview')
|
|
expect(accounts).toContain(':deep(.ledger-query.query-toolbar)')
|
|
expect(accounts).toContain('padding: 0;')
|
|
const summaryStyles = density.match(/\.density-detail-overview \{([^}]*)\}/)?.[1]
|
|
expect(summaryStyles).toContain('display: flex;')
|
|
expect(summaryStyles).toContain('flex-wrap: wrap;')
|
|
const queryStyles = workbench.match(/\.query-toolbar\.workbench-query \{([^}]*)\}/)?.[1]
|
|
expect(accounts).toContain('class="ledger-query workbench-query"')
|
|
expect(queryStyles).toContain('border-color: var(--workbench-border);')
|
|
expect(queryStyles).toContain('background: var(--workbench-surface);')
|
|
expect(accounts).not.toContain('展示应收、应付及每次变动后的未收金额。')
|
|
expect(accounts).not.toContain('到期日按账单日期加客户账期计算;每个客户独立设置,默认 30 天。')
|
|
})
|
|
|
|
it('keeps fee-source details continuous without nested metric and section cards', () => {
|
|
expect(arap).toContain('class="density-detail-overview arap-metrics"')
|
|
expect(arap).toContain('class="arap-information density-form-section"')
|
|
expect(arap).toContain('class="arap-settlement density-form-section"')
|
|
expect(arap).toContain('padding-left: var(--admin-space-6);')
|
|
expect(arap).toContain('border-left: 1px solid')
|
|
expect(arap).not.toContain('.arap-metric.is-amount { border-color:')
|
|
for (const description of ['费用来源与关联业务摘要', '当前审核和出账状态', '按时间查看审核与结算调整记录']) expect(arap).not.toContain('description="' + description + '"')
|
|
})
|
|
})
|