84 lines
3.4 KiB
TypeScript
84 lines
3.4 KiB
TypeScript
import { describe, it, expect } from 'vitest';
|
|
import { RelativeTimeFormatter } from './RelativeTimeFormatter';
|
|
|
|
describe('RelativeTimeFormatter', () => {
|
|
describe('format', () => {
|
|
it('should return "Just now" for less than 1 hour ago', () => {
|
|
const now = new Date();
|
|
const thirtyMinutesAgo = new Date(now.getTime() - 30 * 60 * 1000);
|
|
const result = RelativeTimeFormatter.format(thirtyMinutesAgo, now);
|
|
expect(result).toBe('Just now');
|
|
});
|
|
|
|
it('should return "Xh ago" for less than 24 hours ago', () => {
|
|
const now = new Date();
|
|
const fiveHoursAgo = new Date(now.getTime() - 5 * 60 * 60 * 1000);
|
|
const result = RelativeTimeFormatter.format(fiveHoursAgo, now);
|
|
expect(result).toBe('5h ago');
|
|
});
|
|
|
|
it('should return "Yesterday" for exactly 1 day ago', () => {
|
|
const now = new Date();
|
|
const oneDayAgo = new Date(now.getTime() - 24 * 60 * 60 * 1000);
|
|
const result = RelativeTimeFormatter.format(oneDayAgo, now);
|
|
expect(result).toBe('Yesterday');
|
|
});
|
|
|
|
it('should return "Xd ago" for less than 7 days ago', () => {
|
|
const now = new Date();
|
|
const threeDaysAgo = new Date(now.getTime() - 3 * 24 * 60 * 60 * 1000);
|
|
const result = RelativeTimeFormatter.format(threeDaysAgo, now);
|
|
expect(result).toBe('3d ago');
|
|
});
|
|
|
|
it('should return absolute date for more than 7 days ago', () => {
|
|
const now = new Date('2026-01-24T23:49:00Z');
|
|
const tenDaysAgo = new Date('2026-01-14T23:49:00Z');
|
|
const result = RelativeTimeFormatter.format(tenDaysAgo, now);
|
|
expect(result).toBe('Jan 14');
|
|
});
|
|
|
|
it('should return "Starting soon" for less than 1 hour in the future', () => {
|
|
const now = new Date();
|
|
const thirtyMinutesFromNow = new Date(now.getTime() + 30 * 60 * 1000);
|
|
const result = RelativeTimeFormatter.format(thirtyMinutesFromNow, now);
|
|
expect(result).toBe('Starting soon');
|
|
});
|
|
|
|
it('should return "In Xh" for less than 24 hours in the future', () => {
|
|
const now = new Date();
|
|
const fiveHoursFromNow = new Date(now.getTime() + 5 * 60 * 60 * 1000);
|
|
const result = RelativeTimeFormatter.format(fiveHoursFromNow, now);
|
|
expect(result).toBe('In 5h');
|
|
});
|
|
|
|
it('should return "Tomorrow" for exactly 1 day in the future', () => {
|
|
const now = new Date();
|
|
const oneDayFromNow = new Date(now.getTime() + 24 * 60 * 60 * 1000);
|
|
const result = RelativeTimeFormatter.format(oneDayFromNow, now);
|
|
expect(result).toBe('Tomorrow');
|
|
});
|
|
|
|
it('should return "In X days" for less than 7 days in the future', () => {
|
|
const now = new Date();
|
|
const threeDaysFromNow = new Date(now.getTime() + 3 * 24 * 60 * 60 * 1000);
|
|
const result = RelativeTimeFormatter.format(threeDaysFromNow, now);
|
|
expect(result).toBe('In 3 days');
|
|
});
|
|
|
|
it('should return absolute date for more than 7 days in the future', () => {
|
|
const now = new Date('2026-01-24T23:49:00Z');
|
|
const tenDaysFromNow = new Date('2026-02-03T23:49:00Z');
|
|
const result = RelativeTimeFormatter.format(tenDaysFromNow, now);
|
|
expect(result).toBe('Feb 3');
|
|
});
|
|
|
|
it('should handle string input', () => {
|
|
const now = new Date();
|
|
const thirtyMinutesAgo = new Date(now.getTime() - 30 * 60 * 1000);
|
|
const result = RelativeTimeFormatter.format(thirtyMinutesAgo.toISOString(), now);
|
|
expect(result).toBe('Just now');
|
|
});
|
|
});
|
|
});
|