85 lines
3 KiB
TypeScript
85 lines
3 KiB
TypeScript
/**
|
|
* User stories covered: Feature 7 — Payment history page at /payments/history
|
|
* - ACCOUNTS user can navigate to /payments/history and see paid POs
|
|
* - Non-ACCOUNTS roles are redirected away from /payments/history
|
|
*
|
|
* Note: /payments/history uses hasPermission(role, "view_all_pos") — only ACCOUNTS,
|
|
* MANAGER, SUPERUSER, AUDITOR, ADMIN have this permission. TECHNICAL does not.
|
|
*
|
|
* Created: 2026-05-17
|
|
*/
|
|
import { test, expect } from "@playwright/test";
|
|
import { login, USERS } from "./helpers/login";
|
|
|
|
test.describe("Feature 7 — Payment history page", () => {
|
|
test("US-7a: ACCOUNTS user can load /payments/history", async ({ page }) => {
|
|
await login(page, USERS.ACCOUNTS);
|
|
await page.goto("/payments/history");
|
|
|
|
await expect(page).toHaveURL(/payments\/history/);
|
|
await expect(
|
|
page.getByRole("heading", { name: /payment history/i })
|
|
).toBeVisible();
|
|
console.log("✓ Payment History page loads for ACCOUNTS user");
|
|
});
|
|
|
|
test("US-7a: /payments/history shows a table or empty-state message", async ({
|
|
page,
|
|
}) => {
|
|
await login(page, USERS.ACCOUNTS);
|
|
await page.goto("/payments/history");
|
|
|
|
// Either a table with rows, or the empty-state paragraph
|
|
const tableOrEmpty =
|
|
(await page.locator("table").count()) > 0 ||
|
|
(await page.getByText(/no paid orders found/i).isVisible());
|
|
|
|
expect(tableOrEmpty).toBeTruthy();
|
|
console.log("✓ Payment History renders table or empty-state");
|
|
});
|
|
|
|
test("US-7a: /payments/history contains a heading or summary stat", async ({
|
|
page,
|
|
}) => {
|
|
await login(page, USERS.ACCOUNTS);
|
|
await page.goto("/payments/history");
|
|
|
|
// Page shows "Payment History" heading and a "Total Paid" stat card
|
|
await expect(page.getByText(/total paid/i)).toBeVisible();
|
|
console.log("✓ Total Paid stat visible on Payment History page");
|
|
});
|
|
|
|
test("US-7b: TECHNICAL user is redirected away from /payments/history", async ({
|
|
page,
|
|
}) => {
|
|
await login(page, USERS.TECH);
|
|
await page.goto("/payments/history");
|
|
|
|
// The page redirects non-view_all_pos roles to /dashboard
|
|
await expect(page).not.toHaveURL(/payments\/history/);
|
|
console.log("✓ TECHNICAL user redirected from /payments/history");
|
|
});
|
|
|
|
test("US-7b: MANNING user is redirected away from /payments/history", async ({
|
|
page,
|
|
}) => {
|
|
await login(page, USERS.MANNING);
|
|
await page.goto("/payments/history");
|
|
|
|
await expect(page).not.toHaveURL(/payments\/history/);
|
|
console.log("✓ MANNING user redirected from /payments/history");
|
|
});
|
|
|
|
test("US-7a: MANAGER user can also access /payments/history (view_all_pos)", async ({
|
|
page,
|
|
}) => {
|
|
await login(page, USERS.MANAGER);
|
|
await page.goto("/payments/history");
|
|
// Manager has view_all_pos permission — should NOT be redirected
|
|
await expect(page).toHaveURL(/payments\/history/);
|
|
await expect(
|
|
page.getByRole("heading", { name: /payment history/i })
|
|
).toBeVisible();
|
|
console.log("✓ MANAGER can access Payment History page");
|
|
});
|
|
});
|