mirror of
https://github.com/QwenLM/qwen-code.git
synced 2025-12-19 09:33:53 +00:00
109 lines
4.3 KiB
TypeScript
109 lines
4.3 KiB
TypeScript
/**
|
|
* @license
|
|
* Copyright 2025 Google LLC
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
import { describe, it, expect, vi } from 'vitest';
|
|
import { getCoreSystemPrompt } from './prompts.js';
|
|
import { isGitRepository } from '../utils/gitUtils.js';
|
|
|
|
// Mock tool names if they are dynamically generated or complex
|
|
vi.mock('../tools/ls', () => ({ LSTool: { Name: 'list_directory' } }));
|
|
vi.mock('../tools/edit', () => ({ EditTool: { Name: 'replace' } }));
|
|
vi.mock('../tools/glob', () => ({ GlobTool: { Name: 'glob' } }));
|
|
vi.mock('../tools/grep', () => ({ GrepTool: { Name: 'search_file_content' } }));
|
|
vi.mock('../tools/read-file', () => ({ ReadFileTool: { Name: 'read_file' } }));
|
|
vi.mock('../tools/read-many-files', () => ({
|
|
ReadManyFilesTool: { Name: 'read_many_files' },
|
|
}));
|
|
vi.mock('../tools/shell', () => ({
|
|
ShellTool: { Name: 'run_shell_command' },
|
|
}));
|
|
vi.mock('../tools/write-file', () => ({
|
|
WriteFileTool: { Name: 'write_file' },
|
|
}));
|
|
vi.mock('../utils/gitUtils', () => ({
|
|
isGitRepository: vi.fn(),
|
|
}));
|
|
|
|
describe('Core System Prompt (prompts.ts)', () => {
|
|
it('should return the base prompt when no userMemory is provided', () => {
|
|
vi.stubEnv('SANDBOX', undefined);
|
|
const prompt = getCoreSystemPrompt();
|
|
expect(prompt).not.toContain('---\n\n'); // Separator should not be present
|
|
expect(prompt).toContain('You are an interactive CLI agent'); // Check for core content
|
|
expect(prompt).toMatchSnapshot(); // Use snapshot for base prompt structure
|
|
});
|
|
|
|
it('should return the base prompt when userMemory is empty string', () => {
|
|
vi.stubEnv('SANDBOX', undefined);
|
|
const prompt = getCoreSystemPrompt('');
|
|
expect(prompt).not.toContain('---\n\n');
|
|
expect(prompt).toContain('You are an interactive CLI agent');
|
|
expect(prompt).toMatchSnapshot();
|
|
});
|
|
|
|
it('should return the base prompt when userMemory is whitespace only', () => {
|
|
vi.stubEnv('SANDBOX', undefined);
|
|
const prompt = getCoreSystemPrompt(' \n \t ');
|
|
expect(prompt).not.toContain('---\n\n');
|
|
expect(prompt).toContain('You are an interactive CLI agent');
|
|
expect(prompt).toMatchSnapshot();
|
|
});
|
|
|
|
it('should append userMemory with separator when provided', () => {
|
|
vi.stubEnv('SANDBOX', undefined);
|
|
const memory = 'This is custom user memory.\nBe extra polite.';
|
|
const expectedSuffix = `\n\n---\n\n${memory}`;
|
|
const prompt = getCoreSystemPrompt(memory);
|
|
|
|
expect(prompt.endsWith(expectedSuffix)).toBe(true);
|
|
expect(prompt).toContain('You are an interactive CLI agent'); // Ensure base prompt follows
|
|
expect(prompt).toMatchSnapshot(); // Snapshot the combined prompt
|
|
});
|
|
|
|
it('should include sandbox-specific instructions when SANDBOX env var is set', () => {
|
|
vi.stubEnv('SANDBOX', 'true'); // Generic sandbox value
|
|
const prompt = getCoreSystemPrompt();
|
|
expect(prompt).toContain('# Sandbox');
|
|
expect(prompt).not.toContain('# MacOS Seatbelt');
|
|
expect(prompt).not.toContain('# Outside of Sandbox');
|
|
expect(prompt).toMatchSnapshot();
|
|
});
|
|
|
|
it('should include seatbelt-specific instructions when SANDBOX env var is "sandbox-exec"', () => {
|
|
vi.stubEnv('SANDBOX', 'sandbox-exec');
|
|
const prompt = getCoreSystemPrompt();
|
|
expect(prompt).toContain('# MacOS Seatbelt');
|
|
expect(prompt).not.toContain('# Sandbox');
|
|
expect(prompt).not.toContain('# Outside of Sandbox');
|
|
expect(prompt).toMatchSnapshot();
|
|
});
|
|
|
|
it('should include non-sandbox instructions when SANDBOX env var is not set', () => {
|
|
vi.stubEnv('SANDBOX', undefined); // Ensure it's not set
|
|
const prompt = getCoreSystemPrompt();
|
|
expect(prompt).toContain('# Outside of Sandbox');
|
|
expect(prompt).not.toContain('# Sandbox');
|
|
expect(prompt).not.toContain('# MacOS Seatbelt');
|
|
expect(prompt).toMatchSnapshot();
|
|
});
|
|
|
|
it('should include git instructions when in a git repo', () => {
|
|
vi.stubEnv('SANDBOX', undefined);
|
|
vi.mocked(isGitRepository).mockReturnValue(true);
|
|
const prompt = getCoreSystemPrompt();
|
|
expect(prompt).toContain('# Git Repository');
|
|
expect(prompt).toMatchSnapshot();
|
|
});
|
|
|
|
it('should not include git instructions when not in a git repo', () => {
|
|
vi.stubEnv('SANDBOX', undefined);
|
|
vi.mocked(isGitRepository).mockReturnValue(false);
|
|
const prompt = getCoreSystemPrompt();
|
|
expect(prompt).not.toContain('# Git Repository');
|
|
expect(prompt).toMatchSnapshot();
|
|
});
|
|
});
|