import { test } from 'node:test'; import assert from 'node:assert/strict'; // These modules touch localStorage at import/runtime. Provide a minimal mock // that records removed keys, then import dynamically (a static import would // hoist above the mock). const removed: string[] = []; const store = new Map(); (globalThis as { localStorage?: unknown }).localStorage = { getItem: (k: string) => store.get(k) ?? null, setItem: (k: string, v: string) => { store.set(k, v); }, removeItem: (k: string) => { removed.push(k); store.delete(k); }, }; const { clearPlaintextCaches } = await import('./plaintextCaches'); test('clearPlaintextCaches removes every plaintext/PII localStorage key', () => { store.clear(); store.set('cinny_translation_cache_v1', '[]'); store.set('cinny_scheduled_messages_v1', '{}'); store.set('cinny_recent_searches_v1', '[]'); store.set('cinny_recent_forward_targets_v1', '[]'); store.set('cinny_recent_gifs_v1', '[]'); store.set('cinny_recent_stickers_v1', '[]'); removed.length = 0; clearPlaintextCaches(); for (const key of [ 'cinny_translation_cache_v1', 'cinny_scheduled_messages_v1', 'cinny_recent_searches_v1', 'cinny_recent_forward_targets_v1', 'cinny_recent_gifs_v1', 'cinny_recent_stickers_v1', ]) { assert.ok(removed.includes(key), `${key} cleared`); } assert.equal(store.size, 0, 'all keys gone from store'); }); test('clearPlaintextCaches clears the per-user nav-path store only when given a userId', () => { store.clear(); store.set('navToActivePath@me:server', '{}'); removed.length = 0; clearPlaintextCaches(); // no userId -> nav path untouched assert.ok(!removed.includes('navToActivePath@me:server'), 'nav path kept without userId'); clearPlaintextCaches('@me:server'); assert.ok(removed.includes('navToActivePath@me:server'), 'nav path cleared with userId'); }); test('clearPlaintextCaches does NOT touch drafts or session keys', () => { store.clear(); store.set('draft-msg-!room:server', '{"body":"unsent"}'); store.set('cinny_session', '{"accessToken":"x"}'); removed.length = 0; clearPlaintextCaches('@me:server'); assert.ok(!removed.includes('draft-msg-!room:server'), 'draft preserved (N98)'); assert.ok(!removed.includes('cinny_session'), 'session key not this module’s concern'); assert.ok(store.has('draft-msg-!room:server')); });