* 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>
381 lines
11 KiB
TypeScript
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);
|
|
});
|
|
});
|
|
});
|