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); }); }); });