刘光辉
5 小时以前 cf11e63b659afcc9792ab3e395f1b45d844431a8
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
/* @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();
  });
});