diff options
Diffstat (limited to 'packages/cli/src/ui/commands/toolsCommand.test.ts')
| -rw-r--r-- | packages/cli/src/ui/commands/toolsCommand.test.ts | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/packages/cli/src/ui/commands/toolsCommand.test.ts b/packages/cli/src/ui/commands/toolsCommand.test.ts new file mode 100644 index 00000000..41c5196b --- /dev/null +++ b/packages/cli/src/ui/commands/toolsCommand.test.ts @@ -0,0 +1,108 @@ +/** + * @license + * Copyright 2025 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +import { describe, it, expect, vi } from 'vitest'; +import { toolsCommand } from './toolsCommand.js'; +import { createMockCommandContext } from '../../test-utils/mockCommandContext.js'; +import { MessageType } from '../types.js'; +import { Tool } from '@google/gemini-cli-core'; + +// Mock tools for testing +const mockTools = [ + { + name: 'file-reader', + displayName: 'File Reader', + description: 'Reads files from the local system.', + schema: {}, + }, + { + name: 'code-editor', + displayName: 'Code Editor', + description: 'Edits code files.', + schema: {}, + }, +] as Tool[]; + +describe('toolsCommand', () => { + it('should display an error if the tool registry is unavailable', async () => { + const mockContext = createMockCommandContext({ + services: { + config: { + getToolRegistry: () => Promise.resolve(undefined), + }, + }, + }); + + if (!toolsCommand.action) throw new Error('Action not defined'); + await toolsCommand.action(mockContext, ''); + + expect(mockContext.ui.addItem).toHaveBeenCalledWith( + { + type: MessageType.ERROR, + text: 'Could not retrieve tool registry.', + }, + expect.any(Number), + ); + }); + + it('should display "No tools available" when none are found', async () => { + const mockContext = createMockCommandContext({ + services: { + config: { + getToolRegistry: () => + Promise.resolve({ getAllTools: () => [] as Tool[] }), + }, + }, + }); + + if (!toolsCommand.action) throw new Error('Action not defined'); + await toolsCommand.action(mockContext, ''); + + expect(mockContext.ui.addItem).toHaveBeenCalledWith( + expect.objectContaining({ + text: expect.stringContaining('No tools available'), + }), + expect.any(Number), + ); + }); + + it('should list tools without descriptions by default', async () => { + const mockContext = createMockCommandContext({ + services: { + config: { + getToolRegistry: () => + Promise.resolve({ getAllTools: () => mockTools }), + }, + }, + }); + + if (!toolsCommand.action) throw new Error('Action not defined'); + await toolsCommand.action(mockContext, ''); + + const message = (mockContext.ui.addItem as vi.Mock).mock.calls[0][0].text; + expect(message).not.toContain('Reads files from the local system.'); + expect(message).toContain('File Reader'); + expect(message).toContain('Code Editor'); + }); + + it('should list tools with descriptions when "desc" arg is passed', async () => { + const mockContext = createMockCommandContext({ + services: { + config: { + getToolRegistry: () => + Promise.resolve({ getAllTools: () => mockTools }), + }, + }, + }); + + if (!toolsCommand.action) throw new Error('Action not defined'); + await toolsCommand.action(mockContext, 'desc'); + + const message = (mockContext.ui.addItem as vi.Mock).mock.calls[0][0].text; + expect(message).toContain('Reads files from the local system.'); + expect(message).toContain('Edits code files.'); + }); +}); |
