Cover personal data support workflows

This commit is contained in:
SimpleTest 2026-08-13 06:35:00 +03:00
parent 1eea74f454
commit 7908189e40

View File

@ -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");