Path: blob/main/extensions/copilot/src/extension/inlineChat2/test/node/inlineChatIntent.spec.ts
13405 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import { expect, suite, test, vi } from 'vitest';6import type * as vscode from 'vscode';7import { InlineChatIntent } from '../../node/inlineChatIntent';8import { IInstantiationService } from '../../../../util/vs/platform/instantiation/common/instantiation';9import { IEndpointProvider } from '../../../../platform/endpoint/common/endpointProvider';10import { IAuthenticationService } from '../../../../platform/authentication/common/authentication';11import { ILogService } from '../../../../platform/log/common/logService';12import { IToolsService } from '../../../tools/common/toolsService';13import { IIgnoreService } from '../../../../platform/ignore/common/ignoreService';14import { IEditSurvivalTrackerService } from '../../../../platform/editSurvivalTracking/common/editSurvivalTrackerService';15import { IOctoKitService } from '../../../../platform/github/common/githubService';16import { Conversation, Turn } from '../../../prompt/common/conversation';17import { ChatLocation, ChatFetchResponseType } from '../../../../platform/chat/common/commonTypes';18import { IDocumentContext } from '../../../prompt/node/documentContext';19import { ChatTelemetryBuilder } from '../../../prompt/node/chatParticipantTelemetry';20import { CancellationToken } from '../../../../util/vs/base/common/cancellation';21import { ChatRequestEditorData } from '../../../../vscodeTypes';22import { CopilotInteractiveEditorResponse } from '../../../inlineChat/node/promptCraftingTypes';23import { TextDocumentSnapshot } from '../../../../platform/editing/common/textDocumentSnapshot';24import { createTextDocumentData } from '../../../../util/common/test/shims/textDocument';25import { URI } from '../../../../util/vs/base/common/uri';262728suite('InlineChatIntent', () => {2930test('Metadata is set on the latest turn', async () => {31const mockInstantiationService = {32createInstance: vi.fn((ctor, ...args) => {33if (ctor.name === 'InlineChatProgressMessages') {34return {35getContextualMessage: vi.fn().mockResolvedValue('mock message')36};37}38if (ctor.name === 'InlineChatToolCalling') {39return {40run: vi.fn().mockResolvedValue({41lastResponse: { type: ChatFetchResponseType.Success, value: 'mocked success!' },42telemetry: { telemetryMessageId: 'test-msg-id' },43needsExitTool: false44})45};46}47return {};48})49} as unknown as IInstantiationService;5051const mockEndpointProvider = {52getChatEndpoint: vi.fn().mockResolvedValue({ supportsToolCalls: true })53} as unknown as IEndpointProvider;5455const mockAuthService = {56getCopilotToken: vi.fn()57} as unknown as IAuthenticationService;5859const mockLogService = {60warn: vi.fn(),61error: vi.fn(),62trace: vi.fn()63} as unknown as ILogService;6465const mockToolsService = {66invokeTool: vi.fn()67} as unknown as IToolsService;6869const mockIgnoreService = {70isCopilotIgnored: vi.fn().mockResolvedValue(false)71} as unknown as IIgnoreService;7273const mockEditTracker = {74collectAIEdits: vi.fn()75};76const mockEditSurvivalTrackerService = {77initialize: vi.fn().mockReturnValue(mockEditTracker)78} as unknown as IEditSurvivalTrackerService;7980const mockOctoKitService = {81getGitHubOutageStatus: vi.fn()82} as unknown as IOctoKitService;8384const intent = new InlineChatIntent(85mockInstantiationService,86mockEndpointProvider,87mockAuthService,88mockLogService,89mockToolsService,90mockIgnoreService,91mockEditSurvivalTrackerService,92mockOctoKitService93);9495const mockTurn = {96setMetadata: vi.fn()97};9899const conversation = new Conversation('someId', [mockTurn as unknown as Turn]);100101const document = createTextDocumentData(URI.parse('file:///test.ts'), 'test content', 'typescript').document;102const request = {103prompt: 'test prompt',104location2: new ChatRequestEditorData({} as vscode.TextEditor, document, {} as vscode.Selection, {} as vscode.Range),105toolInvocationToken: {} as vscode.ChatParticipantToolToken106} as unknown as vscode.ChatRequest;107108const stream = {109progress: vi.fn(),110text: vi.fn()111} as unknown as vscode.ChatResponseStream;112113const token = CancellationToken.None;114115const documentContext = { document: TextDocumentSnapshot.create(document) } as IDocumentContext;116const chatTelemetry = {} as ChatTelemetryBuilder;117118await intent.handleRequest(conversation, request, stream, token, documentContext, 'agent', ChatLocation.Editor, chatTelemetry);119120expect(mockTurn.setMetadata).toHaveBeenCalledTimes(1);121const metadata = mockTurn.setMetadata.mock.calls[0][0];122expect(metadata).toBeInstanceOf(CopilotInteractiveEditorResponse);123expect(metadata.messageId).toBe('test-msg-id');124expect(metadata.promptQuery.query).toBe('test prompt');125expect(metadata.promptQuery.document).toBe(documentContext.document);126});127128});129130131