Files
shanxia2.0/web-admin/src/utils/mp-crm-contract-card.test.ts
T
2026-10-23 23:07:00 +08:00

191 lines
5.1 KiB
TypeScript

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), '—')
})
})