48 lines
1.7 KiB
TypeScript
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}$/)
|
|
})
|
|
})
|