import assert from 'node:assert/strict' import { describe, it } from 'node:test' import { MP_CONTRACT_MANAGE_TABS, MP_CONTRACT_APPROVE_TABS, buildContractListQuery, buildContractCard, formatContractMoney, formatContractProductInfoForCard } from './mp-crm-contract-card' describe('tabs', () => { it('manage has no status tabs (Web align); approve submitted/approved', () => { assert.deepEqual( MP_CONTRACT_MANAGE_TABS.map((x) => x.value), ['all'] ) assert.deepEqual( MP_CONTRACT_APPROVE_TABS.map((x) => x.value), ['submitted', 'approved'] ) }) }) describe('buildContractListQuery', () => { it('manage always excludes invalid and ignores view status', () => { assert.deepEqual( buildContractListQuery({ mode: 'manage', view: 'all', pageNum: 1, pageSize: 20, keyword: ' 合同 ', currentUserId: 'u1', contractType: 'sale', signDateBegin: '2026-10-01', signDateEnd: '2026-10-31', minAmount: 100, maxAmount: 200000 }), { pageNum: 1, pageSize: 20, includeProducts: true, keyword: '合同', excludeStatus: 'invalid', contractType: 'sale', signDateBegin: '2026-10-01', signDateEnd: '2026-10-31', minAmount: 100, maxAmount: 200000 } ) const approving = buildContractListQuery({ mode: 'manage', view: 'approving', pageNum: 1, pageSize: 20, keyword: '', currentUserId: 'u1' }) assert.equal(approving.excludeStatus, 'invalid') assert.equal(approving.includeProducts, true) assert.equal('status' in approving, false) }) it('omits empty optional business filters', () => { assert.deepEqual( buildContractListQuery({ mode: 'manage', view: 'all', pageNum: 1, pageSize: 20, keyword: '', currentUserId: 'u1', contractType: '', signDateBegin: '', signDateEnd: '', minAmount: undefined, maxAmount: undefined }), { pageNum: 1, pageSize: 20, includeProducts: true, excludeStatus: 'invalid' } ) }) it('approve submitted uses pendingApprovalUserId', () => { const q = buildContractListQuery({ mode: 'approve', view: 'submitted', pageNum: 1, pageSize: 20, keyword: '', currentUserId: 'u9' }) assert.equal(q.pendingApprovalUserId, 'u9') assert.equal(q.includeProducts, true) }) it('approve approved uses approvedByUserId', () => { const q = buildContractListQuery({ mode: 'approve', view: 'approved', pageNum: 1, pageSize: 20, keyword: 'x', currentUserId: 'u9' }) assert.equal(q.approvedByUserId, 'u9') assert.equal(q.keyword, 'x') assert.equal(q.includeProducts, true) }) }) describe('buildContractCard', () => { it('maps Web default list fields into preview/extra', () => { const card = buildContractCard( { id: 'c1', contractNo: 'HT001', contractName: '硫酸销售合同', customerName: '甲公司', contractType: 'sale', amount: 1000, freight: 50, barrelDeposit: 20, status: 'draft', signDate: '2026-10-01', createTime: '2026-10-01 10:00:00', ownerUserName: '张三', attachmentFiles: 'a,b', products: [{ productName: '硫酸', model: '98%', quantity: 10, unit: '吨' }] }, { statusLabel: '草稿', contractTypeLabel: '销售合同', unitLabel: (u) => (u === '吨' ? '吨' : u) } ) assert.equal(card.id, 'c1') assert.equal(card.contractTitle, '硫酸销售合同') assert.equal(card.customerName, '甲公司') assert.equal(card.amountText, '¥1,070.00') assert.equal(card.status, 'draft') assert.equal(card.metaLine.includes('HT001'), false) assert.deepEqual( card.previewFields.map((f) => f.key), [ 'contractName', 'contractType', 'attachmentFiles', 'productInfo', 'totalContractAmount', 'amount', 'freight', 'barrelDeposit', 'ownerUserName', 'createTime' ] ) assert.deepEqual( card.extraFields.map((f) => f.key), ['contractNo', 'signDate'] ) assert.equal(card.previewFields.find((f) => f.key === 'attachmentFiles')?.value, '2 个') assert.equal( card.previewFields.find((f) => f.key === 'productInfo')?.value, '硫酸 98% 10 吨' ) }) }) describe('formatContractProductInfoForCard', () => { it('joins lines with semicolon', () => { assert.equal( formatContractProductInfoForCard([ { productName: 'A', quantity: 1, unit: '吨' }, { productName: 'B', model: 'X', quantity: 2 } ]), 'A 1 吨;B X 2' ) assert.equal(formatContractProductInfoForCard([]), '—') }) }) describe('formatContractMoney', () => { it('formats and handles empty', () => { assert.equal(formatContractMoney(1000), '¥1,000.00') assert.equal(formatContractMoney(undefined), '—') }) })