Ctrl K
ComunidadGuías…

tests/before-unload-warning.unit.test.ts

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
// @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))
  })
})