issue-ai/__tests__/monitor/availability-engine.test.ts

48 lines
1.7 KiB
TypeScript

// __tests__/monitor/availability-engine.test.ts
import { AvailabilityEngine } from '../../src/lib/monitor/availability-engine'
// Mock getDb
jest.mock('../../src/lib/db', () => ({
getDb: () => ({
prepare: () => ({
get: () => ({ total: 0 }),
all: () => [],
run: () => {},
}),
}),
}))
describe('AvailabilityEngine', () => {
const engine = new AvailabilityEngine()
it('should calculate days in month correctly', () => {
expect(engine.getDaysInMonth('2026-03')).toBe(31)
expect(engine.getDaysInMonth('2026-02')).toBe(28)
expect(engine.getDaysInMonth('2026-04')).toBe(30)
})
it('should calculate OEM diag deadline (first tier only)', () => {
const deadline = engine.calculateOemDiagDeadline('2026-03', '2026-03-10 16:44:01')
expect(deadline).toBeTruthy()
// 31 days = 2678400 seconds, 1% = 26784 seconds ≈ 7.44 hours
const fault = new Date('2026-03-10T16:44:01+08:00')
const deadlineStr = deadline as string
const deadlineDate = new Date(deadlineStr.replace(' ', 'T') + '+08:00')
const diffHours = (deadlineDate.getTime() - fault.getTime()) / (1000 * 3600)
expect(diffHours).toBeCloseTo(7.44, 1)
})
it('should calculate tier deadlines', () => {
const deadlines = engine.calculateTierDeadlines('2026-03', 'SN123', '2026-03-10 16:44:01')
expect(deadlines['第一档']).toBeTruthy()
expect(deadlines['第一档'].deadline).not.toBe('已超出')
expect(deadlines['第一档'].hours).toBeGreaterThan(0)
})
it('should format deadline in UTC+8', () => {
const deadline = engine.calculateOemDiagDeadline('2026-03', '2026-03-10 16:44:01')
// 应该是 UTC+8 格式,不是 UTC
expect(deadline).toMatch(/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/)
})
})