// Codex tests cover doctor contract api plugin behavior. import { describe, expect, it } from "vitest"; import { legacyConfigRules, normalizeCompatibilityConfig } from "./doctor-contract-api.js"; describe("codex doctor contract", () => { it("reports the retired dynamic tools profile config key", () => { expect( legacyConfigRules[0]?.match({ codexDynamicToolsProfile: "openclaw-compat", codexDynamicToolsLoading: "direct", }), ).toBe(true); expect(legacyConfigRules[0]?.match({ codexDynamicToolsLoading: "direct" })).toBe(false); }); it("reports old approval-routed destructive plugin policy values", () => { expect( legacyConfigRules[1]?.match({ allow_destructive_actions: "on-request", plugins: {}, }), ).toBe(true); expect( legacyConfigRules[1]?.match({ allow_destructive_actions: true, plugins: { "google-calendar": { allow_destructive_actions: "on-request" }, }, }), ).toBe(true); expect( legacyConfigRules[1]?.match({ allow_destructive_actions: "auto", plugins: { "google-calendar": { allow_destructive_actions: true }, }, }), ).toBe(false); expect( legacyConfigRules[1]?.match({ allow_destructive_actions: "ask", plugins: { "google-calendar": { allow_destructive_actions: "ask" }, }, }), ).toBe(false); expect( legacyConfigRules[1]?.match({ allow_destructive_actions: "always", plugins: { "google-calendar": { allow_destructive_actions: "always" }, }, }), ).toBe(false); }); it("removes the retired dynamic tools profile without dropping other Codex config", () => { const original = { plugins: { entries: { codex: { enabled: true, config: { codexDynamicToolsProfile: "openclaw-compat", codexDynamicToolsLoading: "direct", codexDynamicToolsExclude: ["custom_tool"], appServer: { mode: "guardian" }, }, }, }, }, }; const result = normalizeCompatibilityConfig({ cfg: original }); expect(result.changes).toEqual([ "Removed retired plugins.entries.codex.config.codexDynamicToolsProfile; Codex app-server always keeps Codex-native workspace tools native.", ]); expect(result.config.plugins?.entries?.codex?.config).toEqual({ codexDynamicToolsLoading: "direct", codexDynamicToolsExclude: ["custom_tool"], appServer: { mode: "guardian" }, }); expect(original.plugins.entries.codex.config).toHaveProperty("codexDynamicToolsProfile"); }); it("renames old approval-routed destructive plugin policy values", () => { const original = { plugins: { entries: { codex: { enabled: true, config: { codexDynamicToolsProfile: "openclaw-compat", codexPlugins: { enabled: true, allow_destructive_actions: "on-request", plugins: { "google-calendar": { enabled: true, allow_destructive_actions: "on-request", }, slack: { enabled: true, allow_destructive_actions: false, }, }, }, }, }, }, }, }; const result = normalizeCompatibilityConfig({ cfg: original }); expect(result.changes).toEqual([ "Removed retired plugins.entries.codex.config.codexDynamicToolsProfile; Codex app-server always keeps Codex-native workspace tools native.", 'Renamed plugins.entries.codex.config.codexPlugins allow_destructive_actions="on-request" values to "auto".', ]); expect(result.config.plugins?.entries?.codex?.config).toEqual({ codexPlugins: { enabled: true, allow_destructive_actions: "auto", plugins: { "google-calendar": { enabled: true, allow_destructive_actions: "auto", }, slack: { enabled: true, allow_destructive_actions: false, }, }, }, }); expect( original.plugins.entries.codex.config.codexPlugins.plugins["google-calendar"] .allow_destructive_actions, ).toBe("on-request"); }); });