File size: 6,074 Bytes
f0743f4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
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();
    });
  });
});