From 376bd7428ab0903255efa569338c3b093c2b5782 Mon Sep 17 00:00:00 2001 From: YeonGyu-Kim Date: Wed, 18 Feb 2026 17:33:50 +0900 Subject: [PATCH] test(hooks): add ultrawork-model-override unit tests --- .../ultrawork-model-override/hook.test.ts | 217 ++++++++++++++++++ 1 file changed, 217 insertions(+) create mode 100644 src/hooks/ultrawork-model-override/hook.test.ts diff --git a/src/hooks/ultrawork-model-override/hook.test.ts b/src/hooks/ultrawork-model-override/hook.test.ts new file mode 100644 index 00000000..66bf2478 --- /dev/null +++ b/src/hooks/ultrawork-model-override/hook.test.ts @@ -0,0 +1,217 @@ +import { describe, expect, it } from "vitest" +import { createUltraworkModelOverrideHook } from "./hook" + +interface ChatParamsInput { + agent: string + message: { + variant: string + model?: { providerID?: string; modelID?: string } + } + sessionID?: string +} + +interface ChatParamsOutput { + // Not used by this hook +} + +function createMockParams(overrides: { + agent?: string + variant?: string + model?: { providerID?: string; modelID?: string } + sessionID?: string +}): { input: ChatParamsInput; output: ChatParamsOutput } { + const agent = overrides.agent ?? "sisyphus" + const variant = overrides.variant ?? "max" + const model = overrides.model + const sessionID = overrides.sessionID + + return { + input: { + agent, + message: { variant, model }, + sessionID, + }, + output: {}, + } +} + +describe("createUltraworkModelOverrideHook", () => { + describe("model swap works", () => { + it("variant max, ultrawork config exists → model swapped", async () => { + // given + const agents = { + sisyphus: { + ultrawork: { + model: "openai/gpt-5.2", + }, + }, + } + const hook = createUltraworkModelOverrideHook({ agents }) + const { input, output } = createMockParams({}) + + // when + await hook["chat.params"](input, output) + + // then + expect(input.message.model).toEqual({ + providerID: "openai", + modelID: "gpt-5.2", + }) + }) + }) + + describe("no-op on non-max variant", () => { + it("variant high → model unchanged", async () => { + // given + const agents = { + sisyphus: { + ultrawork: { + model: "openai/gpt-5.2", + }, + }, + } + const hook = createUltraworkModelOverrideHook({ agents }) + const { input, output } = createMockParams({ variant: "high" }) + + // when + await hook["chat.params"](input, output) + + // then + expect(input.message.model).toBeUndefined() + }) + }) + + describe("no-op without config", () => { + it("agent has no ultrawork config → model unchanged", async () => { + // given + const agents = { + hephaestus: { + ultrawork: { + model: "openai/gpt-5.2", + }, + }, + } + const hook = createUltraworkModelOverrideHook({ agents }) + const { input, output } = createMockParams({}) + + // when + await hook["chat.params"](input, output) + + // then + expect(input.message.model).toBeUndefined() + }) + }) + + describe("empty ultrawork config", () => { + it("ultrawork: {} → no-op (model required)", async () => { + // given + const agents = { + sisyphus: { + ultrawork: undefined, + }, + } + const hook = createUltraworkModelOverrideHook({ agents }) + const { input, output } = createMockParams({}) + + // when + await hook["chat.params"](input, output) + + // then + expect(input.message.model).toBeUndefined() + }) + }) + + describe("model string parsing", () => { + it("openai/gpt-5.2 → { providerID: openai, modelID: gpt-5.2 }", async () => { + // given + const agents = { + sisyphus: { + ultrawork: { + model: "openai/gpt-5.2", + }, + }, + } + const hook = createUltraworkModelOverrideHook({ agents }) + const { input, output } = createMockParams({}) + + // when + await hook["chat.params"](input, output) + + // then + expect(input.message.model).toEqual({ + providerID: "openai", + modelID: "gpt-5.2", + }) + }) + }) + + describe("nested slashes", () => { + it("google-vertex-anthropic/claude-opus-4-6 → { providerID: google-vertex-anthropic, modelID: claude-opus-4-6 } (first / only)", async () => { + // given + const agents = { + sisyphus: { + ultrawork: { + model: "google-vertex-anthropic/claude-opus-4-6", + }, + }, + } + const hook = createUltraworkModelOverrideHook({ agents }) + const { input, output } = createMockParams({}) + + // when + await hook["chat.params"](input, output) + + // then + expect(input.message.model).toEqual({ + providerID: "google-vertex-anthropic", + modelID: "claude-opus-4-6", + }) + }) + }) + + describe("variant override", () => { + it("ultrawork.variant exists → message.variant updated", async () => { + // given + const agents = { + sisyphus: { + ultrawork: { + model: "openai/gpt-5.2", + variant: "high", + }, + }, + } + const hook = createUltraworkModelOverrideHook({ agents }) + const { input, output } = createMockParams({}) + + // when + await hook["chat.params"](input, output) + + // then + expect(input.message.variant).toBe("high") + }) + }) + + describe("agent name normalization", () => { + it("Sisyphus (Ultraworker) → sisyphus config key lookup", async () => { + // given + const agents = { + sisyphus: { + ultrawork: { + model: "openai/gpt-5.2", + }, + }, + } + const hook = createUltraworkModelOverrideHook({ agents }) + const { input, output } = createMockParams({ agent: "Sisyphus (Ultraworker)" }) + + // when + await hook["chat.params"](input, output) + + // then + expect(input.message.model).toEqual({ + providerID: "openai", + modelID: "gpt-5.2", + }) + }) + }) +}) \ No newline at end of file