e2e/month-exports.spec.ts
Linked repository file from this build.
import { expect, test } from "@playwright/test";
import { readFile } from "node:fs/promises";
test("sample-month exports download only eligible scoped rows and enforce export roles", async ({
page,
request,
}) => {
await page
.context()
.addCookies([{ name: "qc-test-staff", value: "501", url: "http://localhost:3001" }]);
await page.goto("/exports");
await expect(
page.getByRole("table", { name: "Export eligibility by sample month" }),
).toBeVisible();
await expect(
page
.getByRole("navigation", { name: "Main navigation" })
.getByRole("link", { name: "Exports", exact: true }),
).toHaveAttribute("aria-current", "page");
const response = await request.get("/api/exports", { headers: { "x-qc-test-staff": "501" } });
expect(response.ok()).toBe(true);
const months: { month: string; eligible: number }[] = (await response.json()).months;
const selected = months.filter((row) => row.eligible > 0).slice(0, 2);
expect(selected).toHaveLength(2);
for (const row of selected)
await page.getByRole("switch", { name: row.month, exact: true }).check();
const downloadPromise = page.waitForEvent("download");
await page.getByRole("button", { name: "Download FNS TSV", exact: true }).click();
const download = await downloadPromise;
expect(download.suggestedFilename()).toBe(
`transmittal-${selected.map((row) => row.month).join("_")}.tsv`,
);
const content = await readFile((await download.path())!, "utf8");
expect(content.split("\r\n").filter(Boolean)).toHaveLength(
2 + selected.reduce((sum, row) => sum + row.eligible, 0),
);
expect(content).toContain("reviewNumber\tcaseNumber");
await expect(page.getByRole("status")).toContainText("Downloaded");
for (const staff of ["101", "401"])
expect(
(await request.get("/api/exports", { headers: { "x-qc-test-staff": staff } })).status(),
).toBe(403);
expect(
(
await request.get(`/api/exports?kind=fns&month=${selected[0].month}`, {
headers: { "x-qc-test-staff": "201" },
})
).status(),
).toBe(403);
const epp = await request.get(
`/api/exports?kind=epp&${selected.map((row) => `month=${row.month}`).join("&")}`,
{ headers: { "x-qc-test-staff": "201" } },
);
expect(epp.ok()).toBe(true);
expect((await epp.json()).content).toContain("QC_Record_Number\tProgram_Type");
});