Skip to content

Commit d2eb044

Browse files
rootroot
authored andcommitted
test(history): restore full coverage for terminal learning
1 parent 9057fa0 commit d2eb044

3 files changed

Lines changed: 58 additions & 2 deletions

File tree

universal-refiner/tests/blackboard.test.ts

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -192,11 +192,32 @@ describe("AgenticBlackboard", () => {
192192
});
193193

194194
it("uses the home-directory global store when no override is configured", () => {
195+
const previousHome = process.env.HOME;
196+
const previousProfile = process.env.USERPROFILE;
195197
delete process.env.PROMPT_REFINER_GLOBAL_DIR;
198+
delete process.env.PROMPT_REFINER_PROJECT_DIR;
199+
process.env.HOME = tmpDir;
200+
process.env.USERPROFILE = tmpDir;
201+
try {
202+
const data = AgenticBlackboard.getGlobalData();
203+
expect(data).toHaveProperty("logs");
204+
expect(data).toHaveProperty("projects");
205+
expect(Array.isArray(AgenticBlackboard.getLogs("."))).toBe(true);
206+
} finally {
207+
if (previousHome === undefined) delete process.env.HOME;
208+
else process.env.HOME = previousHome;
209+
if (previousProfile === undefined) delete process.env.USERPROFILE;
210+
else process.env.USERPROFILE = previousProfile;
211+
}
212+
});
213+
214+
it("uses the isolated project fallback when only project storage is configured", () => {
215+
delete process.env.PROMPT_REFINER_GLOBAL_DIR;
216+
process.env.PROMPT_REFINER_PROJECT_DIR = tmpDir;
196217

197218
const data = AgenticBlackboard.getGlobalData();
198219

199-
expect(data).toHaveProperty("logs");
200-
expect(data).toHaveProperty("projects");
220+
expect(data).toEqual({ logs: [], projects: [] });
221+
expect(fs.existsSync(path.join(tmpDir, ".global-refiner", "global_history.json"))).toBe(true);
201222
});
202223
});

universal-refiner/tests/history.test.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,24 @@ describe("EventStore", () => {
145145

146146
expect(store.reviewLesson("repo", "lesson-goal-1", true)).toBe(true);
147147
expect(store.getRecentLessons("repo").map(lesson => lesson.id)).toContain("lesson-goal-1");
148+
149+
expect(store.recordTerminalOutcome({
150+
goal_id: "goal-without-repo",
151+
status: "completed",
152+
evidence: ["cas://evidence/global"],
153+
summary: "Global terminal outcome",
154+
})).toBe(true);
155+
});
156+
157+
it("rejects terminal outcomes without required evidence", () => {
158+
const store = EventStore.getInstance();
159+
160+
expect(() => store.recordTerminalOutcome({
161+
goal_id: "goal-without-evidence",
162+
status: "failed",
163+
evidence: [],
164+
summary: "Missing evidence",
165+
})).toThrow("Terminal outcomes require goal id, summary, and evidence.");
148166
});
149167

150168
it("should persist learning candidate approval and rejection", () => {
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import { describe, expect, it } from "vitest";
2+
3+
import { resolveDashboardPort } from "../src/core/ports.js";
4+
5+
describe("resolveDashboardPort", () => {
6+
it("uses the dedicated port, generic fallback, and default in priority order", () => {
7+
expect(resolveDashboardPort({ PROMPT_REFINER_DASHBOARD_PORT: "4100", PORT: "4200" })).toBe(4100);
8+
expect(resolveDashboardPort({ PORT: "4200" })).toBe(4200);
9+
expect(resolveDashboardPort({})).toBe(3000);
10+
});
11+
12+
it.each(["0", "65536", "not-a-number", "1.5"])("rejects invalid port %s", (value) => {
13+
expect(() => resolveDashboardPort({ PROMPT_REFINER_DASHBOARD_PORT: value })).toThrow(
14+
`Invalid dashboard port: ${value}`,
15+
);
16+
});
17+
});

0 commit comments

Comments
 (0)