刘光辉
6 小时以前 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
/* @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();
  });
});