import { describe, it, expect, beforeEach, afterEach } from 'vitest'; import { mkdtempSync, rmSync } from 'fs'; import { tmpdir } from 'os'; import { join } from 'path'; import { startServer } from '../src/server/index.js'; import { remoteClient } from '../src/cli/remoteClient.js'; import { init } from '../src/cli/commands/init.js'; describe('network e2e', () => { let cwd: string; let server: Awaited>; beforeEach(async () => { cwd = mkdtempSync(join(tmpdir(), 'ah-net-')); await init(cwd, { projectName: 'net-test', yes: true }); server = await startServer(cwd, { host: '127.0.0.1', port: 0 }); }); afterEach(async () => { await server.app.close(); rmSync(cwd, { recursive: true, force: true }); }); it('creates a task remotely and reads it back', async () => { const url = server.url; const created = await remoteClient.createTask(url, { title: 'Remote', role: 'implementer' }); expect(created.id).toBe('TSK-0001'); const tasks = await remoteClient.listTasks(url); expect(tasks).toHaveLength(1); const { task } = await remoteClient.getTask(url, 'TSK-0001'); expect(task.title).toBe('Remote'); }); it('claims and completes a task remotely', async () => { const url = server.url; await remoteClient.createTask(url, { title: 'Remote', role: 'implementer' }); const claimed = await remoteClient.claimTask(url, 'TSK-0001', 'codex'); expect(claimed.status).toBe('in_progress'); const done = await remoteClient.doneTask(url, 'TSK-0001'); expect(done.status).toBe('done'); }); it('returns a meaningful error when the server is unreachable', async () => { await expect(remoteClient.listTasks('http://127.0.0.1:1')).rejects.toThrow(/Cannot reach AgentHub server/); }); });