Cover personal data support workflows
This commit is contained in:
parent
1eea74f454
commit
7908189e40
|
|
@ -1,4 +1,4 @@
|
||||||
import { APIRequestContext, expect, test } from "@playwright/test";
|
import { APIRequestContext, expect, Page, test } from "@playwright/test";
|
||||||
import {
|
import {
|
||||||
captureBrowserFailures,
|
captureBrowserFailures,
|
||||||
gotoLiveView,
|
gotoLiveView,
|
||||||
|
|
@ -43,6 +43,29 @@ async function waitForNewEmail(
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function submitAuthenticatedSupportRequest(
|
||||||
|
page: Page,
|
||||||
|
requesterEmail: string,
|
||||||
|
kind: "privacy_request" | "data_export",
|
||||||
|
subject: string,
|
||||||
|
details: string,
|
||||||
|
): Promise<void> {
|
||||||
|
await page.goto("/support");
|
||||||
|
await page.getByLabel("What do you need help with?").selectOption(kind);
|
||||||
|
await expect(page.getByLabel("Contact email")).toHaveValue(requesterEmail);
|
||||||
|
await expect(page.getByLabel("Contact email")).toHaveAttribute(
|
||||||
|
"readonly",
|
||||||
|
"",
|
||||||
|
);
|
||||||
|
await page.getByLabel("Subject").fill(subject);
|
||||||
|
await page.getByLabel("Describe the problem").fill(details);
|
||||||
|
await page.getByRole("button", { name: "Send support request" }).click();
|
||||||
|
await expect(page).toHaveURL(/\/support\/received\?reference=SUP-/);
|
||||||
|
await expect(
|
||||||
|
page.getByRole("heading", { name: "Support request created" }),
|
||||||
|
).toBeVisible();
|
||||||
|
}
|
||||||
|
|
||||||
test("authenticated support and legal notices reach the scoped staff queues", async ({
|
test("authenticated support and legal notices reach the scoped staff queues", async ({
|
||||||
browser,
|
browser,
|
||||||
request,
|
request,
|
||||||
|
|
@ -56,6 +79,9 @@ test("authenticated support and legal notices reach the scoped staff queues", as
|
||||||
"Browser E2E verifies the authenticated private case without a duplicate receipt email.";
|
"Browser E2E verifies the authenticated private case without a duplicate receipt email.";
|
||||||
const supportReply = `E2E support reply [${projectName}]`;
|
const supportReply = `E2E support reply [${projectName}]`;
|
||||||
const supportFollowUp = `E2E support inbox follow-up [${projectName}]`;
|
const supportFollowUp = `E2E support inbox follow-up [${projectName}]`;
|
||||||
|
const privacySubject = `E2E privacy request [${projectName}]`;
|
||||||
|
const dataExportSubject = `E2E data export [${projectName}]`;
|
||||||
|
const accountDeletionSubject = "Delete my Who Need Help account";
|
||||||
const generalExplanation =
|
const generalExplanation =
|
||||||
"Browser E2E verifies that a signed-in general removal notice reaches the legal queue.";
|
"Browser E2E verifies that a signed-in general removal notice reaches the legal queue.";
|
||||||
const urgentExplanation =
|
const urgentExplanation =
|
||||||
|
|
@ -154,6 +180,70 @@ test("authenticated support and legal notices reach the scoped staff queues", as
|
||||||
requester.page.getByText(supportFollowUp, { exact: true }),
|
requester.page.getByText(supportFollowUp, { exact: true }),
|
||||||
).toBeVisible();
|
).toBeVisible();
|
||||||
|
|
||||||
|
await submitAuthenticatedSupportRequest(
|
||||||
|
requester.page,
|
||||||
|
requesterEmail,
|
||||||
|
"privacy_request",
|
||||||
|
privacySubject,
|
||||||
|
"Browser E2E verifies that an authenticated privacy request remains private and reaches the scoped support queue.",
|
||||||
|
);
|
||||||
|
await submitAuthenticatedSupportRequest(
|
||||||
|
requester.page,
|
||||||
|
requesterEmail,
|
||||||
|
"data_export",
|
||||||
|
dataExportSubject,
|
||||||
|
"Browser E2E verifies that an authenticated data-export request reaches the scoped support queue.",
|
||||||
|
);
|
||||||
|
|
||||||
|
await requester.page.goto("/account/delete");
|
||||||
|
await expect(requester.page.getByLabel("Account email")).toHaveValue(
|
||||||
|
requesterEmail,
|
||||||
|
);
|
||||||
|
await expect(requester.page.getByLabel("Account email")).toHaveAttribute(
|
||||||
|
"readonly",
|
||||||
|
"",
|
||||||
|
);
|
||||||
|
await requester.page
|
||||||
|
.getByLabel("Additional information")
|
||||||
|
.fill(
|
||||||
|
"Browser E2E verifies that account deletion enters the dedicated support workflow without deleting the fixture account immediately.",
|
||||||
|
);
|
||||||
|
await requester.page
|
||||||
|
.getByRole("button", { name: "Request account deletion" })
|
||||||
|
.click();
|
||||||
|
await expect(requester.page).toHaveURL(/\/support\/received\?reference=SUP-/);
|
||||||
|
await expect(
|
||||||
|
requester.page.getByRole("heading", { name: "Support request created" }),
|
||||||
|
).toBeVisible();
|
||||||
|
|
||||||
|
await gotoLiveView(admin.page, "/support/operations?queue=support");
|
||||||
|
await admin.page
|
||||||
|
.locator("#support-case-filters")
|
||||||
|
.getByLabel("Search")
|
||||||
|
.fill(requesterEmail);
|
||||||
|
const requesterSupportRows = admin.page.locator("main tbody tr");
|
||||||
|
await expect(requesterSupportRows).toHaveCount(4);
|
||||||
|
await expect(
|
||||||
|
requesterSupportRows.filter({ hasText: privacySubject }),
|
||||||
|
).toHaveCount(1);
|
||||||
|
await expect(
|
||||||
|
requesterSupportRows.filter({ hasText: dataExportSubject }),
|
||||||
|
).toHaveCount(1);
|
||||||
|
await expect(
|
||||||
|
requesterSupportRows.filter({ hasText: accountDeletionSubject }),
|
||||||
|
).toHaveCount(1);
|
||||||
|
|
||||||
|
await requester.page.goto("/support/requests");
|
||||||
|
await expect(
|
||||||
|
requester.page.getByRole("link").filter({ hasText: privacySubject }),
|
||||||
|
).toHaveCount(1);
|
||||||
|
await expect(
|
||||||
|
requester.page.getByRole("link").filter({ hasText: dataExportSubject }),
|
||||||
|
).toHaveCount(1);
|
||||||
|
await expect(
|
||||||
|
requester.page.getByRole("link").filter({ hasText: accountDeletionSubject }),
|
||||||
|
).toHaveCount(1);
|
||||||
|
|
||||||
const generalEmailBefore = await latestMessageID(request, requesterEmail);
|
const generalEmailBefore = await latestMessageID(request, requesterEmail);
|
||||||
await requester.page.goto("/legal/content-removal");
|
await requester.page.goto("/legal/content-removal");
|
||||||
await requester.page.getByLabel("Reason").selectOption("privacy_violation");
|
await requester.page.getByLabel("Reason").selectOption("privacy_violation");
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user