刘光辉
3 小时以前 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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
/* @vitest-environment happy-dom */
 
import type { DmsFileCenterItem } from '#/api/x/dms/fileCenter';
 
import { flushPromises, mount } from '@vue/test-utils';
 
import { beforeEach, describe, expect, it, vi } from 'vitest';
 
import CreateFolderModal from '../CreateFolderModal.vue';
 
const apiMocks = vi.hoisted(() => ({ createFolder: vi.fn() }));
const formMocks = vi.hoisted(() => ({ config: undefined as any, reset: vi.fn(), set: vi.fn(), validate: vi.fn() }));
const modalMocks = vi.hoisted(() => ({ changeOkLoading: vi.fn(), close: vi.fn(), init: undefined as any }));
 
vi.mock('#/api/x/dms/fileCenter', () => ({ createFolder: apiMocks.createFolder }));
vi.mock('@jnpf/hooks', () => ({ useMessage: () => ({ createMessage: { error: vi.fn() } }) }));
vi.mock('@jnpf/ui/form', () => ({
  BasicForm: { name: 'BasicForm', emits: ['submit'], template: '<div data-test="folder-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 }];
    },
  };
});
 
const parent: DmsFileCenterItem = {
  createdAt: '2026-09-01T00:00:00Z',
  id: 'folder-1',
  name: '质量文件',
  resourceType: 'FOLDER',
};
 
describe('create folder modal', () => {
  beforeEach(() => {
    vi.clearAllMocks();
    formMocks.reset.mockResolvedValue(undefined);
    formMocks.set.mockResolvedValue(undefined);
    formMocks.validate.mockResolvedValue({ name: '  新目录  ' });
    apiMocks.createFolder.mockResolvedValue({ data: { ...parent, id: 'folder-2', name: '新目录' } });
  });
 
  it('submits validated BasicForm values with the parent and a stable source id', async () => {
    const wrapper = mount(CreateFolderModal, { global: { stubs: { 'a-alert': true } } });
 
    await modalMocks.init({ parent });
    expect(formMocks.config).toMatchObject({ autoFocusFirstItem: true, showActionButtonGroup: false });
    expect(formMocks.config.schemas).toHaveLength(1);
    expect(formMocks.config.schemas[0].componentProps).toMatchObject({ submitOnPressEnter: true });
    expect(formMocks.config.schemas[0].componentProps.onPressEnter).toBeUndefined();
    expect(formMocks.set).toHaveBeenCalledWith({ name: '' });
 
    wrapper.findComponent({ name: 'BasicModal' }).vm.$emit('ok');
    await flushPromises();
 
    expect(apiMocks.createFolder).toHaveBeenCalledWith({
      name: '新目录',
      parentId: parent.id,
      sourceId: expect.stringMatching(/^folder-/),
    });
    expect(modalMocks.close).toHaveBeenCalledOnce();
    expect(wrapper.emitted('created')?.[0]?.[0]).toEqual(parent);
 
    wrapper.unmount();
  });
 
  it('stops without calling the API when BasicForm validation fails', async () => {
    formMocks.validate.mockResolvedValueOnce(false);
    const wrapper = mount(CreateFolderModal, { global: { stubs: { 'a-alert': true } } });
 
    await modalMocks.init({ parent });
    wrapper.findComponent({ name: 'BasicModal' }).vm.$emit('ok');
    await flushPromises();
 
    expect(apiMocks.createFolder).not.toHaveBeenCalled();
    expect(modalMocks.changeOkLoading).not.toHaveBeenCalled();
    wrapper.unmount();
  });
 
  it('submits the values emitted by BasicForm after an Enter key search path', async () => {
    formMocks.validate.mockResolvedValueOnce(false);
    const wrapper = mount(CreateFolderModal, { global: { stubs: { 'a-alert': true } } });
 
    await modalMocks.init({ parent });
    wrapper.findComponent({ name: 'BasicForm' }).vm.$emit('submit', { name: '  快速新建  ' });
    await flushPromises();
 
    expect(apiMocks.createFolder).toHaveBeenCalledWith({
      name: '快速新建',
      parentId: parent.id,
      sourceId: expect.stringMatching(/^folder-/),
    });
    expect(formMocks.validate).not.toHaveBeenCalled();
    wrapper.unmount();
  });
});