diff --git a/.eslintrc.js b/.eslintrc.js index f230d5b..9928b9f 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -7,6 +7,7 @@ module.exports = { }, rules: { ...config.rules, + 'unicorn/no-useless-undefined': 0, 'unicorn/prefer-string-replace-all': 0, 'unicorn/switch-case-braces': 0, }, diff --git a/tests/client/usePluginSettings.test.ts b/tests/client/usePluginSettings.test.ts new file mode 100644 index 0000000..e2bd754 --- /dev/null +++ b/tests/client/usePluginSettings.test.ts @@ -0,0 +1,61 @@ +import { lobeChat, usePluginSettings } from '@lobehub/chat-plugin-sdk/client'; +import { act, renderHook } from '@testing-library/react'; +import { beforeEach, describe, expect, it, vi } from 'vitest'; + +let getPluginSettingsSpy: any; +let setPluginSettingsSpy: any; + +describe('usePluginSettings', () => { + const initialValue = { theme: 'dark' }; + + beforeEach(() => { + // Spy on lobeChat methods and reset mocks before each test + getPluginSettingsSpy = vi.spyOn(lobeChat, 'getPluginSettings').mockResolvedValue(undefined); + setPluginSettingsSpy = vi.spyOn(lobeChat, 'setPluginSettings').mockResolvedValue(); + }); + + afterEach(() => { + // Reset mocks after each test + vi.restoreAllMocks(); + }); + + it('should initialize with the given initial value', () => { + const { result } = renderHook(() => usePluginSettings(initialValue)); + const [value] = result.current; + + expect(value).toEqual(initialValue); + expect(getPluginSettingsSpy).toHaveBeenCalledTimes(1); + }); + + it('should update state with the resolved settings', async () => { + const newSettings = { theme: 'light' }; + + getPluginSettingsSpy.mockResolvedValue(newSettings); + + const { result } = renderHook(() => usePluginSettings(initialValue)); + + // Wait for state to update + await vi.waitFor(() => expect(result.current[0]).toEqual(newSettings)); + }); + + it('should not update state if resolved settings are undefined', async () => { + const { result } = renderHook(() => usePluginSettings(initialValue)); + + await vi.waitFor(() => expect(result.current[0]).toEqual(initialValue)); + }); + + it('should update value and call setPluginSettings when updateValue is called', async () => { + const { result } = renderHook(() => usePluginSettings(initialValue)); + const [, updateValue] = result.current; + + const updatedSettings = { theme: 'blue' }; + + act(() => { + updateValue(updatedSettings); + }); + + const [value] = result.current; + expect(value).toEqual(updatedSettings); + expect(setPluginSettingsSpy).toHaveBeenCalledWith(updatedSettings); + }); +}); diff --git a/tests/client/usePluginState.test.ts b/tests/client/usePluginState.test.ts new file mode 100644 index 0000000..b1bc9b3 --- /dev/null +++ b/tests/client/usePluginState.test.ts @@ -0,0 +1,60 @@ +import { lobeChat, usePluginState } from '@lobehub/chat-plugin-sdk/client'; +import { act, renderHook } from '@testing-library/react'; +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; + +describe('usePluginState', () => { + const key = 'testKey'; + const initialValue = 'initialValue'; + + let getPluginStateSpy: any; + let setPluginStateSpy: any; + + beforeEach(() => { + // Mock lobeChat methods before each test + getPluginStateSpy = vi.spyOn(lobeChat, 'getPluginState').mockResolvedValue(undefined); + setPluginStateSpy = vi.spyOn(lobeChat, 'setPluginState').mockResolvedValue(); + }); + + afterEach(() => { + // Restore mocks after each test + vi.restoreAllMocks(); + }); + + it('should initialize with the given initial value', () => { + const { result } = renderHook(() => usePluginState(key, initialValue)); + const [value] = result.current; + + expect(value).toBe(initialValue); + expect(getPluginStateSpy).toHaveBeenCalledWith(key); + }); + + it('should update state with the resolved plugin state', async () => { + const resolvedState = 'resolvedState'; + getPluginStateSpy.mockResolvedValue(resolvedState); + + const { result } = renderHook(() => usePluginState(key, initialValue)); + + // Wait for state to update + await vi.waitFor(() => expect(result.current[0]).toBe(resolvedState)); + }); + + it('should not update state if resolved plugin state is undefined', async () => { + const { result } = renderHook(() => usePluginState(key, initialValue)); + + await vi.waitFor(() => expect(result.current[0]).toBe(initialValue)); + }); + + it('should update value and call setPluginState when updateValue is called', async () => { + const { result } = renderHook(() => usePluginState(key, initialValue)); + const [, updateValue] = result.current; + + const newValue = 'newValue'; + + act(() => { + updateValue(newValue); + }); + + expect(result.current[0]).toBe(newValue); + expect(setPluginStateSpy).toHaveBeenCalledWith(key, newValue); + }); +}); diff --git a/vitest.config.ts b/vitest.config.ts index 1f998da..6d4e240 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -10,6 +10,7 @@ export default defineConfig({ '@lobehub/chat-plugin-sdk/openapi': path.join(__dirname, './src/openapi'), }, coverage: { + include: ['src'], reporter: ['text', 'text-summary', 'json', 'lcov'], }, environment: 'jsdom',