import { describe, it, expect, beforeEach, afterEach } from 'vitest'; import * as fs from 'fs'; import * as path from 'path'; import * as os from 'os'; import { saveSession, loadSession, clearSession, SavedCookie } from './store'; describe('session store with OS keychain fallback', () => { const dummyCookies: SavedCookie[] = [ { name: 'REPSESS', value: 'dummy_session_value', domain: 'atcoder.jp', path: '/', expires: Date.now() + 3600000, httpOnly: true, secure: true, sameSite: 'Lax', }, ]; const tmpDir = path.join(os.tmpdir(), 'atcoder-next-session-test-' + Date.now()); beforeEach(() => { if (!fs.existsSync(tmpDir)) { fs.mkdirSync(tmpDir, { recursive: true }); } }); afterEach(() => { if (fs.existsSync(tmpDir)) { fs.rmSync(tmpDir, { recursive: true, force: true }); } }); it('should encrypt, save, and load session correctly', () => { saveSession(tmpDir, dummyCookies); const loaded = loadSession(tmpDir); expect(loaded).not.toBeNull(); expect(loaded).toHaveLength(1); expect(loaded![0].name).toBe('REPSESS'); expect(loaded![0].value).toBe('dummy_session_value'); }); it('should clear session correctly', () => { saveSession(tmpDir, dummyCookies); clearSession(tmpDir); const loaded = loadSession(tmpDir); expect(loaded).toBeNull(); }); });