* fix: fix date comparison for OOO * fix date comparison with today, and add tests * remove wrong code * remove logic that is no longer in use * fix type error * mock more methods --------- Co-authored-by: Alex van Andel <me@alexvanandel.com>
130 lines
3.2 KiB
TypeScript
130 lines
3.2 KiB
TypeScript
import { describe, expect, it, beforeEach, afterEach } from "vitest";
|
|
import { vi } from "vitest";
|
|
|
|
import { prisma } from "@calcom/prisma";
|
|
|
|
import { outOfOfficeCreateOrUpdate } from "../outOfOffice.handler";
|
|
|
|
const prismaMock = {
|
|
outOfOfficeEntry: {
|
|
findFirst: vi.fn().mockResolvedValue(undefined),
|
|
findUnique: vi.fn().mockResolvedValue(undefined),
|
|
upsert: vi.fn().mockResolvedValue(undefined),
|
|
},
|
|
};
|
|
vi.spyOn(prisma.outOfOfficeEntry, "findFirst").mockImplementation(prismaMock.outOfOfficeEntry.findFirst);
|
|
vi.spyOn(prisma.outOfOfficeEntry, "findUnique").mockImplementation(prismaMock.outOfOfficeEntry.findUnique);
|
|
vi.spyOn(prisma.outOfOfficeEntry, "upsert").mockImplementation(prismaMock.outOfOfficeEntry.upsert);
|
|
|
|
afterEach(() => {
|
|
prismaMock.outOfOfficeEntry.findFirst.mockClear();
|
|
prismaMock.outOfOfficeEntry.findUnique.mockClear();
|
|
prismaMock.outOfOfficeEntry.upsert.mockClear();
|
|
});
|
|
|
|
const mockUser = {
|
|
id: 4,
|
|
username: "pro",
|
|
email: "pro@example.com",
|
|
password: {
|
|
hash: "",
|
|
userId: 0,
|
|
},
|
|
completedOnboarding: true,
|
|
identityProvider: "CAL",
|
|
profiles: [],
|
|
avatar: "",
|
|
organization: null,
|
|
organizationId: null,
|
|
locale: "en",
|
|
timeZone: "UTC",
|
|
defaultScheduleId: null,
|
|
email_verified: true,
|
|
name: null,
|
|
theme: null,
|
|
} as const;
|
|
|
|
describe("outOfOfficeCreateOrUpdate", () => {
|
|
beforeEach(() => {
|
|
vi.resetAllMocks();
|
|
vi.setSystemTime(new Date("2024-11-22T03:23:45Z"));
|
|
});
|
|
|
|
it("should throw error if start date is after end date", async () => {
|
|
const input = {
|
|
dateRange: {
|
|
startDate: new Date("2024-11-23T23:00:00.000Z"),
|
|
endDate: new Date("2024-11-22T23:00:00.000Z"),
|
|
},
|
|
offset: 60,
|
|
reasonId: 1,
|
|
notes: "",
|
|
toTeamUserId: null,
|
|
};
|
|
|
|
await expect(outOfOfficeCreateOrUpdate({ ctx: { user: mockUser }, input })).rejects.toThrow(
|
|
"start_date_must_be_before_end_date"
|
|
);
|
|
});
|
|
|
|
it("should handle timezone offset correctly", async () => {
|
|
const input = {
|
|
dateRange: {
|
|
startDate: new Date("2024-11-23T23:00:00.000Z"),
|
|
endDate: new Date("2024-11-23T23:00:00.000Z"),
|
|
},
|
|
offset: 60, // Paris timezone offset in minutes
|
|
reasonId: 1,
|
|
notes: "",
|
|
toTeamUserId: null,
|
|
};
|
|
const startTimeUtc = "2024-11-24T00:00:00.000Z";
|
|
const endTimeUtc = "2024-11-24T23:59:59.999Z";
|
|
|
|
await outOfOfficeCreateOrUpdate({
|
|
ctx: { user: mockUser },
|
|
input,
|
|
});
|
|
|
|
expect(prisma.outOfOfficeEntry.findFirst).toHaveBeenNthCalledWith(1, {
|
|
select: {
|
|
toUserId: true,
|
|
userId: true,
|
|
},
|
|
where: {
|
|
OR: [
|
|
{
|
|
AND: [
|
|
{
|
|
start: {
|
|
lte: endTimeUtc,
|
|
},
|
|
},
|
|
{
|
|
end: {
|
|
gte: startTimeUtc,
|
|
},
|
|
},
|
|
],
|
|
},
|
|
{
|
|
AND: [
|
|
{
|
|
start: {
|
|
gte: startTimeUtc,
|
|
},
|
|
},
|
|
{
|
|
end: {
|
|
lte: endTimeUtc,
|
|
},
|
|
},
|
|
],
|
|
},
|
|
],
|
|
toUserId: 4,
|
|
},
|
|
});
|
|
});
|
|
});
|