81 lines
3.9 KiB
TypeScript
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,
|
|
)
|
|
})
|
|
})
|