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.

214 lines (177 loc) • 5.4 kB
import { describe, expect, it, vi } from 'vitest'; import { MessageModel } from '@/database/models/message'; import { FileService } from '@/server/services/file'; import { ChatMessage, CreateMessageParams } from '@/types/message'; vi.mock('@/database/models/message', () => ({ MessageModel: vi.fn(), })); vi.mock('@/server/services/file', () => ({ FileService: vi.fn(), })); vi.mock('@/database/server', () => ({ getServerDB: vi.fn(), })); describe('messageRouter', () => { it('should handle batchCreateMessages', async () => { const mockBatchCreate = vi.fn().mockResolvedValue({ rowCount: 2 }); vi.mocked(MessageModel).mockImplementation( () => ({ batchCreate: mockBatchCreate, }) as any, ); const input = [ { id: '1', role: 'user', content: 'test', sessionId: 'session1', createdAt: new Date(), updatedAt: new Date(), agentId: 'agent1', clientId: 'client1', parentId: null, quotaId: null, model: null, provider: null, topicId: null, error: null, favorite: false, observationId: null, reasoning: null, pluginState: null, translate: null, tts: null, search: null, threadId: null, tools: null, traceId: null, userId: 'user1', } as any, ]; const ctx = { messageModel: new MessageModel({} as any, 'user1'), }; const result = await ctx.messageModel.batchCreate(input); expect(mockBatchCreate).toHaveBeenCalledWith(input); expect(result.rowCount).toBe(2); }); it('should handle count', async () => { const mockCount = vi.fn().mockResolvedValue(5); vi.mocked(MessageModel).mockImplementation( () => ({ count: mockCount, }) as any, ); const input = { startDate: '2024-01-01' }; const ctx = { messageModel: new MessageModel({} as any, 'user1'), }; const result = await ctx.messageModel.count(input); expect(mockCount).toHaveBeenCalledWith(input); expect(result).toBe(5); }); it('should handle createMessage', async () => { const mockCreate = vi.fn().mockResolvedValue({ id: 'msg1' }); vi.mocked(MessageModel).mockImplementation( () => ({ create: mockCreate, }) as any, ); const input: CreateMessageParams = { content: 'test', role: 'user', sessionId: 'session1', }; const ctx = { messageModel: new MessageModel({} as any, 'user1'), }; const result = await ctx.messageModel.create(input); expect(mockCreate).toHaveBeenCalledWith(input); expect(result.id).toBe('msg1'); }); it('should handle getMessages', async () => { const mockQuery = vi.fn().mockResolvedValue([{ id: 'msg1' }]); const mockGetFullFileUrl = vi .fn() .mockImplementation((path: string | null, file: { fileType: string }) => { return Promise.resolve('url'); }); vi.mocked(MessageModel).mockImplementation( () => ({ query: mockQuery, }) as any, ); vi.mocked(FileService).mockImplementation( () => ({ getFullFileUrl: mockGetFullFileUrl, }) as any, ); const input = { sessionId: 'session1' }; const ctx = { messageModel: new MessageModel({} as any, 'user1'), fileService: new FileService({} as any, 'user1'), userId: 'user1', }; const result = await ctx.messageModel.query(input, { postProcessUrl: mockGetFullFileUrl, }); expect(mockQuery).toHaveBeenCalledWith(input, expect.any(Object)); expect(result).toEqual([{ id: 'msg1' }]); }); it('should handle getAllMessages', async () => { const mockQueryAll = vi.fn().mockResolvedValue([ { id: 'msg1', meta: {}, } as ChatMessage, ]); vi.mocked(MessageModel).mockImplementation( () => ({ queryAll: mockQueryAll, }) as any, ); const ctx = { messageModel: new MessageModel({} as any, 'user1'), }; const result = await ctx.messageModel.queryAll(); expect(mockQueryAll).toHaveBeenCalled(); expect(result).toEqual([{ id: 'msg1', meta: {} }]); }); it('should handle removeMessage', async () => { const mockDelete = vi.fn().mockResolvedValue(undefined); vi.mocked(MessageModel).mockImplementation( () => ({ deleteMessage: mockDelete, }) as any, ); const input = { id: 'msg1' }; const ctx = { messageModel: new MessageModel({} as any, 'user1'), }; await ctx.messageModel.deleteMessage(input.id); expect(mockDelete).toHaveBeenCalledWith(input.id); }); it('should handle updateMessage', async () => { const mockUpdate = vi.fn().mockResolvedValue({ success: true }); vi.mocked(MessageModel).mockImplementation( () => ({ update: mockUpdate, }) as any, ); const input = { id: 'msg1', value: { content: 'updated' } }; const ctx = { messageModel: new MessageModel({} as any, 'user1'), }; const result = await ctx.messageModel.update(input.id, input.value); expect(mockUpdate).toHaveBeenCalledWith(input.id, input.value); expect(result).toEqual({ success: true }); }); });