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

81 lines
3.9 KiB
TypeScript

import {
DEFAULT_CERTIFICATE_REPORT_USAGE_RULES,
getCertificateReportDisplayTitle,
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({
reportKind: '原材料',
productModel: '旧 SPU',
reportTitle: '板材检测报告',
})).toBe('板材检测报告')
})
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, '2028-02-30', '2028/09/23']) {
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')
})
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,
)
})
})