

























@@ -46,6 +46,7 @@ const mocks = vi.hoisted(() => ({
4646resolveAgentWorkspaceDir: vi.fn(),
4747resolveDefaultAgentWorkspaceDir: vi.fn(),
4848upsertAuthProfile: vi.fn(),
49+upsertAuthProfileWithLock: vi.fn(),
4950resolvePluginProviders: vi.fn(),
5051createClackPrompter: vi.fn(),
5152loadValidConfigOrThrow: vi.fn(),
@@ -65,6 +66,7 @@ vi.mock("../../agents/auth-profiles/profiles.js", () => ({
6566listProfilesForProvider: mocks.listProfilesForProvider,
6667promoteAuthProfileInOrder: mocks.promoteAuthProfileInOrder,
6768upsertAuthProfile: mocks.upsertAuthProfile,
69+upsertAuthProfileWithLock: mocks.upsertAuthProfileWithLock,
6870}));
69717072vi.mock("../../agents/auth-profiles/store.js", () => ({
@@ -322,7 +324,8 @@ describe("modelsAuthLoginCommand", () => {
322324);
323325mocks.clackSelect.mockReset();
324326mocks.clackText.mockReset();
325-mocks.upsertAuthProfile.mockReset();
327+mocks.upsertAuthProfileWithLock.mockReset();
328+mocks.upsertAuthProfileWithLock.mockResolvedValue({ version: 1, profiles: {} });
326329mocks.promoteAuthProfileInOrder.mockReset();
327330328331mocks.resolveDefaultAgentId.mockReturnValue("main");
@@ -437,7 +440,7 @@ describe("modelsAuthLoginCommand", () => {
437440runProviderAuth.mock.invocationCallOrder[0],
438441);
439442expect(runProviderAuth).toHaveBeenCalledOnce();
440-const upsertCall = readMockCallArg(mocks.upsertAuthProfile) as UpsertAuthProfileCall;
443+const upsertCall = readMockCallArg(mocks.upsertAuthProfileWithLock) as UpsertAuthProfileCall;
441444expect(upsertCall.profileId).toBe("openai-codex:user@example.com");
442445expect(upsertCall.credential?.type).toBe("oauth");
443446expect(upsertCall.credential?.provider).toBe("openai-codex");
@@ -735,9 +738,9 @@ describe("modelsAuthLoginCommand", () => {
735738const authRunCall = readMockCallArg(runProviderAuth) as AuthRunCall;
736739expect(authRunCall.agentDir).toBe("/tmp/openclaw/agents/coder");
737740expect(authRunCall.workspaceDir).toBe("/tmp/openclaw/workspaces/coder");
738-expect((readMockCallArg(mocks.upsertAuthProfile) as UpsertAuthProfileCall).agentDir).toBe(
739-"/tmp/openclaw/agents/coder",
740-);
741+expect(
742+(readMockCallArg(mocks.upsertAuthProfileWithLock) as UpsertAuthProfileCall).agentDir,
743+).toBe("/tmp/openclaw/agents/coder");
741744});
742745743746it("loads the owning plugin for an explicit provider even in a clean config", async () => {
@@ -791,7 +794,7 @@ describe("modelsAuthLoginCommand", () => {
791794expect(providerResolutionCall.providerRefs).toEqual(["anthropic"]);
792795expect(providerResolutionCall.activate).toBe(true);
793796expect(runClaudeCliMigration).toHaveBeenCalledOnce();
794-expect(mocks.upsertAuthProfile).not.toHaveBeenCalled();
797+expect(mocks.upsertAuthProfileWithLock).not.toHaveBeenCalled();
795798expect(lastUpdatedConfig?.agents?.defaults?.model).toEqual({
796799primary: "claude-cli/claude-sonnet-4-6",
797800});
@@ -928,7 +931,7 @@ describe("modelsAuthLoginCommand", () => {
928931(order) => order < runClaudeCliMigration.mock.invocationCallOrder[0],
929932),
930933).toBe(true);
931-expect(mocks.upsertAuthProfile).not.toHaveBeenCalled();
934+expect(mocks.upsertAuthProfileWithLock).not.toHaveBeenCalled();
932935expect(lastUpdatedConfig?.agents?.defaults?.model).toEqual({
933936primary: "claude-cli/claude-sonnet-4-6",
934937fallbacks: ["claude-cli/claude-opus-4-6", "openai/gpt-5.2"],
@@ -1125,7 +1128,7 @@ describe("modelsAuthLoginCommand", () => {
11251128"exit:0",
11261129);
112711301128-expect(mocks.upsertAuthProfile).not.toHaveBeenCalled();
1131+expect(mocks.upsertAuthProfileWithLock).not.toHaveBeenCalled();
11291132expect(mocks.updateConfig).not.toHaveBeenCalled();
11301133expect(mocks.logConfigUpdated).not.toHaveBeenCalled();
11311134} finally {
@@ -1139,7 +1142,7 @@ describe("modelsAuthLoginCommand", () => {
1139114211401143await modelsAuthPasteTokenCommand({ provider: "anthropic" }, runtime);
114111441142-expect(mocks.upsertAuthProfile).toHaveBeenCalledWith({
1145+expect(mocks.upsertAuthProfileWithLock).toHaveBeenCalledWith({
11431146profileId: "anthropic:manual",
11441147credential: {
11451148type: "token",
@@ -1167,7 +1170,7 @@ describe("modelsAuthLoginCommand", () => {
11671170await modelsAuthPasteTokenCommand({ provider: "openai", agent: "coder" }, runtime);
1168117111691172expect(mocks.resolveDefaultAgentId).not.toHaveBeenCalled();
1170-expect(mocks.upsertAuthProfile).toHaveBeenCalledWith({
1173+expect(mocks.upsertAuthProfileWithLock).toHaveBeenCalledWith({
11711174profileId: "openai:manual",
11721175credential: {
11731176type: "token",
@@ -1189,7 +1192,7 @@ describe("modelsAuthLoginCommand", () => {
11891192);
1190119311911194expect(mocks.clackText).not.toHaveBeenCalled();
1192-expect(mocks.upsertAuthProfile).not.toHaveBeenCalled();
1195+expect(mocks.upsertAuthProfileWithLock).not.toHaveBeenCalled();
11931196expect(mocks.updateConfig).not.toHaveBeenCalled();
11941197});
11951198@@ -1225,7 +1228,7 @@ describe("modelsAuthLoginCommand", () => {
12251228await modelsAuthSetupTokenCommand({ provider: "moonshot", yes: true }, runtime);
1226122912271230expect(runTokenAuth).toHaveBeenCalledOnce();
1228-expect(mocks.upsertAuthProfile).toHaveBeenCalledWith({
1231+expect(mocks.upsertAuthProfileWithLock).toHaveBeenCalledWith({
12291232profileId: "moonshot:token",
12301233credential: {
12311234type: "token",
@@ -1272,9 +1275,9 @@ describe("modelsAuthLoginCommand", () => {
12721275const tokenAuthCall = readMockCallArg(runTokenAuth) as AuthRunCall;
12731276expect(tokenAuthCall.agentDir).toBe("/tmp/openclaw/agents/coder");
12741277expect(tokenAuthCall.workspaceDir).toBe("/tmp/openclaw/workspaces/coder");
1275-expect((readMockCallArg(mocks.upsertAuthProfile) as UpsertAuthProfileCall).agentDir).toBe(
1276-"/tmp/openclaw/agents/coder",
1277-);
1278+expect(
1279+(readMockCallArg(mocks.upsertAuthProfileWithLock) as UpsertAuthProfileCall).agentDir,
1280+).toBe("/tmp/openclaw/agents/coder");
12781281});
1279128212801283it("uses the requested agent store for interactive token auth add", async () => {
@@ -1314,9 +1317,9 @@ describe("modelsAuthLoginCommand", () => {
13141317const tokenAuthCall = readMockCallArg(runTokenAuth) as AuthRunCall;
13151318expect(tokenAuthCall.agentDir).toBe("/tmp/openclaw/agents/coder");
13161319expect(tokenAuthCall.workspaceDir).toBe("/tmp/openclaw/workspaces/coder");
1317-expect((readMockCallArg(mocks.upsertAuthProfile) as UpsertAuthProfileCall).agentDir).toBe(
1318-"/tmp/openclaw/agents/coder",
1319-);
1320+expect(
1321+(readMockCallArg(mocks.upsertAuthProfileWithLock) as UpsertAuthProfileCall).agentDir,
1322+).toBe("/tmp/openclaw/agents/coder");
13201323});
1321132413221325it("keeps the requested agent store when interactive auth add falls back to paste-token", async () => {
@@ -1333,7 +1336,7 @@ describe("modelsAuthLoginCommand", () => {
13331336await modelsAuthAddCommand({ agent: "coder" }, runtime);
1334133713351338expect(mocks.resolveDefaultAgentId).not.toHaveBeenCalled();
1336-expect(mocks.upsertAuthProfile).toHaveBeenCalledWith({
1339+expect(mocks.upsertAuthProfileWithLock).toHaveBeenCalledWith({
13371340profileId: "openai:manual",
13381341credential: {
13391342type: "token",
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。