summaryrefslogtreecommitdiff
path: root/packages/cli/src/ui/commands/toolsCommand.test.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/cli/src/ui/commands/toolsCommand.test.ts')
-rw-r--r--packages/cli/src/ui/commands/toolsCommand.test.ts108
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.');
+ });
+});