75 lines
2.7 KiB
TypeScript
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);
|
|
});
|
|
});
|
|
});
|