修复bug

This commit is contained in:
2026-08-03 20:50:32 +08:00
parent fed46f42ef
commit 2d38c90d1c
17 changed files with 499 additions and 62 deletions
@@ -2,13 +2,14 @@ import assert from 'node:assert/strict'
import test from 'node:test'
import { formatQualificationFileSize, QUALIFICATION_MAX_FILE_SIZE, validateQualificationFile } from './qualificationFile.ts'
test('accepts the backend-confirmed JPG and PNG formats up to 5MB', () => {
test('accepts the backend-confirmed PDF, JPG and PNG formats up to 5MB', () => {
assert.equal(validateQualificationFile({ name: '营业执照.jpeg', size: QUALIFICATION_MAX_FILE_SIZE, type: 'image/jpeg' }), '')
assert.equal(validateQualificationFile({ name: '营业执照.PNG', size: 2048, type: 'image/png' }), '')
assert.equal(validateQualificationFile({ name: '货代资质.pdf', size: 2048, type: 'application/pdf' }), '')
})
test('rejects PDF, empty, mismatched, and oversized files', () => {
assert.match(validateQualificationFile({ name: '营业执照.pdf', size: 1024, type: 'application/pdf' }), /格式不支持/)
test('rejects unsupported, empty, mismatched, and oversized files', () => {
assert.match(validateQualificationFile({ name: '营业执照.svg', size: 1024, type: 'image/svg+xml' }), /格式不支持/)
assert.match(validateQualificationFile({ name: '伪装图片.png', size: 1024, type: 'text/plain' }), /内容类型/)
assert.match(validateQualificationFile({ name: '空文件.png', size: 0, type: 'image/png' }), /内容为空/)
assert.match(validateQualificationFile({ name: '超大文件.jpg', size: QUALIFICATION_MAX_FILE_SIZE + 1, type: 'image/jpeg' }), /超过 5MB/)
@@ -1,7 +1,7 @@
export const QUALIFICATION_MAX_FILE_SIZE = 5 * 1024 * 1024
const allowedExtensions = new Set(['jpg', 'jpeg', 'png'])
const allowedMimeTypes = new Set(['image/jpeg', 'image/png'])
const allowedExtensions = new Set(['jpg', 'jpeg', 'png', 'pdf'])
const allowedMimeTypes = new Set(['image/jpeg', 'image/png', 'application/pdf'])
export interface QualificationFileLike {
name: string
@@ -11,7 +11,7 @@ export interface QualificationFileLike {
export function validateQualificationFile(file: QualificationFileLike) {
const extension = file.name.includes('.') ? file.name.split('.').pop()?.toLowerCase() ?? '' : ''
if (!allowedExtensions.has(extension)) return '文件格式不支持,请选择 JPG 或 PNG 图片'
if (!allowedExtensions.has(extension)) return '文件格式不支持,请选择 PDF、JPG 或 PNG 文件'
if (file.type && !allowedMimeTypes.has(file.type)) return '文件内容类型与支持的资质格式不一致'
if (file.size <= 0) return '文件内容为空,请重新选择'
if (file.size > QUALIFICATION_MAX_FILE_SIZE) return '文件超过 5MB,请压缩后重新选择'
@@ -0,0 +1,14 @@
import assert from 'node:assert/strict'
import test from 'node:test'
import { normalizeQualificationStatus, qualificationStatusMeta } from './qualificationStatus.ts'
test('maps backend qualification states without treating replaced files as expired', () => {
assert.equal(normalizeQualificationStatus('APPROVED'), 'VERIFIED')
assert.equal(normalizeQualificationStatus('SUPERSEDED'), 'SUPERSEDED')
assert.deepEqual(qualificationStatusMeta('SUPERSEDED'), { label: '已替换', type: 'info' })
})
test('keeps a safe expired fallback for unknown legacy states', () => {
assert.equal(normalizeQualificationStatus('UNKNOWN'), 'EXPIRED')
assert.deepEqual(qualificationStatusMeta('EXPIRED'), { label: '已过期', type: 'info' })
})
@@ -0,0 +1,15 @@
export type TenantQualificationStatus = 'VERIFIED' | 'PENDING' | 'REJECTED' | 'SUPERSEDED' | 'EXPIRED'
export function normalizeQualificationStatus(status: string): TenantQualificationStatus {
if (status === 'APPROVED') return 'VERIFIED'
if (status === 'PENDING' || status === 'REJECTED' || status === 'SUPERSEDED') return status
return 'EXPIRED'
}
export function qualificationStatusMeta(status: TenantQualificationStatus) {
if (status === 'VERIFIED') return { label: '已验证', type: 'success' as const }
if (status === 'PENDING') return { label: '待审核', type: 'warning' as const }
if (status === 'REJECTED') return { label: '已驳回', type: 'danger' as const }
if (status === 'SUPERSEDED') return { label: '已替换', type: 'info' as const }
return { label: '已过期', type: 'info' as const }
}