From 31b28ade010711c578d4be58c0dc439badebe000 Mon Sep 17 00:00:00 2001 From: Allen Hutchison Date: Fri, 13 Jun 2025 17:44:14 -0700 Subject: Improvements to web-fetch tool (#1030) --- packages/core/src/tools/web-fetch.test.ts | 86 +++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 packages/core/src/tools/web-fetch.test.ts (limited to 'packages/core/src/tools/web-fetch.test.ts') diff --git a/packages/core/src/tools/web-fetch.test.ts b/packages/core/src/tools/web-fetch.test.ts new file mode 100644 index 00000000..f4e3a652 --- /dev/null +++ b/packages/core/src/tools/web-fetch.test.ts @@ -0,0 +1,86 @@ +/** + * @license + * Copyright 2025 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +import { describe, it, expect, vi } from 'vitest'; +import { WebFetchTool } from './web-fetch.js'; +import { Config, ApprovalMode } from '../config/config.js'; +import { ToolConfirmationOutcome } from './tools.js'; + +describe('WebFetchTool', () => { + const mockConfig = { + getApprovalMode: vi.fn(), + setApprovalMode: vi.fn(), + } as unknown as Config; + + describe('shouldConfirmExecute', () => { + it('should return confirmation details with the correct prompt and urls', async () => { + const tool = new WebFetchTool(mockConfig); + const params = { prompt: 'fetch https://example.com' }; + const confirmationDetails = await tool.shouldConfirmExecute(params); + + expect(confirmationDetails).toEqual({ + type: 'info', + title: 'Confirm Web Fetch', + prompt: 'fetch https://example.com', + urls: ['https://example.com'], + onConfirm: expect.any(Function), + }); + }); + + it('should convert github urls to raw format', async () => { + const tool = new WebFetchTool(mockConfig); + const params = { + prompt: + 'fetch https://github.com/google/gemini-react/blob/main/README.md', + }; + const confirmationDetails = await tool.shouldConfirmExecute(params); + + expect(confirmationDetails).toEqual({ + type: 'info', + title: 'Confirm Web Fetch', + prompt: + 'fetch https://github.com/google/gemini-react/blob/main/README.md', + urls: [ + 'https://raw.githubusercontent.com/google/gemini-react/main/README.md', + ], + onConfirm: expect.any(Function), + }); + }); + + it('should return false if approval mode is AUTO_EDIT', async () => { + const tool = new WebFetchTool({ + ...mockConfig, + getApprovalMode: () => ApprovalMode.AUTO_EDIT, + } as unknown as Config); + const params = { prompt: 'fetch https://example.com' }; + const confirmationDetails = await tool.shouldConfirmExecute(params); + + expect(confirmationDetails).toBe(false); + }); + + it('should call setApprovalMode when onConfirm is called with ProceedAlways', async () => { + const setApprovalMode = vi.fn(); + const tool = new WebFetchTool({ + ...mockConfig, + setApprovalMode, + } as unknown as Config); + const params = { prompt: 'fetch https://example.com' }; + const confirmationDetails = await tool.shouldConfirmExecute(params); + + if ( + confirmationDetails && + typeof confirmationDetails === 'object' && + 'onConfirm' in confirmationDetails + ) { + await confirmationDetails.onConfirm( + ToolConfirmationOutcome.ProceedAlways, + ); + } + + expect(setApprovalMode).toHaveBeenCalledWith(ApprovalMode.AUTO_EDIT); + }); + }); +}); -- cgit v1.2.3