Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/extensions/copilot/src/extension/inlineChat2/test/node/inlineChatIntent.spec.ts
13405 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import { expect, suite, test, vi } from 'vitest';
7
import type * as vscode from 'vscode';
8
import { InlineChatIntent } from '../../node/inlineChatIntent';
9
import { IInstantiationService } from '../../../../util/vs/platform/instantiation/common/instantiation';
10
import { IEndpointProvider } from '../../../../platform/endpoint/common/endpointProvider';
11
import { IAuthenticationService } from '../../../../platform/authentication/common/authentication';
12
import { ILogService } from '../../../../platform/log/common/logService';
13
import { IToolsService } from '../../../tools/common/toolsService';
14
import { IIgnoreService } from '../../../../platform/ignore/common/ignoreService';
15
import { IEditSurvivalTrackerService } from '../../../../platform/editSurvivalTracking/common/editSurvivalTrackerService';
16
import { IOctoKitService } from '../../../../platform/github/common/githubService';
17
import { Conversation, Turn } from '../../../prompt/common/conversation';
18
import { ChatLocation, ChatFetchResponseType } from '../../../../platform/chat/common/commonTypes';
19
import { IDocumentContext } from '../../../prompt/node/documentContext';
20
import { ChatTelemetryBuilder } from '../../../prompt/node/chatParticipantTelemetry';
21
import { CancellationToken } from '../../../../util/vs/base/common/cancellation';
22
import { ChatRequestEditorData } from '../../../../vscodeTypes';
23
import { CopilotInteractiveEditorResponse } from '../../../inlineChat/node/promptCraftingTypes';
24
import { TextDocumentSnapshot } from '../../../../platform/editing/common/textDocumentSnapshot';
25
import { createTextDocumentData } from '../../../../util/common/test/shims/textDocument';
26
import { URI } from '../../../../util/vs/base/common/uri';
27
28
29
suite('InlineChatIntent', () => {
30
31
test('Metadata is set on the latest turn', async () => {
32
const mockInstantiationService = {
33
createInstance: vi.fn((ctor, ...args) => {
34
if (ctor.name === 'InlineChatProgressMessages') {
35
return {
36
getContextualMessage: vi.fn().mockResolvedValue('mock message')
37
};
38
}
39
if (ctor.name === 'InlineChatToolCalling') {
40
return {
41
run: vi.fn().mockResolvedValue({
42
lastResponse: { type: ChatFetchResponseType.Success, value: 'mocked success!' },
43
telemetry: { telemetryMessageId: 'test-msg-id' },
44
needsExitTool: false
45
})
46
};
47
}
48
return {};
49
})
50
} as unknown as IInstantiationService;
51
52
const mockEndpointProvider = {
53
getChatEndpoint: vi.fn().mockResolvedValue({ supportsToolCalls: true })
54
} as unknown as IEndpointProvider;
55
56
const mockAuthService = {
57
getCopilotToken: vi.fn()
58
} as unknown as IAuthenticationService;
59
60
const mockLogService = {
61
warn: vi.fn(),
62
error: vi.fn(),
63
trace: vi.fn()
64
} as unknown as ILogService;
65
66
const mockToolsService = {
67
invokeTool: vi.fn()
68
} as unknown as IToolsService;
69
70
const mockIgnoreService = {
71
isCopilotIgnored: vi.fn().mockResolvedValue(false)
72
} as unknown as IIgnoreService;
73
74
const mockEditTracker = {
75
collectAIEdits: vi.fn()
76
};
77
const mockEditSurvivalTrackerService = {
78
initialize: vi.fn().mockReturnValue(mockEditTracker)
79
} as unknown as IEditSurvivalTrackerService;
80
81
const mockOctoKitService = {
82
getGitHubOutageStatus: vi.fn()
83
} as unknown as IOctoKitService;
84
85
const intent = new InlineChatIntent(
86
mockInstantiationService,
87
mockEndpointProvider,
88
mockAuthService,
89
mockLogService,
90
mockToolsService,
91
mockIgnoreService,
92
mockEditSurvivalTrackerService,
93
mockOctoKitService
94
);
95
96
const mockTurn = {
97
setMetadata: vi.fn()
98
};
99
100
const conversation = new Conversation('someId', [mockTurn as unknown as Turn]);
101
102
const document = createTextDocumentData(URI.parse('file:///test.ts'), 'test content', 'typescript').document;
103
const request = {
104
prompt: 'test prompt',
105
location2: new ChatRequestEditorData({} as vscode.TextEditor, document, {} as vscode.Selection, {} as vscode.Range),
106
toolInvocationToken: {} as vscode.ChatParticipantToolToken
107
} as unknown as vscode.ChatRequest;
108
109
const stream = {
110
progress: vi.fn(),
111
text: vi.fn()
112
} as unknown as vscode.ChatResponseStream;
113
114
const token = CancellationToken.None;
115
116
const documentContext = { document: TextDocumentSnapshot.create(document) } as IDocumentContext;
117
const chatTelemetry = {} as ChatTelemetryBuilder;
118
119
await intent.handleRequest(conversation, request, stream, token, documentContext, 'agent', ChatLocation.Editor, chatTelemetry);
120
121
expect(mockTurn.setMetadata).toHaveBeenCalledTimes(1);
122
const metadata = mockTurn.setMetadata.mock.calls[0][0];
123
expect(metadata).toBeInstanceOf(CopilotInteractiveEditorResponse);
124
expect(metadata.messageId).toBe('test-msg-id');
125
expect(metadata.promptQuery.query).toBe('test prompt');
126
expect(metadata.promptQuery.document).toBe(documentContext.document);
127
});
128
129
});
130
131