@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.
280 lines (222 loc) • 9.05 kB
text/typescript
import { renderHook, waitFor } from '@testing-library/react';
import { beforeEach, describe, expect, it, vi } from 'vitest';
import { discoverService } from '@/services/discover';
import { globalHelpers } from '@/store/global/helpers';
import { useDiscoverStore as useStore } from '../../store';
vi.mock('zustand/traditional');
beforeEach(() => {
vi.clearAllMocks();
});
describe('ProviderAction', () => {
describe('useProviderDetail', () => {
it('should fetch provider detail when identifier is provided', async () => {
const mockDetail = {
description: 'OpenAI provider',
identifier: 'openai',
modelCount: 10,
models: [
{ displayName: 'GPT-4', id: 'gpt-4' },
{ displayName: 'GPT-3.5 Turbo', id: 'gpt-3.5-turbo' },
],
name: 'OpenAI',
related: [],
};
vi.spyOn(discoverService, 'getProviderDetail').mockResolvedValue(mockDetail as any);
vi.spyOn(globalHelpers, 'getCurrentLanguage').mockReturnValue('en-US');
const params = { identifier: 'openai' };
const { result } = renderHook(() => useStore.getState().useProviderDetail(params));
await waitFor(() => {
expect(result.current.data).toEqual(mockDetail);
});
expect(discoverService.getProviderDetail).toHaveBeenCalledWith(params);
});
it('should fetch provider detail with readme when withReadme is true', async () => {
const mockDetail = {
description: 'Anthropic provider',
identifier: 'anthropic',
modelCount: 5,
models: [],
name: 'Anthropic',
readme: '# Anthropic Provider\n\nThis is the Anthropic provider.',
related: [],
};
vi.spyOn(discoverService, 'getProviderDetail').mockResolvedValue(mockDetail as any);
vi.spyOn(globalHelpers, 'getCurrentLanguage').mockReturnValue('en-US');
const params = { identifier: 'anthropic', withReadme: true };
const { result } = renderHook(() => useStore.getState().useProviderDetail(params));
await waitFor(() => {
expect(result.current.data).toEqual(mockDetail);
});
expect(discoverService.getProviderDetail).toHaveBeenCalledWith(params);
});
it('should use current language in the request', async () => {
const mockDetail = {
identifier: 'google',
modelCount: 8,
models: [],
name: 'Google',
related: [],
};
vi.spyOn(discoverService, 'getProviderDetail').mockResolvedValue(mockDetail as any);
vi.spyOn(globalHelpers, 'getCurrentLanguage').mockReturnValue('zh-CN');
const params = { identifier: 'google' };
const { result } = renderHook(() => useStore.getState().useProviderDetail(params));
await waitFor(() => {
expect(result.current.data).toEqual(mockDetail);
});
expect(globalHelpers.getCurrentLanguage).toHaveBeenCalled();
expect(discoverService.getProviderDetail).toHaveBeenCalledWith(params);
});
it('should return undefined when provider is not found', async () => {
vi.spyOn(discoverService, 'getProviderDetail').mockResolvedValue(undefined);
vi.spyOn(globalHelpers, 'getCurrentLanguage').mockReturnValue('en-US');
const params = { identifier: 'non-existent' };
const { result } = renderHook(() => useStore.getState().useProviderDetail(params));
await waitFor(() => {
expect(result.current.data).toBeUndefined();
});
});
});
describe('useProviderIdentifiers', () => {
it('should fetch provider identifiers', async () => {
const mockIdentifiers = [
{ identifier: 'openai', lastModified: '2024-01-01' },
{ identifier: 'anthropic', lastModified: '2024-01-02' },
{ identifier: 'google', lastModified: '2024-01-03' },
];
vi.spyOn(discoverService, 'getProviderIdentifiers').mockResolvedValue(mockIdentifiers);
const { result } = renderHook(() => useStore.getState().useProviderIdentifiers());
await waitFor(() => {
expect(result.current.data).toEqual(mockIdentifiers);
});
expect(discoverService.getProviderIdentifiers).toHaveBeenCalled();
});
});
describe('useProviderList', () => {
it('should fetch provider list with default parameters', async () => {
const mockList = {
currentPage: 1,
items: [
{ identifier: 'openai', modelCount: 10, name: 'OpenAI' },
{ identifier: 'anthropic', modelCount: 5, name: 'Anthropic' },
],
pageSize: 21,
totalCount: 2,
totalPages: 1,
};
vi.spyOn(discoverService, 'getProviderList').mockResolvedValue(mockList as any);
vi.spyOn(globalHelpers, 'getCurrentLanguage').mockReturnValue('en-US');
const { result } = renderHook(() => useStore.getState().useProviderList());
await waitFor(() => {
expect(result.current.data).toEqual(mockList);
});
expect(discoverService.getProviderList).toHaveBeenCalledWith({
page: 1,
pageSize: 21,
});
});
it('should fetch provider list with custom parameters', async () => {
const mockList = {
currentPage: 2,
items: [{ identifier: 'openai', modelCount: 10, name: 'OpenAI' }],
pageSize: 10,
totalCount: 15,
totalPages: 2,
};
vi.spyOn(discoverService, 'getProviderList').mockResolvedValue(mockList as any);
vi.spyOn(globalHelpers, 'getCurrentLanguage').mockReturnValue('zh-CN');
const params = { page: 2, pageSize: 10, q: 'openai' } as any;
const { result } = renderHook(() => useStore.getState().useProviderList(params));
await waitFor(() => {
expect(result.current.data).toEqual(mockList);
});
expect(discoverService.getProviderList).toHaveBeenCalledWith({
page: 2,
pageSize: 10,
q: 'openai',
});
});
it('should convert page and pageSize to numbers', async () => {
const mockList = {
currentPage: 3,
items: [],
pageSize: 15,
totalCount: 0,
totalPages: 0,
};
vi.spyOn(discoverService, 'getProviderList').mockResolvedValue(mockList as any);
vi.spyOn(globalHelpers, 'getCurrentLanguage').mockReturnValue('en-US');
const params = { page: 3, pageSize: 15 } as any;
const { result } = renderHook(() => useStore.getState().useProviderList(params));
await waitFor(() => {
expect(result.current.data).toEqual(mockList);
});
expect(discoverService.getProviderList).toHaveBeenCalledWith({
page: 3,
pageSize: 15,
});
});
it('should use current language in the request', async () => {
const mockList = {
currentPage: 1,
items: [],
pageSize: 21,
totalCount: 0,
totalPages: 0,
};
vi.spyOn(discoverService, 'getProviderList').mockResolvedValue(mockList as any);
vi.spyOn(globalHelpers, 'getCurrentLanguage').mockReturnValue('zh-CN');
const { result } = renderHook(() => useStore.getState().useProviderList());
await waitFor(() => {
expect(result.current.data).toEqual(mockList);
});
expect(globalHelpers.getCurrentLanguage).toHaveBeenCalled();
});
it('should handle sort parameter', async () => {
const mockList = {
currentPage: 1,
items: [
{ identifier: 'anthropic', modelCount: 5, name: 'Anthropic' },
{ identifier: 'openai', modelCount: 10, name: 'OpenAI' },
],
pageSize: 21,
totalCount: 2,
totalPages: 1,
};
vi.spyOn(discoverService, 'getProviderList').mockResolvedValue(mockList as any);
vi.spyOn(globalHelpers, 'getCurrentLanguage').mockReturnValue('en-US');
const params = { order: 'asc', sort: 'identifier' } as any;
const { result } = renderHook(() => useStore.getState().useProviderList(params));
await waitFor(() => {
expect(result.current.data).toEqual(mockList);
});
expect(discoverService.getProviderList).toHaveBeenCalledWith({
order: 'asc',
page: 1,
pageSize: 21,
sort: 'identifier',
});
});
it('should handle search query parameter', async () => {
const mockList = {
currentPage: 1,
items: [{ identifier: 'openai', modelCount: 10, name: 'OpenAI' }],
pageSize: 21,
totalCount: 1,
totalPages: 1,
};
vi.spyOn(discoverService, 'getProviderList').mockResolvedValue(mockList as any);
vi.spyOn(globalHelpers, 'getCurrentLanguage').mockReturnValue('en-US');
const params = { q: 'openai' } as any;
const { result } = renderHook(() => useStore.getState().useProviderList(params));
await waitFor(() => {
expect(result.current.data).toEqual(mockList);
});
expect(discoverService.getProviderList).toHaveBeenCalledWith({
page: 1,
pageSize: 21,
q: 'openai',
});
});
});
});