import { describe, expect, it } from 'vitest'; import { createSessionContextStore, type StorageLike } from '../src/spa/session-context-store'; function makeMemoryStorage(seed?: Record): StorageLike { const memory = new Map(Object.entries(seed ?? {})); return { getItem: (key: string) => memory.get(key) ?? null, setItem: (key: string, value: string) => { memory.set(key, value); }, removeItem: (key: string) => { memory.delete(key); } }; } describe('session context store', () => { it('normalizes and persists sessionCode/playerId/token', () => { const storage = makeMemoryStorage(); const store = createSessionContextStore(storage, 'ctx'); const value = store.set({ sessionCode: ' abcd12 ', playerId: 12, token: ' token-1 ' }); expect(value).toEqual({ sessionCode: 'ABCD12', playerId: 12, token: 'token-1' }); expect(store.get()).toEqual({ sessionCode: 'ABCD12', playerId: 12, token: 'token-1' }); expect(storage.getItem('ctx')).toBe('{"sessionCode":"ABCD12","playerId":12,"token":"token-1"}'); }); it('loads from storage and clears invalid payloads', () => { const storage = makeMemoryStorage({ ctx: '{"sessionCode":"","playerId":0,"token":""}' }); const store = createSessionContextStore(storage, 'ctx'); expect(store.get()).toBeNull(); expect(storage.getItem('ctx')).toBeNull(); }); it('supports clear()', () => { const storage = makeMemoryStorage(); const store = createSessionContextStore(storage, 'ctx'); store.set({ sessionCode: 'ABCD12', playerId: 3, token: 'token-3' }); store.clear(); expect(store.get()).toBeNull(); expect(storage.getItem('ctx')).toBeNull(); }); it('rejects invalid context writes', () => { const store = createSessionContextStore(); expect(() => store.set({ sessionCode: '', playerId: 1, token: 'token-1' })).toThrow('sessionCode is required'); expect(() => store.set({ sessionCode: 'ABCD12', playerId: 0, token: 'token-1' })).toThrow( 'playerId must be a positive integer' ); expect(() => store.set({ sessionCode: 'ABCD12', playerId: 2, token: ' ' })).toThrow('token is required'); }); });