import { afterEach, describe, expect, it } from "vitest"; import { resolveApiKeyForProfile } from "../../agents/auth-profiles/oauth.js"; import type { OpenClawConfig } from "../../config/types.openclaw.js"; import { clearSecretsRuntimeSnapshotState } from "../../secrets/runtime-state.js"; import { activateSecretsRuntimeSnapshot } from "../../secrets/runtime.js"; import { loadAuthStoreWithProfiles, setupSecretsRuntimeSnapshotTestHooks, } from "../../secrets/runtime.test-support.ts"; const EMPTY_LOADABLE_PLUGIN_ORIGINS = new Map(); const { prepareSecretsRuntimeSnapshot } = setupSecretsRuntimeSnapshotTestHooks(); afterEach(() => { clearSecretsRuntimeSnapshotState(); }); describe("local model account secret isolation contract", () => { it("keeps a healthy selected profile usable while a sibling SecretRef is unavailable", async () => { const agentDir = "/tmp/openclaw-model-run-account-isolation"; const coldProfileId = "openai:cold"; const healthyProfileId = "anthropic:healthy"; const cfg: OpenClawConfig = {}; const store = loadAuthStoreWithProfiles({ [coldProfileId]: { type: "api_key", provider: "openai", keyRef: { source: "env", provider: "default", id: "MISSING_OPENAI_PROFILE_KEY" }, }, [healthyProfileId]: { type: "api_key", provider: "anthropic", keyRef: { source: "env", provider: "default", id: "ANTHROPIC_PROFILE_KEY" }, }, }); const snapshot = await prepareSecretsRuntimeSnapshot({ config: cfg, env: { ANTHROPIC_PROFILE_KEY: "anthropic-runtime-key" }, agentDirs: [agentDir], includeConfigRefs: false, allowUnavailableSecretOwners: true, loadablePluginOrigins: EMPTY_LOADABLE_PLUGIN_ORIGINS, loadAuthStore: () => store, }); activateSecretsRuntimeSnapshot(snapshot); await expect( resolveApiKeyForProfile({ cfg, store, profileId: healthyProfileId, agentDir, }), ).resolves.toMatchObject({ apiKey: "anthropic-runtime-key", provider: "anthropic", }); await expect( resolveApiKeyForProfile({ cfg, store, profileId: coldProfileId, agentDir, }), ).rejects.toMatchObject({ code: "SECRET_SURFACE_UNAVAILABLE" }); }); });