UNPKG

react-sessionstorage-ttl-hook

Version:

React hook for sessionStorage with TTL and auto-expiry

82 lines (63 loc) 2.03 kB
import { renderHook, act } from '@testing-library/react-hooks'; import useSessionStorageWithTTL from './useSessionStorageWithTTL'; describe('useSessionStorageWithTTL', () => { beforeEach(() => { sessionStorage.clear(); jest.useFakeTimers(); }); afterEach(() => { jest.runOnlyPendingTimers(); jest.useRealTimers(); }); it('should return default value initially', () => { const { result } = renderHook(() => useSessionStorageWithTTL('key1', 'default', 1000) ); expect(result.current[0]).toBe('default'); }); it('should store and retrieve value', () => { const { result, rerender } = renderHook(() => useSessionStorageWithTTL('key2', 'default', 1000) ); act(() => { result.current[1]('newValue'); }); rerender(); const stored = JSON.parse(sessionStorage.getItem('key2')!); expect(stored.value).toBe('newValue'); expect(result.current[0]).toBe('newValue'); }); it('should auto-expire after TTL', () => { const { result, rerender } = renderHook(() => useSessionStorageWithTTL('key3', 'default', 1000) ); act(() => { result.current[1]('expiringValue'); }); rerender(); expect(result.current[0]).toBe('expiringValue'); act(() => { jest.advanceTimersByTime(1001); }); rerender(); const expired = sessionStorage.getItem('key3'); expect(expired).toBeNull(); }); it('should ignore invalid JSON', () => { sessionStorage.setItem('key4', '{invalid json'); const { result } = renderHook(() => useSessionStorageWithTTL('key4', 'fallback', 1000) ); expect(result.current[0]).toBe('fallback'); }); it('should skip all logic in SSR (no window)', () => { const originalWindow = global.window; // @ts-ignore delete global.window; const { result } = renderHook(() => useSessionStorageWithTTL('keySSR', 'defaultSSR', 1000) ); expect(result.current[0]).toBe('defaultSSR'); global.window = originalWindow; }); });