test(commands): dedupe auth-sync fixture and cover invalid profile handling

This commit is contained in:
Peter Steinberger
2026-02-21 19:26:59 +00:00
parent e978297c28
commit 0e49eec056

View File

@@ -16,14 +16,22 @@ async function pathExists(pathname: string): Promise<boolean> {
} }
} }
describe("models list auth-profile sync", () => { type AuthSyncFixture = {
it("marks models available when auth exists only in auth-profiles.json", async () => { root: string;
const root = await fs.mkdtemp(path.join(os.tmpdir(), "openclaw-models-list-auth-sync-")); stateDir: string;
agentDir: string;
configPath: string;
authPath: string;
};
async function withAuthSyncFixture(run: (fixture: AuthSyncFixture) => Promise<void>) {
const root = await fs.mkdtemp(path.join(os.tmpdir(), "openclaw-models-list-auth-sync-"));
try { try {
const stateDir = path.join(root, "state"); const stateDir = path.join(root, "state");
const agentDir = path.join(stateDir, "agents", "main", "agent"); const agentDir = path.join(stateDir, "agents", "main", "agent");
const configPath = path.join(stateDir, "openclaw.json"); const configPath = path.join(stateDir, "openclaw.json");
const authPath = path.join(agentDir, "auth.json");
await fs.mkdir(agentDir, { recursive: true }); await fs.mkdir(agentDir, { recursive: true });
await fs.writeFile(configPath, "{}\n", "utf8"); await fs.writeFile(configPath, "{}\n", "utf8");
@@ -36,6 +44,33 @@ describe("models list auth-profile sync", () => {
OPENROUTER_API_KEY: undefined, OPENROUTER_API_KEY: undefined,
}, },
async () => { async () => {
clearConfigCache();
await run({ root, stateDir, agentDir, configPath, authPath });
},
);
} finally {
clearConfigCache();
await fs.rm(root, { recursive: true, force: true });
}
}
function createRuntime() {
return {
log: vi.fn(),
error: vi.fn(),
};
}
function getProviderRow(payloadText: string, providerPrefix: string) {
const payload = JSON.parse(payloadText) as {
models?: Array<{ key?: string; available?: boolean }>;
};
return payload.models?.find((model) => String(model.key ?? "").startsWith(providerPrefix));
}
describe("models list auth-profile sync", () => {
it("marks models available when auth exists only in auth-profiles.json", async () => {
await withAuthSyncFixture(async ({ agentDir, authPath }) => {
saveAuthProfileStore( saveAuthProfileStore(
{ {
version: 1, version: 1,
@@ -50,33 +85,45 @@ describe("models list auth-profile sync", () => {
agentDir, agentDir,
); );
const authPath = path.join(agentDir, "auth.json");
expect(await pathExists(authPath)).toBe(false); expect(await pathExists(authPath)).toBe(false);
clearConfigCache(); const runtime = createRuntime();
const runtime = {
log: vi.fn(),
error: vi.fn(),
};
await modelsListCommand({ all: true, json: true }, runtime as never); await modelsListCommand({ all: true, json: true }, runtime as never);
expect(runtime.error).not.toHaveBeenCalled(); expect(runtime.error).not.toHaveBeenCalled();
expect(runtime.log).toHaveBeenCalledTimes(1); expect(runtime.log).toHaveBeenCalledTimes(1);
const payload = JSON.parse(String(runtime.log.mock.calls[0]?.[0])) as { const openrouter = getProviderRow(String(runtime.log.mock.calls[0]?.[0]), "openrouter/");
models?: Array<{ key?: string; available?: boolean }>;
};
const openrouter = payload.models?.find((model) =>
String(model.key ?? "").startsWith("openrouter/"),
);
expect(openrouter).toBeDefined(); expect(openrouter).toBeDefined();
expect(openrouter?.available).toBe(true); expect(openrouter?.available).toBe(true);
expect(await pathExists(authPath)).toBe(true); expect(await pathExists(authPath)).toBe(true);
});
});
it("keeps providers unavailable when auth profile credentials are invalid", async () => {
await withAuthSyncFixture(async ({ agentDir, authPath }) => {
saveAuthProfileStore(
{
version: 1,
profiles: {
"openrouter:default": {
type: "api_key",
provider: "openrouter",
key: " ",
}, },
},
},
agentDir,
); );
} finally {
clearConfigCache(); const runtime = createRuntime();
await fs.rm(root, { recursive: true, force: true }); await modelsListCommand({ all: true, json: true }, runtime as never);
}
expect(runtime.error).not.toHaveBeenCalled();
expect(runtime.log).toHaveBeenCalledTimes(1);
const openrouter = getProviderRow(String(runtime.log.mock.calls[0]?.[0]), "openrouter/");
expect(openrouter).toBeDefined();
expect(openrouter?.available).not.toBe(true);
expect(await pathExists(authPath)).toBe(false);
});
}); });
}); });