168 lines
4.9 KiB
TypeScript
168 lines
4.9 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
|
|
import type { CurrentSeats } from "@calcom/core/getUserAvailability";
|
|
import dayjs from "@calcom/dayjs";
|
|
import type { EventBusyDate } from "@calcom/types/Calendar";
|
|
|
|
import { checkForConflicts } from "./checkForConflicts";
|
|
|
|
describe("checkForConflicts", () => {
|
|
const createTestData = (time: string) => ({
|
|
time: dayjs(time),
|
|
eventLength: 30,
|
|
busy: [] as EventBusyDate[],
|
|
});
|
|
|
|
describe("currentSeats handling", () => {
|
|
it("should return false if slot exists in currentSeats", () => {
|
|
const currentSeats: CurrentSeats = [
|
|
{
|
|
uid: "123",
|
|
startTime: dayjs.utc("2023-01-01T09:00:00Z").toDate(),
|
|
_count: { attendees: 1 },
|
|
},
|
|
];
|
|
|
|
const result = checkForConflicts({
|
|
...createTestData("2023-01-01T09:00:00Z"),
|
|
currentSeats,
|
|
});
|
|
|
|
expect(result).toBe(false);
|
|
});
|
|
});
|
|
|
|
describe("busy time overlap scenarios", () => {
|
|
it("should return false when no busy periods", () => {
|
|
const result = checkForConflicts(createTestData("2023-01-01T09:00:00Z"));
|
|
expect(result).toBe(false);
|
|
});
|
|
|
|
it("should return false when busy period ends before slot starts", () => {
|
|
const result = checkForConflicts({
|
|
...createTestData("2023-01-01T09:00:00Z"),
|
|
busy: [
|
|
{
|
|
start: dayjs.utc("2023-01-01T08:00:00Z").toDate(),
|
|
end: dayjs.utc("2023-01-01T08:30:00Z").toDate(),
|
|
},
|
|
],
|
|
});
|
|
expect(result).toBe(false);
|
|
});
|
|
|
|
it("should return false when busy period starts after slot ends", () => {
|
|
const result = checkForConflicts({
|
|
...createTestData("2023-01-01T09:00:00Z"),
|
|
busy: [
|
|
{
|
|
start: dayjs.utc("2023-01-01T10:00:00Z").toDate(),
|
|
end: dayjs.utc("2023-01-01T10:30:00Z").toDate(),
|
|
},
|
|
],
|
|
});
|
|
expect(result).toBe(false);
|
|
});
|
|
|
|
it("should return true when slot start falls within busy period", () => {
|
|
const result = checkForConflicts({
|
|
...createTestData("2023-01-01T09:15:00Z"),
|
|
busy: [
|
|
{
|
|
start: dayjs.utc("2023-01-01T09:00:00Z").toDate(),
|
|
end: dayjs.utc("2023-01-01T09:30:00Z").toDate(),
|
|
},
|
|
],
|
|
});
|
|
expect(result).toBe(true);
|
|
});
|
|
|
|
it("should return true when slot end falls within busy period", () => {
|
|
const result = checkForConflicts({
|
|
...createTestData("2023-01-01T08:45:00Z"),
|
|
busy: [
|
|
{
|
|
start: dayjs.utc("2023-01-01T09:00:00Z").toDate(),
|
|
end: dayjs.utc("2023-01-01T09:30:00Z").toDate(),
|
|
},
|
|
],
|
|
});
|
|
expect(result).toBe(true);
|
|
});
|
|
|
|
it("should return true when busy period is completely contained within slot", () => {
|
|
const result = checkForConflicts({
|
|
...createTestData("2023-01-01T09:00:00Z"),
|
|
eventLength: 60,
|
|
busy: [
|
|
{
|
|
start: dayjs.utc("2023-01-01T09:15:00Z").toDate(),
|
|
end: dayjs.utc("2023-01-01T09:45:00Z").toDate(),
|
|
},
|
|
],
|
|
});
|
|
expect(result).toBe(true);
|
|
});
|
|
|
|
it("should return true when slot is completely contained within busy period", () => {
|
|
const result = checkForConflicts({
|
|
...createTestData("2023-01-01T09:15:00Z"),
|
|
busy: [
|
|
{
|
|
start: dayjs.utc("2023-01-01T09:00:00Z").toDate(),
|
|
end: dayjs.utc("2023-01-01T10:00:00Z").toDate(),
|
|
},
|
|
],
|
|
});
|
|
expect(result).toBe(true);
|
|
});
|
|
|
|
it("should return false when multiple non-overlapping busy periods", () => {
|
|
const result = checkForConflicts({
|
|
...createTestData("2023-01-01T09:30:00Z"),
|
|
busy: [
|
|
{
|
|
start: dayjs.utc("2023-01-01T08:00:00Z").toDate(),
|
|
end: dayjs.utc("2023-01-01T09:00:00Z").toDate(),
|
|
},
|
|
{
|
|
start: dayjs.utc("2023-01-01T10:00:00Z").toDate(),
|
|
end: dayjs.utc("2023-01-01T11:00:00Z").toDate(),
|
|
},
|
|
],
|
|
});
|
|
expect(result).toBe(false);
|
|
});
|
|
|
|
it("should return true if any busy period overlaps", () => {
|
|
const result = checkForConflicts({
|
|
...createTestData("2023-01-01T09:30:00Z"),
|
|
busy: [
|
|
{
|
|
start: dayjs.utc("2023-01-01T08:00:00Z").toDate(),
|
|
end: dayjs.utc("2023-01-01T09:00:00Z").toDate(),
|
|
},
|
|
{
|
|
start: dayjs.utc("2023-01-01T09:45:00Z").toDate(),
|
|
end: dayjs.utc("2023-01-01T10:00:00Z").toDate(),
|
|
},
|
|
],
|
|
});
|
|
expect(result).toBe(true);
|
|
});
|
|
|
|
it("should handle exact boundary conditions", () => {
|
|
const result = checkForConflicts({
|
|
...createTestData("2023-01-01T09:30:00Z"),
|
|
busy: [
|
|
{
|
|
start: dayjs.utc("2023-01-01T09:00:00Z").toDate(),
|
|
end: dayjs.utc("2023-01-01T09:30:00Z").toDate(),
|
|
},
|
|
],
|
|
});
|
|
expect(result).toBe(false);
|
|
});
|
|
});
|
|
});
|