mirror of
https://github.com/bluewave-labs/Checkmate.git
synced 2026-05-14 21:48:39 -05:00
100 lines
4.1 KiB
TypeScript
100 lines
4.1 KiB
TypeScript
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<ConstructorParameters<typeof SuperSimpleQueueHelper>[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);
|
|
});
|
|
});
|
|
});
|