agenthub/tests/single-instance.test.ts

75 lines
2.7 KiB
TypeScript

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<ReturnType<typeof startServer>>;
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<ReturnType<typeof startServer>> | 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);
});
});
});