68 lines
1.8 KiB
TypeScript
68 lines
1.8 KiB
TypeScript
import { renderHook, act } from '@testing-library/react';
|
|
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
import { useLocalStorage } from './useLocalStorage';
|
|
|
|
// Mock localStorage
|
|
const localStorageMock = {
|
|
getItem: vi.fn(),
|
|
setItem: vi.fn(),
|
|
removeItem: vi.fn(),
|
|
clear: vi.fn(),
|
|
};
|
|
|
|
Object.defineProperty(window, 'localStorage', {
|
|
value: localStorageMock,
|
|
});
|
|
|
|
describe('useLocalStorage', () => {
|
|
beforeEach(() => {
|
|
vi.clearAllMocks();
|
|
});
|
|
|
|
it('should return initial value when localStorage is empty', () => {
|
|
localStorageMock.getItem.mockReturnValue(null);
|
|
|
|
const { result } = renderHook(() =>
|
|
useLocalStorage('test-key', 'default-value'),
|
|
);
|
|
|
|
expect(result.current[0]).toBe('default-value');
|
|
});
|
|
|
|
it('should return stored value from localStorage', () => {
|
|
localStorageMock.getItem.mockReturnValue(JSON.stringify('stored-value'));
|
|
|
|
const { result } = renderHook(() =>
|
|
useLocalStorage('test-key', 'default-value'),
|
|
);
|
|
|
|
expect(result.current[0]).toBe('stored-value');
|
|
});
|
|
|
|
it('should update localStorage when value changes', () => {
|
|
localStorageMock.getItem.mockReturnValue(null);
|
|
|
|
const { result } = renderHook(() =>
|
|
useLocalStorage('test-key', 'default-value'),
|
|
);
|
|
|
|
act(() => {
|
|
result.current[1]('new-value');
|
|
});
|
|
|
|
expect(localStorageMock.setItem).toHaveBeenCalledWith(
|
|
'test-key',
|
|
JSON.stringify('new-value'),
|
|
);
|
|
expect(result.current[0]).toBe('new-value');
|
|
});
|
|
|
|
it('should handle object values', () => {
|
|
const testObject = { name: 'test', value: 123 };
|
|
localStorageMock.getItem.mockReturnValue(JSON.stringify(testObject));
|
|
|
|
const { result } = renderHook(() => useLocalStorage('test-key', {}));
|
|
|
|
expect(result.current[0]).toEqual(testObject);
|
|
});
|
|
});
|