react-sessionstorage-ttl-hook
Version:
React hook for sessionStorage with TTL and auto-expiry
59 lines (58 loc) • 2.6 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const react_hooks_1 = require("@testing-library/react-hooks");
const useSessionStorageWithTTL_1 = __importDefault(require("./useSessionStorageWithTTL"));
describe('useSessionStorageWithTTL', () => {
beforeEach(() => {
sessionStorage.clear();
jest.useFakeTimers();
});
afterEach(() => {
jest.runOnlyPendingTimers();
jest.useRealTimers();
});
it('should return default value initially', () => {
const { result } = (0, react_hooks_1.renderHook)(() => (0, useSessionStorageWithTTL_1.default)('key1', 'default', 1000));
expect(result.current[0]).toBe('default');
});
it('should store and retrieve value', () => {
const { result, rerender } = (0, react_hooks_1.renderHook)(() => (0, useSessionStorageWithTTL_1.default)('key2', 'default', 1000));
(0, react_hooks_1.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 } = (0, react_hooks_1.renderHook)(() => (0, useSessionStorageWithTTL_1.default)('key3', 'default', 1000));
(0, react_hooks_1.act)(() => {
result.current[1]('expiringValue');
});
rerender();
expect(result.current[0]).toBe('expiringValue');
(0, react_hooks_1.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 } = (0, react_hooks_1.renderHook)(() => (0, useSessionStorageWithTTL_1.default)('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 } = (0, react_hooks_1.renderHook)(() => (0, useSessionStorageWithTTL_1.default)('keySSR', 'defaultSSR', 1000));
expect(result.current[0]).toBe('defaultSSR');
global.window = originalWindow;
});
});