// __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}$/) }) })