element-plus/packages/hooks/__tests__/use-floating.tsx
JeremyWuuuuu da992a97b2
feat(hooks): [floating] add use-floating (#6822)
* feat(hooks): [floating] add use-floating

- Implement floating-ui vue with composition API
- Add test for the hook.

* Update coordinate type
2022-03-25 15:43:54 +08:00

88 lines
2.3 KiB
TypeScript

import { computed, nextTick, reactive, ref, watch } from 'vue'
import { mount } from '@vue/test-utils'
import { rAF } from '@element-plus/test-utils/tick'
import { useFloating, arrowMiddleware } from '../use-floating'
import type { CSSProperties } from 'vue'
import type { Placement, Strategy, Middleware } from '@floating-ui/dom'
describe('useFloating', () => {
const createComponent = (arrow = false) => {
return mount({
setup() {
const placement = ref<Placement>('bottom')
const strategy = ref<Strategy>('fixed')
const arrowRef = ref<HTMLElement>()
const middleware = ref<Array<Middleware>>(
arrow
? [
arrowMiddleware({
arrowRef,
}),
]
: []
)
const { referenceRef, contentRef, x, y, update, middlewareData } =
useFloating({
placement,
strategy,
middleware,
})
const contentStyle = computed<CSSProperties>(() => {
return reactive({
position: strategy,
x,
y,
})
})
watch(arrowRef, () => update())
return {
arrowRef,
contentRef,
contentStyle,
referenceRef,
middlewareData,
}
},
render() {
const { contentStyle } = this
return (
<div>
<button ref="referenceRef">My button</button>
<div ref="contentRef" style={contentStyle}>
My tooltip
<div ref="arrowRef" />
</div>
</div>
)
},
})
}
let wrapper: ReturnType<typeof createComponent>
it('should render without arrow correctly', async () => {
wrapper = createComponent()
await rAF()
await nextTick()
expect(wrapper.vm.referenceRef).toBeInstanceOf(Element)
expect(wrapper.vm.contentRef).toBeInstanceOf(Element)
expect(wrapper.vm.middlewareData.arrow).toBeUndefined()
})
it('should render with arrow correctly', async () => {
wrapper = createComponent(true)
await rAF()
await nextTick()
expect(wrapper.vm.referenceRef).toBeInstanceOf(Element)
expect(wrapper.vm.contentRef).toBeInstanceOf(Element)
expect(wrapper.vm.middlewareData.arrow).toBeDefined()
})
})