49 lines
1.5 KiB
TypeScript
49 lines
1.5 KiB
TypeScript
import { beforeEach, describe, expect, it, vi } from 'vitest'
|
|
import {
|
|
FRONTEND_READY_EVENT_NAME,
|
|
STARTUP_RELOAD_ATTEMPT_STORAGE_NAME,
|
|
markFrontendReady,
|
|
reloadFrontendOnceIfStartupFailed,
|
|
} from './frontendReady'
|
|
|
|
describe('frontend readiness recovery', () => {
|
|
beforeEach(() => {
|
|
window.__tolariaFrontendReady = false
|
|
sessionStorage.clear()
|
|
})
|
|
|
|
it('marks the frontend ready and clears a pending startup reload', () => {
|
|
const onReady = vi.fn()
|
|
window.addEventListener(FRONTEND_READY_EVENT_NAME, onReady, { once: true })
|
|
sessionStorage.setItem(STARTUP_RELOAD_ATTEMPT_STORAGE_NAME, '1')
|
|
|
|
markFrontendReady()
|
|
|
|
expect(window.__tolariaFrontendReady).toBe(true)
|
|
expect(sessionStorage.getItem(STARTUP_RELOAD_ATTEMPT_STORAGE_NAME)).toBeNull()
|
|
expect(onReady).toHaveBeenCalledOnce()
|
|
})
|
|
|
|
it('reloads once when React reports a startup error before readiness', () => {
|
|
const reload = vi.fn()
|
|
|
|
const firstAttempt = reloadFrontendOnceIfStartupFailed({ reload })
|
|
const secondAttempt = reloadFrontendOnceIfStartupFailed({ reload })
|
|
|
|
expect(firstAttempt).toBe(true)
|
|
expect(secondAttempt).toBe(false)
|
|
expect(reload).toHaveBeenCalledOnce()
|
|
expect(sessionStorage.getItem(STARTUP_RELOAD_ATTEMPT_STORAGE_NAME)).toBe('1')
|
|
})
|
|
|
|
it('does not reload after the frontend has reported readiness', () => {
|
|
const reload = vi.fn()
|
|
markFrontendReady()
|
|
|
|
const didReload = reloadFrontendOnceIfStartupFailed({ reload })
|
|
|
|
expect(didReload).toBe(false)
|
|
expect(reload).not.toHaveBeenCalled()
|
|
})
|
|
})
|