


























@@ -0,0 +1,69 @@
1+import { beforeEach, describe, expect, it, vi } from "vitest";
2+3+const AUTH_URL = "https://accounts.google.com/o/oauth2/v2/auth?state=state-123";
4+5+const exchangeCodeForTokensMock = vi.hoisted(() =>
6+vi.fn(async () => ({
7+access: "access-token",
8+refresh: "refresh-token",
9+expires: 123,
10+})),
11+);
12+const waitForLocalCallbackMock = vi.hoisted(() =>
13+vi.fn(async () => ({ code: "oauth-code", state: "state-123" })),
14+);
15+16+vi.mock("./oauth.flow.js", () => ({
17+buildAuthUrl: () => AUTH_URL,
18+generateOAuthState: () => "state-123",
19+generatePkce: () => ({ challenge: "pkce-challenge", verifier: "pkce-verifier" }),
20+parseCallbackInput: vi.fn(),
21+shouldUseManualOAuthFlow: (isRemote: boolean) => isRemote,
22+waitForLocalCallback: waitForLocalCallbackMock,
23+}));
24+25+vi.mock("./oauth.token.js", () => ({
26+exchangeCodeForTokens: exchangeCodeForTokensMock,
27+}));
28+29+describe("loginGeminiCliOAuth local browser flow", () => {
30+beforeEach(() => {
31+exchangeCodeForTokensMock.mockClear();
32+waitForLocalCallbackMock.mockClear();
33+});
34+35+it("prints the auth URL before attempting best-effort browser launch", async () => {
36+const events: string[] = [];
37+const { loginGeminiCliOAuth } = await import("./oauth.js");
38+const openUrl = vi.fn(async () => {
39+events.push("open");
40+});
41+const log = vi.fn((message: string) => {
42+events.push(`log:${message}`);
43+});
44+45+const result = await loginGeminiCliOAuth({
46+isRemote: false,
47+ openUrl,
48+ log,
49+note: async () => {},
50+prompt: async () => "",
51+progress: { update: () => {}, stop: () => {} },
52+});
53+54+expect(result).toEqual({
55+access: "access-token",
56+refresh: "refresh-token",
57+expires: 123,
58+});
59+expect(log).toHaveBeenCalledWith(expect.stringContaining(AUTH_URL));
60+expect(openUrl).toHaveBeenCalledWith(AUTH_URL);
61+expect(events.findIndex((event) => event.startsWith("log:"))).toBeLessThan(
62+events.indexOf("open"),
63+);
64+expect(waitForLocalCallbackMock).toHaveBeenCalledWith(
65+expect.objectContaining({ expectedState: "state-123" }),
66+);
67+expect(exchangeCodeForTokensMock).toHaveBeenCalledWith("oauth-code", "pkce-verifier");
68+});
69+});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。