react-sessionstorage-ttl-hook
Version:
React hook for sessionStorage with TTL and auto-expiry
82 lines (63 loc) • 2.03 kB
text/typescript
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;
});
});