import { describe, expect, it, vi } from 'vitest'; import { readFileSync } from 'node:fs'; import { WebServer } from '../src/web/server.js'; describe('scheduled session layout registration', () => { it('registers the layout before lifecycle work and rolls back a rejected tentative session', async () => { const sessions = new Map(); const session = { id: 'scheduled-session', owner: 'alice' }; const sessionCreated = vi.fn(async () => { throw new Error('layout unavailable'); }); const server = Object.create(WebServer.prototype) as { sessions: typeof sessions; tabLayouts: { sessionCreated: typeof sessionCreated }; registerSessionWithLayout(session: typeof session): Promise; }; server.sessions = sessions; server.tabLayouts = { sessionCreated }; await expect(server.registerSessionWithLayout(session)).rejects.toThrow('layout unavailable'); expect(sessionCreated).toHaveBeenCalledWith('alice'); expect(sessions.has(session.id)).toBe(false); }); it('uses the shared registration helper in the scheduled loop before persistence and listeners', () => { const source = readFileSync(new URL('../src/web/server.ts', import.meta.url), 'utf8'); const loop = source.slice( source.indexOf('private async runScheduledLoop'), source.indexOf('private async stopScheduledRun') ); expect(loop).toContain('await this.registerSessionWithLayout(session);'); expect(loop.indexOf('await this.registerSessionWithLayout(session);')).toBeLessThan( loop.indexOf('this.store.incrementSessionsCreated();') ); expect(loop.indexOf('await this.registerSessionWithLayout(session);')).toBeLessThan( loop.indexOf('await this.setupSessionListeners(session);') ); }); });