UNPKG

@lobehub/chat

Version:

Lobe Chat - an open-source, high-performance chatbot framework that supports speech synthesis, multimodal, and extensible Function Call plugin system. Supports one-click free deployment of your private ChatGPT/LLM web application.

196 lines (159 loc) 6.43 kB
import { describe } from 'vitest'; import { MigrationData, VersionController } from '@/migrations/VersionController'; import { MigrationV1ToV2 } from '../FromV1ToV2'; import inputV1Data from '../FromV1ToV2/fixtures/input-v1-session.json'; import { MigrationV2ToV3 } from '../FromV2ToV3'; import azureInputV3 from './fixtures/azure-input-v3.json'; import azureOutputV4 from './fixtures/azure-output-v4.json'; import ollamaInputV3 from './fixtures/ollama-input-v3.json'; import ollamaOutputV4 from './fixtures/ollama-output-v4.json'; import openaiInputV3 from './fixtures/openai-input-v3.json'; import openaiOutputV4 from './fixtures/openai-output-v4.json'; import openrouterInputV3 from './fixtures/openrouter-input-v3.json'; import openrouterOutputV4 from './fixtures/openrouter-output-v4.json'; import outputV4Data from './fixtures/output-v4-from-v1.json'; import { MigrationV3ToV4 } from './index'; describe('MigrationV3ToV4', () => { let migrations; let versionController: VersionController<any>; beforeEach(() => { migrations = [MigrationV3ToV4]; versionController = new VersionController(migrations, 4); }); describe('should migrate data correctly from previous versions', () => { it('openai', () => { const data: MigrationData = openaiInputV3; const migratedData = versionController.migrate(data); expect(migratedData.version).toEqual(openaiOutputV4.version); expect(migratedData.state.settings.languageModel).toEqual( openaiOutputV4.state.settings.languageModel, ); }); it('azure', () => { const data: MigrationData = azureInputV3; const migratedData = versionController.migrate(data); expect(migratedData.version).toEqual(azureOutputV4.version); expect(migratedData.state.settings.languageModel).toEqual( azureOutputV4.state.settings.languageModel, ); }); it('openrouter', () => { const data: MigrationData = openrouterInputV3; const migratedData = versionController.migrate(data); expect(migratedData.version).toEqual(openrouterOutputV4.version); expect(migratedData.state.settings.languageModel).toEqual( openrouterOutputV4.state.settings.languageModel, ); }); it('ollama', () => { const data: MigrationData = ollamaInputV3; const migratedData = versionController.migrate(data); expect(migratedData.version).toEqual(ollamaOutputV4.version); expect(migratedData.state.settings.languageModel).toEqual( ollamaOutputV4.state.settings.languageModel, ); }); }); it('should work correct from v1 to v4', () => { const data: MigrationData = inputV1Data; versionController = new VersionController( [MigrationV3ToV4, MigrationV2ToV3, MigrationV1ToV2], 4, ); const migratedData = versionController.migrate(data); expect(migratedData.version).toEqual(outputV4Data.version); // expect(migratedData.state.sessions).toEqual(outputV3DataFromV1.state.sessions); // expect(migratedData.state.topics).toEqual(outputV3DataFromV1.state.topics); // expect(migratedData.state.messages).toEqual(outputV3DataFromV1.state.messages); }); describe('Edge Case', () => { it('should handle undefined settings or languageModel', () => { const data: MigrationData = { version: 3, state: { // settings undefined }, }; const migratedData = versionController.migrate(data); expect(migratedData.version).toEqual(4); expect(migratedData.state.settings).toBeUndefined(); }); it('should handle undefined languageModel', () => { const data: MigrationData = { version: 3, state: { settings: { // languageModel undefined }, }, }; const migratedData = versionController.migrate(data); expect(migratedData.version).toEqual(4); expect(migratedData.state.settings.languageModel).toBeUndefined(); }); it('should handle missing provider configurations', () => { const data: MigrationData = { version: 3, state: { settings: { languageModel: { // missing togetherai、openrouter 、 ollama openAI: { // openAI }, }, }, }, }; const migratedData = versionController.migrate(data); expect(migratedData.version).toEqual(4); expect(migratedData.state.settings.languageModel.togetherai).toBeUndefined(); expect(migratedData.state.settings.languageModel.openrouter).toBeUndefined(); expect(migratedData.state.settings.languageModel.ollama).toBeUndefined(); }); it('should success for invalid data format', () => { const data: MigrationData = { version: 3, state: { settings: { languageModel: { openAI: 'invalid-config', // 错误的配置格式 }, }, }, }; const migratedData = versionController.migrate(data); expect(migratedData.version).toEqual(4); expect(migratedData.state.settings.languageModel.openai).toEqual({ enabled: true }); expect(migratedData.state.settings.languageModel.togetherai).toBeUndefined(); expect(migratedData.state.settings.languageModel.openrouter).toBeUndefined(); expect(migratedData.state.settings.languageModel.ollama).toBeUndefined(); }); it('should handle empty strings and empty objects', () => { const data: MigrationData = { version: 3, state: { settings: { languageModel: { openAI: undefined, togetherai: { apiKey: '', endpoint: '', customModelName: '', }, }, }, }, }; const migratedData = versionController.migrate(data); expect(migratedData.version).toEqual(4); expect(migratedData.state.settings.languageModel.openai).toEqual({ apiKey: '', enabled: true, }); expect(migratedData.state.settings.languageModel.togetherai.apiKey).toEqual(''); expect(migratedData.state.settings.languageModel.togetherai.endpoint).toEqual(''); expect(migratedData.state.settings.languageModel.togetherai.customModelCards).toBeUndefined(); }); }); });