Files
knowai/test/unit/utils/date.test.ts
tobegold574 6a81b7bb13
Some checks reported errors
continuous-integration/drone/push Build was killed
feat(image): 新建 knowai-core:1.0.0 镜像并完成推送
- 搭建 api、auth、utils 等逻辑模块
- 通过 tsc、eslint、vitest 测试验证

BREAKING CHANGE: 新镜像分支
2025-11-10 20:20:25 +08:00

158 lines
5.9 KiB
TypeScript

import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
import { dateUtils } from '@/utils/date';
describe('dateUtils', () => {
// 模拟当前时间
const mockCurrentDate = new Date('2023-05-15T12:00:00Z');
beforeEach(() => {
// 使用 vi.useFakeTimers 模拟当前时间
vi.useFakeTimers();
vi.setSystemTime(mockCurrentDate);
});
afterEach(() => {
// 恢复真实时间
vi.useRealTimers();
});
describe('formatDate', () => {
it('应该格式化日期对象', () => {
const date = new Date('2023-05-15T10:30:45Z');
expect(dateUtils.formatDate(date, 'YYYY-MM-DD')).toBe('2023-05-15');
expect(dateUtils.formatDate(date, 'YYYY-MM-DD HH:mm:ss')).toBe('2023-05-15 10:30:45');
});
it('应该格式化日期字符串', () => {
const dateString = '2023-05-15T10:30:45Z';
expect(dateUtils.formatDate(dateString, 'YYYY-MM-DD')).toBe('2023-05-15');
expect(dateUtils.formatDate(dateString, 'YYYY-MM-DD HH:mm')).toBe('2023-05-15 10:30');
});
it('应该使用默认格式', () => {
const date = new Date('2023-05-15T10:30:45Z');
expect(dateUtils.formatDate(date)).toBe('2023-05-15');
});
it('应该处理无效日期', () => {
const invalidDate = new Date('invalid');
expect(dateUtils.formatDate(invalidDate)).toBe('');
expect(dateUtils.formatDate('invalid date')).toBe('');
});
it('应该正确格式化单个数字的月份和日期', () => {
const date = new Date('2023-01-02T03:04:05Z');
expect(dateUtils.formatDate(date, 'YYYY-MM-DD HH:mm:ss')).toBe('2023-01-02 03:04:05');
});
});
describe('getRelativeTime', () => {
it('应该显示"刚刚"对于几秒前的时间', () => {
const date = new Date(mockCurrentDate.getTime() - 30 * 1000); // 30秒前
expect(dateUtils.getRelativeTime(date)).toBe('刚刚');
});
it('应该显示"X分钟前"对于几分钟前的时间', () => {
const date = new Date(mockCurrentDate.getTime() - 5 * 60 * 1000); // 5分钟前
expect(dateUtils.getRelativeTime(date)).toBe('5分钟前');
});
it('应该显示"X小时前"对于几小时前的时间', () => {
const date = new Date(mockCurrentDate.getTime() - 3 * 60 * 60 * 1000); // 3小时前
expect(dateUtils.getRelativeTime(date)).toBe('3小时前');
});
it('应该显示"X天前"对于几天前的时间', () => {
const date = new Date(mockCurrentDate.getTime() - 5 * 24 * 60 * 60 * 1000); // 5天前
expect(dateUtils.getRelativeTime(date)).toBe('5天前');
});
it('应该显示"X周前"对于几周前的时间', () => {
const date = new Date(mockCurrentDate.getTime() - 2 * 7 * 24 * 60 * 60 * 1000); // 2周前
expect(dateUtils.getRelativeTime(date)).toBe('2周前');
});
it('应该显示"X个月前"对于几个月前的时间', () => {
const date = new Date(mockCurrentDate.getTime() - 3 * 30 * 24 * 60 * 60 * 1000); // 3个月前
expect(dateUtils.getRelativeTime(date)).toBe('3个月前');
});
it('应该显示"X年前"对于几年前的时间', () => {
const date = new Date(mockCurrentDate.getTime() - 2 * 365 * 24 * 60 * 60 * 1000); // 2年前
expect(dateUtils.getRelativeTime(date)).toBe('2年前');
});
it('应该返回绝对时间对于未来的时间', () => {
const futureDate = new Date(mockCurrentDate.getTime() + 24 * 60 * 60 * 1000); // 1天后
expect(dateUtils.getRelativeTime(futureDate)).toBe('2023-05-16 12:00');
});
it('应该处理字符串日期', () => {
const dateString = '2023-05-14T12:00:00Z'; // 1天前
expect(dateUtils.getRelativeTime(dateString)).toBe('1天前');
});
});
describe('isToday', () => {
it('应该识别今天的日期', () => {
const today = new Date(mockCurrentDate);
expect(dateUtils.isToday(today)).toBe(true);
});
it('应该识别不是今天的日期', () => {
const yesterday = new Date(mockCurrentDate.getTime() - 24 * 60 * 60 * 1000);
const tomorrow = new Date(mockCurrentDate.getTime() + 24 * 60 * 60 * 1000);
expect(dateUtils.isToday(yesterday)).toBe(false);
expect(dateUtils.isToday(tomorrow)).toBe(false);
});
it('应该处理字符串日期', () => {
const todayString = mockCurrentDate.toISOString();
expect(dateUtils.isToday(todayString)).toBe(true);
});
it('应该处理不同时间但同一天的日期', () => {
const morning = new Date(mockCurrentDate);
morning.setHours(0, 0, 0, 0);
const evening = new Date(mockCurrentDate);
evening.setHours(23, 59, 59, 999);
expect(dateUtils.isToday(morning)).toBe(true);
expect(dateUtils.isToday(evening)).toBe(true);
});
});
describe('isYesterday', () => {
it('应该识别昨天的日期', () => {
const yesterday = new Date(mockCurrentDate.getTime() - 24 * 60 * 60 * 1000);
expect(dateUtils.isYesterday(yesterday)).toBe(true);
});
it('应该识别不是昨天的日期', () => {
const today = new Date(mockCurrentDate);
const twoDaysAgo = new Date(mockCurrentDate.getTime() - 2 * 24 * 60 * 60 * 1000);
expect(dateUtils.isYesterday(today)).toBe(false);
expect(dateUtils.isYesterday(twoDaysAgo)).toBe(false);
});
it('应该处理字符串日期', () => {
const yesterdayString = new Date(mockCurrentDate.getTime() - 24 * 60 * 60 * 1000).toISOString();
expect(dateUtils.isYesterday(yesterdayString)).toBe(true);
});
it('应该处理不同时间但昨天的日期', () => {
const yesterdayMorning = new Date(mockCurrentDate.getTime() - 24 * 60 * 60 * 1000);
yesterdayMorning.setHours(0, 0, 0, 0);
const yesterdayEvening = new Date(mockCurrentDate.getTime() - 24 * 60 * 60 * 1000);
yesterdayEvening.setHours(23, 59, 59, 999);
expect(dateUtils.isYesterday(yesterdayMorning)).toBe(true);
expect(dateUtils.isYesterday(yesterdayEvening)).toBe(true);
});
});
});