chat / client /src /utils /__tests__ /presets.test.ts
helloya20's picture
Upload 2345 files
f0743f4 verified
import { EModelEndpoint } from 'librechat-data-provider';
import { getPresetTitle, removeUnavailableTools } from '../presets';
import type { TPreset, TPlugin } from 'librechat-data-provider';
describe('presets utils', () => {
describe('getPresetTitle', () => {
const basePreset: TPreset = {
presetId: 'test-id',
title: 'Test Preset',
endpoint: EModelEndpoint.openAI,
model: 'gpt-4',
};
describe('with modelLabel', () => {
it('should use modelLabel as the label', () => {
const preset = {
...basePreset,
modelLabel: 'Custom Model Name',
};
const result = getPresetTitle(preset);
expect(result).toBe('Test Preset: gpt-4 (Custom Model Name)');
});
it('should prioritize modelLabel over deprecated chatGptLabel', () => {
const preset = {
...basePreset,
modelLabel: 'New Model Label',
chatGptLabel: 'Old ChatGPT Label',
};
const result = getPresetTitle(preset);
expect(result).toBe('Test Preset: gpt-4 (New Model Label)');
});
it('should handle title that includes the label', () => {
const preset = {
...basePreset,
title: 'Custom Model Name Settings',
modelLabel: 'Custom Model Name',
};
const result = getPresetTitle(preset);
expect(result).toBe('Custom Model Name Settings: gpt-4 (Custom Model Name)');
});
it('should handle case-insensitive title matching', () => {
const preset = {
...basePreset,
title: 'custom model name preset',
modelLabel: 'Custom Model Name',
};
const result = getPresetTitle(preset);
expect(result).toBe('custom model name preset: gpt-4 (Custom Model Name)');
});
it('should use label as title when label includes the title', () => {
const preset = {
...basePreset,
title: 'GPT',
modelLabel: 'Custom GPT Assistant',
};
const result = getPresetTitle(preset);
expect(result).toBe('Custom GPT Assistant: gpt-4');
});
});
describe('without modelLabel', () => {
it('should work without modelLabel', () => {
const preset = { ...basePreset };
const result = getPresetTitle(preset);
expect(result).toBe('Test Preset: gpt-4');
});
it('should handle empty modelLabel', () => {
const preset = {
...basePreset,
modelLabel: '',
};
const result = getPresetTitle(preset);
expect(result).toBe('Test Preset: gpt-4');
});
it('should handle null modelLabel', () => {
const preset = {
...basePreset,
modelLabel: null,
};
const result = getPresetTitle(preset);
expect(result).toBe('Test Preset: gpt-4');
});
});
describe('title variations', () => {
it('should handle missing title', () => {
const preset = {
...basePreset,
title: null,
modelLabel: 'Custom Model',
};
const result = getPresetTitle(preset);
expect(result).toBe('gpt-4 (Custom Model)');
});
it('should handle empty title', () => {
const preset = {
...basePreset,
title: '',
modelLabel: 'Custom Model',
};
const result = getPresetTitle(preset);
expect(result).toBe('gpt-4 (Custom Model)');
});
it('should handle "New Chat" title', () => {
const preset = {
...basePreset,
title: 'New Chat',
modelLabel: 'Custom Model',
};
const result = getPresetTitle(preset);
expect(result).toBe('gpt-4 (Custom Model)');
});
it('should handle title with whitespace', () => {
const preset = {
...basePreset,
title: ' ',
modelLabel: 'Custom Model',
};
const result = getPresetTitle(preset);
expect(result).toBe(': gpt-4 (Custom Model)');
});
});
describe('mention mode', () => {
it('should return mention format with all components', () => {
const preset = {
...basePreset,
modelLabel: 'Custom Model',
promptPrefix: 'You are a helpful assistant',
tools: ['plugin1', 'plugin2'] as string[],
};
const result = getPresetTitle(preset, true);
expect(result).toBe(
'gpt-4 | Custom Model | You are a helpful assistant | plugin1, plugin2',
);
});
it('should handle mention format with object tools', () => {
const preset = {
...basePreset,
modelLabel: 'Custom Model',
tools: [
{ pluginKey: 'plugin1', name: 'Plugin 1' } as TPlugin,
{ pluginKey: 'plugin3', name: 'Plugin 3' } as TPlugin,
] as TPlugin[],
};
const result = getPresetTitle(preset, true);
expect(result).toBe('gpt-4 | Custom Model | plugin1, plugin3');
});
it('should handle mention format with minimal data', () => {
const preset = { ...basePreset };
const result = getPresetTitle(preset, true);
expect(result).toBe('gpt-4');
});
it('should handle mention format with only modelLabel', () => {
const preset = {
...basePreset,
modelLabel: 'Custom Model',
};
const result = getPresetTitle(preset, true);
expect(result).toBe('gpt-4 | Custom Model');
});
it('should handle mention format with only promptPrefix', () => {
const preset = {
...basePreset,
promptPrefix: 'Custom prompt',
};
const result = getPresetTitle(preset, true);
expect(result).toBe('gpt-4 | Custom prompt');
});
});
describe('edge cases', () => {
it('should handle missing model', () => {
const preset = {
...basePreset,
model: null,
modelLabel: 'Custom Model',
};
const result = getPresetTitle(preset);
expect(result).toBe('Test Preset: (Custom Model)');
});
it('should handle undefined model', () => {
const preset = {
...basePreset,
model: undefined,
modelLabel: 'Custom Model',
};
const result = getPresetTitle(preset);
expect(result).toBe('Test Preset: (Custom Model)');
});
it('should trim the final result', () => {
const preset = {
...basePreset,
title: '',
model: '',
modelLabel: '',
};
const result = getPresetTitle(preset);
expect(result).toBe('');
});
});
});
describe('removeUnavailableTools', () => {
const basePreset: TPreset = {
presetId: 'test-id',
title: 'Test Preset',
endpoint: EModelEndpoint.openAI,
model: 'gpt-4',
};
const availableTools: Record<string, TPlugin | undefined> = {
plugin1: { pluginKey: 'plugin1', name: 'Plugin 1' } as TPlugin,
plugin2: { pluginKey: 'plugin2', name: 'Plugin 2' } as TPlugin,
plugin3: { pluginKey: 'plugin3', name: 'Plugin 3' } as TPlugin,
};
it('should remove unavailable tools from string array', () => {
const preset = {
...basePreset,
tools: ['plugin1', 'unavailable-plugin', 'plugin2'] as string[],
};
const result = removeUnavailableTools(preset, availableTools);
expect(result.tools).toEqual(['plugin1', 'plugin2']);
});
it('should remove unavailable tools from object array', () => {
const preset = {
...basePreset,
tools: [
{ pluginKey: 'plugin1', name: 'Plugin 1' } as TPlugin,
{ pluginKey: 'unavailable-plugin', name: 'Unavailable' } as TPlugin,
{ pluginKey: 'plugin2', name: 'Plugin 2' } as TPlugin,
] as TPlugin[],
};
const result = removeUnavailableTools(preset, availableTools);
expect(result.tools).toEqual(['plugin1', 'plugin2']);
});
it('should handle preset without tools', () => {
const preset = { ...basePreset };
const result = removeUnavailableTools(preset, availableTools);
expect(result).toEqual(preset);
});
it('should handle preset with empty tools array', () => {
const preset = {
...basePreset,
tools: [] as string[],
};
const result = removeUnavailableTools(preset, availableTools);
expect(result.tools).toEqual([]);
});
it('should remove all tools when none are available', () => {
const preset = {
...basePreset,
tools: ['unavailable1', 'unavailable2'] as string[],
};
const result = removeUnavailableTools(preset, {});
expect(result.tools).toEqual([]);
});
it('should preserve all other preset properties', () => {
const preset = {
...basePreset,
tools: ['plugin1'] as string[],
modelLabel: 'Custom Model',
temperature: 0.8,
promptPrefix: 'Test prompt',
};
const result = removeUnavailableTools(preset, availableTools);
expect(result.presetId).toBe(preset.presetId);
expect(result.title).toBe(preset.title);
expect(result.endpoint).toBe(preset.endpoint);
expect(result.model).toBe(preset.model);
expect(result.modelLabel).toBe(preset.modelLabel);
expect(result.temperature).toBe(preset.temperature);
expect(result.promptPrefix).toBe(preset.promptPrefix);
expect(result.tools).toEqual(['plugin1']);
});
it('should not mutate the original preset', () => {
const preset = {
...basePreset,
tools: ['plugin1', 'unavailable-plugin'] as string[],
};
const originalTools = [...preset.tools];
removeUnavailableTools(preset, availableTools);
expect(preset.tools).toEqual(originalTools);
});
});
});