ci: use self-hosted runner, add filter/date/client tests
This commit is contained in:
149
lib/utils/__tests__/formatDate.test.ts
Normal file
149
lib/utils/__tests__/formatDate.test.ts
Normal file
@@ -0,0 +1,149 @@
|
||||
import { describe, it, expect, vi, afterEach } from 'vitest'
|
||||
import {
|
||||
formatDate,
|
||||
formatDateShort,
|
||||
formatDateTime,
|
||||
formatTime,
|
||||
formatMonth,
|
||||
formatDateISO,
|
||||
formatDateFull,
|
||||
formatDateTimeFull,
|
||||
formatDateLong,
|
||||
formatRelativeTime,
|
||||
formatDateTimeShort,
|
||||
} from '../formatDate'
|
||||
|
||||
// Fixed date: Friday 14 March 2025, 14:30:00 UTC
|
||||
const date = new Date('2025-03-14T14:30:00Z')
|
||||
|
||||
describe('formatDate', () => {
|
||||
it('returns day-first format with short month', () => {
|
||||
const result = formatDate(date)
|
||||
expect(result).toContain('14')
|
||||
expect(result).toContain('Mar')
|
||||
expect(result).toContain('2025')
|
||||
})
|
||||
})
|
||||
|
||||
describe('formatDateShort', () => {
|
||||
it('omits year when same as current year', () => {
|
||||
const now = new Date()
|
||||
const sameYear = new Date(`${now.getFullYear()}-06-15T10:00:00Z`)
|
||||
const result = formatDateShort(sameYear)
|
||||
expect(result).toContain('15')
|
||||
expect(result).toContain('Jun')
|
||||
expect(result).not.toContain(String(now.getFullYear()))
|
||||
})
|
||||
|
||||
it('includes year when different from current year', () => {
|
||||
const oldDate = new Date('2020-06-15T10:00:00Z')
|
||||
const result = formatDateShort(oldDate)
|
||||
expect(result).toContain('2020')
|
||||
})
|
||||
})
|
||||
|
||||
describe('formatDateTime', () => {
|
||||
it('includes date and 24-hour time', () => {
|
||||
const result = formatDateTime(date)
|
||||
expect(result).toContain('14')
|
||||
expect(result).toContain('Mar')
|
||||
expect(result).toContain('2025')
|
||||
// 24-hour format check: should contain 14:30 (UTC) or local equivalent
|
||||
expect(result).toMatch(/\d{2}:\d{2}/)
|
||||
})
|
||||
})
|
||||
|
||||
describe('formatTime', () => {
|
||||
it('returns HH:MM in 24-hour format', () => {
|
||||
const result = formatTime(date)
|
||||
expect(result).toMatch(/^\d{2}:\d{2}$/)
|
||||
})
|
||||
})
|
||||
|
||||
describe('formatMonth', () => {
|
||||
it('returns full month name and year', () => {
|
||||
const result = formatMonth(date)
|
||||
expect(result).toContain('March')
|
||||
expect(result).toContain('2025')
|
||||
})
|
||||
})
|
||||
|
||||
describe('formatDateISO', () => {
|
||||
it('returns YYYY-MM-DD format', () => {
|
||||
expect(formatDateISO(date)).toBe('2025-03-14')
|
||||
})
|
||||
})
|
||||
|
||||
describe('formatDateFull', () => {
|
||||
it('includes weekday', () => {
|
||||
const result = formatDateFull(date)
|
||||
expect(result).toContain('Fri')
|
||||
expect(result).toContain('14')
|
||||
expect(result).toContain('Mar')
|
||||
expect(result).toContain('2025')
|
||||
})
|
||||
})
|
||||
|
||||
describe('formatDateTimeFull', () => {
|
||||
it('includes weekday and time', () => {
|
||||
const result = formatDateTimeFull(date)
|
||||
expect(result).toContain('Fri')
|
||||
expect(result).toMatch(/\d{2}:\d{2}/)
|
||||
})
|
||||
})
|
||||
|
||||
describe('formatDateLong', () => {
|
||||
it('uses full month name', () => {
|
||||
const result = formatDateLong(date)
|
||||
expect(result).toContain('March')
|
||||
expect(result).toContain('2025')
|
||||
expect(result).toContain('14')
|
||||
})
|
||||
})
|
||||
|
||||
describe('formatRelativeTime', () => {
|
||||
afterEach(() => {
|
||||
vi.useRealTimers()
|
||||
})
|
||||
|
||||
it('returns "Just now" for times less than a minute ago', () => {
|
||||
vi.useFakeTimers()
|
||||
vi.setSystemTime(new Date('2025-03-14T14:30:30Z'))
|
||||
expect(formatRelativeTime('2025-03-14T14:30:00Z')).toBe('Just now')
|
||||
})
|
||||
|
||||
it('returns minutes ago', () => {
|
||||
vi.useFakeTimers()
|
||||
vi.setSystemTime(new Date('2025-03-14T14:35:00Z'))
|
||||
expect(formatRelativeTime('2025-03-14T14:30:00Z')).toBe('5m ago')
|
||||
})
|
||||
|
||||
it('returns hours ago', () => {
|
||||
vi.useFakeTimers()
|
||||
vi.setSystemTime(new Date('2025-03-14T16:30:00Z'))
|
||||
expect(formatRelativeTime('2025-03-14T14:30:00Z')).toBe('2h ago')
|
||||
})
|
||||
|
||||
it('returns days ago', () => {
|
||||
vi.useFakeTimers()
|
||||
vi.setSystemTime(new Date('2025-03-17T14:30:00Z'))
|
||||
expect(formatRelativeTime('2025-03-14T14:30:00Z')).toBe('3d ago')
|
||||
})
|
||||
|
||||
it('falls back to short date after 7 days', () => {
|
||||
vi.useFakeTimers()
|
||||
vi.setSystemTime(new Date('2025-03-25T14:30:00Z'))
|
||||
const result = formatRelativeTime('2025-03-14T14:30:00Z')
|
||||
expect(result).toContain('14')
|
||||
expect(result).toContain('Mar')
|
||||
})
|
||||
})
|
||||
|
||||
describe('formatDateTimeShort', () => {
|
||||
it('includes date and time', () => {
|
||||
const result = formatDateTimeShort(date)
|
||||
expect(result).toContain('14')
|
||||
expect(result).toContain('Mar')
|
||||
expect(result).toMatch(/\d{2}:\d{2}/)
|
||||
})
|
||||
})
|
||||
Reference in New Issue
Block a user