129 lines
4.0 KiB
TypeScript
129 lines
4.0 KiB
TypeScript
|
import dayjs from "@calcom/dayjs";
|
||
|
import { validateIntervalLimitOrder } from "@calcom/lib";
|
||
|
import { checkDurationLimit, checkDurationLimits } from "@calcom/lib/server";
|
||
|
|
||
|
import { prismaMock } from "../../../../tests/config/singleton";
|
||
|
|
||
|
type MockData = {
|
||
|
id: number;
|
||
|
startDate: Date;
|
||
|
};
|
||
|
|
||
|
const MOCK_DATA: MockData = {
|
||
|
id: 1,
|
||
|
startDate: dayjs("2022-09-30T09:00:00+01:00").toDate(),
|
||
|
};
|
||
|
|
||
|
// Path: apps/web/test/lib/checkDurationLimits.ts
|
||
|
describe("Check Duration Limits Tests", () => {
|
||
|
it("Should return no errors if limit is not reached", async () => {
|
||
|
prismaMock.$queryRaw.mockResolvedValue([{ totalMinutes: 0 }]);
|
||
|
await expect(
|
||
|
checkDurationLimits({ PER_DAY: 60 }, MOCK_DATA.startDate, MOCK_DATA.id)
|
||
|
).resolves.toBeTruthy();
|
||
|
});
|
||
|
it("Should throw an error if limit is reached", async () => {
|
||
|
prismaMock.$queryRaw.mockResolvedValue([{ totalMinutes: 60 }]);
|
||
|
await expect(
|
||
|
checkDurationLimits({ PER_DAY: 60 }, MOCK_DATA.startDate, MOCK_DATA.id)
|
||
|
).rejects.toThrowError();
|
||
|
});
|
||
|
it("Should pass with multiple duration limits", async () => {
|
||
|
prismaMock.$queryRaw.mockResolvedValue([{ totalMinutes: 30 }]);
|
||
|
await expect(
|
||
|
checkDurationLimits(
|
||
|
{
|
||
|
PER_DAY: 60,
|
||
|
PER_WEEK: 120,
|
||
|
},
|
||
|
MOCK_DATA.startDate,
|
||
|
MOCK_DATA.id
|
||
|
)
|
||
|
).resolves.toBeTruthy();
|
||
|
});
|
||
|
it("Should pass with multiple duration limits with one undefined", async () => {
|
||
|
prismaMock.$queryRaw.mockResolvedValue([{ totalMinutes: 30 }]);
|
||
|
await expect(
|
||
|
checkDurationLimits(
|
||
|
{
|
||
|
PER_DAY: 60,
|
||
|
PER_WEEK: undefined,
|
||
|
},
|
||
|
MOCK_DATA.startDate,
|
||
|
MOCK_DATA.id
|
||
|
)
|
||
|
).resolves.toBeTruthy();
|
||
|
});
|
||
|
it("Should return no errors if limit is not reached with multiple bookings", async () => {
|
||
|
prismaMock.$queryRaw.mockResolvedValue([{ totalMinutes: 60 }]);
|
||
|
await expect(
|
||
|
checkDurationLimits(
|
||
|
{
|
||
|
PER_DAY: 90,
|
||
|
PER_WEEK: 120,
|
||
|
},
|
||
|
MOCK_DATA.startDate,
|
||
|
MOCK_DATA.id
|
||
|
)
|
||
|
).resolves.toBeTruthy();
|
||
|
});
|
||
|
it("Should throw an error if one of the limit is reached with multiple bookings", async () => {
|
||
|
prismaMock.$queryRaw.mockResolvedValue([{ totalMinutes: 90 }]);
|
||
|
await expect(
|
||
|
checkDurationLimits(
|
||
|
{
|
||
|
PER_DAY: 60,
|
||
|
PER_WEEK: 120,
|
||
|
},
|
||
|
MOCK_DATA.startDate,
|
||
|
MOCK_DATA.id
|
||
|
)
|
||
|
).rejects.toThrowError();
|
||
|
});
|
||
|
});
|
||
|
|
||
|
// Path: apps/web/test/lib/checkDurationLimits.ts
|
||
|
describe("Check Duration Limit Tests", () => {
|
||
|
it("Should return no busyTimes and no error if limit is not reached", async () => {
|
||
|
prismaMock.$queryRaw.mockResolvedValue([{ totalMinutes: 60 }]);
|
||
|
await expect(
|
||
|
checkDurationLimit({
|
||
|
key: "PER_DAY",
|
||
|
limitingNumber: 90,
|
||
|
eventStartDate: MOCK_DATA.startDate,
|
||
|
eventId: MOCK_DATA.id,
|
||
|
})
|
||
|
).resolves.toBeUndefined();
|
||
|
});
|
||
|
it("Should return busyTimes when set and limit is reached", async () => {
|
||
|
prismaMock.$queryRaw.mockResolvedValue([{ totalMinutes: 60 }]);
|
||
|
await expect(
|
||
|
checkDurationLimit({
|
||
|
key: "PER_DAY",
|
||
|
limitingNumber: 60,
|
||
|
eventStartDate: MOCK_DATA.startDate,
|
||
|
eventId: MOCK_DATA.id,
|
||
|
returnBusyTimes: true,
|
||
|
})
|
||
|
).resolves.toEqual({
|
||
|
start: dayjs(MOCK_DATA.startDate).startOf("day").toDate(),
|
||
|
end: dayjs(MOCK_DATA.startDate).endOf("day").toDate(),
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe("Duration limit validation", () => {
|
||
|
it("Should validate limit where ranges have ascending values", () => {
|
||
|
expect(validateIntervalLimitOrder({ PER_DAY: 30, PER_MONTH: 60 })).toBe(true);
|
||
|
});
|
||
|
it("Should invalidate limit where ranges does not have a strict ascending values", () => {
|
||
|
expect(validateIntervalLimitOrder({ PER_DAY: 60, PER_WEEK: 30 })).toBe(false);
|
||
|
});
|
||
|
it("Should validate a correct limit with 'gaps'", () => {
|
||
|
expect(validateIntervalLimitOrder({ PER_DAY: 60, PER_YEAR: 120 })).toBe(true);
|
||
|
});
|
||
|
it("Should validate empty limit", () => {
|
||
|
expect(validateIntervalLimitOrder({})).toBe(true);
|
||
|
});
|
||
|
});
|