88 lines
3.0 KiB
TypeScript
88 lines
3.0 KiB
TypeScript
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);
|
|
});
|
|
});
|