diff options
| author | N. Taylor Mullen <[email protected]> | 2025-06-15 22:41:32 -0700 |
|---|---|---|
| committer | GitHub <[email protected]> | 2025-06-15 22:41:32 -0700 |
| commit | 197704c630cbf85aa4d113c7a62e305827043910 (patch) | |
| tree | cf5db2e0894f6bbab5998fb93e2593fdb97b6699 /packages/core/src/code_assist/oauth2.test.ts | |
| parent | f00b9f27278f4cdfe7c863138212ec489db3e5d9 (diff) | |
feat(test): Increase test coverage across CLI and Core packages (#1089)
Diffstat (limited to 'packages/core/src/code_assist/oauth2.test.ts')
| -rw-r--r-- | packages/core/src/code_assist/oauth2.test.ts | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/packages/core/src/code_assist/oauth2.test.ts b/packages/core/src/code_assist/oauth2.test.ts new file mode 100644 index 00000000..80949203 --- /dev/null +++ b/packages/core/src/code_assist/oauth2.test.ts @@ -0,0 +1,92 @@ +/** + * @license + * Copyright 2025 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +import { describe, it, expect, vi } from 'vitest'; +import { webLoginClient } from './oauth2.js'; +import { OAuth2Client } from 'google-auth-library'; +import http from 'http'; +import open from 'open'; +import crypto from 'crypto'; + +vi.mock('google-auth-library'); +vi.mock('http'); +vi.mock('open'); +vi.mock('crypto'); + +describe('oauth2', () => { + it('should perform a web login', async () => { + const mockAuthUrl = 'https://example.com/auth'; + const mockCode = 'test-code'; + const mockState = 'test-state'; + const mockTokens = { + access_token: 'test-access-token', + refresh_token: 'test-refresh-token', + }; + + const mockGenerateAuthUrl = vi.fn().mockReturnValue(mockAuthUrl); + const mockGetToken = vi.fn().mockResolvedValue({ tokens: mockTokens }); + const mockSetCredentials = vi.fn(); + const mockOAuth2Client = { + generateAuthUrl: mockGenerateAuthUrl, + getToken: mockGetToken, + setCredentials: mockSetCredentials, + } as unknown as OAuth2Client; + vi.mocked(OAuth2Client).mockImplementation(() => mockOAuth2Client); + + vi.spyOn(crypto, 'randomBytes').mockReturnValue(mockState as never); + vi.mocked(open).mockImplementation(async () => ({}) as never); + + let requestCallback!: ( + req: http.IncomingMessage, + res: http.ServerResponse, + ) => void; + const mockHttpServer = { + listen: vi.fn((port: number, callback?: () => void) => { + if (callback) { + callback(); + } + }), + close: vi.fn((callback?: () => void) => { + if (callback) { + callback(); + } + }), + on: vi.fn(), + address: () => ({ port: 1234 }), + }; + vi.mocked(http.createServer).mockImplementation((cb) => { + requestCallback = cb as ( + req: http.IncomingMessage, + res: http.ServerResponse, + ) => void; + return mockHttpServer as unknown as http.Server; + }); + + const clientPromise = webLoginClient(); + + // Wait for the server to be created + await new Promise((resolve) => setTimeout(resolve, 0)); + + const mockReq = { + url: `/oauth2callback?code=${mockCode}&state=${mockState}`, + } as http.IncomingMessage; + const mockRes = { + writeHead: vi.fn(), + end: vi.fn(), + } as unknown as http.ServerResponse; + + if (requestCallback) { + await requestCallback(mockReq, mockRes); + } + + const client = await clientPromise; + + expect(open).toHaveBeenCalledWith(mockAuthUrl); + expect(mockGetToken).toHaveBeenCalledWith(mockCode); + expect(mockSetCredentials).toHaveBeenCalledWith(mockTokens); + expect(client).toBe(mockOAuth2Client); + }); +}); |
