import { mount } from '@vue/test-utils' import { eventKeys } from '@element-plus/utils/aria' import Dropdown from '../src/dropdown.vue' import DropdownItem from '../src/dropdown-item.vue' import DropdownMenu from '../src/dropdown-menu.vue' const MOUSE_ENTER_EVENT = 'mouseenter' const MOUSE_LEAVE_EVENT = 'mouseleave' const CLICK = 'click' const _mount = (template: string, data, otherObj?) => mount({ components: { [Dropdown.name]: Dropdown, [DropdownItem.name]: DropdownItem, [DropdownMenu.name]: DropdownMenu, }, template, data, ...otherObj, }) const sleep = (time = 250) => new Promise(resolve => setTimeout(resolve, time)) export const timeout = async (fn, time = 250) => { await sleep(time) fn() } describe('Dropdown', () => { test('create', async () => { const wrapper = _mount( ` dropdown `, () => ({}), ) const content = wrapper.findComponent({ ref: 'b' }).vm.$refs.popper as any const triggerElm = wrapper.find('.el-dropdown-link') expect(content.value).toBe(false) await triggerElm.trigger(MOUSE_ENTER_EVENT) await sleep() expect(content.value).toBe(true) await triggerElm.trigger(MOUSE_LEAVE_EVENT) await sleep() expect(content.value).toBe(false) }) test('menu click', async () => { const wrapper = _mount( ` dropdown `, () => ({ myCommandObject: { name: 'CommandC' }, name: '', }), { methods: { commandHandler(command) { this.name = command.name }, }, }, ) // const content = wrapper.findComponent({ ref: 'b' }).vm.$refs.popper as any const triggerElm = wrapper.find('.el-dropdown-link') await triggerElm.trigger(MOUSE_ENTER_EVENT) await sleep() await wrapper.findComponent({ ref: 'c' }).trigger('click') await sleep() expect((wrapper.vm as any).name).toBe('CommandC') }) test('trigger', async () => { const wrapper = _mount( ` dropdown `, () => ({ myCommandObject: { name: 'CommandC' }, name: '', }), ) const content = wrapper.findComponent({ ref: 'b' }).vm.$refs.popper as any const triggerElm = wrapper.find('.el-dropdown-link') expect(content.value).toBe(false) await triggerElm.trigger(MOUSE_ENTER_EVENT) await sleep() expect(content.value).toBe(false) await triggerElm.trigger(CLICK) await sleep() expect(content.value).toBe(true) }) test('split button', async () => { const wrapper = _mount( ` dropdown `, () => ({ myCommandObject: { name: 'CommandC' }, name: '', }), { methods: { handleClick() { this.name = 'click' }, }, }, ) const content = wrapper.findComponent({ ref: 'b' }).vm.$refs.popper as any const triggerElm = wrapper.find('.el-dropdown__caret-button') const button = wrapper.find('.el-button') expect(content.value).toBe(false) await button.trigger('click') expect((wrapper.vm as any).name).toBe('click') await triggerElm.trigger(MOUSE_ENTER_EVENT) await sleep() expect(content.value).toBe(true) }) test('hide on click', async () => { const wrapper = _mount( ` dropdown `, () => ({}), ) const content = wrapper.findComponent({ ref: 'b' }).vm.$refs.popper as any const triggerElm = wrapper.find('.el-dropdown-link') await triggerElm.trigger(MOUSE_ENTER_EVENT) await sleep() await wrapper.findComponent({ ref: 'c' }).trigger('click') await sleep() expect(content.value).toBe(true) }) test('triggerElm keydown', async () => { const wrapper = _mount( ` dropdown `, () => ({}), ) const content = wrapper.findComponent({ ref: 'b' }).vm.$refs.popper as any const triggerElm = wrapper.find('.el-dropdown-link') await triggerElm.trigger(MOUSE_ENTER_EVENT) await sleep() await triggerElm.trigger('keydown', { keyCode: eventKeys.enter, }) await sleep() expect(content.value).toBe(false) await triggerElm.trigger(MOUSE_ENTER_EVENT) await sleep() await triggerElm.trigger('keydown', { keyCode: eventKeys.tab, }) await sleep() expect(content.value).toBe(false) }) test('dropdown menu keydown', async () => { const wrapper = _mount( ` dropdown `, () => ({}), ) const content = wrapper.findComponent({ ref: 'a' }) const triggerElm = wrapper.find('.el-dropdown-link') await triggerElm.trigger(MOUSE_ENTER_EVENT) await sleep() await content.trigger('keydown', { keyCode: eventKeys.down, }) await sleep() expect(wrapper.findComponent({ ref: 'd' }).attributes('tabindex')).toBe('0') }) })