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.

110 lines (87 loc) 3.15 kB
import { act, renderHook } from '@testing-library/react'; import useSWR from 'swr'; import { beforeAll, beforeEach, describe, expect, it, vi } from 'vitest'; import { fileService } from '@/services/file'; import { createServerConfigStore } from '@/store/serverConfig/store'; import { useFileStore as useStore } from '../../store'; vi.mock('zustand/traditional'); // Mock for useSWR vi.mock('swr', () => ({ default: vi.fn(), })); // mock the arrayBuffer beforeAll(() => { Object.defineProperty(File.prototype, 'arrayBuffer', { writable: true, value: function () { return new Promise((resolve) => { const reader = new FileReader(); reader.onloadend = () => { resolve(reader.result); }; reader.readAsArrayBuffer(this); }); }, }); createServerConfigStore(); }); beforeEach(() => { // Reset all mocks before each test vi.resetAllMocks(); }); describe('TTSFileAction', () => { // Test for removeTTSFile it('removeTTSFile should call fileService.removeFile', async () => { const fileId = 'tts-file-id'; // Mock the fileService.removeFile to resolve vi.spyOn(fileService, 'removeFile').mockResolvedValue(undefined); await act(async () => { await useStore.getState().removeTTSFile(fileId); }); expect(fileService.removeFile).toHaveBeenCalledWith(fileId); }); // Test for uploadTTSByArrayBuffers it('uploadTTSByArrayBuffers should create a file and call uploadTTSFile', async () => { const messageId = 'message-id'; const arrayBuffers = [new ArrayBuffer(10)]; const fileType = 'audio/mp3'; const fileName = `${messageId}.mp3`; // Spy on uploadTTSFile to simulate a successful upload const uploadTTSFileSpy = vi .spyOn(useStore.getState(), 'uploadWithProgress') .mockResolvedValue({ id: 'new-tts-file-id', url: '1' }); let fileId; await act(async () => { fileId = await useStore.getState().uploadTTSByArrayBuffers(messageId, arrayBuffers); }); expect(uploadTTSFileSpy).toHaveBeenCalled(); expect(fileId).toBe('new-tts-file-id'); // Cleanup spy uploadTTSFileSpy.mockRestore(); }); // Test for useFetchTTSFile it('useFetchTTSFile should call useSWR and return file data', async () => { const fileId = 'tts-file-id'; const fileData = { id: fileId, name: 'test', url: 'blob:test', fileType: 'audio/mp3', base64Url: '', saveMode: 'local', }; // Mock the fileService.getFile to resolve with fileData vi.spyOn(fileService, 'getFile').mockResolvedValue(fileData as any); // Mock useSWR to call the fetcher function immediately const useSWRMock = vi.mocked(useSWR); useSWRMock.mockImplementation(((key: string, fetcher: any) => { const data = fetcher(key); return { data, error: undefined, isValidating: false, mutate: vi.fn() }; }) as any); const { result } = renderHook(() => useStore.getState().useFetchTTSFile(fileId)); await act(async () => { await result.current.data; }); expect(fileService.getFile).toHaveBeenCalledWith(fileId); }); });