import { NotificationJobStatus } from "../NotificationJobs.Interface"; const mockCreate = jest.fn(); const mockCancelByAppointment = jest.fn(); const mockFindByAppointment = jest.fn(); const mockDeleteOldJobs = jest.fn(); jest.mock("../NotificationJobs.Adapter.Mongoose", () => ({ NotificationJobsAdapterMongoose: jest.fn().mockImplementation(() => ({ create: mockCreate, cancelByAppointment: mockCancelByAppointment, findByAppointment: mockFindByAppointment, deleteOldJobs: mockDeleteOldJobs, })), })); describe("NotificationJobManager cleanup", () => { const loadNotificationJobsList = () => { jest.isolateModules(() => { // eslint-disable-next-line @typescript-eslint/no-var-requires require("../NotificationJobs"); }); // eslint-disable-next-line @typescript-eslint/no-var-requires return require("../NotificationJobs").default; }; beforeEach(() => { jest.resetModules(); jest.clearAllMocks(); jest.useFakeTimers().setSystemTime(new Date("2026-07-29T12:00:00.000Z")); mockCreate.mockResolvedValue({ id: "job-1" }); mockCancelByAppointment.mockResolvedValue(undefined); mockFindByAppointment.mockResolvedValue([]); mockDeleteOldJobs.mockResolvedValue({ deletedCount: 0 }); }); afterEach(() => { jest.useRealTimers(); }); it("deletes only completed old jobs before creating a job", async () => { const NotificationJobsList = loadNotificationJobsList(); await NotificationJobsList.createJob({ companyId: "company-1", appointmentId: "appointment-1", clientId: "client-1", channel: "email", type: "creation", scheduledAt: new Date("2026-07-29T12:30:00.000Z"), }); expect(mockDeleteOldJobs).toHaveBeenCalledWith({ scheduledBefore: new Date("2026-07-22T12:00:00.000Z"), statuses: [ NotificationJobStatus.SENT, NotificationJobStatus.FAILED, NotificationJobStatus.CANCELLED, ], }); expect(mockCreate).toHaveBeenCalledTimes(1); }); it("throttles cleanup across manager operations", async () => { const NotificationJobsList = loadNotificationJobsList(); await NotificationJobsList.createJob({ companyId: "company-1", appointmentId: "appointment-1", clientId: "client-1", channel: "email", type: "creation", scheduledAt: new Date("2026-07-29T12:30:00.000Z"), }); await NotificationJobsList.cancelByAppointment("appointment-1"); await NotificationJobsList.findByAppointment("appointment-1"); expect(mockDeleteOldJobs).toHaveBeenCalledTimes(1); jest.setSystemTime(new Date("2026-07-29T13:00:00.000Z")); await NotificationJobsList.findByAppointment("appointment-1"); expect(mockDeleteOldJobs).toHaveBeenCalledTimes(2); }); });