Files
openhuman/app/src/utils/toolDefinitions.test.ts
T

80 lines
2.9 KiB
TypeScript

import { describe, expect, it } from 'vitest';
import {
getDefaultEnabledTools,
getEnabledRustToolNames,
normalizeEnabledToolList,
TOOL_CATALOG,
} from './toolDefinitions';
describe('normalizeEnabledToolList', () => {
it('converts a Rust tool name to its UI toggle ID', () => {
// "web_search_tool" is the Rust name for the "web_search" UI toggle.
// This was the root cause of #2742: handleSave persisted Rust names,
// the read path checked UI IDs, and the mismatch caused the toggle to
// always read back as OFF.
expect(normalizeEnabledToolList(['web_search_tool'])).toEqual(['web_search']);
});
it('passes through an entry that is already a UI toggle ID', () => {
expect(normalizeEnabledToolList(['shell'])).toEqual(['shell']);
});
it('handles a mixed list of UI IDs and Rust names', () => {
const result = normalizeEnabledToolList(['shell', 'web_search_tool', 'file_read']);
expect(result).toContain('shell');
expect(result).toContain('web_search');
expect(result).toContain('file_read');
expect(result).toHaveLength(3);
});
it('deduplicates when multiple Rust names map to the same UI toggle ID', () => {
// "cron_add", "cron_list", and "cron_remove" all belong to the "cron" toggle.
const result = normalizeEnabledToolList(['cron_add', 'cron_list', 'cron_remove']);
expect(result).toEqual(['cron']);
});
it('drops unknown entries', () => {
const result = normalizeEnabledToolList(['shell', 'totally_unknown_tool']);
expect(result).toEqual(['shell']);
});
it('returns empty array for empty input', () => {
expect(normalizeEnabledToolList([])).toEqual([]);
});
it('round-trips with getEnabledRustToolNames for all default enabled tools', () => {
const defaults = getDefaultEnabledTools();
const rustNames = getEnabledRustToolNames(defaults);
const normalized = normalizeEnabledToolList(rustNames);
// Every default UI ID must survive the round-trip.
for (const id of defaults) {
expect(normalized).toContain(id);
}
});
it('normalises a realistic persisted list that would cause the #2742 revert', () => {
// Simulate what handleSave writes: Rust names for all tools that were ON.
const persistedRustNames = getEnabledRustToolNames([
'shell',
'web_search',
'http_request',
'cron',
]);
const normalized = normalizeEnabledToolList(persistedRustNames);
expect(normalized).toContain('shell');
expect(normalized).toContain('web_search');
expect(normalized).toContain('http_request');
expect(normalized).toContain('cron');
});
it('covers every entry in TOOL_CATALOG — all rustToolNames reverse-map correctly', () => {
for (const tool of TOOL_CATALOG) {
for (const rustName of tool.rustToolNames) {
const result = normalizeEnabledToolList([rustName]);
expect(result).toEqual([tool.id]);
}
}
});
});