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.

120 lines (96 loc) 3.24 kB
import { Mock, beforeAll, beforeEach, describe, expect, it, vi } from 'vitest'; import { fileEnv } from '@/config/file'; import { FileModel } from '@/database/_deprecated/models/file'; import { DB_File } from '@/database/_deprecated/schemas/files'; import { clientS3Storage } from '@/services/file/ClientS3'; import { serverConfigSelectors } from '@/store/serverConfig/selectors'; import { createServerConfigStore } from '@/store/serverConfig/store'; import { ClientService } from './_deprecated'; const fileService = new ClientService(); beforeAll(() => { createServerConfigStore(); }); // Mocks for the FileModel vi.mock('@/database/_deprecated/models/file', () => ({ FileModel: { create: vi.fn(), delete: vi.fn(), findById: vi.fn(), clear: vi.fn(), }, })); let s3Domain: string; vi.mock('@/config/file', () => ({ fileEnv: { get NEXT_PUBLIC_S3_DOMAIN() { return s3Domain; }, }, })); // Mocks for the URL and Blob objects global.URL.createObjectURL = vi.fn(); global.Blob = vi.fn(); beforeEach(() => { // Reset all mocks before each test vi.resetAllMocks(); s3Domain = ''; }); describe('FileService', () => { it('createFile should save the file to the database', async () => { const localFile = { name: 'test', fileType: 'image/png', url: 'client-s3://123', size: 1, hash: '123', }; await clientS3Storage.putObject( '123', new File([new ArrayBuffer(1)], 'test.png', { type: 'image/png' }), ); (FileModel.create as Mock).mockResolvedValue(localFile); const result = await fileService.createFile(localFile); expect(result).toEqual({ url: 'data:image/png;base64,AA==' }); }); it('removeFile should delete the file from the database', async () => { const fileId = '1'; (FileModel.delete as Mock).mockResolvedValue(true); const result = await fileService.removeFile(fileId); expect(FileModel.delete).toHaveBeenCalledWith(fileId); expect(result).toBe(true); }); describe('getFile', () => { it('should retrieve and convert local file info to FilePreview', async () => { const fileId = '1'; const fileData = { name: 'test', data: new ArrayBuffer(1), fileType: 'image/png', saveMode: 'local', size: 1, createdAt: 1, updatedAt: 2, } as DB_File; (FileModel.findById as Mock).mockResolvedValue(fileData); (global.URL.createObjectURL as Mock).mockReturnValue('blob:test'); (global.Blob as Mock).mockImplementation(() => ['test']); const result = await fileService.getFile(fileId); expect(FileModel.findById).toHaveBeenCalledWith(fileId); expect(result).toEqual({ createdAt: new Date(1), id: '1', size: 1, type: 'image/png', name: 'test', url: 'blob:test', updatedAt: new Date(2), }); }); it('should throw an error when the file is not found', async () => { const fileId = 'non-existent'; (FileModel.findById as Mock).mockResolvedValue(null); const getFilePromise = fileService.getFile(fileId); await expect(getFilePromise).rejects.toThrow('file not found'); }); }); });