gongxiangp2/lib/__tests__/certificate-report.test.ts

108 lines
5.4 KiB
TypeScript

import {
DEFAULT_CERTIFICATE_REPORT_USAGE_RULES,
getCertificateReportDisplayTitle,
getDefaultCertificateExpiryDate,
isPublicCertificateReportPdf,
parseCertificateDate,
validateCertificateReportMetadata,
} from '@/lib/certificate-report'
const metadata = {
reportKind: '成品',
productModel: 'SPU-001',
reportTitle: '',
certificateTestedOn: '2027-09-23',
certificateNumber: 'CMA-2026-001',
certificateExpiresOn: '2028-09-23',
reportUsageRules: DEFAULT_CERTIFICATE_REPORT_USAGE_RULES,
platformName: '大货',
}
test('公开报告 PDF 必须位于当前素材的公开 PDF 目录', () => {
const root = 'https://s3.jiansun.vip/gongxiangpan/public-display/certificate-report/material-1/pdf/'
expect(isPublicCertificateReportPdf('report-pdf', `${root}report.pdf`, 'material-1')).toBe(true)
expect(isPublicCertificateReportPdf('source', `${root}report.pdf`, 'material-1')).toBe(false)
expect(isPublicCertificateReportPdf('report-pdf', `${root}report.pdf`, 'material-2')).toBe(false)
expect(isPublicCertificateReportPdf('report-pdf', `${root}../private.pdf`, 'material-1')).toBe(false)
expect(isPublicCertificateReportPdf('report-pdf', `${root}%ZZ.pdf`, 'material-1')).toBe(false)
expect(isPublicCertificateReportPdf('report-pdf', 'uploads/materials/report.pdf', 'material-1')).toBe(false)
})
describe('检测报告字段规则', () => {
test('成品沿用 SPU 或报告名称至少填一个,原材料必须填报告名称', () => {
expect(validateCertificateReportMetadata(metadata)).toHaveProperty('value.reportKind', '成品')
expect(validateCertificateReportMetadata({ ...metadata, reportKind: '原材料' })).toEqual({
error: '原材料检测报告必须填写报告名称',
})
expect(validateCertificateReportMetadata({
...metadata,
reportKind: '原材料',
productModel: '',
reportTitle: '板材检测报告',
})).toHaveProperty('value.reportKind', '原材料')
expect(getCertificateReportDisplayTitle({
productModel: '旧 SPU',
reportTitle: '板材检测报告',
})).toBe('板材检测报告')
})
test('成品有报告名称时优先显示,旧记录缺少名称时显示 SPU', () => {
expect(getCertificateReportDisplayTitle({ productModel: 'SPU-001', reportTitle: '成品检测报告' })).toBe('成品检测报告')
expect(getCertificateReportDisplayTitle({ productModel: 'SPU-001', reportTitle: null })).toBe('SPU-001')
})
test('检测日期必须是真实的 YYYY-MM-DD 日期', () => {
expect(parseCertificateDate('2027-02-28')?.toISOString().slice(0, 10)).toBe('2027-02-28')
expect(parseCertificateDate('2027-02-30')).toBeNull()
expect(parseCertificateDate('2027/02/28')).toBeNull()
expect(validateCertificateReportMetadata({ ...metadata, certificateTestedOn: '2027-02-30' })).toEqual({
error: '请选择有效的证书检测日期',
})
})
test('到期时间留空默认一年,手动填写时仍检查日期和先后顺序', () => {
for (const certificateExpiresOn of ['', undefined, null, ' ']) {
expect(validateCertificateReportMetadata({ ...metadata, certificateExpiresOn }))
.toHaveProperty('value.certificateExpiresOn', new Date('2028-09-23T00:00:00.000Z'))
}
for (const certificateExpiresOn of ['2028-02-30', '2028/09/23', false, 0]) {
expect(validateCertificateReportMetadata({ ...metadata, certificateExpiresOn })).toEqual({ error: '请选择有效的证书到期时间' })
}
expect(validateCertificateReportMetadata({ ...metadata, certificateExpiresOn: '2027-09-22' }))
.toEqual({ error: '证书到期时间不能早于检测日期' })
expect(validateCertificateReportMetadata({ ...metadata, certificateExpiresOn: '2027-09-23' }))
.toHaveProperty('value.certificateExpiresOn', new Date('2027-09-23T00:00:00.000Z'))
expect(validateCertificateReportMetadata(metadata)).not.toHaveProperty('value.certificateUsageInstructions')
expect(validateCertificateReportMetadata({ ...metadata, certificateExpiresOn: '2030-09-23' }))
.toHaveProperty('value.certificateExpiresOn', new Date('2030-09-23T00:00:00.000Z'))
})
test.each([
['2026-05-14', '2027-05-14'],
['2024-02-29', '2025-02-28'],
['2023-02-28', '2024-02-28'],
['2026-12-31', '2027-12-31'],
])('检测日期 %s 顺延一个日历年为 %s', (testedOn, expiresOn) => {
expect(getDefaultCertificateExpiryDate(testedOn)?.toISOString().slice(0, 10)).toBe(expiresOn)
expect(getDefaultCertificateExpiryDate(new Date(`${testedOn}T00:00:00Z`))?.toISOString().slice(0, 10)).toBe(expiresOn)
})
test('缺少检测日期时不推测到期时间', () => {
expect(getDefaultCertificateExpiryDate(null)).toBeNull()
expect(getDefaultCertificateExpiryDate('2026-02-30')).toBeNull()
expect(getDefaultCertificateExpiryDate(new Date('invalid'))).toBeNull()
})
test('平台分类只接受报告专用选项,整段预置说明保持为一个文本值', () => {
expect(validateCertificateReportMetadata({ ...metadata, platformName: '品牌' })).toHaveProperty('value')
expect(validateCertificateReportMetadata({ ...metadata, platformName: '其它' })).toEqual({
error: '检测报告的平台分类只能选择大货或品牌',
})
expect(DEFAULT_CERTIFICATE_REPORT_USAGE_RULES).toContain('\n7、')
expect(validateCertificateReportMetadata(metadata)).toHaveProperty(
'value.reportUsageRules',
DEFAULT_CERTIFICATE_REPORT_USAGE_RULES,
)
})
})