test(plugin): update plugin config and registry tests

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This commit is contained in:
YeonGyu-Kim
2026-04-10 15:53:25 +09:00
parent fa1b4650ce
commit c21c3630ca
4 changed files with 87 additions and 37 deletions
+18 -8
View File
@@ -1,4 +1,4 @@
import { describe, expect, mock, spyOn, test } from "bun:test"
import { beforeEach, describe, expect, mock, spyOn, test } from "bun:test"
import { tool } from "@opencode-ai/plugin"
import type { OhMyOpenCodeConfig } from "../config"
@@ -25,7 +25,12 @@ const syncSessionCreatedCallbacks: Array<
((event: { sessionID: string; parentID: string; title: string }) => Promise<void>) | undefined
> = []
mock.module("../tools", () => ({
const trackedPaneBySession = new Map<string, string>()
let dispatchOpenClawEvent: ReturnType<typeof spyOn>
const { createToolRegistry, trimToolsToCap } = await import("./tool-registry")
const toolFactories: NonNullable<Parameters<typeof createToolRegistry>[0]["toolFactories"]> = {
builtinTools: { bash: fakeTool, read: fakeTool },
createBackgroundTools: mock(() => ({})),
createCallOmoAgent: mock(() => fakeTool),
@@ -47,12 +52,7 @@ mock.module("../tools", () => ({
createTaskList: mock(() => fakeTool),
createTaskUpdateTool: mock(() => fakeTool),
createHashlineEditTool: mock(() => fakeTool),
}))
const trackedPaneBySession = new Map<string, string>()
const { createToolRegistry, trimToolsToCap } = await import("./tool-registry")
const dispatchOpenClawEvent = spyOn(openclawRuntimeDispatch, "dispatchOpenClawEvent")
}
function createPluginConfig(overrides: Partial<OhMyOpenCodeConfig> = {}): OhMyOpenCodeConfig {
return {
@@ -65,6 +65,11 @@ function createPluginConfig(overrides: Partial<OhMyOpenCodeConfig> = {}): OhMyOp
}
}
beforeEach(() => {
dispatchOpenClawEvent = spyOn(openclawRuntimeDispatch, "dispatchOpenClawEvent")
syncSessionCreatedCallbacks.length = 0
})
describe("#given tool trimming prioritization", () => {
test("#when max_tools trims a hashline edit registration named edit #then edit is removed before higher-priority tools", () => {
const filteredTools = {
@@ -100,6 +105,7 @@ describe("#given task_system configuration", () => {
disabledSkills: new Set(),
},
availableCategories: [],
toolFactories,
})
expect(result.taskSystemEnabled).toBe(false)
@@ -129,6 +135,7 @@ describe("#given task_system configuration", () => {
disabledSkills: new Set(),
},
availableCategories: [],
toolFactories,
})
expect(result.taskSystemEnabled).toBe(true)
@@ -168,6 +175,7 @@ describe("#given tmux integration is disabled", () => {
},
availableCategories: [],
interactiveBashEnabled: true,
toolFactories,
})
expect(result.filteredTools).toHaveProperty("interactive_bash")
@@ -201,6 +209,7 @@ describe("#given tmux integration is disabled", () => {
},
availableCategories: [],
interactiveBashEnabled: false,
toolFactories,
})
expect(result.filteredTools).not.toHaveProperty("interactive_bash")
@@ -246,6 +255,7 @@ describe("#given openclaw is enabled for sync task sessions", () => {
disabledSkills: new Set(),
},
availableCategories: [],
toolFactories,
})
const onSyncSessionCreated = syncSessionCreatedCallbacks[syncSessionCreatedCallbacks.length - 1]
+19 -10
View File
@@ -6,6 +6,12 @@ import { tmpdir } from "node:os"
import * as dataPathModule from "../shared/data-path"
import * as sharedModule from "../shared"
let scheduleDeferredModelOverride: (typeof import("./ultrawork-db-model-override"))["scheduleDeferredModelOverride"]
async function importFreshUltraworkDbModelOverrideModule(): Promise<typeof import("./ultrawork-db-model-override")> {
return import(`./ultrawork-db-model-override?test=${Date.now()}-${Math.random()}`)
}
function flushMicrotasks(depth: number): Promise<void> {
return new Promise<void>((resolve) => {
let remaining = depth
@@ -22,6 +28,11 @@ function flushWithTimeout(): Promise<void> {
return new Promise<void>((resolve) => setTimeout(resolve, 10))
}
async function settleDeferredModelOverrideWork(): Promise<void> {
await flushMicrotasks(12)
await flushWithTimeout()
}
function isRecord(value: unknown): value is Record<string, unknown> {
return typeof value === "object" && value !== null
}
@@ -32,7 +43,7 @@ describe("scheduleDeferredModelOverride", () => {
let logSpy: ReturnType<typeof spyOn>
let getDataDirSpy: ReturnType<typeof spyOn>
beforeEach(() => {
beforeEach(async () => {
tempDir = mkdtempSync(join(tmpdir(), "ultrawork-db-test-"))
const opencodePath = join(tempDir, "opencode")
mkdirSync(opencodePath, { recursive: true })
@@ -50,11 +61,15 @@ describe("scheduleDeferredModelOverride", () => {
`)
db.close()
getDataDirSpy = spyOn(dataPathModule, "getDataDir").mockReturnValue(tempDir)
logSpy = spyOn(sharedModule, "log").mockImplementation(() => {})
getDataDirSpy = spyOn(dataPathModule, "getDataDir")
getDataDirSpy.mockReturnValue(tempDir)
logSpy = spyOn(sharedModule, "log")
logSpy.mockImplementation(() => {})
;({ scheduleDeferredModelOverride } = await importFreshUltraworkDbModelOverrideModule())
})
afterEach(() => {
afterEach(async () => {
await settleDeferredModelOverrideWork()
getDataDirSpy?.mockRestore()
logSpy?.mockRestore()
rmSync(tempDir, { recursive: true, force: true })
@@ -95,7 +110,6 @@ describe("scheduleDeferredModelOverride", () => {
insertMessage("msg_001", { providerID: "anthropic", modelID: "claude-sonnet-4-6" })
//#when
const { scheduleDeferredModelOverride } = await import("./ultrawork-db-model-override")
scheduleDeferredModelOverride(
"msg_001",
{ providerID: "anthropic", modelID: "claude-opus-4-6" },
@@ -112,7 +126,6 @@ describe("scheduleDeferredModelOverride", () => {
insertMessage("msg_002", { providerID: "anthropic", modelID: "claude-sonnet-4-6" })
//#when
const { scheduleDeferredModelOverride } = await import("./ultrawork-db-model-override")
scheduleDeferredModelOverride(
"msg_002",
{ providerID: "anthropic", modelID: "claude-opus-4-6" },
@@ -129,7 +142,6 @@ describe("scheduleDeferredModelOverride", () => {
//#given no message inserted
//#when
const { scheduleDeferredModelOverride } = await import("./ultrawork-db-model-override")
scheduleDeferredModelOverride(
"msg_nonexistent",
{ providerID: "anthropic", modelID: "claude-opus-4-6" },
@@ -148,7 +160,6 @@ describe("scheduleDeferredModelOverride", () => {
insertMessage("msg_003", { providerID: "anthropic", modelID: "claude-sonnet-4-6" })
//#when
const { scheduleDeferredModelOverride } = await import("./ultrawork-db-model-override")
scheduleDeferredModelOverride(
"msg_003",
{ providerID: "anthropic", modelID: "claude-opus-4-6" },
@@ -167,7 +178,6 @@ describe("scheduleDeferredModelOverride", () => {
getDataDirSpy.mockReturnValue("/nonexistent/path/that/does/not/exist")
//#when
const { scheduleDeferredModelOverride } = await import("./ultrawork-db-model-override")
scheduleDeferredModelOverride(
"msg_004",
{ providerID: "anthropic", modelID: "claude-opus-4-6" },
@@ -188,7 +198,6 @@ describe("scheduleDeferredModelOverride", () => {
chmodSync(corruptedDbPath, 0o000)
//#when
const { scheduleDeferredModelOverride } = await import("./ultrawork-db-model-override")
scheduleDeferredModelOverride(
"msg_corrupt",
{ providerID: "anthropic", modelID: "claude-opus-4-6" },
+32 -9
View File
@@ -1,14 +1,29 @@
import { describe, expect, test, beforeEach, afterEach, spyOn } from "bun:test"
import {
applyUltraworkModelOverrideOnMessage,
resolveUltraworkOverride,
detectUltrawork,
} from "./ultrawork-model-override"
import * as sharedModule from "../shared"
import * as dbOverrideModule from "./ultrawork-db-model-override"
import * as sessionStateModule from "../features/claude-code-session-state"
let resolveUltraworkOverride: (typeof import("./ultrawork-model-override"))["resolveUltraworkOverride"]
let detectUltrawork: (typeof import("./ultrawork-model-override"))["detectUltrawork"]
let applyUltraworkModelOverrideOnMessage: (typeof import("./ultrawork-model-override"))["applyUltraworkModelOverrideOnMessage"]
async function importFreshUltraworkModelOverrideModule(): Promise<typeof import("./ultrawork-model-override")> {
return import(`./ultrawork-model-override?test=${Date.now()}-${Math.random()}`)
}
async function loadFreshUltraworkModelOverrideModule(): Promise<void> {
;({
resolveUltraworkOverride,
detectUltrawork,
applyUltraworkModelOverrideOnMessage,
} = await importFreshUltraworkModelOverrideModule())
}
describe("detectUltrawork", () => {
beforeEach(async () => {
await loadFreshUltraworkModelOverrideModule()
})
test("should detect ultrawork keyword", () => {
expect(detectUltrawork("ultrawork do something")).toBe(true)
})
@@ -41,6 +56,10 @@ describe("detectUltrawork", () => {
})
describe("resolveUltraworkOverride", () => {
beforeEach(async () => {
await loadFreshUltraworkModelOverrideModule()
})
function createOutput(text: string, agentName?: string) {
return {
message: {
@@ -203,7 +222,8 @@ describe("resolveUltraworkOverride", () => {
//#given
const config = createConfig("sisyphus", { model: "anthropic/claude-opus-4-6", variant: "max" })
const output = createOutput("ultrawork do something")
const getSessionAgentSpy = spyOn(sessionStateModule, "getSessionAgent").mockReturnValue("sisyphus")
const getSessionAgentSpy = spyOn(sessionStateModule, "getSessionAgent")
getSessionAgentSpy.mockReturnValue("sisyphus")
//#when
const result = resolveUltraworkOverride(config, undefined, output, "ses_test")
@@ -220,9 +240,12 @@ describe("applyUltraworkModelOverrideOnMessage", () => {
let logSpy: ReturnType<typeof spyOn>
let dbOverrideSpy: ReturnType<typeof spyOn>
beforeEach(() => {
logSpy = spyOn(sharedModule, "log").mockImplementation(() => {})
dbOverrideSpy = spyOn(dbOverrideModule, "scheduleDeferredModelOverride").mockImplementation(() => {})
beforeEach(async () => {
logSpy = spyOn(sharedModule, "log")
logSpy.mockImplementation(() => {})
dbOverrideSpy = spyOn(dbOverrideModule, "scheduleDeferredModelOverride")
dbOverrideSpy.mockImplementation(() => {})
await loadFreshUltraworkModelOverrideModule()
})
afterEach(() => {