Files
oh-my-openagent/packages/sdk/src/create-omo-runner.test.ts
2026-03-16 15:06:33 +09:00

107 lines
2.9 KiB
TypeScript

import { beforeEach, describe, expect, it, mock } from "bun:test"
import type { ServerConnection } from "../../../src/cli/run/types"
const mockCreateServerConnection = mock(
async (): Promise<ServerConnection> => ({
client: {} as never,
cleanup: mock(() => {}),
}),
)
const mockExecuteRunSession = mock(async (_options: unknown) => ({
exitCode: 0,
sessionId: "ses_runner",
result: {
sessionId: "ses_runner",
success: true,
durationMs: 10,
messageCount: 1,
summary: "done",
},
}))
mock.module("../../../src/cli/run/server-connection", () => ({
createServerConnection: mockCreateServerConnection,
}))
mock.module("../../../src/cli/run/run-engine", () => ({
executeRunSession: mockExecuteRunSession,
}))
const { createOmoRunner } = await import("./create-omo-runner")
describe("createOmoRunner", () => {
beforeEach(() => {
mockCreateServerConnection.mockClear()
mockExecuteRunSession.mockClear()
})
it("reuses the same connection and enables question-aware execution", async () => {
const runner = createOmoRunner({
directory: "/repo",
agent: "atlas",
})
const first = await runner.run("first")
const second = await runner.run("second", { agent: "prometheus" })
expect(first.summary).toBe("done")
expect(second.summary).toBe("done")
expect(mockCreateServerConnection).toHaveBeenCalledTimes(1)
expect(mockExecuteRunSession).toHaveBeenNthCalledWith(1, expect.objectContaining({
directory: "/repo",
agent: "atlas",
questionPermission: "allow",
questionToolEnabled: true,
renderOutput: false,
}))
expect(mockExecuteRunSession).toHaveBeenNthCalledWith(2, expect.objectContaining({
agent: "prometheus",
}))
await runner.close()
})
it("streams normalized events", async () => {
mockExecuteRunSession.mockImplementationOnce(async (options: { eventObserver?: { onEvent?: (event: unknown) => Promise<void> } }) => {
await options.eventObserver?.onEvent?.({
type: "session.started",
sessionId: "ses_runner",
agent: "Atlas (Plan Executor)",
resumed: false,
})
await options.eventObserver?.onEvent?.({
type: "session.completed",
sessionId: "ses_runner",
result: {
sessionId: "ses_runner",
success: true,
durationMs: 10,
messageCount: 1,
summary: "done",
},
})
return {
exitCode: 0,
sessionId: "ses_runner",
result: {
sessionId: "ses_runner",
success: true,
durationMs: 10,
messageCount: 1,
summary: "done",
},
}
})
const runner = createOmoRunner({ directory: "/repo" })
const seenTypes: string[] = []
for await (const event of runner.stream("stream")) {
seenTypes.push(event.type)
}
expect(seenTypes).toEqual(["session.started", "session.completed"])
await runner.close()
})
})