test: add e2e test for round robin event types (#21159)

Co-authored-by: Anik Dhabal Babu <81948346+anikdhabal@users.noreply.github.com>
This commit is contained in:
Udit TakkarandAnik Dhabal Babu authored and GitHub committed 2025-05-08 11:41:21 +05:30
1 parent 5f770a9789
commit 78a34038d2
1 file changed
+161
@@ -295,6 +295,167 @@ test.describe("Bookings", () => {
await page.goto(`/org/${org.slug}/${teamSlugUpperCase}/${teamEventSlugUpperCase}`);
await page.waitForSelector("[data-testid=day]");
});
test("Round robin event type properly rotates hosts", async ({ page, users, orgs }) => {
const org = await orgs.create({
name: "TestOrg",
});
const teamMatesObj = [{ name: "teammate-1" }, { name: "teammate-2" }, { name: "teammate-3" }];
const owner = await users.create(
{
username: "pro-user",
name: "pro-user",
organizationId: org.id,
roleInOrganization: MembershipRole.MEMBER,
},
{
hasTeam: true,
teammates: teamMatesObj,
schedulingType: SchedulingType.ROUND_ROBIN,
}
);
const { team } = await owner.getFirstTeamMembership();
const teamEvent = await owner.getFirstTeamEvent(team.id);
const eventHostsObj = [...teamMatesObj, { name: "pro-user" }];
await doOnOrgDomain(
{
orgSlug: org.slug,
page,
},
async () => {
await bookTeamEvent({ page, team, event: teamEvent, teamMatesObj: eventHostsObj });
const firstHost = await page.getByTestId("booking-host-name").textContent();
expect(firstHost).not.toBeNull();
// Second booking - should get a different host
await page.goto(`/org/${org.slug}/${team.slug}/${teamEvent.slug}`);
await selectFirstAvailableTimeSlotNextMonth(page);
await bookTimeSlot(page);
await expect(page.getByTestId("success-page")).toBeVisible();
const secondHost = await page.getByTestId("booking-host-name").textContent();
expect(secondHost).not.toBeNull();
expect(secondHost).not.toBe(firstHost);
// Third booking - should get a different host
await page.goto(`/org/${org.slug}/${team.slug}/${teamEvent.slug}`);
await selectFirstAvailableTimeSlotNextMonth(page);
await bookTimeSlot(page);
await expect(page.getByTestId("success-page")).toBeVisible();
const thirdHost = await page.getByTestId("booking-host-name").textContent();
expect(thirdHost).not.toBeNull();
expect(thirdHost).not.toBe(firstHost);
expect(thirdHost).not.toBe(secondHost);
// Fourth booking - should get a different host
await page.goto(`/org/${org.slug}/${team.slug}/${teamEvent.slug}`);
await selectFirstAvailableTimeSlotNextMonth(page);
await bookTimeSlot(page);
await expect(page.getByTestId("success-page")).toBeVisible();
const fourthHost = await page.getByTestId("booking-host-name").textContent();
expect(fourthHost).not.toBeNull();
expect(fourthHost).not.toBe(firstHost);
expect(fourthHost).not.toBe(secondHost);
expect(fourthHost).not.toBe(thirdHost);
// Verify all hosts were used
const allHosts = [firstHost, secondHost, thirdHost, fourthHost];
const uniqueHosts = new Set(allHosts);
expect(uniqueHosts.size).toBe(4);
}
);
});
test("Round robin event type with confirmation required handles cancellation and rebooking correctly with the same details and slot", async ({
page,
users,
orgs,
}) => {
const org = await orgs.create({
name: "TestOrg",
});
const teamMatesObj = [
{ name: "teammate-1" },
{ name: "teammate-2" },
{ name: "teammate-3" },
{ name: "teammate-4" },
];
const owner = await users.create(
{
username: "pro-user",
name: "pro-user",
organizationId: org.id,
roleInOrganization: MembershipRole.MEMBER,
},
{
hasTeam: true,
teammates: teamMatesObj,
schedulingType: SchedulingType.ROUND_ROBIN,
}
);
const { team } = await owner.getFirstTeamMembership();
const teamEvent = await owner.getFirstTeamEvent(team.id);
const eventHostsObj = [...teamMatesObj, { name: "pro-user" }];
// Enable confirmation required for the event
await owner.apiLogin();
await page.goto(`/event-types/${teamEvent.id}?tabName=advanced`);
await page.getByTestId("requires-confirmation").click();
await page.getByTestId("update-eventtype").click();
await page.waitForResponse((response) => response.url().includes("/api/trpc/eventTypes/update"));
await doOnOrgDomain(
{
orgSlug: org.slug,
page,
},
async () => {
await bookTeamEvent({ page, team, event: teamEvent, teamMatesObj: eventHostsObj });
const firstHost = await page.getByTestId("booking-host-name").textContent();
expect(firstHost).not.toBeNull();
const bookingUid = page.url().split("/booking/")[1];
expect(bookingUid).not.toBeNull();
// Login as the host to cancel the booking
await page.goto("/auth/logout");
const allUsers = await users.get();
const hostUser = allUsers.find((mate) => mate.name === firstHost);
if (!hostUser) throw new Error("Host not found");
await hostUser.apiLogin();
// Cancel the booking
await page.goto(`/booking/${bookingUid}`);
await page.getByTestId("cancel").click();
await page.getByTestId("confirm_cancel").click();
await page.waitForResponse((response) => response.url().includes("/api/cancel"));
// Logout and go back to booking page
await page.goto("/auth/logout");
await page.goto(`/org/${org.slug}/${team.slug}/${teamEvent.slug}`);
// Rebook with the same details
await selectFirstAvailableTimeSlotNextMonth(page);
await bookTimeSlot(page);
await expect(page.getByTestId("success-page")).toBeVisible();
// Verify a new host is assigned
const newHost = await page.getByTestId("booking-host-name").textContent();
expect(newHost).not.toBeNull();
expect(newHost).toBe(firstHost);
// Verify the booking was successful by checking the new booking UID
const newBookingUid = page.url().split("/booking/")[1];
expect(newBookingUid).not.toBeNull();
expect(newBookingUid).not.toBe(bookingUid);
}
);
});
});
test.describe("User Event", () => {