/* @vitest-environment happy-dom */
|
|
import { flushPromises, mount } from '@vue/test-utils';
|
|
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
|
import UploadFileModal from '../UploadFileModal.vue';
|
|
const apiMocks = vi.hoisted(() => ({ uploadFile: vi.fn() }));
|
const formMocks = vi.hoisted(() => ({ config: undefined as any, reset: vi.fn(), set: vi.fn(), validate: vi.fn() }));
|
const messageMocks = vi.hoisted(() => ({ error: vi.fn() }));
|
const modalMocks = vi.hoisted(() => ({ changeOkLoading: vi.fn(), close: vi.fn(), init: undefined as any }));
|
const preparedOnTimestamp = new Date(2026, 8, 23).getTime();
|
|
vi.mock('#/api/x/dms/fileCenter', () => ({ uploadFile: apiMocks.uploadFile }));
|
vi.mock('@jnpf/hooks', () => ({ useMessage: () => ({ createMessage: messageMocks }) }));
|
vi.mock('@jnpf/ui/form', () => ({
|
BasicForm: { name: 'BasicForm', template: '<div data-test="upload-form" />' },
|
useForm: (config: any) => {
|
formMocks.config = config;
|
return [vi.fn(), { resetFields: formMocks.reset, setFieldsValue: formMocks.set, validate: formMocks.validate }];
|
},
|
}));
|
vi.mock('@jnpf/ui/modal', async () => {
|
const { defineComponent, h } = await import('vue');
|
|
return {
|
BasicModal: defineComponent({
|
name: 'BasicModal',
|
emits: ['ok'],
|
setup:
|
(_, { slots }) =>
|
() =>
|
h('section', slots.default?.()),
|
}),
|
useModalInner: (init: any) => {
|
modalMocks.init = init;
|
return [vi.fn(), { changeOkLoading: modalMocks.changeOkLoading, closeModal: modalMocks.close }];
|
},
|
};
|
});
|
|
describe('upload file modal', () => {
|
beforeEach(() => {
|
vi.clearAllMocks();
|
formMocks.reset.mockResolvedValue(undefined);
|
formMocks.set.mockResolvedValue(undefined);
|
formMocks.validate.mockResolvedValue({
|
documentName: ' 质量手册.docx ',
|
documentNo: ' MM-R02 ',
|
documentType: ' DOCX ',
|
preparedBy: ' 张三 ',
|
preparedOn: preparedOnTimestamp,
|
responsibleDeptId: ' dept-1 ',
|
versionLabel: ' D(00) ',
|
});
|
apiMocks.uploadFile.mockResolvedValue({ data: {} });
|
});
|
|
it('initializes and submits upload metadata through BasicForm', async () => {
|
const wrapper = mount(UploadFileModal, { global: { stubs: { 'a-alert': true } } });
|
const file = new File(['content'], '质量手册.docx', {
|
type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
|
});
|
const folder = { id: 'folder-1', name: '质量文件' };
|
|
await modalMocks.init({ file, folder });
|
expect(formMocks.config).toMatchObject({ autoFocusFirstItem: true, baseColProps: { span: 12 }, showActionButtonGroup: false });
|
expect(formMocks.config.schemas).toHaveLength(7);
|
expect(formMocks.set).toHaveBeenCalledWith(
|
expect.objectContaining({
|
documentName: file.name,
|
documentType: 'DOCX',
|
preparedOn: expect.any(Number),
|
versionLabel: 'D(00)',
|
}),
|
);
|
|
wrapper.findComponent({ name: 'BasicModal' }).vm.$emit('ok');
|
await flushPromises();
|
|
expect(apiMocks.uploadFile).toHaveBeenCalledWith(folder.id, expect.stringMatching(/^dms-upload-/), file, {
|
documentName: '质量手册.docx',
|
documentNo: 'MM-R02',
|
documentType: 'DOCX',
|
preparedBy: '张三',
|
preparedOn: '2026-09-23',
|
responsibleDeptId: 'dept-1',
|
versionLabel: 'D(00)',
|
});
|
expect(modalMocks.close).toHaveBeenCalledOnce();
|
expect(wrapper.emitted('uploaded')).toEqual([[folder]]);
|
|
wrapper.unmount();
|
});
|
});
|