import { flushPromises, mount } from '@vue/test-utils';
|
|
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
|
import FileCompareSelectModal from '../FileCompareSelectModal.vue';
|
|
const mocks = vi.hoisted(() => ({ init: undefined as any, versions: vi.fn(), create: vi.fn(), close: vi.fn() }));
|
const formMocks = vi.hoisted(() => ({ config: undefined as any, reset: vi.fn(), validate: vi.fn() }));
|
vi.mock('#/api/x/dms/fileCenter', () => ({ getDocumentVersions: mocks.versions }));
|
vi.mock('#/api/x/dms/compare', () => ({ createDmsCompareSession: mocks.create }));
|
vi.mock('@jnpf/utils', () => ({ formatToDateTime: (v: string) => v }));
|
vi.mock('@jnpf/ui/form', () => ({
|
BasicForm: { name: 'BasicForm', template: '<div data-test="compare-form" />' },
|
useForm: (config: any) => {
|
formMocks.config = config;
|
return [vi.fn(), { resetFields: formMocks.reset, validate: formMocks.validate }];
|
},
|
}));
|
vi.mock('@jnpf/ui/modal', async () => {
|
const { defineComponent, h } = await import('vue');
|
return {
|
BasicModal: defineComponent({
|
name: 'BasicModal',
|
emits: ['ok', 'cancel'],
|
setup:
|
(_, { slots }) =>
|
() =>
|
h('section', slots.default?.()),
|
}),
|
useModalInner: (init: any) => {
|
mocks.init = init;
|
return [vi.fn(), { closeModal: mocks.close }];
|
},
|
};
|
});
|
|
const item = { id: 'v3', documentId: 'doc-1', versionNo: 3, name: 'SOP.docx', fileName: 'SOP.docx', resourceType: 'FILE_VERSION', createdAt: '2026-09-01' };
|
const options = {
|
global: {
|
stubs: {
|
'a-descriptions': true,
|
'a-descriptions-item': true,
|
'a-alert': true,
|
'a-button': true,
|
'jnpf-empty': true,
|
},
|
},
|
};
|
|
beforeEach(() => {
|
vi.clearAllMocks();
|
formMocks.reset.mockResolvedValue(undefined);
|
formMocks.validate.mockResolvedValue({ historicalVersionId: 'v1' });
|
mocks.versions.mockResolvedValue({ data: { list: [{ ...item, id: 'v1', versionNo: 1 }], hasMore: false } });
|
});
|
|
describe('historical version dialog', () => {
|
it('submits the fixed current version and selected historical version', async () => {
|
const wrapper = mount(FileCompareSelectModal, options);
|
await mocks.init({ item });
|
await flushPromises();
|
const selectProps = formMocks.config.schemas[0].componentProps();
|
expect(selectProps.fieldNames).toEqual({ label: 'label', value: 'value' });
|
const session = { title: 'v1 → v3' };
|
mocks.create.mockResolvedValue(session);
|
wrapper.findComponent({ name: 'BasicModal' }).vm.$emit('ok');
|
await flushPromises();
|
expect(formMocks.validate).toHaveBeenCalledOnce();
|
expect(mocks.create).toHaveBeenCalledWith(expect.objectContaining({ documentId: 'doc-1', currentVersionId: 'v3', historicalVersionId: 'v1' }));
|
expect(wrapper.emitted('compare')).toEqual([[session]]);
|
wrapper.unmount();
|
});
|
|
it('does not reopen comparison after the user cancels an in-flight request', async () => {
|
const wrapper = mount(FileCompareSelectModal, options);
|
await mocks.init({ item });
|
await flushPromises();
|
formMocks.config.schemas[0].componentProps().onChange('v1');
|
let resolve!: (data: any) => void;
|
mocks.create.mockReturnValue(
|
new Promise((r) => {
|
resolve = r;
|
}),
|
);
|
const modal = wrapper.findComponent({ name: 'BasicModal' });
|
modal.vm.$emit('ok');
|
await flushPromises();
|
modal.vm.$emit('cancel');
|
resolve({ title: 'late result' });
|
await flushPromises();
|
expect(wrapper.emitted('compare')).toBeUndefined();
|
wrapper.unmount();
|
});
|
});
|