@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.
151 lines (123 loc) • 5.02 kB
text/typescript
// @vitest-environment node
import { eq } from 'drizzle-orm/expressions';
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
import { LobeChatDatabase } from '@/database/type';
import { sessionGroups, users } from '../../schemas';
import { SessionGroupModel } from '../sessionGroup';
import { getTestDB } from './_util';
const serverDB: LobeChatDatabase = await getTestDB();
const userId = 'session-group-model-test-user-id';
const sessionGroupModel = new SessionGroupModel(serverDB, userId);
beforeEach(async () => {
await serverDB.delete(users);
await serverDB.insert(users).values([{ id: userId }, { id: 'user2' }]);
});
afterEach(async () => {
await serverDB.delete(users).where(eq(users.id, userId));
await serverDB.delete(sessionGroups).where(eq(sessionGroups.userId, userId));
});
describe('SessionGroupModel', () => {
describe('create', () => {
it('should create a new session group', async () => {
const params = {
name: 'Test Group',
sort: 1,
};
const result = await sessionGroupModel.create(params);
expect(result.id).toBeDefined();
expect(result).toMatchObject({ ...params, userId });
const group = await serverDB.query.sessionGroups.findFirst({
where: eq(sessionGroups.id, result.id),
});
expect(group).toMatchObject({ ...params, userId });
});
});
describe('delete', () => {
it('should delete a session group by id', async () => {
const { id } = await sessionGroupModel.create({ name: 'Test Group' });
await sessionGroupModel.delete(id);
const group = await serverDB.query.sessionGroups.findFirst({
where: eq(sessionGroups.id, id),
});
expect(group).toBeUndefined();
});
});
describe('deleteAll', () => {
it('should delete all session groups for the user', async () => {
await sessionGroupModel.create({ name: 'Test Group 1' });
await sessionGroupModel.create({ name: 'Test Group 2' });
await sessionGroupModel.deleteAll();
const userGroups = await serverDB.query.sessionGroups.findMany({
where: eq(sessionGroups.userId, userId),
});
expect(userGroups).toHaveLength(0);
});
it('should only delete session groups for the user, not others', async () => {
await sessionGroupModel.create({ name: 'Test Group 1' });
await sessionGroupModel.create({ name: 'Test Group 333' });
const anotherSessionGroupModel = new SessionGroupModel(serverDB, 'user2');
await anotherSessionGroupModel.create({ name: 'Test Group 2' });
await sessionGroupModel.deleteAll();
const userGroups = await serverDB.query.sessionGroups.findMany({
where: eq(sessionGroups.userId, userId),
});
const total = await serverDB.query.sessionGroups.findMany();
expect(userGroups).toHaveLength(0);
expect(total).toHaveLength(1);
});
});
describe('query', () => {
it('should query session groups for the user', async () => {
await sessionGroupModel.create({ name: 'Test Group 1', sort: 2 });
await sessionGroupModel.create({ name: 'Test Group 2', sort: 1 });
const userGroups = await sessionGroupModel.query();
expect(userGroups).toHaveLength(2);
expect(userGroups[0].name).toBe('Test Group 2');
expect(userGroups[1].name).toBe('Test Group 1');
});
});
describe('findById', () => {
it('should find a session group by id', async () => {
const { id } = await sessionGroupModel.create({ name: 'Test Group' });
const group = await sessionGroupModel.findById(id);
expect(group).toMatchObject({
id,
name: 'Test Group',
userId,
});
});
});
describe('update', () => {
it('should update a session group', async () => {
const { id } = await sessionGroupModel.create({ name: 'Test Group' });
await sessionGroupModel.update(id, { name: 'Updated Test Group', sort: 3 });
const updatedGroup = await serverDB.query.sessionGroups.findFirst({
where: eq(sessionGroups.id, id),
});
expect(updatedGroup).toMatchObject({
id,
name: 'Updated Test Group',
sort: 3,
userId,
});
});
});
describe('updateOrder', () => {
it('should update order of session groups', async () => {
const group1 = await sessionGroupModel.create({ name: 'Test Group 1', sort: 1 });
const group2 = await sessionGroupModel.create({ name: 'Test Group 2', sort: 2 });
await sessionGroupModel.updateOrder([
{ id: group1.id, sort: 3 },
{ id: group2.id, sort: 4 },
]);
const updatedGroup1 = await serverDB.query.sessionGroups.findFirst({
where: eq(sessionGroups.id, group1.id),
});
const updatedGroup2 = await serverDB.query.sessionGroups.findFirst({
where: eq(sessionGroups.id, group2.id),
});
expect(updatedGroup1?.sort).toBe(3);
expect(updatedGroup2?.sort).toBe(4);
});
});
});