import { ref, nextTick, h } from 'vue' import { mount } from '@vue/test-utils' import useTeleport from '../use-teleport' const AXIOM = 'Rem is the best girl' const Comp = { setup() { const appendToBody = ref(true) const { showTeleport, hideTeleport, renderTeleport } = useTeleport(() => h('div', AXIOM), appendToBody) return () => { return [ h('button', { class: 'show', onClick: showTeleport, }, 'show'), h('button', { class: 'hide', onClick: hideTeleport, }, 'hide'), h('button', { class: 'toggle', onClick: () => { // toggle append to body. appendToBody.value = !appendToBody.value }, }), renderTeleport(), ] } }, } describe('useModal', () => { let wrapper: ReturnType beforeEach(() => { wrapper = mount(Comp) }) afterEach(() => { wrapper.unmount() }) it('should render correctly', async () => { await nextTick() expect(wrapper.text()).not.toContain(AXIOM) }) it('should render teleport to the DOM', async () => { await nextTick() expect(wrapper.text()).not.toContain(AXIOM) await wrapper.find('.show').trigger('click') expect(document.body.innerHTML).toContain(AXIOM) await wrapper.find('.hide').trigger('click') expect(document.body.innerHTML).not.toContain(AXIOM) }) it('should render to the current wrapper instead of document.body', async () => { await nextTick() expect(wrapper.text()).not.toContain(AXIOM) await wrapper.find('.toggle').trigger('click') expect(wrapper.text()).toContain(AXIOM) }) })