import { describe, it, expect, beforeEach, afterEach } from 'vitest'; import { mkdtempSync, rmSync, mkdirSync } from 'fs'; import { tmpdir } from 'os'; import { join } from 'path'; import { startServer } from '../src/server/index.js'; import { serverStart } from '../src/cli/commands/server.js'; import { findProjectRoot } from '../src/core/paths.js'; import { init } from '../src/cli/commands/init.js'; describe('single source of truth', () => { describe('findProjectRoot (cwd-robust)', () => { let cwd: string; beforeEach(() => { cwd = mkdtempSync(join(tmpdir(), 'ah-root-')); }); afterEach(() => { rmSync(cwd, { recursive: true, force: true }); }); it('finds the project root from a nested subdirectory', async () => { await init(cwd, { yes: true, projectName: 'root-test' }); const nested = join(cwd, 'apps', 'web', 'src'); mkdirSync(nested, { recursive: true }); expect(findProjectRoot(nested)).toBe(cwd); }); it('returns undefined when there is no project anywhere above', () => { const empty = mkdtempSync(join(tmpdir(), 'ah-empty-')); expect(findProjectRoot(empty)).toBeUndefined(); rmSync(empty, { recursive: true, force: true }); }); }); describe('server start guard (single instance)', () => { let cwd: string; let server: Awaited>; beforeEach(async () => { cwd = mkdtempSync(join(tmpdir(), 'ah-guard-')); await init(cwd, { yes: true, projectName: 'guard-test' }); server = await startServer(cwd, { host: '127.0.0.1', port: 0 }); }); afterEach(async () => { await server.app.close(); rmSync(cwd, { recursive: true, force: true }); }); it('refuses to start a second server on a port already serving AgentHub', async () => { const port = Number(new URL(server.url).port); const logs: string[] = []; const original = console.log; console.log = (msg: unknown) => logs.push(String(msg)); try { await serverStart(cwd, { host: '127.0.0.1', port }); } finally { console.log = original; } expect(logs.some((m) => m.includes('already running'))).toBe(true); }); it('does not start LAN advertisers during tests', async () => { const logs: string[] = []; const original = console.log; console.log = (msg: unknown) => logs.push(String(msg)); let isolated: Awaited> | undefined; try { isolated = await startServer(cwd, { host: '127.0.0.1', port: 0 }); } finally { console.log = original; } await isolated?.app.close(); expect(logs.some((m) => m.includes('reachable in a browser'))).toBe(false); }); }); });