@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.
143 lines (112 loc) • 3.87 kB
text/typescript
import dayjs from 'dayjs';
import { beforeAll, describe, expect, it } from 'vitest';
import { ChatTopic } from '@/types/topic';
import { groupTopicsByTime } from './topic';
// Mock current date to ensure consistent test results
const NOW = '2024-01-15T12:00:00Z';
beforeAll(() => {
// Mock the current date
vi.useFakeTimers();
vi.setSystemTime(new Date(NOW));
});
describe('groupTopicsByTime', () => {
afterAll(() => {
vi.useRealTimers();
});
// Helper function to create test topics
const createTopic = (createdAt: number, title: string = 'Test Topic'): ChatTopic => ({
id: createdAt.toString(),
title,
createdAt,
updatedAt: createdAt,
});
it('should return empty array for empty input', () => {
expect(groupTopicsByTime([])).toEqual([]);
});
it('should group topics created today', () => {
const today = dayjs().valueOf();
const topics = [createTopic(today)];
const result = groupTopicsByTime(topics);
expect(result).toHaveLength(1);
expect(result[0]).toEqual({
id: 'today',
children: topics,
});
});
it('should group topics created yesterday', () => {
const yesterday = dayjs().subtract(1, 'day').valueOf();
const topics = [createTopic(yesterday)];
const result = groupTopicsByTime(topics);
expect(result).toHaveLength(1);
expect(result[0]).toEqual({
id: 'yesterday',
children: topics,
});
});
it('should group topics created within the week', () => {
const threeDaysAgo = dayjs().subtract(3, 'day').valueOf();
const topics = [createTopic(threeDaysAgo)];
const result = groupTopicsByTime(topics);
expect(result).toHaveLength(1);
expect(result[0]).toEqual({
id: 'week',
children: topics,
});
});
it('should group topics created this month', () => {
const thisMonth = dayjs().startOf('month').add(1, 'day').valueOf();
const topics = [createTopic(thisMonth)];
const result = groupTopicsByTime(topics);
expect(result).toHaveLength(1);
expect(result[0]).toEqual({
id: 'month',
children: topics,
});
});
it('should group topics from previous years', () => {
const lastYear = dayjs().subtract(1, 'year').valueOf();
const topics = [createTopic(lastYear)];
const result = groupTopicsByTime(topics);
expect(result).toHaveLength(1);
expect(result[0]).toEqual({
id: dayjs(lastYear).year().toString(),
children: topics,
});
});
it('should sort groups in correct order', () => {
const today = dayjs().valueOf();
const yesterday = dayjs().subtract(1, 'day').valueOf();
const lastWeek = dayjs().subtract(5, 'day').valueOf();
const lastMonth = dayjs().subtract(1, 'month').valueOf();
const lastYear = dayjs().subtract(1, 'year').valueOf();
const topics = [
createTopic(lastYear, 'Last Year'),
createTopic(lastMonth, 'Last Month'),
createTopic(lastWeek, 'Last Week'),
createTopic(yesterday, 'Yesterday'),
createTopic(today, 'Today'),
];
const result = groupTopicsByTime(topics);
// Verify order of groups
expect(result.map((g) => g.id)).toEqual([
'today',
'yesterday',
'week',
dayjs(lastYear).year().toString(),
]);
});
it('should sort topics within groups by createdAt in descending order', () => {
const today1 = dayjs().hour(9).valueOf();
const today2 = dayjs().hour(10).valueOf();
const today3 = dayjs().hour(11).valueOf();
const topics = [
createTopic(today1, 'Morning'),
createTopic(today2, 'Midday'),
createTopic(today3, 'Afternoon'),
];
const result = groupTopicsByTime(topics);
expect(result).toHaveLength(1);
expect(result[0].id).toBe('today');
expect(result[0].children.map((t) => t.title)).toEqual(['Afternoon', 'Midday', 'Morning']);
});
});