@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.
114 lines (96 loc) • 3.09 kB
text/typescript
import { act, renderHook } from '@testing-library/react';
import { Mock, afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
import { chainLangDetect } from '@/chains/langDetect';
import { chainTranslate } from '@/chains/translate';
import { chatService } from '@/services/chat';
import { messageService } from '@/services/message';
import { messageMapKey } from '@/store/chat/utils/messageMapKey';
import { useChatStore } from '../../store';
// Mock messageService 和 chatService
vi.mock('@/services/message', () => ({
messageService: {
updateMessageTTS: vi.fn(),
updateMessageTranslate: vi.fn(),
updateMessage: vi.fn(),
},
}));
vi.mock('@/services/chat', () => ({
chatService: {
fetchPresetTaskResult: vi.fn(),
},
}));
vi.mock('@/chains/langDetect', () => ({
chainLangDetect: vi.fn(),
}));
vi.mock('@/chains/translate', () => ({
chainTranslate: vi.fn(),
}));
// Mock supportLocales
vi.mock('@/locales/options', () => ({
supportLocales: ['en-US', 'zh-CN'],
}));
beforeEach(() => {
vi.clearAllMocks();
useChatStore.setState(
{
// ... 初始状态
},
false,
);
});
afterEach(() => {
vi.restoreAllMocks();
});
describe('ChatEnhanceAction', () => {
describe('translateMessage', () => {
it('should translate a message to the target language and refresh messages', async () => {
const { result } = renderHook(() => useChatStore());
const messageId = 'message-id';
const targetLang = 'zh-CN';
const messageContent = 'Hello World';
const detectedLang = 'en-US';
act(() => {
useChatStore.setState({
activeId: 'session',
messagesMap: {
[messageMapKey('session')]: [
{
id: messageId,
content: messageContent,
createdAt: Date.now(),
updatedAt: Date.now(),
role: 'user',
sessionId: 'test',
topicId: 'test',
meta: {},
},
],
},
});
});
(chatService.fetchPresetTaskResult as Mock).mockImplementation(({ params }) => {
if (params === chainLangDetect(messageContent)) {
return Promise.resolve(detectedLang);
}
if (params === chainTranslate(messageContent, targetLang)) {
return Promise.resolve('Hola Mundo');
}
return Promise.resolve(undefined);
});
await act(async () => {
await result.current.translateMessage(messageId, targetLang);
});
expect(messageService.updateMessageTranslate).toHaveBeenCalled();
});
});
describe('clearTranslate', () => {
it('should clear translation for a message and refresh messages', async () => {
const { result } = renderHook(() => useChatStore());
const messageId = 'message-id';
await act(async () => {
await result.current.clearTranslate(messageId);
});
expect(messageService.updateMessageTranslate).toHaveBeenCalledWith(messageId, false);
});
});
});