tests/before-unload-warning.unit.test.ts
Rama main · réplica de lectura del repositorio original.
// @vitest-environment happy-dom
import { afterEach, describe, expect, it, vi } from 'vitest'
import { createApp, defineComponent } from 'vue'
import { useBeforeUnloadWarning } from '../src/utils/beforeUnloadWarning'
function mountWarning(enabled: boolean) {
let complete = () => {}
const app = createApp(defineComponent({
setup() {
complete = useBeforeUnloadWarning(enabled)
return () => null
},
}))
app.mount(document.createElement('div'))
return { app, complete }
}
describe('before unload warning', () => {
afterEach(() => vi.restoreAllMocks())
it('registers the native warning and returns its cleanup', () => {
const addListener = vi.spyOn(window, 'addEventListener')
const removeListener = vi.spyOn(window, 'removeEventListener')
const { complete } = mountWarning(true)
const [eventName, handler] = addListener.mock.calls[0] as unknown as ['beforeunload', EventListener]
const event = { preventDefault: vi.fn(), returnValue: false } as unknown as BeforeUnloadEvent
expect(eventName).toBe('beforeunload')
handler(event)
expect(event.preventDefault).toHaveBeenCalledOnce()
expect(event.returnValue).toBe(true)
complete()
expect(removeListener).toHaveBeenCalledWith('beforeunload', handler)
})
it('does not register outside pre-organization onboarding', () => {
const addListener = vi.spyOn(window, 'addEventListener')
mountWarning(false)
expect(addListener).not.toHaveBeenCalled()
})
it('removes the warning when onboarding unmounts', () => {
const removeListener = vi.spyOn(window, 'removeEventListener')
const { app } = mountWarning(true)
app.unmount()
expect(removeListener).toHaveBeenCalledWith('beforeunload', expect.any(Function))
})
})