



















@@ -263,6 +263,56 @@ function createRuntime() {
263263};
264264}
265265266+function requireRecord(value: unknown, label: string): Record<string, unknown> {
267+expect(typeof value).toBe("object");
268+expect(value).not.toBeNull();
269+if (typeof value !== "object" || value === null) {
270+throw new Error(`${label} was not an object`);
271+}
272+return value as Record<string, unknown>;
273+}
274+275+function expectRecordFields(record: Record<string, unknown>, fields: Record<string, unknown>) {
276+for (const [key, value] of Object.entries(fields)) {
277+expect(record[key]).toEqual(value);
278+}
279+}
280+281+function requireArray(value: unknown, label: string): unknown[] {
282+expect(Array.isArray(value)).toBe(true);
283+if (!Array.isArray(value)) {
284+throw new Error(`${label} was not an array`);
285+}
286+return value;
287+}
288+289+function requireProvider(providers: unknown, provider: string) {
290+const entry = requireArray(providers, "auth providers").find(
291+(candidate) => requireRecord(candidate, "auth provider").provider === provider,
292+);
293+expect(entry).toBeDefined();
294+if (!entry) {
295+throw new Error(`missing provider ${provider}`);
296+}
297+return requireRecord(entry, `provider ${provider}`);
298+}
299+300+function requireProfile(profiles: unknown, profileId: string) {
301+const entry = requireArray(profiles, "auth profiles").find(
302+(candidate) => requireRecord(candidate, "auth profile").profileId === profileId,
303+);
304+expect(entry).toBeDefined();
305+if (!entry) {
306+throw new Error(`missing profile ${profileId}`);
307+}
308+return requireRecord(entry, `profile ${profileId}`);
309+}
310+311+function expectResolveAgentDirCalledFor(agentId: string) {
312+const hasCall = mocks.resolveAgentDir.mock.calls.some((call) => call[1] === agentId);
313+expect(hasCall).toBe(true);
314+}
315+266316async function withAgentScopeOverrides<T>(
267317overrides: {
268318primary?: string;
@@ -314,7 +364,7 @@ describe("modelsStatusCommand auth overview", () => {
314364await modelsStatusCommand({ json: true }, runtime as never);
315365const payload = JSON.parse(String((runtime.log as Mock).mock.calls[0]?.[0]));
316366317-expect(mocks.resolveAgentDir).toHaveBeenCalledWith(expect.anything(), "main");
367+expectResolveAgentDirCalledFor("main");
318368expect(mocks.ensureAuthProfileStore).toHaveBeenCalled();
319369expect(payload.defaultModel).toBe("anthropic/claude-opus-4-6");
320370expect(payload.configPath).toBe("/tmp/openclaw-dev/openclaw.json");
@@ -347,17 +397,11 @@ describe("modelsStatusCommand auth overview", () => {
347397provider.startsWith("openai "),
348398),
349399).toBe(false);
350-expect(providers).toEqual(
351-expect.arrayContaining([
352-expect.objectContaining({
353-provider: "minimax",
354-effective: expect.objectContaining({ kind: "env" }),
355-}),
356-expect.objectContaining({
357-provider: "fal",
358-effective: expect.objectContaining({ kind: "env" }),
359-}),
360-]),
400+expect(
401+requireRecord(requireProvider(providers, "minimax").effective, "minimax effective").kind,
402+).toBe("env");
403+expect(requireRecord(requireProvider(providers, "fal").effective, "fal effective").kind).toBe(
404+"env",
361405);
362406363407expect(
@@ -400,7 +444,7 @@ describe("modelsStatusCommand auth overview", () => {
400444},
401445async () => {
402446await modelsStatusCommand({ json: true, agent: "Jeremiah" }, localRuntime as never);
403-expect(mocks.resolveAgentDir).toHaveBeenCalledWith(expect.anything(), "jeremiah");
447+expectResolveAgentDirCalledFor("jeremiah");
404448const payload = JSON.parse(String((localRuntime.log as Mock).mock.calls[0]?.[0]));
405449expect(payload.agentId).toBe("jeremiah");
406450expect(payload.agentDir).toBe("/tmp/openclaw-agent-custom");
@@ -548,26 +592,11 @@ describe("modelsStatusCommand auth overview", () => {
548592await modelsStatusCommand({ json: true, check: true }, localRuntime as never);
549593const payload = JSON.parse(String((localRuntime.log as Mock).mock.calls[0]?.[0]));
550594expect(payload.auth.missingProvidersInUse).toEqual([]);
551-expect(payload.auth.oauth.profiles).toEqual(
552-expect.arrayContaining([
553-expect.objectContaining({
554-profileId: "openai-codex:default",
555-status: "expired",
556-}),
557-expect.objectContaining({
558-profileId: "openai-codex:named",
559-status: "ok",
560-}),
561-]),
562-);
563-expect(payload.auth.oauth.providers).toEqual(
564-expect.arrayContaining([
565-expect.objectContaining({
566-provider: "openai-codex",
567-status: "ok",
568-}),
569-]),
595+expect(requireProfile(payload.auth.oauth.profiles, "openai-codex:default").status).toBe(
596+"expired",
570597);
598+expect(requireProfile(payload.auth.oauth.profiles, "openai-codex:named").status).toBe("ok");
599+expect(requireProvider(payload.auth.oauth.providers, "openai-codex").status).toBe("ok");
571600expect(localRuntime.exit).not.toHaveBeenCalledWith(1);
572601} finally {
573602mocks.store.profiles = originalProfiles;
@@ -797,14 +826,10 @@ describe("modelsStatusCommand auth overview", () => {
797826try {
798827await modelsStatusCommand({ json: true, check: true }, localRuntime as never);
799828const payload = JSON.parse(String((localRuntime.log as Mock).mock.calls[0]?.[0]));
800-expect(payload.auth.providers).toEqual(
801-expect.arrayContaining([
802-expect.objectContaining({
803-provider: "anthropic",
804-env: expect.objectContaining({ source: "env: ANTHROPIC_OAUTH_TOKEN" }),
805-}),
806-]),
807-);
829+expect(
830+requireRecord(requireProvider(payload.auth.providers, "anthropic").env, "anthropic env")
831+.source,
832+).toBe("env: ANTHROPIC_OAUTH_TOKEN");
808833expect(localRuntime.exit).not.toHaveBeenCalledWith(1);
809834expect(localRuntime.exit).not.toHaveBeenCalledWith(2);
810835} finally {
@@ -907,9 +932,12 @@ describe("modelsStatusCommand auth overview", () => {
907932await modelsStatusCommand({ json: true, check: true }, localRuntime as never);
908933const payload = JSON.parse(String((localRuntime.log as Mock).mock.calls[0]?.[0]));
909934expect(payload.auth.missingProvidersInUse).toEqual(["anthropic"]);
910-expect(mocks.resolveUsableCustomProviderApiKey).toHaveBeenCalledWith(
911-expect.objectContaining({ provider: "anthropic" }),
912-);
935+expect(
936+mocks.resolveUsableCustomProviderApiKey.mock.calls.some(
937+([params]) =>
938+requireRecord(params, "custom provider key params").provider === "anthropic",
939+),
940+).toBe(true);
913941expect(localRuntime.exit).toHaveBeenCalledWith(1);
914942} finally {
915943mocks.store.profiles = originalProfiles;
@@ -1117,21 +1145,15 @@ describe("modelsStatusCommand auth overview", () => {
11171145effective?: { kind: string; detail?: string };
11181146}>;
11191147expect(payload.auth.missingProvidersInUse).toStrictEqual([]);
1120-expect(providers).toEqual(
1121-expect.arrayContaining([
1122-expect.objectContaining({
1123-provider: "codex",
1124-syntheticAuth: expect.objectContaining({
1125-value: "plugin-owned",
1126-source: "codex-app-server",
1127-}),
1128-effective: {
1129-kind: "synthetic",
1130-detail: "codex-app-server",
1131-},
1132-}),
1133-]),
1134-);
1148+const codexProvider = requireProvider(providers, "codex");
1149+expectRecordFields(requireRecord(codexProvider.syntheticAuth, "codex synthetic auth"), {
1150+value: "plugin-owned",
1151+source: "codex-app-server",
1152+});
1153+expectRecordFields(requireRecord(codexProvider.effective, "codex effective auth"), {
1154+kind: "synthetic",
1155+detail: "codex-app-server",
1156+});
11351157expect(providers.map((entry) => entry.provider)).not.toContain("unused-synthetic");
11361158} finally {
11371159if (originalLoadConfig) {
@@ -1244,14 +1266,12 @@ describe("modelsStatusCommand auth overview", () => {
12441266try {
12451267await modelsStatusCommand({ json: true }, localRuntime as never);
12461268const payload = JSON.parse(String((localRuntime.log as Mock).mock.calls[0]?.[0]));
1247-expect(payload.auth.providers).toEqual(
1248-expect.arrayContaining([
1249-expect.objectContaining({
1250-provider: "workspace-cloud",
1251-effective: expect.objectContaining({ kind: "env" }),
1252-env: expect.objectContaining({ source: "workspace cloud credentials" }),
1253-}),
1254-]),
1269+const workspaceProvider = requireProvider(payload.auth.providers, "workspace-cloud");
1270+expect(requireRecord(workspaceProvider.effective, "workspace effective auth").kind).toBe(
1271+"env",
1272+);
1273+expect(requireRecord(workspaceProvider.env, "workspace env auth").source).toBe(
1274+"workspace cloud credentials",
12551275);
12561276} finally {
12571277if (originalKeysImpl) {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。