/* @vitest-environment happy-dom */
|
|
import { flushPromises, shallowMount } from '@vue/test-utils';
|
import { defineComponent, h } from 'vue';
|
|
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
import PermissionGroupSelect from '../PermissionGroupSelect.vue';
|
|
const apiMocks = vi.hoisted(() => ({ getPermissionGroups: vi.fn() }));
|
|
vi.mock('#/api/x/dms/permission', () => ({ getPermissionGroups: apiMocks.getPermissionGroups }));
|
|
const JnpfSelectStub = defineComponent({
|
name: 'JnpfSelect',
|
props: {
|
allowClear: Boolean,
|
filterOption: { default: undefined, type: [Boolean, Function] },
|
loading: Boolean,
|
options: { default: () => [], type: Array },
|
showSearch: Boolean,
|
value: { default: undefined, type: Array },
|
multiple: Boolean,
|
},
|
emits: ['search', 'update:value'],
|
setup: () => () => h('div', { class: 'jnpf-select-stub' }),
|
});
|
|
beforeEach(() => {
|
vi.useFakeTimers();
|
apiMocks.getPermissionGroups.mockResolvedValue({ data: [{ id: 'group-1', name: '质量组' }] });
|
});
|
|
afterEach(() => {
|
vi.useRealTimers();
|
});
|
|
describe('permission group select', () => {
|
it('keeps remote search semantics while adapting options to JnpfSelect fields', async () => {
|
const wrapper = shallowMount(PermissionGroupSelect, {
|
global: { stubs: { JnpfSelect: JnpfSelectStub } },
|
});
|
await flushPromises();
|
|
const select = wrapper.getComponent(JnpfSelectStub);
|
expect(apiMocks.getPermissionGroups).toHaveBeenCalledWith({ keyword: '', pageSize: 100 });
|
expect(select.props('options')).toEqual([{ fullName: '质量组', id: 'group-1' }]);
|
expect(select.props()).toMatchObject({ allowClear: true, filterOption: false, multiple: true, showSearch: true });
|
|
apiMocks.getPermissionGroups.mockResolvedValueOnce({ data: [{ id: 'group-2', name: '研发组' }] });
|
select.vm.$emit('search', ' 研发 ');
|
await vi.advanceTimersByTimeAsync(300);
|
await flushPromises();
|
|
expect(apiMocks.getPermissionGroups).toHaveBeenLastCalledWith({ keyword: '研发', pageSize: 100 });
|
expect(select.props('options')).toEqual([{ fullName: '研发组', id: 'group-2' }]);
|
|
select.vm.$emit('update:value', ['group-1', 'group-2']);
|
expect(wrapper.emitted('update:value')?.at(-1)).toEqual([['group-1', 'group-2']]);
|
wrapper.unmount();
|
});
|
});
|