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.

140 lines (107 loc) 3.25 kB
import { produce } from 'immer'; import { expect } from 'vitest'; import { ChatTopic } from '@/types/topic'; import { ChatTopicDispatch, topicReducer } from './reducer'; describe('topicReducer', () => { let state: ChatTopic[]; beforeEach(() => { state = []; }); describe('addTopic', () => { it('should add a new ChatTopic object to state', () => { const payload: ChatTopicDispatch = { type: 'addTopic', value: { title: 'Test Topic', sessionId: '', }, }; const newState = topicReducer(state, payload); expect(newState[0].id).toBeDefined(); }); }); describe('updateTopic', () => { it('should update the ChatTopic object in state', () => { const topic: ChatTopic = { id: '1', title: 'Test Topic', createdAt: Date.now(), updatedAt: Date.now(), }; state.push(topic); const payload: ChatTopicDispatch = { type: 'updateTopic', id: '1', value: { title: 'Updated Topic' }, }; const newState = topicReducer(state, payload); expect(newState[0].title).toBe('Updated Topic'); }); it('should update the ChatTopic object with correct properties', () => { const topic: ChatTopic = { id: '1', title: 'Test Topic', createdAt: Date.now() - 1, updatedAt: Date.now() - 1, // 设定比当前时间前面一点 }; state.push(topic); const payload: ChatTopicDispatch = { type: 'updateTopic', id: '1', value: { title: 'Updated Topic' }, }; const newState = topicReducer(state, payload); expect((newState[0].updatedAt as unknown as Date).valueOf()).toBeGreaterThan(topic.updatedAt); }); }); describe('deleteTopic', () => { it('should delete the specified ChatTopic object from state', () => { const topic: ChatTopic = { id: '1', title: 'Test Topic', createdAt: Date.now(), updatedAt: Date.now(), }; state.push(topic); const payload: ChatTopicDispatch = { type: 'deleteTopic', id: '1', }; const newState = topicReducer(state, payload); expect(newState).toEqual([]); }); }); describe('default', () => { it('should return the original state object', () => { const payload = { type: 'unknown', } as unknown as ChatTopicDispatch; const newState = topicReducer(state, payload); expect(newState).toBe(state); }); }); describe('produce', () => { it('should generate immutable state object', () => { const payload: ChatTopicDispatch = { type: 'addTopic', value: { title: 'Test Topic', sessionId: '1', }, }; const newState = topicReducer(state, payload); expect(newState).not.toBe(state); }); it('should not modify the original state object', () => { const payload: ChatTopicDispatch = { type: 'addTopic', value: { title: 'Test Topic', sessionId: '123', }, }; const newState = topicReducer(state, payload); expect(state).toEqual([]); }); }); });