* refactor: convert checkBookingLimits to class service with dependency injection - Create CheckBookingLimitsService class following AvailableSlotsService pattern - Add countBookingsByEventTypeAndDateRange method to BookingRepository - Move direct prisma calls from service to repository layer - Implement dependency injection with proper DI tokens and modules - Update all usage points to use the new service through DI - Maintain backward compatibility with error-throwing wrapper functions - Update tests to use the new service pattern - Resolve TODO comment in AvailableSlotsService for DI integration Co-Authored-By: morgan@cal.com <morgan@cal.com> * chore: DI CheckBookingLimitsService in v2 slots service * chore: bump libraries * chore: create getCheckBookingLimitsService * refactor: convert checkBookingAndDurationLimits to service class with DI - Create CheckBookingAndDurationLimitsService class following DI pattern - Add DI tokens and module for the new service - Update booking-limits container to provide the new service - Refactor handleNewBooking.ts to use service through DI - Maintain backward compatibility with deprecated function export - Preserve all existing functionality while improving code organization Co-Authored-By: morgan@cal.com <morgan@cal.com> * chore: CheckBookingAndDurationLimitsService * chore: bump platform libs --------- Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Co-authored-by: morgan@cal.com <morgan@cal.com> Co-authored-by: Morgan <33722304+ThyMinimalDev@users.noreply.github.com>
110 lines
3.3 KiB
TypeScript
110 lines
3.3 KiB
TypeScript
import prismaMock from "../../../../tests/libs/__mocks__/prismaMock";
|
|
|
|
import { describe, expect, it } from "vitest";
|
|
|
|
import dayjs from "@calcom/dayjs";
|
|
import { getCheckBookingLimitsService } from "@calcom/lib/di/containers/booking-limits";
|
|
import type { IntervalLimit } from "@calcom/lib/intervalLimits/intervalLimitSchema";
|
|
import { validateIntervalLimitOrder } from "@calcom/lib/intervalLimits/validateIntervalLimitOrder";
|
|
|
|
type Mockdata = {
|
|
id: number;
|
|
startDate: Date;
|
|
bookingLimits: IntervalLimit;
|
|
};
|
|
|
|
const MOCK_DATA: Mockdata = {
|
|
id: 1,
|
|
startDate: dayjs("2022-09-30T09:00:00+01:00").toDate(),
|
|
bookingLimits: {
|
|
PER_DAY: 1,
|
|
},
|
|
};
|
|
|
|
const checkBookingLimitsService = getCheckBookingLimitsService();
|
|
|
|
describe("Check Booking Limits Tests", () => {
|
|
it("Should return no errors", async () => {
|
|
prismaMock.booking.count.mockResolvedValue(0);
|
|
expect(
|
|
checkBookingLimitsService.checkBookingLimits(MOCK_DATA.bookingLimits, MOCK_DATA.startDate, MOCK_DATA.id)
|
|
).resolves.toBeTruthy();
|
|
});
|
|
it("Should throw an error", async () => {
|
|
// Mock there being two a day
|
|
prismaMock.booking.count.mockResolvedValue(2);
|
|
expect(
|
|
checkBookingLimitsService.checkBookingLimits(MOCK_DATA.bookingLimits, MOCK_DATA.startDate, MOCK_DATA.id)
|
|
).rejects.toThrowError();
|
|
});
|
|
|
|
it("Should pass with multiple booking limits", async () => {
|
|
prismaMock.booking.count.mockResolvedValue(0);
|
|
expect(
|
|
checkBookingLimitsService.checkBookingLimits(
|
|
{
|
|
PER_DAY: 1,
|
|
PER_WEEK: 2,
|
|
},
|
|
MOCK_DATA.startDate,
|
|
MOCK_DATA.id
|
|
)
|
|
).resolves.toBeTruthy();
|
|
});
|
|
it("Should pass with multiple booking limits with one undefined", async () => {
|
|
prismaMock.booking.count.mockResolvedValue(0);
|
|
|
|
expect(
|
|
checkBookingLimitsService.checkBookingLimits(
|
|
{
|
|
PER_DAY: 1,
|
|
PER_WEEK: undefined,
|
|
},
|
|
MOCK_DATA.startDate,
|
|
MOCK_DATA.id
|
|
)
|
|
).resolves.toBeTruthy();
|
|
});
|
|
it("Should handle multiple limits correctly", async () => {
|
|
prismaMock.booking.count.mockResolvedValue(1);
|
|
expect(
|
|
checkBookingLimitsService.checkBookingLimit({
|
|
key: "PER_DAY",
|
|
limitingNumber: 2,
|
|
eventStartDate: MOCK_DATA.startDate,
|
|
eventId: MOCK_DATA.id,
|
|
})
|
|
).resolves.not.toThrow();
|
|
prismaMock.booking.count.mockResolvedValue(3);
|
|
expect(
|
|
checkBookingLimitsService.checkBookingLimit({
|
|
key: "PER_WEEK",
|
|
limitingNumber: 2,
|
|
eventStartDate: MOCK_DATA.startDate,
|
|
eventId: MOCK_DATA.id,
|
|
})
|
|
).rejects.toThrowError();
|
|
});
|
|
});
|
|
|
|
describe("Booking limit validation", () => {
|
|
it("Should validate a correct limit", () => {
|
|
expect(validateIntervalLimitOrder({ PER_DAY: 3, PER_MONTH: 5 })).toBe(true);
|
|
});
|
|
|
|
it("Should invalidate an incorrect limit", () => {
|
|
expect(validateIntervalLimitOrder({ PER_DAY: 9, PER_MONTH: 5 })).toBe(false);
|
|
});
|
|
|
|
it("Should validate a correct limit with 'gaps' ", () => {
|
|
expect(validateIntervalLimitOrder({ PER_DAY: 9, PER_YEAR: 25 })).toBe(true);
|
|
});
|
|
|
|
it("Should validate a correct limit with equal values ", () => {
|
|
expect(validateIntervalLimitOrder({ PER_DAY: 1, PER_YEAR: 1 })).toBe(true);
|
|
});
|
|
it("Should validate a correct with empty", () => {
|
|
expect(validateIntervalLimitOrder({})).toBe(true);
|
|
});
|
|
});
|