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); }); });