Skip to content

Commit f9f916e

Browse files
authored
test: support tests that include color information (#20220)
1 parent 78dfe9d commit f9f916e

68 files changed

Lines changed: 2342 additions & 492 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

packages/cli/src/commands/extensions/link.test.ts

Lines changed: 10 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -13,34 +13,21 @@ import {
1313
afterEach,
1414
type Mock,
1515
} from 'vitest';
16-
import { format } from 'node:util';
16+
import { coreEvents } from '@google/gemini-cli-core';
1717
import { type Argv } from 'yargs';
1818
import { handleLink, linkCommand } from './link.js';
1919
import { ExtensionManager } from '../../config/extension-manager.js';
2020
import { loadSettings, type LoadedSettings } from '../../config/settings.js';
2121
import { getErrorMessage } from '../../utils/errors.js';
2222

23-
// Mock dependencies
24-
const emitConsoleLog = vi.hoisted(() => vi.fn());
25-
const debugLogger = vi.hoisted(() => ({
26-
log: vi.fn((message, ...args) => {
27-
emitConsoleLog('log', format(message, ...args));
28-
}),
29-
error: vi.fn((message, ...args) => {
30-
emitConsoleLog('error', format(message, ...args));
31-
}),
32-
}));
33-
3423
vi.mock('@google/gemini-cli-core', async (importOriginal) => {
35-
const actual =
36-
await importOriginal<typeof import('@google/gemini-cli-core')>();
37-
return {
38-
...actual,
39-
coreEvents: {
40-
emitConsoleLog,
41-
},
42-
debugLogger,
43-
};
24+
const { mockCoreDebugLogger } = await import(
25+
'../../test-utils/mockDebugLogger.js'
26+
);
27+
return mockCoreDebugLogger(
28+
await importOriginal<typeof import('@google/gemini-cli-core')>(),
29+
{ stripAnsi: true },
30+
);
4431
});
4532

4633
vi.mock('../../config/extension-manager.js');
@@ -95,7 +82,7 @@ describe('extensions link command', () => {
9582
source: '/local/path/to/extension',
9683
type: 'link',
9784
});
98-
expect(emitConsoleLog).toHaveBeenCalledWith(
85+
expect(coreEvents.emitConsoleLog).toHaveBeenCalledWith(
9986
'log',
10087
'Extension "my-linked-extension" linked successfully and enabled.',
10188
);
@@ -116,7 +103,7 @@ describe('extensions link command', () => {
116103

117104
await handleLink({ path: '/local/path/to/extension' });
118105

119-
expect(emitConsoleLog).toHaveBeenCalledWith(
106+
expect(coreEvents.emitConsoleLog).toHaveBeenCalledWith(
120107
'error',
121108
'Link failed message',
122109
);

packages/cli/src/commands/extensions/list.test.ts

Lines changed: 14 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -5,33 +5,22 @@
55
*/
66

77
import { vi, describe, it, expect, beforeEach, afterEach } from 'vitest';
8-
import { format } from 'node:util';
8+
import { coreEvents } from '@google/gemini-cli-core';
99
import { handleList, listCommand } from './list.js';
1010
import { ExtensionManager } from '../../config/extension-manager.js';
1111
import { loadSettings, type LoadedSettings } from '../../config/settings.js';
1212
import { getErrorMessage } from '../../utils/errors.js';
1313

14-
// Mock dependencies
15-
const emitConsoleLog = vi.hoisted(() => vi.fn());
16-
const debugLogger = vi.hoisted(() => ({
17-
log: vi.fn((message, ...args) => {
18-
emitConsoleLog('log', format(message, ...args));
19-
}),
20-
error: vi.fn((message, ...args) => {
21-
emitConsoleLog('error', format(message, ...args));
22-
}),
23-
}));
24-
2514
vi.mock('@google/gemini-cli-core', async (importOriginal) => {
26-
const actual =
27-
await importOriginal<typeof import('@google/gemini-cli-core')>();
28-
return {
29-
...actual,
30-
coreEvents: {
31-
emitConsoleLog,
15+
const { mockCoreDebugLogger } = await import(
16+
'../../test-utils/mockDebugLogger.js'
17+
);
18+
return mockCoreDebugLogger(
19+
await importOriginal<typeof import('@google/gemini-cli-core')>(),
20+
{
21+
stripAnsi: false,
3222
},
33-
debugLogger,
34-
};
23+
);
3524
});
3625

3726
vi.mock('../../config/extension-manager.js');
@@ -71,7 +60,7 @@ describe('extensions list command', () => {
7160
.mockResolvedValue([]);
7261
await handleList();
7362

74-
expect(emitConsoleLog).toHaveBeenCalledWith(
63+
expect(coreEvents.emitConsoleLog).toHaveBeenCalledWith(
7564
'log',
7665
'No extensions installed.',
7766
);
@@ -85,7 +74,7 @@ describe('extensions list command', () => {
8574
.mockResolvedValue([]);
8675
await handleList({ outputFormat: 'json' });
8776

88-
expect(emitConsoleLog).toHaveBeenCalledWith('log', '[]');
77+
expect(coreEvents.emitConsoleLog).toHaveBeenCalledWith('log', '[]');
8978
mockCwd.mockRestore();
9079
});
9180

@@ -103,7 +92,7 @@ describe('extensions list command', () => {
10392
);
10493
await handleList();
10594

106-
expect(emitConsoleLog).toHaveBeenCalledWith(
95+
expect(coreEvents.emitConsoleLog).toHaveBeenCalledWith(
10796
'log',
10897
'ext1@1.0.0\n\next2@2.0.0',
10998
);
@@ -121,7 +110,7 @@ describe('extensions list command', () => {
121110
.mockResolvedValue(extensions);
122111
await handleList({ outputFormat: 'json' });
123112

124-
expect(emitConsoleLog).toHaveBeenCalledWith(
113+
expect(coreEvents.emitConsoleLog).toHaveBeenCalledWith(
125114
'log',
126115
JSON.stringify(extensions, null, 2),
127116
);
@@ -142,7 +131,7 @@ describe('extensions list command', () => {
142131

143132
await handleList();
144133

145-
expect(emitConsoleLog).toHaveBeenCalledWith(
134+
expect(coreEvents.emitConsoleLog).toHaveBeenCalledWith(
146135
'error',
147136
'List failed message',
148137
);

packages/cli/src/commands/skills/disable.test.ts

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

77
import { vi, describe, it, expect, beforeEach, afterEach } from 'vitest';
8-
import { format } from 'node:util';
98
import { handleDisable, disableCommand } from './disable.js';
109
import {
1110
loadSettings,
@@ -14,12 +13,12 @@ import {
1413
type LoadableSettingScope,
1514
} from '../../config/settings.js';
1615

17-
const emitConsoleLog = vi.hoisted(() => vi.fn());
18-
const debugLogger = vi.hoisted(() => ({
19-
log: vi.fn((message, ...args) => {
20-
emitConsoleLog('log', format(message, ...args));
21-
}),
22-
}));
16+
const { emitConsoleLog, debugLogger } = await vi.hoisted(async () => {
17+
const { createMockDebugLogger } = await import(
18+
'../../test-utils/mockDebugLogger.js'
19+
);
20+
return createMockDebugLogger({ stripAnsi: true });
21+
});
2322

2423
vi.mock('@google/gemini-cli-core', async (importOriginal) => {
2524
const actual =

packages/cli/src/commands/skills/enable.test.ts

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

77
import { vi, describe, it, expect, beforeEach, afterEach } from 'vitest';
8-
import { format } from 'node:util';
98
import { handleEnable, enableCommand } from './enable.js';
109
import {
1110
loadSettings,
1211
SettingScope,
1312
type LoadedSettings,
1413
} from '../../config/settings.js';
1514

16-
const emitConsoleLog = vi.hoisted(() => vi.fn());
17-
const debugLogger = vi.hoisted(() => ({
18-
log: vi.fn((message, ...args) => {
19-
emitConsoleLog('log', format(message, ...args));
20-
}),
21-
}));
15+
const { emitConsoleLog, debugLogger } = await vi.hoisted(async () => {
16+
const { createMockDebugLogger } = await import(
17+
'../../test-utils/mockDebugLogger.js'
18+
);
19+
return createMockDebugLogger({ stripAnsi: true });
20+
});
2221

2322
vi.mock('@google/gemini-cli-core', async (importOriginal) => {
2423
const actual =

packages/cli/src/commands/skills/install.test.ts

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* SPDX-License-Identifier: Apache-2.0
55
*/
66

7-
import { describe, it, expect, vi, beforeEach } from 'vitest';
7+
import { vi, describe, it, expect, beforeEach } from 'vitest';
88

99
const mockInstallSkill = vi.hoisted(() => vi.fn());
1010
const mockRequestConsentNonInteractive = vi.hoisted(() => vi.fn());
@@ -19,11 +19,17 @@ vi.mock('../../config/extensions/consent.js', () => ({
1919
skillsConsentString: mockSkillsConsentString,
2020
}));
2121

22+
const { debugLogger, emitConsoleLog } = await vi.hoisted(async () => {
23+
const { createMockDebugLogger } = await import(
24+
'../../test-utils/mockDebugLogger.js'
25+
);
26+
return createMockDebugLogger({ stripAnsi: true });
27+
});
28+
2229
vi.mock('@google/gemini-cli-core', () => ({
23-
debugLogger: { log: vi.fn(), error: vi.fn() },
30+
debugLogger,
2431
}));
2532

26-
import { debugLogger } from '@google/gemini-cli-core';
2733
import { handleInstall, installCommand } from './install.js';
2834

2935
describe('skill install command', () => {
@@ -63,10 +69,12 @@ describe('skill install command', () => {
6369
expect.any(Function),
6470
expect.any(Function),
6571
);
66-
expect(debugLogger.log).toHaveBeenCalledWith(
72+
expect(emitConsoleLog).toHaveBeenCalledWith(
73+
'log',
6774
expect.stringContaining('Successfully installed skill: test-skill'),
6875
);
69-
expect(debugLogger.log).toHaveBeenCalledWith(
76+
expect(emitConsoleLog).toHaveBeenCalledWith(
77+
'log',
7078
expect.stringContaining('location: /mock/user/skills/test-skill'),
7179
);
7280
expect(mockRequestConsentNonInteractive).toHaveBeenCalledWith(
@@ -86,10 +94,11 @@ describe('skill install command', () => {
8694
});
8795

8896
expect(mockRequestConsentNonInteractive).not.toHaveBeenCalled();
89-
expect(debugLogger.log).toHaveBeenCalledWith(
97+
expect(emitConsoleLog).toHaveBeenCalledWith(
98+
'log',
9099
'You have consented to the following:',
91100
);
92-
expect(debugLogger.log).toHaveBeenCalledWith('Mock Consent String');
101+
expect(emitConsoleLog).toHaveBeenCalledWith('log', 'Mock Consent String');
93102
expect(mockInstallSkill).toHaveBeenCalled();
94103
});
95104

@@ -106,7 +115,8 @@ describe('skill install command', () => {
106115
source: 'https://example.com/repo.git',
107116
});
108117

109-
expect(debugLogger.error).toHaveBeenCalledWith(
118+
expect(emitConsoleLog).toHaveBeenCalledWith(
119+
'error',
110120
'Skill installation cancelled by user.',
111121
);
112122
expect(process.exit).toHaveBeenCalledWith(1);
@@ -137,7 +147,7 @@ describe('skill install command', () => {
137147

138148
await handleInstall({ source: '/local/path' });
139149

140-
expect(debugLogger.error).toHaveBeenCalledWith('Install failed');
150+
expect(emitConsoleLog).toHaveBeenCalledWith('error', 'Install failed');
141151
expect(process.exit).toHaveBeenCalledWith(1);
142152
});
143153
});

packages/cli/src/commands/skills/link.test.ts

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,17 +15,22 @@ vi.mock('../../utils/skillUtils.js', () => ({
1515
linkSkill: mockLinkSkill,
1616
}));
1717

18+
const { debugLogger } = await vi.hoisted(async () => {
19+
const { createMockDebugLogger } = await import(
20+
'../../test-utils/mockDebugLogger.js'
21+
);
22+
return createMockDebugLogger({ stripAnsi: false });
23+
});
24+
1825
vi.mock('@google/gemini-cli-core', () => ({
19-
debugLogger: { log: vi.fn(), error: vi.fn() },
26+
debugLogger,
2027
}));
2128

2229
vi.mock('../../config/extensions/consent.js', () => ({
2330
requestConsentNonInteractive: mockRequestConsentNonInteractive,
2431
skillsConsentString: mockSkillsConsentString,
2532
}));
2633

27-
import { debugLogger } from '@google/gemini-cli-core';
28-
2934
describe('skills link command', () => {
3035
beforeEach(() => {
3136
vi.clearAllMocks();

0 commit comments

Comments
 (0)