mirror of
https://github.com/danny-avila/LibreChat.git
synced 2025-12-18 09:20:15 +01:00
225 lines
5.9 KiB
TypeScript
225 lines
5.9 KiB
TypeScript
|
|
import { EModelEndpoint } from 'librechat-data-provider';
|
||
|
|
import cleanupPreset from '../cleanupPreset';
|
||
|
|
import type { TPreset } from 'librechat-data-provider';
|
||
|
|
|
||
|
|
// Mock parseConvo since we're focusing on testing the chatGptLabel migration logic
|
||
|
|
jest.mock('librechat-data-provider', () => ({
|
||
|
|
...jest.requireActual('librechat-data-provider'),
|
||
|
|
parseConvo: jest.fn((input) => {
|
||
|
|
// Return a simplified mock that passes through most properties
|
||
|
|
const { conversation } = input;
|
||
|
|
return {
|
||
|
|
...conversation,
|
||
|
|
model: conversation?.model || 'gpt-3.5-turbo',
|
||
|
|
};
|
||
|
|
}),
|
||
|
|
}));
|
||
|
|
|
||
|
|
describe('cleanupPreset', () => {
|
||
|
|
const basePreset = {
|
||
|
|
presetId: 'test-preset-id',
|
||
|
|
title: 'Test Preset',
|
||
|
|
endpoint: EModelEndpoint.openAI,
|
||
|
|
model: 'gpt-4',
|
||
|
|
temperature: 0.7,
|
||
|
|
};
|
||
|
|
|
||
|
|
beforeEach(() => {
|
||
|
|
jest.clearAllMocks();
|
||
|
|
});
|
||
|
|
|
||
|
|
describe('chatGptLabel migration', () => {
|
||
|
|
it('should migrate chatGptLabel to modelLabel when only chatGptLabel exists', () => {
|
||
|
|
const preset = {
|
||
|
|
...basePreset,
|
||
|
|
chatGptLabel: 'Custom ChatGPT Label',
|
||
|
|
};
|
||
|
|
|
||
|
|
const result = cleanupPreset({ preset });
|
||
|
|
|
||
|
|
expect(result.modelLabel).toBe('Custom ChatGPT Label');
|
||
|
|
expect(result.chatGptLabel).toBeUndefined();
|
||
|
|
});
|
||
|
|
|
||
|
|
it('should prioritize modelLabel over chatGptLabel when both exist', () => {
|
||
|
|
const preset = {
|
||
|
|
...basePreset,
|
||
|
|
chatGptLabel: 'Old ChatGPT Label',
|
||
|
|
modelLabel: 'New Model Label',
|
||
|
|
};
|
||
|
|
|
||
|
|
const result = cleanupPreset({ preset });
|
||
|
|
|
||
|
|
expect(result.modelLabel).toBe('New Model Label');
|
||
|
|
expect(result.chatGptLabel).toBeUndefined();
|
||
|
|
});
|
||
|
|
|
||
|
|
it('should keep modelLabel when only modelLabel exists', () => {
|
||
|
|
const preset = {
|
||
|
|
...basePreset,
|
||
|
|
modelLabel: 'Existing Model Label',
|
||
|
|
};
|
||
|
|
|
||
|
|
const result = cleanupPreset({ preset });
|
||
|
|
|
||
|
|
expect(result.modelLabel).toBe('Existing Model Label');
|
||
|
|
expect(result.chatGptLabel).toBeUndefined();
|
||
|
|
});
|
||
|
|
|
||
|
|
it('should handle preset without either label', () => {
|
||
|
|
const preset = { ...basePreset };
|
||
|
|
|
||
|
|
const result = cleanupPreset({ preset });
|
||
|
|
|
||
|
|
expect(result.modelLabel).toBeUndefined();
|
||
|
|
expect(result.chatGptLabel).toBeUndefined();
|
||
|
|
});
|
||
|
|
|
||
|
|
it('should handle empty chatGptLabel', () => {
|
||
|
|
const preset = {
|
||
|
|
...basePreset,
|
||
|
|
chatGptLabel: '',
|
||
|
|
modelLabel: 'Valid Model Label',
|
||
|
|
};
|
||
|
|
|
||
|
|
const result = cleanupPreset({ preset });
|
||
|
|
|
||
|
|
expect(result.modelLabel).toBe('Valid Model Label');
|
||
|
|
expect(result.chatGptLabel).toBeUndefined();
|
||
|
|
});
|
||
|
|
|
||
|
|
it('should not migrate empty string chatGptLabel when modelLabel exists', () => {
|
||
|
|
const preset = {
|
||
|
|
...basePreset,
|
||
|
|
chatGptLabel: '',
|
||
|
|
};
|
||
|
|
|
||
|
|
const result = cleanupPreset({ preset });
|
||
|
|
|
||
|
|
expect(result.modelLabel).toBeUndefined();
|
||
|
|
expect(result.chatGptLabel).toBeUndefined();
|
||
|
|
});
|
||
|
|
});
|
||
|
|
|
||
|
|
describe('presetOverride handling', () => {
|
||
|
|
it('should apply presetOverride and then handle label migration', () => {
|
||
|
|
const preset = {
|
||
|
|
...basePreset,
|
||
|
|
chatGptLabel: 'Original Label',
|
||
|
|
presetOverride: {
|
||
|
|
modelLabel: 'Override Model Label',
|
||
|
|
temperature: 0.9,
|
||
|
|
},
|
||
|
|
};
|
||
|
|
|
||
|
|
const result = cleanupPreset({ preset });
|
||
|
|
|
||
|
|
expect(result.modelLabel).toBe('Override Model Label');
|
||
|
|
expect(result.chatGptLabel).toBeUndefined();
|
||
|
|
expect(result.temperature).toBe(0.9);
|
||
|
|
});
|
||
|
|
|
||
|
|
it('should handle label migration in presetOverride', () => {
|
||
|
|
const preset = {
|
||
|
|
...basePreset,
|
||
|
|
presetOverride: {
|
||
|
|
chatGptLabel: 'Override ChatGPT Label',
|
||
|
|
},
|
||
|
|
};
|
||
|
|
|
||
|
|
const result = cleanupPreset({ preset });
|
||
|
|
|
||
|
|
expect(result.modelLabel).toBe('Override ChatGPT Label');
|
||
|
|
expect(result.chatGptLabel).toBeUndefined();
|
||
|
|
});
|
||
|
|
});
|
||
|
|
|
||
|
|
describe('error handling', () => {
|
||
|
|
it('should handle undefined preset', () => {
|
||
|
|
const result = cleanupPreset({ preset: undefined });
|
||
|
|
|
||
|
|
expect(result).toEqual({
|
||
|
|
endpoint: null,
|
||
|
|
presetId: null,
|
||
|
|
title: 'New Preset',
|
||
|
|
});
|
||
|
|
});
|
||
|
|
|
||
|
|
it('should handle preset with null endpoint', () => {
|
||
|
|
const preset = {
|
||
|
|
...basePreset,
|
||
|
|
endpoint: null,
|
||
|
|
};
|
||
|
|
|
||
|
|
const result = cleanupPreset({ preset });
|
||
|
|
|
||
|
|
expect(result).toEqual({
|
||
|
|
endpoint: null,
|
||
|
|
presetId: 'test-preset-id',
|
||
|
|
title: 'Test Preset',
|
||
|
|
});
|
||
|
|
});
|
||
|
|
|
||
|
|
it('should handle preset with empty string endpoint', () => {
|
||
|
|
const preset = {
|
||
|
|
...basePreset,
|
||
|
|
endpoint: '',
|
||
|
|
};
|
||
|
|
|
||
|
|
const result = cleanupPreset({ preset });
|
||
|
|
|
||
|
|
expect(result).toEqual({
|
||
|
|
endpoint: null,
|
||
|
|
presetId: 'test-preset-id',
|
||
|
|
title: 'Test Preset',
|
||
|
|
});
|
||
|
|
});
|
||
|
|
});
|
||
|
|
|
||
|
|
describe('normal preset properties', () => {
|
||
|
|
it('should preserve all other preset properties', () => {
|
||
|
|
const preset = {
|
||
|
|
...basePreset,
|
||
|
|
promptPrefix: 'Custom prompt:',
|
||
|
|
temperature: 0.8,
|
||
|
|
top_p: 0.9,
|
||
|
|
modelLabel: 'Custom Model',
|
||
|
|
tools: ['plugin1', 'plugin2'],
|
||
|
|
};
|
||
|
|
|
||
|
|
const result = cleanupPreset({ preset });
|
||
|
|
|
||
|
|
expect(result.presetId).toBe('test-preset-id');
|
||
|
|
expect(result.title).toBe('Test Preset');
|
||
|
|
expect(result.endpoint).toBe(EModelEndpoint.openAI);
|
||
|
|
expect(result.modelLabel).toBe('Custom Model');
|
||
|
|
expect(result.promptPrefix).toBe('Custom prompt:');
|
||
|
|
expect(result.temperature).toBe(0.8);
|
||
|
|
expect(result.top_p).toBe(0.9);
|
||
|
|
expect(result.tools).toEqual(['plugin1', 'plugin2']);
|
||
|
|
});
|
||
|
|
|
||
|
|
it('should generate default title when title is missing', () => {
|
||
|
|
const preset = {
|
||
|
|
...basePreset,
|
||
|
|
title: undefined,
|
||
|
|
};
|
||
|
|
|
||
|
|
const result = cleanupPreset({ preset });
|
||
|
|
|
||
|
|
expect(result.title).toBe('New Preset');
|
||
|
|
});
|
||
|
|
|
||
|
|
it('should handle null presetId', () => {
|
||
|
|
const preset = {
|
||
|
|
...basePreset,
|
||
|
|
presetId: null,
|
||
|
|
};
|
||
|
|
|
||
|
|
const result = cleanupPreset({ preset });
|
||
|
|
|
||
|
|
expect(result.presetId).toBeNull();
|
||
|
|
});
|
||
|
|
});
|
||
|
|
});
|