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.

221 lines (191 loc) 8.72 kB
import { afterEach, beforeEach, describe, expect, it } from 'vitest'; import { SessionModel } from '@/database/_deprecated/models/session'; import { SessionGroups } from '@/types/session'; import { DB_SessionGroup } from '../../schemas/sessionGroup'; import { SessionGroupModel } from '../sessionGroup'; const sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms)); describe('SessionGroupModel', () => { let sessionGroupData: DB_SessionGroup; beforeEach(() => { // 设置正确结构的会话组数据 sessionGroupData = { name: 'test-group', sort: 1, }; }); afterEach(async () => { // 每次测试后清理数据库 await SessionGroupModel.clear(); }); describe('create', () => { it('should create a session group record', async () => { const createdGroup = await SessionGroupModel.create( sessionGroupData.name, sessionGroupData.sort, ); const item = await SessionGroupModel.findById(createdGroup.id); expect(item.name).toEqual(sessionGroupData.name); expect(item.sort).toEqual(sessionGroupData.sort); }); }); describe('batchCreate', () => { it('should batch create session group records', async () => { const groups = [ sessionGroupData, { ...sessionGroupData, name: 'another-group' }, ] as SessionGroups; await SessionGroupModel.batchCreate(groups); const fetchedGroups = await SessionGroupModel.query(); expect(fetchedGroups).toHaveLength(2); }); }); describe('update', () => { it('should update a session group', async () => { const createdGroup = await SessionGroupModel.create( sessionGroupData.name, sessionGroupData.sort, ); const updatedGroupData: DB_SessionGroup = { ...sessionGroupData, name: 'updated-group' }; await SessionGroupModel.update(createdGroup.id, updatedGroupData); const fetchedGroups = await SessionGroupModel.query(); expect(fetchedGroups[0].name).toEqual(updatedGroupData.name); }); }); describe('delete', () => { it('should delete a session group', async () => { const createdGroup = await SessionGroupModel.create( sessionGroupData.name, sessionGroupData.sort, ); await SessionGroupModel.delete(createdGroup.id); const fetchedGroups = await SessionGroupModel.query(); expect(fetchedGroups).toHaveLength(0); }); it('should delete a session group and update associated sessions', async () => { // Create a new session group const createdGroup = await SessionGroupModel.create( sessionGroupData.name, sessionGroupData.sort, ); // Delete the created session group await SessionGroupModel.delete(createdGroup.id); // Fetch all session groups to confirm deletion const fetchedGroups = await SessionGroupModel.query(); expect(fetchedGroups).toHaveLength(0); // Fetch all sessions to confirm update const fetchedSessions = await SessionModel.query(); fetchedSessions.forEach((session) => { expect(session.group).not.toEqual(createdGroup.id); }); }); it('should update associated sessions to default group when a session group is deleted', async () => { const createdGroup = await SessionGroupModel.create( sessionGroupData.name, sessionGroupData.sort, ); const sessionId = await SessionModel.create('agent', {}, createdGroup.id); await SessionGroupModel.delete(createdGroup.id); const updatedSession = await SessionModel.findById(sessionId.id); expect(updatedSession.group).toEqual('default'); }); }); describe('query', () => { it('should fetch and return the session group list', async () => { await SessionGroupModel.create(sessionGroupData.name, sessionGroupData.sort); const fetchedGroups = await SessionGroupModel.query(); expect(fetchedGroups).toHaveLength(1); expect(fetchedGroups[0].name).toEqual(sessionGroupData.name); }); it('should return an empty array when there are no session groups', async () => { const fetchedGroups = await SessionGroupModel.query(); expect(fetchedGroups).toEqual([]); }); it('should return session groups sorted by sort field when it exists', async () => { const group1 = await SessionGroupModel.create('group1', 2); const group2 = await SessionGroupModel.create('group2', 1); const fetchedGroups = await SessionGroupModel.query(); expect(fetchedGroups[0].id).toEqual(group2.id); expect(fetchedGroups[1].id).toEqual(group1.id); }); it('should return session groups sorted by createdAt when sort field does not exist', async () => { const group1 = await SessionGroupModel.create('group1'); await new Promise((resolve) => setTimeout(() => resolve(undefined), 300)); const group2 = await SessionGroupModel.create('group2'); const fetchedGroups = await SessionGroupModel.query(); expect(fetchedGroups[0].id).toEqual(group2.id); expect(fetchedGroups[1].id).toEqual(group1.id); }); it('should return session groups sorted by sort field first and then by createdAt', async () => { const group0 = await SessionGroupModel.create('group0'); await sleep(10); const group1 = await SessionGroupModel.create('group1', 1); await sleep(10); const group2 = await SessionGroupModel.create('group2'); await sleep(10); const group3 = await SessionGroupModel.create('group3', 2); await sleep(10); const fetchedGroups = await SessionGroupModel.query(); expect(fetchedGroups[0].id).toEqual(group1.id); expect(fetchedGroups[1].id).toEqual(group3.id); expect(fetchedGroups[2].id).toEqual(group2.id); expect(fetchedGroups[3].id).toEqual(group0.id); }); it('should return session groups sorted by sort ', async () => { const group1 = await SessionGroupModel.create('group1', 1); const group2 = await SessionGroupModel.create('group2'); const group3 = await SessionGroupModel.create('group3', 2); const fetchedGroups = await SessionGroupModel.query(); expect(fetchedGroups[0].id).toEqual(group1.id); expect(fetchedGroups[1].id).toEqual(group3.id); expect(fetchedGroups[2].id).toEqual(group2.id); }); it('should return session groups sorted by createdAt when sort fields are equal', async () => { const group1 = await SessionGroupModel.create('group1', 1); await new Promise((resolve) => setTimeout(() => resolve(undefined), 300)); const group2 = await SessionGroupModel.create('group2', 1); const fetchedGroups = await SessionGroupModel.query(); expect(fetchedGroups[0].id).toEqual(group2.id); expect(fetchedGroups[1].id).toEqual(group1.id); }); it('should sort session groups correctly when only b has a sort value', async () => { const groupA = await SessionGroupModel.create('groupA'); // sort undefined const groupB = await SessionGroupModel.create('groupB', 1); // sort defined const fetchedGroups = await SessionGroupModel.query(); expect(fetchedGroups[0].id).toEqual(groupB.id); expect(fetchedGroups[1].id).toEqual(groupA.id); }); }); describe('updateOrder', () => { it('should update the order of session groups', async () => { const group1 = await SessionGroupModel.create(sessionGroupData.name, sessionGroupData.sort); const group2 = await SessionGroupModel.create('another-group', 2); await SessionGroupModel.updateOrder([ { id: group1.id, sort: 2 }, { id: group2.id, sort: 1 }, ]); const fetchedGroups = await SessionGroupModel.query(); expect(fetchedGroups[0].id).toEqual(group2.id); expect(fetchedGroups[1].id).toEqual(group1.id); }); }); describe('findById', () => { it('should find a session group by id', async () => { const createdGroup = await SessionGroupModel.create( sessionGroupData.name, sessionGroupData.sort, ); const fetchedGroup = await SessionGroupModel.findById(createdGroup.id); expect(fetchedGroup).toMatchObject({ ...createdGroup, ...sessionGroupData }); }); }); describe('clear', () => { it('should clear all session groups', async () => { await SessionGroupModel.create(sessionGroupData.name, sessionGroupData.sort); const first = await SessionGroupModel.query(); expect(first).toHaveLength(1); await SessionGroupModel.clear(); const fetchedGroups = await SessionGroupModel.query(); expect(fetchedGroups).toHaveLength(0); }); }); });