66 lines
2.1 KiB
TypeScript
66 lines
2.1 KiB
TypeScript
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
import { MindDB } from '../../src/mind/db.js';
|
|
import { SessionStore } from '../../src/mind/sessions.js';
|
|
|
|
describe('SessionStore', () => {
|
|
let db: MindDB;
|
|
let sessions: SessionStore;
|
|
|
|
beforeEach(() => {
|
|
db = new MindDB(':memory:');
|
|
sessions = new SessionStore(db);
|
|
});
|
|
|
|
afterEach(() => {
|
|
db.close();
|
|
});
|
|
|
|
describe('ensureActive (review #7 — session-create race in autoSaveFromExchange)', () => {
|
|
it('creates a new active session when none exists', () => {
|
|
expect(sessions.getActive()).toHaveLength(0);
|
|
|
|
const result = sessions.ensureActive();
|
|
expect(result.status).toBe('active');
|
|
expect(result.gop_id).toMatch(/^session:/);
|
|
expect(sessions.getActive()).toHaveLength(1);
|
|
});
|
|
|
|
it('returns the existing active session when one exists', () => {
|
|
const first = sessions.ensureActive();
|
|
const second = sessions.ensureActive();
|
|
const third = sessions.ensureActive();
|
|
|
|
// All three calls return the same session — never a duplicate.
|
|
expect(second.id).toBe(first.id);
|
|
expect(third.id).toBe(first.id);
|
|
expect(sessions.getActive()).toHaveLength(1);
|
|
});
|
|
|
|
it('returns the most-recent active session when multiple are open', () => {
|
|
const older = sessions.create();
|
|
// Force a tiny time gap so started_at differs measurably
|
|
const newer = sessions.create();
|
|
|
|
const result = sessions.ensureActive();
|
|
// Most-recent (newer) wins — matches getActive() ordering contract
|
|
expect(result.id).toBe(newer.id);
|
|
expect(result.id).not.toBe(older.id);
|
|
});
|
|
|
|
it('does not resurrect closed or archived sessions', () => {
|
|
const s = sessions.create();
|
|
sessions.close(s.gop_id);
|
|
|
|
// No active session now — ensureActive should create a fresh one
|
|
const ensured = sessions.ensureActive();
|
|
expect(ensured.id).not.toBe(s.id);
|
|
expect(ensured.status).toBe('active');
|
|
});
|
|
|
|
it('preserves project_id when provided', () => {
|
|
const result = sessions.ensureActive('my-project');
|
|
expect(result.project_id).toBe('my-project');
|
|
});
|
|
});
|
|
});
|