Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/extensions/copilot/src/extension/prompts/node/agent/test/copilotCLIPrompt.spec.ts
13406 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 { ChatCompletionContentPartKind, ChatRole } from '@vscode/prompt-tsx/dist/base/output/rawTypes';
7
import { expect, suite, test, vi } from 'vitest';
8
import type { IInstantiationService } from '../../../../../util/vs/platform/instantiation/common/instantiation';
9
import type { ChatRequest } from '../../../../../vscodeTypes';
10
import { ChatVariablesCollection } from '../../../../prompt/common/chatVariablesCollection';
11
import { renderPromptElement } from '../../base/promptRenderer';
12
import { generateUserPrompt } from '../copilotCLIPrompt';
13
14
vi.mock('../../base/promptRenderer', async importOriginal => {
15
const actual = await importOriginal<typeof import('../../base/promptRenderer')>();
16
return {
17
...actual,
18
renderPromptElement: vi.fn(),
19
};
20
});
21
22
suite('generateUserPrompt', () => {
23
const renderPromptElementMock = vi.mocked(renderPromptElement);
24
const request = { prompt: 'Implement this.' } as ChatRequest;
25
const chatVariables = new ChatVariablesCollection();
26
const instantiationService = {
27
invokeFunction<T>(fn: (accessor: { get: (service: unknown) => { getChatEndpoint: (request: ChatRequest) => { family: string } } }) => T): T {
28
return fn({
29
get: () => ({
30
getChatEndpoint: () => ({ family: 'gpt-4.1' }),
31
}),
32
});
33
},
34
} as unknown as IInstantiationService;
35
36
test('joins multiple text parts from a generated user prompt', async () => {
37
renderPromptElementMock.mockResolvedValue({
38
messages: [{
39
role: ChatRole.User,
40
content: [
41
{ type: ChatCompletionContentPartKind.Text, text: '<current_datetime>2026-04-27T12:17:47.949-06:00</current_datetime>\n\n' },
42
{ type: ChatCompletionContentPartKind.Text, text: '[CopilotCLISession] Unexpected generated prompt structure.\n\n' },
43
{ type: ChatCompletionContentPartKind.Text, text: '<reminder>\n<sql_tables>Available tables: todos, todo_deps, inbox_entries</sql_tables>\n</reminder>' },
44
],
45
}],
46
} as Awaited<ReturnType<typeof renderPromptElement>>);
47
48
await expect(generateUserPrompt(request, undefined, chatVariables, instantiationService)).resolves.toBe(
49
'<current_datetime>2026-04-27T12:17:47.949-06:00</current_datetime>\n\n' +
50
'[CopilotCLISession] Unexpected generated prompt structure.\n\n' +
51
'<reminder>\n<sql_tables>Available tables: todos, todo_deps, inbox_entries</sql_tables>\n</reminder>'
52
);
53
});
54
55
test('joins text parts across multiple generated user messages', async () => {
56
renderPromptElementMock.mockResolvedValue({
57
messages: [
58
{
59
role: ChatRole.User,
60
content: [
61
{ type: ChatCompletionContentPartKind.Text, text: '<current_datetime>2026-04-27T13:29:45.461-06:00</current_datetime>\n\n' },
62
],
63
},
64
{
65
role: ChatRole.User,
66
content: [
67
{ type: ChatCompletionContentPartKind.Text, text: '[CopilotCLISession] Unexpected generated prompt structure.\n\n' },
68
{ type: ChatCompletionContentPartKind.Text, text: '<reminder>\n<sql_tables>Available tables: todos, todo_deps, inbox_entries</sql_tables>\n</reminder>' },
69
],
70
},
71
],
72
} as Awaited<ReturnType<typeof renderPromptElement>>);
73
74
await expect(generateUserPrompt(request, undefined, chatVariables, instantiationService)).resolves.toBe(
75
'<current_datetime>2026-04-27T13:29:45.461-06:00</current_datetime>\n\n' +
76
'[CopilotCLISession] Unexpected generated prompt structure.\n\n' +
77
'<reminder>\n<sql_tables>Available tables: todos, todo_deps, inbox_entries</sql_tables>\n</reminder>'
78
);
79
});
80
81
test('rejects non-text generated user prompt content', async () => {
82
renderPromptElementMock.mockResolvedValue({
83
messages: [{
84
role: ChatRole.User,
85
content: [
86
{ type: ChatCompletionContentPartKind.Text, text: 'Implement this.' },
87
{ type: 'image_url' },
88
],
89
}],
90
} as Awaited<ReturnType<typeof renderPromptElement>>);
91
92
await expect(generateUserPrompt(request, undefined, chatVariables, instantiationService)).rejects.toThrow('[CopilotCLISession] Unexpected generated prompt structure.');
93
});
94
});
95
96