chore: remove integration tests, clean up CI exclusion
CI / check (pull_request) Successful in 2m41s
CI / check (pull_request) Successful in 2m41s
Deleted: - acp-client.integration.test.ts (3 cases) - resume-e2e.integration.test.ts (1 case, already skipped) These tests spawn a real hermes CLI and hit live LLM, belonging to the eval layer (#34), not CI. ACP protocol parsing is already covered by unit test acp-client.test.ts. Also removed the --exclude integration/ hack from test:ci. Fixes #60
This commit is contained in:
@@ -1,55 +0,0 @@
|
|||||||
import { afterEach, beforeEach, describe, expect, it } from "vitest";
|
|
||||||
import { HermesAcpClient } from "../../src/acp-client.js";
|
|
||||||
|
|
||||||
const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
||||||
|
|
||||||
describe("HermesAcpClient", () => {
|
|
||||||
let client: HermesAcpClient;
|
|
||||||
|
|
||||||
beforeEach(() => {
|
|
||||||
client = new HermesAcpClient();
|
|
||||||
});
|
|
||||||
|
|
||||||
afterEach(async () => {
|
|
||||||
await client.close();
|
|
||||||
});
|
|
||||||
|
|
||||||
it(
|
|
||||||
"connect() returns a UUID sessionId",
|
|
||||||
async () => {
|
|
||||||
const sessionId = await client.connect(process.cwd());
|
|
||||||
expect(typeof sessionId).toBe("string");
|
|
||||||
expect(sessionId).toMatch(UUID_RE);
|
|
||||||
},
|
|
||||||
{ timeout: 2 * 60 * 1000 },
|
|
||||||
);
|
|
||||||
|
|
||||||
it(
|
|
||||||
"prompt() returns a non-empty text response",
|
|
||||||
async () => {
|
|
||||||
await client.connect(process.cwd());
|
|
||||||
const result = await client.prompt("Reply with exactly the word: PONG");
|
|
||||||
expect(typeof result.text).toBe("string");
|
|
||||||
expect(result.text.length).toBeGreaterThan(0);
|
|
||||||
expect(typeof result.sessionId).toBe("string");
|
|
||||||
expect(result.sessionId).toMatch(UUID_RE);
|
|
||||||
},
|
|
||||||
{ timeout: 2 * 60 * 1000 },
|
|
||||||
);
|
|
||||||
|
|
||||||
it(
|
|
||||||
"prompt() can be called twice on the same session (resume)",
|
|
||||||
async () => {
|
|
||||||
await client.connect(process.cwd());
|
|
||||||
|
|
||||||
const first = await client.prompt("Say the word ALPHA and nothing else.");
|
|
||||||
expect(first.text.length).toBeGreaterThan(0);
|
|
||||||
|
|
||||||
const second = await client.prompt("Now say the word BETA and nothing else.");
|
|
||||||
expect(second.text.length).toBeGreaterThan(0);
|
|
||||||
|
|
||||||
expect(first.sessionId).toBe(second.sessionId);
|
|
||||||
},
|
|
||||||
{ timeout: 2 * 60 * 1000 },
|
|
||||||
);
|
|
||||||
});
|
|
||||||
@@ -1,56 +0,0 @@
|
|||||||
import { afterEach, describe, expect, it } from "vitest";
|
|
||||||
import { HermesAcpClient } from "../../src/acp-client.js";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* E2E test for cross-process session resume.
|
|
||||||
*
|
|
||||||
* Simulates the workflow re-entry scenario:
|
|
||||||
* 1. Client A: connect → prompt → close (developer first run)
|
|
||||||
* 2. Client B: resume(sessionId) → prompt (developer re-entry after reviewer reject)
|
|
||||||
*
|
|
||||||
* This is what happens when uwf thread step spawns uwf-hermes twice for the same role.
|
|
||||||
*/
|
|
||||||
describe("HermesAcpClient cross-process resume", () => {
|
|
||||||
const clients: HermesAcpClient[] = [];
|
|
||||||
|
|
||||||
afterEach(async () => {
|
|
||||||
for (const c of clients) {
|
|
||||||
await c.close();
|
|
||||||
}
|
|
||||||
clients.length = 0;
|
|
||||||
});
|
|
||||||
|
|
||||||
// TODO(#435): flaky — depends on live LLM; mock or move to integration suite
|
|
||||||
it.skip(
|
|
||||||
"resume() after close — second prompt returns non-empty text",
|
|
||||||
async () => {
|
|
||||||
// --- Client A: first run ---
|
|
||||||
const clientA = new HermesAcpClient();
|
|
||||||
clients.push(clientA);
|
|
||||||
|
|
||||||
await clientA.connect(process.cwd());
|
|
||||||
const first = await clientA.prompt(
|
|
||||||
"Remember the secret code: WATERMELON. Reply with exactly: ACKNOWLEDGED",
|
|
||||||
);
|
|
||||||
expect(first.text.length).toBeGreaterThan(0);
|
|
||||||
const sessionId = first.sessionId;
|
|
||||||
|
|
||||||
// Close client A (simulates uwf-hermes process exit)
|
|
||||||
await clientA.close();
|
|
||||||
|
|
||||||
// --- Client B: resume (simulates re-entry) ---
|
|
||||||
const clientB = new HermesAcpClient();
|
|
||||||
clients.push(clientB);
|
|
||||||
|
|
||||||
await clientB.resume(sessionId, process.cwd());
|
|
||||||
const second = await clientB.prompt(
|
|
||||||
"What was the secret code I told you earlier? Reply with just the code word.",
|
|
||||||
);
|
|
||||||
|
|
||||||
// The critical assertion: resumed session produces non-empty output
|
|
||||||
expect(second.text.length).toBeGreaterThan(0);
|
|
||||||
expect(second.sessionId).toBe(sessionId);
|
|
||||||
},
|
|
||||||
{ timeout: 3 * 60 * 1000 },
|
|
||||||
);
|
|
||||||
});
|
|
||||||
@@ -19,7 +19,7 @@
|
|||||||
"scripts": {
|
"scripts": {
|
||||||
"prepublishOnly": "echo 'Use pnpm run release from repo root' && exit 1",
|
"prepublishOnly": "echo 'Use pnpm run release from repo root' && exit 1",
|
||||||
"test": "vitest run __tests__/",
|
"test": "vitest run __tests__/",
|
||||||
"test:ci": "vitest run __tests__/ --exclude __tests__/integration/"
|
"test:ci": "vitest run __tests__/"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@ocas/core": "^0.3.0",
|
"@ocas/core": "^0.3.0",
|
||||||
|
|||||||
Reference in New Issue
Block a user