Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: consider sendToAll settings in routingForms response #18226

Merged
merged 18 commits into from
Feb 24, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
3e3acbf
update to consider sendToAll
vijayraghav-io Dec 17, 2024
9d57a06
Merge branch 'main' of https://github.com/calcom/cal.com into fix__ro…
vijayraghav-io Dec 17, 2024
885bc4d
Merge branch 'main' of https://github.com/calcom/cal.com into fix__ro…
vijayraghav-io Dec 17, 2024
3fa8b7f
added tests for team routingForms selectAllMembers cases
vijayraghav-io Dec 18, 2024
3119d90
Merge branch 'main' of https://github.com/calcom/cal.com into fix__ro…
vijayraghav-io Dec 18, 2024
3755e37
chore
vijayraghav-io Dec 18, 2024
342f24d
chore
vijayraghav-io Dec 18, 2024
ffdd1f7
Merge branch 'main' of https://github.com/calcom/cal.com into fix__ro…
vijayraghav-io Dec 18, 2024
41747df
chore
vijayraghav-io Dec 18, 2024
ac09aac
updated test case in case of toggle off
vijayraghav-io Dec 19, 2024
8e02471
Merge branch 'main' of https://github.com/calcom/cal.com into fix__ro…
vijayraghav-io Dec 19, 2024
e59faf7
Merge branch 'main' of https://github.com/calcom/cal.com into fix__ro…
vijayraghav-io Jan 1, 2025
fd1ad32
Merge branch 'main' of https://github.com/calcom/cal.com into fix__ro…
vijayraghav-io Jan 26, 2025
3a0771f
Merge branch 'main' of https://github.com/calcom/cal.com into fix__ro…
vijayraghav-io Jan 27, 2025
215578a
Merge branch 'main' of https://github.com/calcom/cal.com into fix__ro…
vijayraghav-io Feb 12, 2025
40f65f5
Merge branch 'main' into fix__routingForms_sendToAll
anikdhabal Feb 24, 2025
c54dc03
tweak
anikdhabal Feb 24, 2025
cea6225
Merge branch 'main' into fix__routingForms_sendToAll
anikdhabal Feb 24, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions packages/app-store/routing-forms/components/SingleForm.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -799,6 +799,7 @@ function SingleForm({ form, appUrl, Page, enrichedWithUserProfileForm }: SingleF
{t("routing_forms_send_email_to")}
</span>
<AddMembersWithSwitch
data-testid="routing-form-select-members"
teamId={form.teamId}
teamMembers={form.teamMembers.map((member) => ({
value: member.id.toString(),
Expand Down
13 changes: 6 additions & 7 deletions packages/app-store/routing-forms/lib/handleResponse.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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: {
Expand Down
132 changes: 130 additions & 2 deletions packages/app-store/routing-forms/playwright/tests/basic.e2e.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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) {
Expand Down
Loading