fix(test): isolate browser storage from Node globals

This commit is contained in:
matevip 2026-11-03 03:29:54 -05:00
parent 11378be705
commit cfd704f19a
3 changed files with 30 additions and 0 deletions

View File

@ -0,0 +1,12 @@
import { Storage } from 'happy-dom'
// Node 25 exposes its own localStorage even without a backing file. Vitest
// preserves existing Node globals, so it can shadow happy-dom's browser API.
// Give each test file browser storage independent of the host Node version.
for (const name of ['localStorage', 'sessionStorage'] as const) {
Object.defineProperty(globalThis, name, {
configurable: true,
writable: true,
value: new Storage(),
})
}

View File

@ -0,0 +1,17 @@
import { describe, expect, it } from 'vitest'
describe('browser storage in the DOM test environment', () => {
it.each(['localStorage', 'sessionStorage'] as const)('%s provides the browser Storage API', name => {
const storage = globalThis[name]
expect(typeof storage.getItem, `${process.version}: ${name}.getItem`).toBe('function')
expect(typeof storage.clear, `${process.version}: ${name}.clear`).toBe('function')
storage.clear()
storage.setItem('token', 'test-token')
expect(storage.getItem('token')).toBe('test-token')
expect(storage.length).toBe(1)
expect(storage.key(0)).toBe('token')
storage.removeItem('token')
expect(storage.getItem('token')).toBeNull()
expect(storage.length).toBe(0)
})
})

View File

@ -14,6 +14,7 @@ export default defineConfig({
test: {
include: ['src/**/*.{test,spec}.{ts,tsx}'],
environment: 'happy-dom',
setupFiles: ['./src/test/setup.ts'],
},
resolve: {
alias: {