allinssl/frontend/packages/utils/test/date.spec.ts

124 lines
4.2 KiB
TypeScript

import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest'
import * as dateUtils from '../src/date'
describe('日期处理工具函数测试', () => {
describe('formatDate', () => {
it('应当正确格式化日期字符串', () => {
const date = new Date('2024-02-27 14:30:45')
expect(dateUtils.formatDate(date)).toBe('2024-02-27 14:30:45')
expect(dateUtils.formatDate(date, 'YYYY-MM-DD')).toBe('2024-02-27')
expect(dateUtils.formatDate(date, 'HH:mm:ss')).toBe('14:30:45')
})
it('应当正确处理单位数的月日时分秒', () => {
const date = new Date('2024-01-05 09:05:08')
expect(dateUtils.formatDate(date)).toBe('2024-01-05 09:05:08')
})
})
describe('getDaysDiff', () => {
it('应当正确计算两个日期之间的天数差', () => {
const start = new Date('2024-02-27')
const end = new Date('2024-03-01')
expect(dateUtils.getDaysDiff(start, end)).toBe(3)
})
it('应当正确处理同一天的情况', () => {
const date = new Date('2024-02-27')
expect(dateUtils.getDaysDiff(date, date)).toBe(0)
})
})
describe('isDateInRange', () => {
it('应当正确判断日期是否在范围内', () => {
const start = new Date('2024-02-01')
const end = new Date('2024-02-29')
const date = new Date('2024-02-15')
expect(dateUtils.isDateInRange(date, start, end)).toBe(true)
})
it('应当正确处理边界情况', () => {
const start = new Date('2024-02-01')
const end = new Date('2024-02-29')
expect(dateUtils.isDateInRange(start, start, end)).toBe(true)
expect(dateUtils.isDateInRange(end, start, end)).toBe(true)
})
it('应当正确处理范围外的情况', () => {
const start = new Date('2024-02-01')
const end = new Date('2024-02-29')
const before = new Date('2024-01-31')
const after = new Date('2024-03-01')
expect(dateUtils.isDateInRange(before, start, end)).toBe(false)
expect(dateUtils.isDateInRange(after, start, end)).toBe(false)
})
})
describe('getStartOfDay和getEndOfDay', () => {
it('应当正确获取一天的开始时间', () => {
const date = new Date('2024-02-27 14:30:45')
const start = dateUtils.getStartOfDay(date)
expect(start.getHours()).toBe(0)
expect(start.getMinutes()).toBe(0)
expect(start.getSeconds()).toBe(0)
})
it('应当正确获取一天的结束时间', () => {
const date = new Date('2024-02-27 14:30:45')
const end = dateUtils.getEndOfDay(date)
expect(end.getHours()).toBe(23)
expect(end.getMinutes()).toBe(59)
expect(end.getSeconds()).toBe(59)
})
})
describe('addDays', () => {
it('应当正确添加天数', () => {
const date = new Date('2024-02-27')
expect(dateUtils.addDays(1, date).toDateString()).toBe(new Date('2024-02-28').toDateString())
expect(dateUtils.addDays(-1, date).toDateString()).toBe(new Date('2024-02-26').toDateString())
})
})
describe('formatRelativeTime', () => {
beforeEach(() => {
// 固定当前时间为2024-02-27 14:30:00
vi.useFakeTimers()
vi.setSystemTime(new Date('2024-02-27 14:30:00'))
})
afterEach(() => {
vi.useRealTimers()
})
it('应当正确格式化相对时间', () => {
expect(dateUtils.formatRelativeTime(new Date('2024-02-27 14:29:30'))).toBe('刚刚')
expect(dateUtils.formatRelativeTime(new Date('2024-02-27 14:25:00'))).toBe('5分钟前')
expect(dateUtils.formatRelativeTime(new Date('2024-02-27 13:30:00'))).toBe('1小时前')
expect(dateUtils.formatRelativeTime(new Date('2024-02-26 14:30:00'))).toBe('1天前')
expect(dateUtils.formatRelativeTime(new Date('2024-01-27 14:30:00'))).toBe('2024-01-27')
})
})
describe('getDayOfWeek', () => {
it('应当正确获取星期几', () => {
expect(dateUtils.getDayOfWeek(new Date('2024-02-27'))).toBe('星期二')
expect(dateUtils.getDayOfWeek(new Date('2024-02-25'))).toBe('星期日')
})
})
describe('getDaysUntilExpiration', () => {
it('应当正确计算到期天数', () => {
const current = new Date('2024-02-27')
const future = new Date('2024-03-01')
expect(dateUtils.getDaysUntilExpiration(current, future)).toBe('3天')
})
it('应当正确处理已过期情况', () => {
const current = new Date('2024-02-27')
const past = new Date('2024-02-26')
expect(dateUtils.getDaysUntilExpiration(current, past)).toBe('已过期')
})
})
})