mirror of https://github.com/allinssl/allinssl
82 lines
2.8 KiB
JavaScript
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
|