Files
calendar/packages/lib/server/getLuckyUser.integration-test.ts
T
9873e373dc feat: reset RR every month (#17472)
* only fetch bookings of this month for weighted rr

* test set up

* only get bookings of current month

* reverts test setup

* first changes for weight adjustments

* reset booking count + adjust calibration

* depreciate weightAdjustment

* get only bookings created this month

* fix typo

* make sure createdAt for hosts is correct

* use earliest possibel date as fallback

* add missing createdAt date to tests

* fix typo

* clean up changes in tests

* fix typo

* change end date to current date

* fix: Fall back to empty host array when no hosts are found

* fix: Restructure code a little

* fixed test, incorrectly used now outdated var

* perf: remove Dayjs from getLuckyUser

* Refactor getHostsWithCalibration for optimised performance, intentionally break test as findMany is always an array

* Better mock for host.findMany

* Remove team-event-types.test.ts, move to appropriate package

* TypeScript cannot auto-infer that an array is non-empty when assigning to a var

* fix: Type Fixes and DistributionMethod enum add

* Optimise tests

* Added test to show that bookings made before a newHost was added affect the lucky user result

* Throw error when the usersWithHighestPriority is empty, which should never happen

---------

Co-authored-by: CarinaWolli <wollencarina@gmail.com>
Co-authored-by: Alex van Andel <me@alexvanandel.com>
2024-11-07 10:24:23 +00:00

381 lines
11 KiB
TypeScript

import { describe, it, expect, afterEach, beforeAll, afterAll } from "vitest";
import prisma from "@calcom/prisma";
import { DistributionMethod, getLuckyUser } from "./getLuckyUser";
describe("getLuckyUser Integration tests", () => {
describe("should not consider no show bookings for round robin: ", () => {
let userIds: number[] = [];
let eventTypeId: number;
beforeAll(async () => {
const event = await prisma.eventType.create({
data: {
title: "Test Event",
slug: "test-event",
length: 15,
},
select: {
id: true,
},
});
eventTypeId = event.id;
});
afterEach(async () => {
await prisma.user.deleteMany({
where: {
id: {
in: userIds,
},
},
});
userIds = [];
});
afterAll(async () => {
await prisma.eventType.delete({
where: {
id: eventTypeId,
},
});
});
it("When a host is no show, that is chosen when competing with another host that showed up for the booking", async () => {
const organizerThatShowedUp = await prisma.user.create({
data: {
email: "test-user1@example.com",
bookings: {
create: [
{
uid: "uuid-test-user1-booking1",
createdAt: new Date("2022-01-25T05:30:00.000Z"),
title: "Test user 1 Booking",
startTime: new Date(),
endTime: new Date(),
eventTypeId,
attendees: {
create: [
{
name: "test-attendee",
email: "test-attendee@example.com",
timeZone: "Asia/Calcutta",
},
],
},
},
],
},
},
});
const organizerThatDidntShowUp = await prisma.user.create({
data: {
email: "test-user2@example.com",
bookings: {
create: [
{
uid: "uuid-test-user2-booking1",
title: "Test User 2 Booking",
createdAt: new Date("2022-01-25T06:30:00.000Z"),
noShowHost: true,
startTime: new Date(),
endTime: new Date(),
attendees: {
create: [
{
name: "test-attendee",
email: "test-attendee@example.com",
timeZone: "Asia/Calcutta",
},
],
},
eventTypeId,
},
],
},
},
});
userIds.push(organizerThatShowedUp.id, organizerThatDidntShowUp.id);
expect(
getLuckyUser(DistributionMethod.PRIORITIZE_AVAILABILITY, {
availableUsers: [organizerThatShowedUp, organizerThatDidntShowUp],
eventType: {
id: eventTypeId,
isRRWeightsEnabled: false,
},
allRRHosts: [],
})
).resolves.toStrictEqual(organizerThatDidntShowUp);
});
it("When a attendee is a noShow for organizers booking, that organizer is competing with another host whose attendee showed up for the booking", async () => {
const organizerWhoseAttendeeShowedUp = await prisma.user.create({
data: {
email: "test-user1@example.com",
bookings: {
create: [
{
uid: "uuid-test-user1-booking1",
createdAt: new Date("2022-01-25T05:30:00.000Z"),
title: "Test User 1 Booking",
startTime: new Date(),
endTime: new Date(),
eventTypeId,
attendees: {
create: [
{
name: "test-attendee",
email: "test-attendee@example.com",
timeZone: "Asia/Calcutta",
},
],
},
},
],
},
},
});
const organizerWhoseAttendeeDidntShowUp = await prisma.user.create({
data: {
email: "test-user2@example.com",
bookings: {
create: [
{
uid: "uuid-test-user2-booking1",
title: "Test User 2 Booking",
createdAt: new Date("2022-01-25T06:30:00.000Z"),
startTime: new Date(),
endTime: new Date(),
attendees: {
create: [
{
noShow: true,
name: "test-attendee",
email: "test-attendee@example.com",
timeZone: "Asia/Calcutta",
},
],
},
eventTypeId,
},
],
},
},
});
userIds.push(organizerWhoseAttendeeShowedUp.id, organizerWhoseAttendeeDidntShowUp.id);
expect(
getLuckyUser(DistributionMethod.PRIORITIZE_AVAILABILITY, {
availableUsers: [organizerWhoseAttendeeShowedUp, organizerWhoseAttendeeDidntShowUp],
eventType: {
id: eventTypeId,
isRRWeightsEnabled: false,
},
allRRHosts: [],
})
).resolves.toStrictEqual(organizerWhoseAttendeeDidntShowUp);
});
it("When a organizer is attendee (event types with fixed hosts) and no show, that organizer is competing other hosts", async () => {
const organizerWhoseAttendeeShowedUp = await prisma.user.create({
data: {
email: "test-user1@example.com",
bookings: {
create: [
{
uid: "uuid-test-user1-booking1",
createdAt: new Date("2022-01-25T05:30:00.000Z"),
title: "Test User 1 Booking",
startTime: new Date(),
endTime: new Date(),
eventTypeId,
attendees: {
create: [
{
name: "test-attendee",
email: "test-attendee@example.com",
timeZone: "Asia/Calcutta",
},
],
},
},
],
},
},
});
const fixedHostOrganizerWhoseAttendeeDidNotShowUp = await prisma.user.create({
data: {
email: "test-user2@example.com",
bookings: {
create: [
{
uid: "uuid-test-user2-booking1",
title: `Test User 2 Booking`,
createdAt: new Date("2022-01-25T06:30:00.000Z"),
startTime: new Date(),
endTime: new Date(),
attendees: {
create: [
{
name: "test-attendee",
email: "test-attendee@example.com",
timeZone: "Asia/Calcutta",
},
],
},
eventTypeId,
},
// User2 is fixed user, User 3 was selected as round robin host but did not show up so this booking should be counted for User 3
{
uid: "uuid-test-user2-booking2",
title: `Test User 2 Booking 2`,
createdAt: new Date("2022-01-25T07:30:00.000Z"),
startTime: new Date(),
endTime: new Date(),
attendees: {
create: [
{
name: "test-attendee",
email: "test-user3@example.com",
timeZone: "Asia/Calcutta",
noShow: true,
},
],
},
eventTypeId,
},
],
},
},
});
const organizerWhoWasAttendeeAndDidntShowUp = await prisma.user.create({
data: {
email: `test-user3@example.com`,
bookings: {
create: [
{
uid: "uuid-test-user3-booking1",
title: `Test User 3 Booking`,
createdAt: new Date("2022-01-25T04:30:00.000Z"),
startTime: new Date(),
endTime: new Date(),
attendees: {
create: [
{
name: "test-attendee",
email: "test-attendee@example.com",
timeZone: "Asia/Calcutta",
},
],
},
eventTypeId,
},
],
},
},
});
userIds.push(
organizerWhoseAttendeeShowedUp.id,
fixedHostOrganizerWhoseAttendeeDidNotShowUp.id,
organizerWhoWasAttendeeAndDidntShowUp.id
);
expect(
getLuckyUser(DistributionMethod.PRIORITIZE_AVAILABILITY, {
availableUsers: [
organizerWhoseAttendeeShowedUp,
fixedHostOrganizerWhoseAttendeeDidNotShowUp,
organizerWhoWasAttendeeAndDidntShowUp,
],
eventType: {
id: eventTypeId,
isRRWeightsEnabled: false,
},
allRRHosts: [],
})
).resolves.toStrictEqual(organizerWhoWasAttendeeAndDidntShowUp);
});
it("should consider booking when noShowHost is null", async () => {
const user1 = await prisma.user.create({
data: {
email: "test-user1@example.com",
bookings: {
create: [
{
uid: "uuid-test-user1-booking1",
createdAt: new Date("2022-01-25T07:30:00.000Z"),
title: "Test user 1 Booking",
startTime: new Date(),
noShowHost: null,
endTime: new Date(),
eventTypeId,
attendees: {
create: [
{
name: "test-attendee",
email: "test-attendee@example.com",
timeZone: "Asia/Calcutta",
},
],
},
},
],
},
},
});
const user2 = await prisma.user.create({
data: {
email: "test-user2@example.com",
bookings: {
create: [
{
uid: "uuid-test-user2-booking1",
title: "Test User 2 Booking",
createdAt: new Date("2022-01-25T06:30:00.000Z"),
noShowHost: null,
startTime: new Date(),
endTime: new Date(),
attendees: {
create: [
{
name: "test-attendee",
email: "test-attendee@example.com",
timeZone: "Asia/Calcutta",
},
],
},
eventTypeId,
},
],
},
},
});
userIds.push(user1.id, user2.id);
expect(
getLuckyUser(DistributionMethod.PRIORITIZE_AVAILABILITY, {
availableUsers: [user1, user2],
eventType: {
id: eventTypeId,
isRRWeightsEnabled: false,
},
allRRHosts: [],
})
).resolves.toStrictEqual(user2);
});
});
});