test: stabilize embedded runner tests

This commit is contained in:
Peter Steinberger
2026-01-18 02:55:35 +00:00
parent 67f63ecd7e
commit 0f6f7059d9
3 changed files with 30 additions and 10 deletions

View File

@@ -78,6 +78,7 @@ vi.mock("@mariozechner/pi-ai", async () => {
? buildAssistantErrorMessage(model) ? buildAssistantErrorMessage(model)
: buildAssistantMessage(model), : buildAssistantMessage(model),
}); });
stream.end();
}); });
return stream; return stream;
}, },
@@ -113,6 +114,9 @@ const makeOpenAiConfig = (modelIds: string[]) =>
const ensureModels = (cfg: ClawdbotConfig, agentDir: string) => const ensureModels = (cfg: ClawdbotConfig, agentDir: string) =>
ensureClawdbotModelsJson(cfg, agentDir); ensureClawdbotModelsJson(cfg, agentDir);
const testSessionKey = "agent:test:embedded-ordering";
const immediateEnqueue = async <T>(task: () => Promise<T>) => task();
const textFromContent = (content: unknown) => { const textFromContent = (content: unknown) => {
if (typeof content === "string") return content; if (typeof content === "string") return content;
if (Array.isArray(content) && content[0]?.type === "text") { if (Array.isArray(content) && content[0]?.type === "text") {
@@ -179,7 +183,7 @@ describe("runEmbeddedPiAgent", () => {
await runEmbeddedPiAgent({ await runEmbeddedPiAgent({
sessionId: "session:test", sessionId: "session:test",
sessionKey: "agent:main:main", sessionKey: testSessionKey,
sessionFile, sessionFile,
workspaceDir, workspaceDir,
config: cfg, config: cfg,
@@ -188,6 +192,7 @@ describe("runEmbeddedPiAgent", () => {
model: "mock-1", model: "mock-1",
timeoutMs: 5_000, timeoutMs: 5_000,
agentDir, agentDir,
enqueue: immediateEnqueue,
}); });
const messages = await readSessionMessages(sessionFile); const messages = await readSessionMessages(sessionFile);
@@ -219,7 +224,7 @@ describe("runEmbeddedPiAgent", () => {
await runEmbeddedPiAgent({ await runEmbeddedPiAgent({
sessionId: "session:test", sessionId: "session:test",
sessionKey: "agent:main:main", sessionKey: testSessionKey,
sessionFile, sessionFile,
workspaceDir, workspaceDir,
config: cfg, config: cfg,
@@ -228,11 +233,12 @@ describe("runEmbeddedPiAgent", () => {
model: "mock-1", model: "mock-1",
timeoutMs: 5_000, timeoutMs: 5_000,
agentDir, agentDir,
enqueue: immediateEnqueue,
}); });
await runEmbeddedPiAgent({ await runEmbeddedPiAgent({
sessionId: "session:test", sessionId: "session:test",
sessionKey: "agent:main:main", sessionKey: testSessionKey,
sessionFile, sessionFile,
workspaceDir, workspaceDir,
config: cfg, config: cfg,
@@ -241,6 +247,7 @@ describe("runEmbeddedPiAgent", () => {
model: "mock-1", model: "mock-1",
timeoutMs: 5_000, timeoutMs: 5_000,
agentDir, agentDir,
enqueue: immediateEnqueue,
}); });
const messages = await readSessionMessages(sessionFile); const messages = await readSessionMessages(sessionFile);
@@ -306,7 +313,7 @@ describe("runEmbeddedPiAgent", () => {
const result = await runEmbeddedPiAgent({ const result = await runEmbeddedPiAgent({
sessionId: "session:test", sessionId: "session:test",
sessionKey: "agent:main:main", sessionKey: testSessionKey,
sessionFile, sessionFile,
workspaceDir, workspaceDir,
config: cfg, config: cfg,
@@ -315,6 +322,7 @@ describe("runEmbeddedPiAgent", () => {
model: "mock-1", model: "mock-1",
timeoutMs: 5_000, timeoutMs: 5_000,
agentDir, agentDir,
enqueue: immediateEnqueue,
}); });
expect(result.meta.error).toBeUndefined(); expect(result.meta.error).toBeUndefined();
@@ -339,7 +347,7 @@ describe("runEmbeddedPiAgent", () => {
const result = await runEmbeddedPiAgent({ const result = await runEmbeddedPiAgent({
sessionId: "session:test", sessionId: "session:test",
sessionKey: "agent:main:main", sessionKey: testSessionKey,
sessionFile, sessionFile,
workspaceDir, workspaceDir,
config: cfg, config: cfg,
@@ -348,6 +356,7 @@ describe("runEmbeddedPiAgent", () => {
model: "mock-1", model: "mock-1",
timeoutMs: 5_000, timeoutMs: 5_000,
agentDir, agentDir,
enqueue: immediateEnqueue,
}); });
expect(result.meta.error).toBeUndefined(); expect(result.meta.error).toBeUndefined();

View File

@@ -78,6 +78,7 @@ vi.mock("@mariozechner/pi-ai", async () => {
? buildAssistantErrorMessage(model) ? buildAssistantErrorMessage(model)
: buildAssistantMessage(model), : buildAssistantMessage(model),
}); });
stream.end();
}); });
return stream; return stream;
}, },
@@ -113,6 +114,9 @@ const makeOpenAiConfig = (modelIds: string[]) =>
const ensureModels = (cfg: ClawdbotConfig, agentDir: string) => const ensureModels = (cfg: ClawdbotConfig, agentDir: string) =>
ensureClawdbotModelsJson(cfg, agentDir); ensureClawdbotModelsJson(cfg, agentDir);
const testSessionKey = "agent:test:embedded-models";
const immediateEnqueue = async <T>(task: () => Promise<T>) => task();
const textFromContent = (content: unknown) => { const textFromContent = (content: unknown) => {
if (typeof content === "string") return content; if (typeof content === "string") return content;
if (Array.isArray(content) && content[0]?.type === "text") { if (Array.isArray(content) && content[0]?.type === "text") {
@@ -169,7 +173,7 @@ describe("runEmbeddedPiAgent", () => {
await expect( await expect(
runEmbeddedPiAgent({ runEmbeddedPiAgent({
sessionId: "session:test", sessionId: "session:test",
sessionKey: "agent:dev:test", sessionKey: testSessionKey,
sessionFile, sessionFile,
workspaceDir, workspaceDir,
config: cfg, config: cfg,
@@ -178,6 +182,7 @@ describe("runEmbeddedPiAgent", () => {
model: "definitely-not-a-model", model: "definitely-not-a-model",
timeoutMs: 1, timeoutMs: 1,
agentDir, agentDir,
enqueue: immediateEnqueue,
}), }),
).rejects.toThrow(/Unknown model:/); ).rejects.toThrow(/Unknown model:/);
@@ -193,7 +198,7 @@ describe("runEmbeddedPiAgent", () => {
await runEmbeddedPiAgent({ await runEmbeddedPiAgent({
sessionId: "session:test", sessionId: "session:test",
sessionKey: "agent:main:main", sessionKey: testSessionKey,
sessionFile, sessionFile,
workspaceDir, workspaceDir,
config: cfg, config: cfg,
@@ -202,6 +207,7 @@ describe("runEmbeddedPiAgent", () => {
model: "mock-1", model: "mock-1",
timeoutMs: 5_000, timeoutMs: 5_000,
agentDir, agentDir,
enqueue: immediateEnqueue,
}); });
const messages = await readSessionMessages(sessionFile); const messages = await readSessionMessages(sessionFile);
@@ -224,7 +230,7 @@ describe("runEmbeddedPiAgent", () => {
const result = await runEmbeddedPiAgent({ const result = await runEmbeddedPiAgent({
sessionId: "session:test", sessionId: "session:test",
sessionKey: "agent:main:main", sessionKey: testSessionKey,
sessionFile, sessionFile,
workspaceDir, workspaceDir,
config: cfg, config: cfg,
@@ -233,6 +239,7 @@ describe("runEmbeddedPiAgent", () => {
model: "mock-error", model: "mock-error",
timeoutMs: 5_000, timeoutMs: 5_000,
agentDir, agentDir,
enqueue: immediateEnqueue,
}); });
expect(result.payloads[0]?.isError).toBe(true); expect(result.payloads[0]?.isError).toBe(true);

View File

@@ -2,7 +2,9 @@ import type { AgentMessage } from "@mariozechner/pi-agent-core";
import type { SessionManager } from "@mariozechner/pi-coding-agent"; import type { SessionManager } from "@mariozechner/pi-coding-agent";
import { beforeEach, describe, expect, it, vi } from "vitest"; import { beforeEach, describe, expect, it, vi } from "vitest";
import * as helpers from "./pi-embedded-helpers.js"; import * as helpers from "./pi-embedded-helpers.js";
import { sanitizeSessionHistory } from "./pi-embedded-runner/google.js";
type SanitizeSessionHistory = typeof import("./pi-embedded-runner/google.js").sanitizeSessionHistory;
let sanitizeSessionHistory: SanitizeSessionHistory;
// Mock dependencies // Mock dependencies
vi.mock("./pi-embedded-helpers.js", async () => { vi.mock("./pi-embedded-helpers.js", async () => {
@@ -26,7 +28,7 @@ describe("sanitizeSessionHistory", () => {
const mockMessages: AgentMessage[] = [{ role: "user", content: "hello" }]; const mockMessages: AgentMessage[] = [{ role: "user", content: "hello" }];
beforeEach(() => { beforeEach(async () => {
vi.resetAllMocks(); vi.resetAllMocks();
vi.mocked(helpers.sanitizeSessionMessagesImages).mockImplementation(async (msgs) => msgs); vi.mocked(helpers.sanitizeSessionMessagesImages).mockImplementation(async (msgs) => msgs);
// Default mock implementation // Default mock implementation
@@ -34,6 +36,8 @@ describe("sanitizeSessionHistory", () => {
if (!msgs) return []; if (!msgs) return [];
return [...msgs, { role: "system", content: "downgraded" }]; return [...msgs, { role: "system", content: "downgraded" }];
}); });
vi.resetModules();
({ sanitizeSessionHistory } = await import("./pi-embedded-runner/google.js"));
}); });
it("should downgrade history for Google models if provider is not google-antigravity", async () => { it("should downgrade history for Google models if provider is not google-antigravity", async () => {