/** * @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: () => 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: () => ({ 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: () => ({ 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: () => ({ 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.'); }); });