test(websearch): cover disabled launch snapshots

This commit is contained in:
Tam Nhu Tran committed 2026-07-29 13:22:21 -04:00
1 parent abc3002e89
commit 9f5706c275
6 files changed
+159 -29

No files matched your search

@@ -4,9 +4,13 @@ import { appendThirdPartyWebSearchToolArgs } from '../../../../src/utils/websear
const STEERING_PROMPT =
'For web lookup or current-information requests, prefer the CCS MCP tool WebSearch instead of Bash/curl/http fetches. If the user explicitly wants shell commands, or WebSearch is unavailable or fails, you may fall back to Bash/network tools.';
function appendEnabledWebSearchArgs(args: string[]): string[] {
return appendThirdPartyWebSearchToolArgs(args, true);
}
describe('appendThirdPartyWebSearchToolArgs', () => {
it('appends native WebSearch suppression and inline steering prompt when no prompt flags are present', () => {
expect(appendThirdPartyWebSearchToolArgs(['smoke'])).toEqual([
expect(appendEnabledWebSearchArgs(['smoke'])).toEqual([
'smoke',
'--disallowedTools',
'WebSearch',
@@ -17,7 +21,7 @@ describe('appendThirdPartyWebSearchToolArgs', () => {
it('does not append duplicate suppression or steering prompt when both are already present', () => {
expect(
appendThirdPartyWebSearchToolArgs([
appendEnabledWebSearchArgs([
'smoke',
'--disallowedTools',
'WebSearch',
@@ -34,9 +38,7 @@ describe('appendThirdPartyWebSearchToolArgs', () => {
});
it('detects comma-separated disallowed tool values', () => {
expect(
appendThirdPartyWebSearchToolArgs(['smoke', '--disallowedTools=Read,WebSearch'])
).toEqual([
expect(appendEnabledWebSearchArgs(['smoke', '--disallowedTools=Read,WebSearch'])).toEqual([
'smoke',
'--disallowedTools=Read,WebSearch',
'--append-system-prompt',
@@ -45,7 +47,7 @@ describe('appendThirdPartyWebSearchToolArgs', () => {
});
it('merges WebSearch into an existing space-separated disallowed tool flag', () => {
expect(appendThirdPartyWebSearchToolArgs(['smoke', '--disallowedTools', 'Read'])).toEqual([
expect(appendEnabledWebSearchArgs(['smoke', '--disallowedTools', 'Read'])).toEqual([
'smoke',
'--disallowedTools',
'Read,WebSearch',
@@ -55,7 +57,7 @@ describe('appendThirdPartyWebSearchToolArgs', () => {
});
it('merges WebSearch into an existing equals-form disallowed tool flag', () => {
expect(appendThirdPartyWebSearchToolArgs(['smoke', '--disallowedTools=Read'])).toEqual([
expect(appendEnabledWebSearchArgs(['smoke', '--disallowedTools=Read'])).toEqual([
'smoke',
'--disallowedTools=Read,WebSearch',
'--append-system-prompt',
@@ -65,11 +67,7 @@ describe('appendThirdPartyWebSearchToolArgs', () => {
it('preserves user-supplied append-system-prompt values and adds the CCS steering hint once', () => {
expect(
appendThirdPartyWebSearchToolArgs([
'smoke',
'--append-system-prompt',
'User-provided instruction',
])
appendEnabledWebSearchArgs(['smoke', '--append-system-prompt', 'User-provided instruction'])
).toEqual([
'smoke',
'--append-system-prompt',
@@ -83,7 +81,7 @@ describe('appendThirdPartyWebSearchToolArgs', () => {
it('does not duplicate the steering prompt when it already exists in equals form', () => {
expect(
appendThirdPartyWebSearchToolArgs([
appendEnabledWebSearchArgs([
'smoke',
'--disallowedTools',
'WebSearch',
@@ -98,9 +96,7 @@ describe('appendThirdPartyWebSearchToolArgs', () => {
});
it('does not consume positional args after a disallowed-tools flag value', () => {
expect(
appendThirdPartyWebSearchToolArgs(['--disallowedTools', 'Read', 'latest AI news'])
).toEqual([
expect(appendEnabledWebSearchArgs(['--disallowedTools', 'Read', 'latest AI news'])).toEqual([
'--disallowedTools',
'Read,WebSearch',
'latest AI news',
@@ -110,7 +106,7 @@ describe('appendThirdPartyWebSearchToolArgs', () => {
});
it('injects synthetic flags before an end-of-options marker', () => {
expect(appendThirdPartyWebSearchToolArgs(['--', 'latest AI news'])).toEqual([
expect(appendEnabledWebSearchArgs(['--', 'latest AI news'])).toEqual([
'--disallowedTools',
'WebSearch',
'--append-system-prompt',
@@ -121,7 +117,7 @@ describe('appendThirdPartyWebSearchToolArgs', () => {
});
it('inserts the WebSearch disallow value when the flag is present without one', () => {
expect(appendThirdPartyWebSearchToolArgs(['--disallowedTools', '--verbose'])).toEqual([
expect(appendEnabledWebSearchArgs(['--disallowedTools', '--verbose'])).toEqual([
'--disallowedTools',
'WebSearch',
'--verbose',
@@ -133,7 +129,7 @@ describe('appendThirdPartyWebSearchToolArgs', () => {
// File mode: --append-system-prompt-file when user passes --append-system-prompt-file
it('uses --append-system-prompt-file when user passes --append-system-prompt-file', () => {
const result = appendThirdPartyWebSearchToolArgs([
const result = appendEnabledWebSearchArgs([
'smoke',
'--append-system-prompt-file',
'/tmp/user-prompt.txt',
@@ -147,26 +143,54 @@ describe('appendThirdPartyWebSearchToolArgs', () => {
});
it('uses --append-system-prompt-file when user passes --append-system-prompt-file= form', () => {
const result = appendThirdPartyWebSearchToolArgs([
const result = appendEnabledWebSearchArgs([
'smoke',
'--append-system-prompt-file=/tmp/user-prompt.txt',
]);
const fileFlags = result.filter(
(arg) => arg === '--append-system-prompt-file' || arg.startsWith('--append-system-prompt-file=')
(arg) =>
arg === '--append-system-prompt-file' || arg.startsWith('--append-system-prompt-file=')
);
expect(fileFlags.length).toBeGreaterThanOrEqual(2);
expect(result).not.toContain('--append-system-prompt');
});
it('does not treat unrelated user prompt files as the managed CCS steering prompt', () => {
const result = appendThirdPartyWebSearchToolArgs([
const result = appendEnabledWebSearchArgs([
'smoke',
'--append-system-prompt-file',
'/tmp/user-ccs-prompt-websearch-tool-notes.txt',
]);
const filePaths = result.filter((arg, index) => result[index - 1] === '--append-system-prompt-file');
const filePaths = result.filter(
(arg, index) => result[index - 1] === '--append-system-prompt-file'
);
expect(filePaths).toContain('/tmp/user-ccs-prompt-websearch-tool-notes.txt');
expect(filePaths.some((filePath) => filePath.endsWith('/ccs-prompt-websearch-tool.txt'))).toBe(true);
expect(filePaths.some((filePath) => filePath.endsWith('/ccs-prompt-websearch-tool.txt'))).toBe(
true
);
});
it('keeps native WebSearch disallowed but skips CCS steering when WebSearch is disabled', () => {
expect(appendThirdPartyWebSearchToolArgs(['smoke'], false)).toEqual([
'smoke',
'--disallowedTools',
'WebSearch',
]);
});
it('preserves user prompt args when WebSearch is disabled', () => {
expect(
appendThirdPartyWebSearchToolArgs(
['smoke', '--append-system-prompt', 'User-provided instruction'],
false
)
).toEqual([
'smoke',
'--append-system-prompt',
'User-provided instruction',
'--disallowedTools',
'WebSearch',
]);
});
});
@@ -0,0 +1,48 @@
import { afterEach, beforeEach, describe, expect, it } from 'bun:test';
import * as fs from 'fs';
import * as os from 'os';
import * as path from 'path';
import { appendThirdPartyWebSearchToolArgs } from '../../../../src/utils/websearch/claude-tool-args';
import { resolveWebSearchLaunchState } from '../../../../src/utils/websearch/launch-state';
import { ensureWebSearchMcpForLaunch } from '../../../../src/utils/websearch/mcp-installer';
describe('WebSearch launch state', () => {
let originalCcsHome: string | undefined;
let tempHome = '';
let configPath = '';
beforeEach(() => {
originalCcsHome = process.env.CCS_HOME;
tempHome = fs.mkdtempSync(path.join(os.tmpdir(), 'ccs-websearch-launch-state-'));
const ccsDir = path.join(tempHome, '.ccs');
configPath = path.join(ccsDir, 'config.yaml');
fs.mkdirSync(ccsDir, { recursive: true });
process.env.CCS_HOME = tempHome;
});
afterEach(() => {
if (originalCcsHome === undefined) {
delete process.env.CCS_HOME;
} else {
process.env.CCS_HOME = originalCcsHome;
}
fs.rmSync(tempHome, { recursive: true, force: true });
});
it('keeps provisioning, hook env, and steering on one snapshot when config changes', () => {
fs.writeFileSync(configPath, 'version: 12\nwebsearch:\n enabled: false\n', 'utf8');
const launch = resolveWebSearchLaunchState();
ensureWebSearchMcpForLaunch(launch.config);
fs.writeFileSync(configPath, 'version: 12\nwebsearch:\n enabled: true\n', 'utf8');
const args = appendThirdPartyWebSearchToolArgs(['smoke'], launch.enabled);
expect(launch.enabled).toBe(false);
expect(launch.hookEnv.CCS_WEBSEARCH_ENABLED).toBe('0');
expect(launch.hookEnv.CCS_WEBSEARCH_SKIP).toBe('1');
expect(args).toContain('--disallowedTools');
expect(args).toContain('WebSearch');
expect(args).not.toContain('--append-system-prompt');
});
});