mirror of
https://github.com/google-gemini/gemini-cli.git
synced 2026-03-11 14:40:52 -07:00
116 lines
3.3 KiB
TypeScript
116 lines
3.3 KiB
TypeScript
/**
|
|
* @license
|
|
* Copyright 2025 Google LLC
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
import type { vi } from 'vitest';
|
|
import { describe, it, expect } from 'vitest';
|
|
import { toolsCommand } from './toolsCommand.js';
|
|
import { createMockCommandContext } from '../../test-utils/mockCommandContext.js';
|
|
import { MessageType } from '../types.js';
|
|
import type { 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(
|
|
{
|
|
type: MessageType.TOOLS_LIST,
|
|
tools: [],
|
|
showDescriptions: false,
|
|
},
|
|
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];
|
|
expect(message.type).toBe(MessageType.TOOLS_LIST);
|
|
expect(message.showDescriptions).toBe(false);
|
|
expect(message.tools).toHaveLength(2);
|
|
expect(message.tools[0].displayName).toBe('File Reader');
|
|
expect(message.tools[1].displayName).toBe('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];
|
|
expect(message.type).toBe(MessageType.TOOLS_LIST);
|
|
expect(message.showDescriptions).toBe(true);
|
|
expect(message.tools).toHaveLength(2);
|
|
expect(message.tools[0].description).toBe(
|
|
'Reads files from the local system.',
|
|
);
|
|
expect(message.tools[1].description).toBe('Edits code files.');
|
|
});
|
|
});
|