import { describe, expect, it, jest } from "@jest/globals"; import SuperSimpleQueueHelper from "../src/service/infrastructure/SuperSimpleQueue/SuperSimpleQueueHelper.ts"; import type { Monitor } from "../src/types/monitor.ts"; const createLogger = () => ({ info: jest.fn(), error: jest.fn(), warn: jest.fn() }); const createHelper = (overrides?: Partial[0]>) => { const maintenanceWindowModule = { getMaintenanceWindowsByMonitorId: jest.fn().mockResolvedValue([]), }; const helper = new SuperSimpleQueueHelper({ db: { maintenanceWindowModule }, logger: createLogger(), networkService: { requestStatus: jest.fn() }, statusService: { updateStatus: jest.fn() }, notificationService: { handleNotifications: jest.fn().mockResolvedValue(undefined) }, ...overrides, }); return { helper, maintenanceWindowModule }; }; describe("SuperSimpleQueueHelper", () => { describe("getMonitorJob", () => { it("skips execution when monitor is in maintenance window", async () => { const { helper } = createHelper(); const spy = jest.spyOn(helper, "isInMaintenanceWindow").mockResolvedValue(true); const job = helper.getMonitorJob(); await job({ id: "m1", teamId: "team", interval: 60000 } as Monitor); expect(helper["networkService"].requestStatus).not.toHaveBeenCalled(); expect(helper["logger"].info).toHaveBeenCalledWith( expect.objectContaining({ message: expect.stringContaining("Monitor m1 is in maintenance window") }) ); spy.mockRestore(); }); it("processes monitor status and notifications when active", async () => { const networkResponse = { monitor: { id: "m1" }, status: true }; const updatedMonitor = { id: "m1", status: true }; const { helper } = createHelper({ networkService: { requestStatus: jest.fn().mockResolvedValue(networkResponse) }, statusService: { updateStatus: jest.fn().mockResolvedValue({ monitor: updatedMonitor, statusChanged: true, prevStatus: false }), }, notificationService: { handleNotifications: jest.fn().mockResolvedValue(undefined) }, }); jest.spyOn(helper, "isInMaintenanceWindow").mockResolvedValue(false); const job = helper.getMonitorJob(); const monitor = { id: "m1", teamId: "team" } as Monitor; await job(monitor); expect(helper["networkService"].requestStatus).toHaveBeenCalledWith(monitor); expect(helper["statusService"].updateStatus).toHaveBeenCalledWith(networkResponse); expect(helper["notificationService"].handleNotifications).toHaveBeenCalledWith( expect.objectContaining({ monitor: updatedMonitor, statusChanged: true, prevStatus: false }) ); }); it("throws when monitor id is missing", async () => { const { helper } = createHelper(); const job = helper.getMonitorJob(); await expect(job({} as Monitor)).rejects.toThrow("No monitor id"); expect(helper["logger"].warn).toHaveBeenCalled(); }); }); describe("isInMaintenanceWindow", () => { it("returns true when an active window spans now", async () => { const now = new Date(); const { helper, maintenanceWindowModule } = createHelper(); maintenanceWindowModule.getMaintenanceWindowsByMonitorId.mockResolvedValue([ { active: true, start: new Date(now.getTime() - 1000).toISOString(), end: new Date(now.getTime() + 1000).toISOString(), repeat: 0, }, ]); await expect(helper.isInMaintenanceWindow("m1", "team")).resolves.toBe(true); }); it("returns true when repeat interval advances window into current time", async () => { const now = Date.now(); const { helper, maintenanceWindowModule } = createHelper(); maintenanceWindowModule.getMaintenanceWindowsByMonitorId.mockResolvedValue([ { active: true, start: new Date(now - 7200000).toISOString(), end: new Date(now - 6600000).toISOString(), repeat: 3600000, }, ]); await expect(helper.isInMaintenanceWindow("m1", "team")).resolves.toBe(true); }); it("returns false when no active windows exist", async () => { const { helper } = createHelper(); await expect(helper.isInMaintenanceWindow("m1", "team")).resolves.toBe(false); }); }); });