/* @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();
|
});
|
});
|