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