allinssl/frontend/packages/vue/hooks/test/local-storage.spec.js

82 lines
2.8 KiB
JavaScript

import { describe, it, expect, beforeEach, vi, afterEach } from 'vitest'
import { nextTick } from 'vue'
import useLocalStorage from '../src/local-storage'
describe('useLocalStorage', () => {
// 保存原始的localStorage
const originalLocalStorage = window.localStorage
beforeEach(() => {
// 创建模拟的localStorage
const localStorageMock = {
store: {},
getItem: vi.fn((key) => localStorageMock.store[key] || null),
setItem: vi.fn((key, value) => {
localStorageMock.store[key] = value
}),
removeItem: vi.fn((key) => {
delete localStorageMock.store[key]
}),
clear: vi.fn(() => {
localStorageMock.store = {}
}),
key: vi.fn((index) => Object.keys(localStorageMock.store)[index] || null),
length: 0,
}
// 替换全局的localStorage
Object.defineProperty(window, 'localStorage', {
value: localStorageMock,
writable: true,
})
// 监视console.error
vi.spyOn(console, 'error').mockImplementation(() => {})
})
afterEach(() => {
// 恢复原始的localStorage
Object.defineProperty(window, 'localStorage', {
value: originalLocalStorage,
writable: true,
})
vi.restoreAllMocks()
})
it('应该使用localStorage存储数据', async () => {
const value = useLocalStorage('testKey', { name: 'test' })
// 验证初始值已存储到localStorage
expect(window.localStorage.setItem).toHaveBeenCalled()
// 修改值
value.value = { name: 'updated' }
await nextTick()
// 验证更新的值已存储到localStorage
const lastCall = window.localStorage.setItem.mock.calls.pop()
expect(lastCall[0]).toBe('testKey')
expect(JSON.parse(lastCall[1]).value).toEqual({ name: 'updated' })
})
it('应该从localStorage加载存储的数据', () => {
// 预先设置localStorage的值
const storedValue = { value: { name: 'stored' } }
window.localStorage.getItem.mockReturnValueOnce(JSON.stringify(storedValue))
const value = useLocalStorage('testKey', { name: 'default' })
// 验证加载了存储的值而不是默认值
expect(value.value).toEqual({ name: 'stored' })
expect(window.localStorage.getItem).toHaveBeenCalledWith('testKey')
})
it('当设置为null时应该从localStorage移除数据', async () => {
const value = useLocalStorage('testKey', { name: 'test' })
// 设置为null
value.value = null
await nextTick()
// 验证数据已从localStorage中移除
expect(window.localStorage.removeItem).toHaveBeenCalledWith('testKey')
})
it('应该支持过期时间选项', () => {
vi.useFakeTimers()
const now = Date.now()
vi.setSystemTime(now)
useLocalStorage('testKey', 'test', { expires: 1000 })
// 验证设置了过期时间
const lastCall = window.localStorage.setItem.mock.calls.pop()
const storedData = JSON.parse(lastCall[1])
expect(storedData.expires).toBe(now + 1000)
vi.useRealTimers()
})
})
//# sourceMappingURL=local-storage.spec.js.map