import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest'; import { getDashboardShellCache, setDashboardShellCache, DASHBOARD_SHELL_CACHE_TTL_MS } from './dashboard-shell-cache'; const SAMPLE_DATA = { userTenants: [{ id: 1, name: 'Tenant A', slug: 'tenant-a' }], myApps: { apps: [{ id: 'app-1' }], routing: 'default' } }; describe('dashboard-shell-cache', () => { beforeEach(() => { vi.useFakeTimers(); }); afterEach(() => { vi.useRealTimers(); }); it('devuelve null si no hay nada cacheado para esa llave', () => { expect(getDashboardShellCache('sesion-inexistente')).toBeNull(); }); it('devuelve lo cacheado dentro del TTL', () => { setDashboardShellCache('sesion-1', SAMPLE_DATA); expect(getDashboardShellCache('sesion-1')).toEqual(SAMPLE_DATA); }); it('sigue acertando aunque el "access token" hubiera rotado — la llave es el session key, no el token', () => { // Simula dos navegaciones con tokens de acceso distintos (rotación cada ~60s) // pero el mismo session key estable (sid/sub) — como haría getJwtSessionKey(). setDashboardShellCache('mismo-session-key', SAMPLE_DATA); vi.advanceTimersByTime(5_000); expect(getDashboardShellCache('mismo-session-key')).toEqual(SAMPLE_DATA); }); it('expira después del TTL', () => { setDashboardShellCache('sesion-2', SAMPLE_DATA); vi.advanceTimersByTime(DASHBOARD_SHELL_CACHE_TTL_MS + 1); expect(getDashboardShellCache('sesion-2')).toBeNull(); }); it('no acierta entre llaves distintas (sesiones distintas)', () => { setDashboardShellCache('sesion-usuario-a', SAMPLE_DATA); expect(getDashboardShellCache('sesion-usuario-b')).toBeNull(); }); });