mirror of
https://github.com/openclaw/openclaw.git
synced 2026-05-30 09:43:39 +00:00
160 lines
5.4 KiB
TypeScript
160 lines
5.4 KiB
TypeScript
import { afterEach, describe, expect, it, vi } from "vitest";
|
|
import type { AuthProfileStore } from "../agents/auth-profiles/types.js";
|
|
|
|
describe("provider auth profile helpers", () => {
|
|
afterEach(() => {
|
|
vi.doUnmock("../agents/agent-scope-config.js");
|
|
vi.doUnmock("../agents/auth-profiles/external-cli-discovery.js");
|
|
vi.doUnmock("../agents/auth-profiles/oauth.js");
|
|
vi.doUnmock("../agents/auth-profiles/order.js");
|
|
vi.doUnmock("../agents/auth-profiles/store.js");
|
|
vi.resetModules();
|
|
});
|
|
|
|
it("resolves API keys from the fallback store that supplied usable profile ids", async () => {
|
|
vi.resetModules();
|
|
|
|
const primaryStore: AuthProfileStore = {
|
|
version: 1,
|
|
profiles: {},
|
|
};
|
|
const fallbackStore: AuthProfileStore = {
|
|
version: 1,
|
|
profiles: {
|
|
"openai-codex:default": {
|
|
type: "api_key",
|
|
provider: "openai-codex",
|
|
key: "fallback-key",
|
|
},
|
|
},
|
|
};
|
|
const resolveApiKeyForProfile = vi.fn(
|
|
async (params: { store: AuthProfileStore; profileId: string }) => {
|
|
const profile = params.store.profiles[params.profileId];
|
|
return profile?.type === "api_key" && profile.key
|
|
? {
|
|
apiKey: profile.key,
|
|
provider: profile.provider,
|
|
profileId: params.profileId,
|
|
profileType: profile.type,
|
|
}
|
|
: null;
|
|
},
|
|
);
|
|
|
|
vi.doMock("../agents/agent-scope-config.js", () => ({
|
|
resolveDefaultAgentDir: () => "/tmp/openclaw-agent",
|
|
}));
|
|
vi.doMock("../agents/auth-profiles/oauth.js", () => ({
|
|
resolveApiKeyForProfile,
|
|
}));
|
|
vi.doMock("../agents/auth-profiles/order.js", () => ({
|
|
resolveAuthProfileOrder: ({
|
|
provider,
|
|
store,
|
|
}: {
|
|
provider: string;
|
|
store: AuthProfileStore;
|
|
}) =>
|
|
Object.entries(store.profiles)
|
|
.filter(([, profile]) => profile.provider === provider)
|
|
.map(([profileId]) => profileId),
|
|
}));
|
|
vi.doMock("../agents/auth-profiles/store.js", () => ({
|
|
ensureAuthProfileStore: vi.fn(() => primaryStore),
|
|
ensureAuthProfileStoreForLocalUpdate: vi.fn(() => primaryStore),
|
|
loadAuthProfileStoreForSecretsRuntime: vi.fn(() => primaryStore),
|
|
loadAuthProfileStoreWithoutExternalProfiles: vi.fn(() => fallbackStore),
|
|
updateAuthProfileStoreWithLock: vi.fn(),
|
|
}));
|
|
|
|
const { listUsableProviderAuthProfileIds, resolveProviderAuthProfileApiKey } =
|
|
await import("./provider-auth.js");
|
|
|
|
expect(listUsableProviderAuthProfileIds({ provider: "openai-codex" }).profileIds).toEqual([
|
|
"openai-codex:default",
|
|
]);
|
|
await expect(resolveProviderAuthProfileApiKey({ provider: "openai-codex" })).resolves.toBe(
|
|
"fallback-key",
|
|
);
|
|
expect(resolveApiKeyForProfile).toHaveBeenCalledWith(
|
|
expect.objectContaining({
|
|
agentDir: "/tmp/openclaw-agent",
|
|
profileId: "openai-codex:default",
|
|
store: fallbackStore,
|
|
}),
|
|
);
|
|
});
|
|
|
|
it("only discovers external CLI auth when provider resolution opts in", async () => {
|
|
vi.resetModules();
|
|
|
|
const primaryStore: AuthProfileStore = {
|
|
version: 1,
|
|
profiles: {},
|
|
};
|
|
const externalStore: AuthProfileStore = {
|
|
version: 1,
|
|
profiles: {
|
|
"openai-codex:default": {
|
|
type: "oauth",
|
|
provider: "openai-codex",
|
|
access: "oauth-access",
|
|
refresh: "oauth-refresh",
|
|
expires: Date.now() + 60_000,
|
|
},
|
|
},
|
|
};
|
|
const externalCli = { mode: "scoped", providerIds: ["openai-codex"] };
|
|
const loadAuthProfileStoreForSecretsRuntime = vi.fn(
|
|
(_agentDir?: string, options?: { externalCli?: unknown }) =>
|
|
options?.externalCli ? externalStore : primaryStore,
|
|
);
|
|
|
|
vi.doMock("../agents/agent-scope-config.js", () => ({
|
|
resolveDefaultAgentDir: () => "/tmp/openclaw-agent",
|
|
}));
|
|
vi.doMock("../agents/auth-profiles/external-cli-discovery.js", () => ({
|
|
externalCliDiscoveryForProviderAuth: vi.fn(() => externalCli),
|
|
}));
|
|
vi.doMock("../agents/auth-profiles/oauth.js", () => ({
|
|
resolveApiKeyForProfile: vi.fn(),
|
|
}));
|
|
vi.doMock("../agents/auth-profiles/order.js", () => ({
|
|
resolveAuthProfileOrder: ({
|
|
provider,
|
|
store,
|
|
}: {
|
|
provider: string;
|
|
store: AuthProfileStore;
|
|
}) =>
|
|
Object.entries(store.profiles)
|
|
.filter(([, profile]) => profile.provider === provider)
|
|
.map(([profileId]) => profileId),
|
|
}));
|
|
vi.doMock("../agents/auth-profiles/store.js", () => ({
|
|
ensureAuthProfileStore: vi.fn(() => primaryStore),
|
|
ensureAuthProfileStoreForLocalUpdate: vi.fn(() => primaryStore),
|
|
loadAuthProfileStoreForSecretsRuntime,
|
|
loadAuthProfileStoreWithoutExternalProfiles: vi.fn(() => ({ version: 1, profiles: {} })),
|
|
updateAuthProfileStoreWithLock: vi.fn(),
|
|
}));
|
|
|
|
const { isProviderAuthProfileConfigured } = await import("./provider-auth.js");
|
|
|
|
expect(isProviderAuthProfileConfigured({ provider: "openai-codex" })).toBe(false);
|
|
expect(
|
|
isProviderAuthProfileConfigured({
|
|
provider: "openai-codex",
|
|
includeExternalCliAuth: true,
|
|
}),
|
|
).toBe(true);
|
|
expect(loadAuthProfileStoreForSecretsRuntime).toHaveBeenNthCalledWith(1, "/tmp/openclaw-agent");
|
|
expect(loadAuthProfileStoreForSecretsRuntime).toHaveBeenNthCalledWith(
|
|
2,
|
|
"/tmp/openclaw-agent",
|
|
{ externalCli },
|
|
);
|
|
});
|
|
});
|