Skip to content

Commit 6158267

Browse files
authored
Optimize and improve test coverage for cli/src/config (#13485)
1 parent 613b8a4 commit 6158267

17 files changed

+2172
-1810
lines changed

packages/cli/src/config/auth.test.ts

Lines changed: 68 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
*/
66

77
import { AuthType } from '@google/gemini-cli-core';
8-
import { vi } from 'vitest';
8+
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
99
import { validateAuthMethod } from './auth.js';
1010

1111
vi.mock('./settings.js', () => ({
@@ -17,7 +17,6 @@ vi.mock('./settings.js', () => ({
1717

1818
describe('validateAuthMethod', () => {
1919
beforeEach(() => {
20-
vi.resetModules();
2120
vi.stubEnv('GEMINI_API_KEY', undefined);
2221
vi.stubEnv('GOOGLE_CLOUD_PROJECT', undefined);
2322
vi.stubEnv('GOOGLE_CLOUD_LOCATION', undefined);
@@ -28,53 +27,73 @@ describe('validateAuthMethod', () => {
2827
vi.unstubAllEnvs();
2928
});
3029

31-
it('should return null for LOGIN_WITH_GOOGLE', () => {
32-
expect(validateAuthMethod(AuthType.LOGIN_WITH_GOOGLE)).toBeNull();
33-
});
34-
35-
it('should return null for COMPUTE_ADC', () => {
36-
expect(validateAuthMethod(AuthType.COMPUTE_ADC)).toBeNull();
37-
});
38-
39-
describe('USE_GEMINI', () => {
40-
it('should return null if GEMINI_API_KEY is set', () => {
41-
vi.stubEnv('GEMINI_API_KEY', 'test-key');
42-
expect(validateAuthMethod(AuthType.USE_GEMINI)).toBeNull();
43-
});
44-
45-
it('should return an error message if GEMINI_API_KEY is not set', () => {
46-
vi.stubEnv('GEMINI_API_KEY', undefined);
47-
expect(validateAuthMethod(AuthType.USE_GEMINI)).toBeNull();
48-
});
49-
});
50-
51-
describe('USE_VERTEX_AI', () => {
52-
it('should return null if GOOGLE_CLOUD_PROJECT and GOOGLE_CLOUD_LOCATION are set', () => {
53-
vi.stubEnv('GOOGLE_CLOUD_PROJECT', 'test-project');
54-
vi.stubEnv('GOOGLE_CLOUD_LOCATION', 'test-location');
55-
expect(validateAuthMethod(AuthType.USE_VERTEX_AI)).toBeNull();
56-
});
57-
58-
it('should return null if GOOGLE_API_KEY is set', () => {
59-
vi.stubEnv('GOOGLE_API_KEY', 'test-api-key');
60-
expect(validateAuthMethod(AuthType.USE_VERTEX_AI)).toBeNull();
61-
});
62-
63-
it('should return an error message if no required environment variables are set', () => {
64-
vi.stubEnv('GOOGLE_CLOUD_PROJECT', undefined);
65-
vi.stubEnv('GOOGLE_CLOUD_LOCATION', undefined);
66-
expect(validateAuthMethod(AuthType.USE_VERTEX_AI)).toBe(
30+
it.each([
31+
{
32+
description: 'should return null for LOGIN_WITH_GOOGLE',
33+
authType: AuthType.LOGIN_WITH_GOOGLE,
34+
envs: {},
35+
expected: null,
36+
},
37+
{
38+
description: 'should return null for COMPUTE_ADC',
39+
authType: AuthType.COMPUTE_ADC,
40+
envs: {},
41+
expected: null,
42+
},
43+
{
44+
description: 'should return null for USE_GEMINI if GEMINI_API_KEY is set',
45+
authType: AuthType.USE_GEMINI,
46+
envs: { GEMINI_API_KEY: 'test-key' },
47+
expected: null,
48+
},
49+
{
50+
description:
51+
'should return an error message for USE_GEMINI if GEMINI_API_KEY is not set',
52+
authType: AuthType.USE_GEMINI,
53+
envs: {},
54+
expected:
55+
'When using Gemini API, you must specify the GEMINI_API_KEY environment variable.\n' +
56+
'Update your environment and try again (no reload needed if using .env)!',
57+
},
58+
{
59+
description:
60+
'should return null for USE_VERTEX_AI if GOOGLE_CLOUD_PROJECT and GOOGLE_CLOUD_LOCATION are set',
61+
authType: AuthType.USE_VERTEX_AI,
62+
envs: {
63+
GOOGLE_CLOUD_PROJECT: 'test-project',
64+
GOOGLE_CLOUD_LOCATION: 'test-location',
65+
},
66+
expected: null,
67+
},
68+
{
69+
description:
70+
'should return null for USE_VERTEX_AI if GOOGLE_API_KEY is set',
71+
authType: AuthType.USE_VERTEX_AI,
72+
envs: { GOOGLE_API_KEY: 'test-api-key' },
73+
expected: null,
74+
},
75+
{
76+
description:
77+
'should return an error message for USE_VERTEX_AI if no required environment variables are set',
78+
authType: AuthType.USE_VERTEX_AI,
79+
envs: {},
80+
expected:
6781
'When using Vertex AI, you must specify either:\n' +
68-
'• GOOGLE_CLOUD_PROJECT and GOOGLE_CLOUD_LOCATION environment variables.\n' +
69-
'• GOOGLE_API_KEY environment variable (if using express mode).\n' +
70-
'Update your environment and try again (no reload needed if using .env)!',
71-
);
72-
});
73-
});
74-
75-
it('should return an error message for an invalid auth method', () => {
76-
expect(validateAuthMethod('invalid-method')).toBe(
77-
'Invalid auth method selected.',
78-
);
82+
'• GOOGLE_CLOUD_PROJECT and GOOGLE_CLOUD_LOCATION environment variables.\n' +
83+
'• GOOGLE_API_KEY environment variable (if using express mode).\n' +
84+
'Update your environment and try again (no reload needed if using .env)!',
85+
},
86+
{
87+
description: 'should return an error message for an invalid auth method',
88+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
89+
authType: 'invalid-method' as any,
90+
envs: {},
91+
expected: 'Invalid auth method selected.',
92+
},
93+
])('$description', ({ authType, envs, expected }) => {
94+
for (const [key, value] of Object.entries(envs)) {
95+
vi.stubEnv(key, value as string);
96+
}
97+
expect(validateAuthMethod(authType)).toBe(expected);
7998
});
8099
});

packages/cli/src/config/auth.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,12 @@ export function validateAuthMethod(authMethod: string): string | null {
1717
}
1818

1919
if (authMethod === AuthType.USE_GEMINI) {
20+
if (!process.env['GEMINI_API_KEY']) {
21+
return (
22+
'When using Gemini API, you must specify the GEMINI_API_KEY environment variable.\n' +
23+
'Update your environment and try again (no reload needed if using .env)!'
24+
);
25+
}
2026
return null;
2127
}
2228

0 commit comments

Comments
 (0)