fix(driver): 限制驾驶证上传为 JPG 和 PNG 图片

This commit is contained in:
2026-11-06 21:02:20 +08:00
parent f69ea1476d
commit a9373e468a
4 changed files with 39 additions and 7 deletions
@@ -307,6 +307,23 @@ describe('driver page workflows', () => {
expect(api.getDriverQualification).toHaveBeenCalledTimes(1)
})
it('accepts image selection and clears it when a PDF is selected instead', async () => {
vi.mocked(api.updateDriver).mockResolvedValue(structuredClone(driver))
const wrapper = mount(DriverEditorDialog, { modelValue: false, driver })
await wrapper.setProps({ modelValue: true }); await flushPromises()
const picker = wrapper.get('input[type="file"]')
expect(picker.attributes('accept')).toBe('image/jpeg,image/png')
Object.defineProperty(picker.element, 'files', { value: [new File(['image'], 'license.png', { type: 'image/png' })], configurable: true })
await picker.trigger('change')
expect(ElMessage.warning).not.toHaveBeenCalled()
Object.defineProperty(picker.element, 'files', { value: [new File(['%PDF'], 'license.pdf', { type: 'application/pdf' })], configurable: true })
await picker.trigger('change')
expect(ElMessage.warning).toHaveBeenCalledWith('请选择非空 JPG 或 PNG,最大 10MiB')
wrapper.findComponent({ name: 'AppDialog' }).vm.$emit('confirm'); await flushPromises()
expect(api.updateDriver).toHaveBeenCalledTimes(1)
expect(api.uploadDriverLicense).not.toHaveBeenCalled()
})
it('does not create a second draft when attachment upload fails after saving', async () => {
vi.mocked(api.createDriver).mockResolvedValue({ ...structuredClone(driver), recordVersion: 0 })
vi.mocked(api.uploadDriverLicense).mockRejectedValueOnce(new Error('文件服务不可用')).mockResolvedValueOnce({ ...structuredClone(driver), recordVersion: 1 })
@@ -317,7 +334,7 @@ describe('driver page workflows', () => {
inputs[1]!.vm.$emit('update:modelValue', '123')
const selects = wrapper.findAllComponents({ name: 'ElSelect' })
selects.at(-1)!.vm.$emit('update:modelValue', 'UTC')
const file = new File(['%PDF-test'], 'license.pdf', { type: 'application/pdf' })
const file = new File(['image'], 'license.png', { type: 'image/png' })
const picker = wrapper.get('input[type="file"]')
Object.defineProperty(picker.element, 'files', { value: [file] })
await picker.trigger('change')
@@ -342,7 +359,7 @@ describe('driver page workflows', () => {
expect(api.updateDriver).toHaveBeenCalledWith(driver.id, 2, expect.anything())
await wrapper.setProps({ modelValue: false }); await flushPromises()
await wrapper.setProps({ driver: other, modelValue: true }); await flushPromises()
const file = new File(['%PDF-other'], 'other-driver.pdf', { type: 'application/pdf' })
const file = new File(['image'], 'other-driver.jpg', { type: 'image/jpeg' })
const picker = wrapper.get('input[type="file"]')
Object.defineProperty(picker.element, 'files', { value: [file], configurable: true })
await picker.trigger('change')
@@ -365,7 +382,7 @@ describe('driver page workflows', () => {
const wrapper = mount(DriverEditorDialog, { modelValue: false, driver })
await wrapper.setProps({ modelValue: true }); await flushPromises()
const picker = wrapper.get('input[type="file"]')
Object.defineProperty(picker.element, 'files', { value: [new File(['%PDF'], 'driver.pdf', { type: 'application/pdf' })] })
Object.defineProperty(picker.element, 'files', { value: [new File(['image'], 'driver.jpg', { type: 'image/jpeg' })] })
await picker.trigger('change')
wrapper.findComponent({ name: 'AppDialog' }).vm.$emit('confirm'); await flushPromises()
wrapper.unmount()