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('