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.

142 lines (118 loc) 4.07 kB
import { act, renderHook } from '@testing-library/react'; import { beforeEach, describe, expect, it, vi } from 'vitest'; import { pluginService } from '@/services/plugin'; import { LobeToolCustomPlugin } from '@/types/tool/plugin'; import { useToolStore } from '../../store'; import { defaultCustomPlugin } from './initialState'; beforeEach(() => { vi.resetAllMocks(); }); vi.mock('@/services/plugin', () => ({ pluginService: { updatePlugin: vi.fn(), createCustomPlugin: vi.fn(), uninstallPlugin: vi.fn(), updatePluginManifest: vi.fn(), }, })); vi.mock('@/services/tool', () => ({ toolService: { getToolManifest: vi.fn(), }, })); describe('useToolStore:customPlugin', () => { describe('deleteCustomPlugin', () => { it('should delete custom plugin and related settings', async () => { // 设置初始状态和 mock 函数 act(() => { useToolStore.setState({ // ...其他状态 installedPlugins: [{ identifier: 'test-plugin' } as LobeToolCustomPlugin], }); }); const { result } = renderHook(() => useToolStore()); const pluginId = 'test-plugin'; act(() => { result.current.uninstallCustomPlugin(pluginId); }); expect(pluginService.uninstallPlugin).toBeCalledWith(pluginId); }); }); describe('saveToCustomPluginList', () => { it('should add a plugin to the custom plugin list and reset newCustomPlugin', async () => { const newPlugin = { type: 'customPlugin', manifest: { identifier: 'plugin2', meta: { title: 'New Plugin' }, }, } as LobeToolCustomPlugin; act(() => { useToolStore.setState({ installedPlugins: [], newCustomPlugin: newPlugin, }); }); const { result } = renderHook(() => useToolStore()); await act(async () => { await result.current.installCustomPlugin(newPlugin); }); expect(result.current.newCustomPlugin).toEqual(defaultCustomPlugin); expect(pluginService.createCustomPlugin).toBeCalledWith(newPlugin); }); }); describe('updateCustomPlugin', () => { it('should update a specific plugin in the custom plugin list and reinstall the plugin', async () => { const pluginId = 'test-plugin'; const old = { type: 'customPlugin', identifier: pluginId, manifest: { identifier: pluginId, meta: { title: 'Old Plugin', avatar: '🍎' }, }, } as LobeToolCustomPlugin; act(() => { useToolStore.setState({ installedPlugins: [old], }); }); const { result } = renderHook(() => useToolStore()); const updatedPlugin = { type: 'customPlugin', manifest: { identifier: pluginId, meta: { title: 'Updated Plugin', avatar: '🥒' }, }, identifier: pluginId, } as LobeToolCustomPlugin; await act(async () => { await result.current.updateCustomPlugin(pluginId, updatedPlugin); }); expect(pluginService.updatePlugin).toHaveBeenCalledWith(pluginId, updatedPlugin); }); }); describe('updateNewCustomPlugin', () => { it('should update the newCustomPlugin state with the provided values', () => { const initialNewCustomPlugin = { type: 'customPlugin', manifest: { identifier: 'plugin3', meta: { title: 'Initial Plugin' }, }, } as LobeToolCustomPlugin; const updates = { meta: { title: 'Updated Name' } } as Partial<LobeToolCustomPlugin>; const expectedNewCustomPlugin = { ...initialNewCustomPlugin, ...updates }; act(() => { useToolStore.setState({ newCustomPlugin: initialNewCustomPlugin, }); }); const { result } = renderHook(() => useToolStore()); act(() => { result.current.updateNewCustomPlugin(updates); }); expect(useToolStore.getState().newCustomPlugin).toEqual(expectedNewCustomPlugin); }); }); });