import { h, nextTick, Fragment, withDirectives, ref } from 'vue'
import makeMount from '@element-plus/test-utils/make-mount'
import { rAF } from '@element-plus/test-utils/tick'
import Popover from '../src/index.vue'
import PopoverDirective, { VPopover } from '../src/directive'
import type { ComponentPublicInstance } from 'vue'
const AXIOM = 'Rem is the best girl'
const Comp = {
template: `
${AXIOM}
`,
components: {
[Popover.name]: Popover,
},
data() {
return {
visible: false,
content: AXIOM,
}
},
}
const mount = makeMount(Comp, {
props: {},
global: {
directives: {
[VPopover]: PopoverDirective,
},
},
})
describe('v-popover', () => {
test('should render correctly', () => {
const wrapper = mount()
expect(document.body.querySelector('.el-popover').innerHTML).toContain(
AXIOM
)
wrapper.unmount()
})
test('should show popover when reference is mounted', async () => {
const wrapper = mount()
const refNode = '#reference-node'
expect(wrapper.find(refNode).exists()).toBe(false)
;(wrapper.vm as ComponentPublicInstance<{ visible: boolean }>).visible =
true
await nextTick()
expect(wrapper.find(refNode).exists()).toBe(true)
expect(
document.body.querySelector('.el-popover').getAttribute('style')
).toContain('display: none')
await wrapper.find(refNode).trigger('click')
await rAF()
await nextTick()
expect(
document.body.querySelector('.el-popover').getAttribute('style')
).not.toContain('display: none')
wrapper.unmount()
})
test('should render correctly with tabindex', async () => {
const tabindex = ref(1)
const Comp = {
setup() {
return () => {
return h(Fragment, null, [
h(Popover, {
title: 'title',
content: AXIOM,
ref: 'popover',
tabindex: tabindex.value,
}),
withDirectives(h('div', { ref: 'trigger' }, AXIOM), [
[PopoverDirective, 'popover'],
]),
])
}
},
}
const wrapper = makeMount(Comp, {})()
const triggerDom = wrapper.vm.$refs.trigger
expect((triggerDom as HTMLElement).getAttribute('tabindex')).toEqual('1')
tabindex.value = 2
await nextTick()
expect((triggerDom as HTMLElement).getAttribute('tabindex')).toEqual('2')
wrapper.unmount()
})
})