From caade0850ad4a9e2bf48d84647ec9e31031d2006 Mon Sep 17 00:00:00 2001 From: Vijay Date: Mon, 24 Feb 2025 23:29:54 +0530 Subject: [PATCH] fix: consider sendToAll settings in routingForms response (#18226) * update to consider sendToAll * added tests for team routingForms selectAllMembers cases * chore * chore * chore * updated test case in case of toggle off * tweak --------- Co-authored-by: Anik Dhabal Babu <81948346+anikdhabal@users.noreply.github.com> Co-authored-by: unknown --- .../routing-forms/components/SingleForm.tsx | 1 + .../routing-forms/lib/handleResponse.ts | 13 +- .../playwright/tests/basic.e2e.ts | 132 +++++++++++++++++- 3 files changed, 137 insertions(+), 9 deletions(-) diff --git a/packages/app-store/routing-forms/components/SingleForm.tsx b/packages/app-store/routing-forms/components/SingleForm.tsx index 54140b25e4..d4d7ccab58 100644 --- a/packages/app-store/routing-forms/components/SingleForm.tsx +++ b/packages/app-store/routing-forms/components/SingleForm.tsx @@ -799,6 +799,7 @@ function SingleForm({ form, appUrl, Page, enrichedWithUserProfileForm }: SingleF {t("routing_forms_send_email_to")} ({ value: member.id.toString(), diff --git a/packages/app-store/routing-forms/lib/handleResponse.ts b/packages/app-store/routing-forms/lib/handleResponse.ts index c97a5c2fed..d582e0e533 100644 --- a/packages/app-store/routing-forms/lib/handleResponse.ts +++ b/packages/app-store/routing-forms/lib/handleResponse.ts @@ -98,14 +98,13 @@ export const handleResponse = async ({ const settings = RoutingFormSettings.parse(form.settings); let userWithEmails: string[] = []; - if (form.teamId && settings?.sendUpdatesTo?.length) { + if (form.teamId && (settings?.sendToAll || settings?.sendUpdatesTo?.length)) { + const whereClause: Prisma.MembershipWhereInput = { teamId: form.teamId }; + if (!settings?.sendToAll) { + whereClause.userId = { in: settings.sendUpdatesTo }; + } const userEmails = await prisma.membership.findMany({ - where: { - teamId: form.teamId, - userId: { - in: settings.sendUpdatesTo, - }, - }, + where: whereClause, select: { user: { select: { diff --git a/packages/app-store/routing-forms/playwright/tests/basic.e2e.ts b/packages/app-store/routing-forms/playwright/tests/basic.e2e.ts index 1f9a22393a..56d6484f90 100644 --- a/packages/app-store/routing-forms/playwright/tests/basic.e2e.ts +++ b/packages/app-store/routing-forms/playwright/tests/basic.e2e.ts @@ -2,11 +2,11 @@ import type { Locator, Page } from "@playwright/test"; import { expect } from "@playwright/test"; import { prisma } from "@calcom/prisma"; -import { AttributeType, SchedulingType } from "@calcom/prisma/enums"; +import { AttributeType, MembershipRole, SchedulingType } from "@calcom/prisma/enums"; import type { Fixtures } from "@calcom/web/playwright/lib/fixtures"; import { test } from "@calcom/web/playwright/lib/fixtures"; import { selectInteractions } from "@calcom/web/playwright/lib/pageObject"; -import { gotoRoutingLink } from "@calcom/web/playwright/lib/testUtils"; +import { getEmailsReceivedByUser, gotoRoutingLink } from "@calcom/web/playwright/lib/testUtils"; import { addForm, @@ -614,6 +614,134 @@ test.describe("Routing Forms", () => { })(); }); }); + + test.describe("Team Routing Form", () => { + test.afterEach(async ({ users }) => { + await users.deleteAll(); + }); + + const createUserAndTeamRoutingForm = async ({ + users, + page, + }: { + users: Fixtures["users"]; + page: Page; + }) => { + const owner = await users.create( + { username: "routing-forms" }, + { + hasTeam: true, + isOrg: true, + hasSubteam: true, + } + ); + const { team } = await owner.getFirstTeamMembership(); + await owner.apiLogin(); + const formId = await addForm(page, { + forTeam: true, + }); + await addShortTextFieldAndSaveForm({ + page, + formId, + }); + await page.click('[href*="/route-builder/"]'); + await selectNewRoute(page); + await selectOption({ + selector: { + selector: ".data-testid-select-routing-action", + nth: 0, + }, + option: 2, + page, + }); + await page.fill("[name=externalRedirectUrl]", "https://cal.com"); + await saveCurrentForm(page); + return { + formId, + teamId: team.id, + owner, + }; + }; + + const selectSendMailToAllMembers = async ({ page, formId }: { page: Page; formId: string }) => { + await page.goto(`apps/routing-forms/form-edit/${formId}`); + await page.click('[data-testid="assign-all-team-members-toggle"]'); + await saveCurrentForm(page); + }; + + const selectSendMailToUser = async ({ + page, + formId, + text, + }: { + page: Page; + formId: string; + text: string; + }) => { + await page.goto(`apps/routing-forms/form-edit/${formId}`); + await page.click('[data-testid="routing-form-select-members"]'); + await page.getByText(text).nth(1).click(); + await saveCurrentForm(page); + }; + + const addNewUserToTeam = async ({ users, teamId }: { users: Fixtures["users"]; teamId: number }) => { + const newUser = await users.create(); + await prisma.membership.create({ + data: { + teamId: teamId, + userId: newUser.id, + role: MembershipRole.MEMBER, + accepted: true, + }, + }); + return newUser; + }; + + const goToRoutingLinkAndSubmit = async ({ page, formId }: { page: Page; formId: string }) => { + await gotoRoutingLink({ page, formId }); + await page.fill('[data-testid="form-field-short-text"]', "test"); + await page.click('button[type="submit"]'); + await page.waitForURL((url) => { + return url.hostname.includes("cal.com"); + }); + }; + + test("newly added team member gets mail updates, when `Add all team members, including future members` switch is selected", async ({ + page, + emails, + users, + }) => { + const { formId, teamId, owner } = await createUserAndTeamRoutingForm({ users, page }); + await selectSendMailToAllMembers({ page, formId }); + const newUser = await addNewUserToTeam({ users, teamId }); + await goToRoutingLinkAndSubmit({ page, formId }); + + // eslint-disable-next-line playwright/no-wait-for-timeout + await page.waitForTimeout(2000); + const receivedEmailsOwner = await getEmailsReceivedByUser({ emails, userEmail: owner.email }); + expect(receivedEmailsOwner?.total).toBe(1); + const receivedEmailsNewUser = await getEmailsReceivedByUser({ emails, userEmail: newUser.email }); + expect(receivedEmailsNewUser?.total).toBe(1); + }); + + test("newly added team member Not gets mail updates, when `Add all team members, including future members` switch is Not selected", async ({ + page, + emails, + users, + }) => { + const { formId, teamId, owner } = await createUserAndTeamRoutingForm({ users, page }); + await selectSendMailToUser({ page, formId, text: owner.email as string }); + const newUser = await addNewUserToTeam({ users, teamId }); + await goToRoutingLinkAndSubmit({ page, formId }); + + // eslint-disable-next-line playwright/no-wait-for-timeout + await page.waitForTimeout(2000); + const receivedEmailsOwner = await getEmailsReceivedByUser({ emails, userEmail: owner.email }); + expect(receivedEmailsOwner?.total).toBe(1); + const receivedEmailsNewUser = await getEmailsReceivedByUser({ emails, userEmail: newUser.email }); + expect(receivedEmailsNewUser?.total).toBe(0); + }); + }); }); async function disableForm(page: Page) {