test-report-2026-05-17.md — Run summary for the 2026-05-17 session: 64 passed, 3 flaky, 2 skipped, 61 failed (all in pre-existing specs with legacy selectors). Includes per-spec results, root causes for every failure category, and recommended fixes. e2e-test-framework.md — Developer reference covering stack, directory layout, playwright.config.ts rationale (workers: 2, why bcrypt floods the server), shared helpers, selector conventions (PO form has no htmlFor bindings), mobile viewport pattern, and future improvements including auth state sharing. e2e-test-plan.md — Feature coverage matrix mapping all 21 user story groups to their spec files and roles, individual test case tables, regression trigger checklist by code area, gap analysis, and planned CI configuration. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
12 KiB
12 KiB
PPMS — E2E Test Plan
Version: 1.0
Date: 2026-05-17
Scope: PPMS portal (App/pelagia-portal)
Test type: Browser-level end-to-end (Playwright / Chromium)
1 · Objectives
- Verify that each shipped feature behaves correctly from a user's perspective in a real browser session against a live Next.js dev server and PostgreSQL database.
- Catch regressions introduced by new features before they reach production.
- Document the expected user experience for each role so that future developers have a runnable specification, not just written prose.
2 · Scope
In scope
- All authenticated portal routes under
/(portal)/ - Login / logout flows
- Role-based access control (page redirects, element visibility)
- Mobile-specific layout and navigation (375 × 812 viewport)
- API-level gate checks (HTTP status codes on export endpoint)
Out of scope
- Unit tests for individual components and utilities →
tests/unit/(Vitest) - Integration tests for Server Actions and database mutations →
tests/integration/(Vitest + real DB) - Email delivery (Resend is console-logged in dev; not browser-testable)
- File storage (R2 is mocked to
.dev-uploads/in dev) - GstService GST-number lookup (separate Node.js service; tested independently)
- Visual pixel-perfect regression (not yet implemented)
3 · Test Environment
| Item | Value |
|---|---|
| Base URL | http://localhost:3000 |
| App server | Next.js 15 dev server (pnpm dev) — auto-started by Playwright webServer config |
| Database | Local PostgreSQL populated with pnpm db:seed |
| Browser | Chromium (headless by default) |
| Auth | Fresh login per test using seeded credentials |
Prerequisite: run pnpm db:seed before the first test run to ensure all users,
vessels, accounts, vendors, and POs are present.
4 · User Roles Under Test
| Role | Capabilities tested | |
|---|---|---|
| TECHNICAL | tech@pelagia.local | Create/submit POs, view status, receipt confirmation |
| MANNING | manning@pelagia.local | Same as TECHNICAL; separate user for isolation |
| ACCOUNTS | accounts@pelagia.local | Payment queue, mark paid, payment history, partial receipt |
| MANAGER | manager@pelagia.local | Approval queue, approve/reject/request-edits, mobile |
| SUPERUSER | superuser@pelagia.local | All manager capabilities + admin read |
| ADMIN | admin@pelagia.local | Admin CRUD pages (users, vendors, vessels, etc.) |
| AUDITOR | auditor@pelagia.local | Desktop Required overlay (non-mobile role) |
5 · Feature Coverage Matrix
Each row maps a shipped feature (linked to its git commit) to the spec file that verifies it, the roles exercised, and the current test status.
| # | Feature | Spec File | Roles | Status |
|---|---|---|---|---|
| 1 | PPMS rebrand — login, sidebar, title | rebrand.spec.ts |
TECH | ✅ Pass |
| 2 | Color-coded PO status badges on dashboard | dashboard/po-status-badges.js |
TECH, MANAGER | ✅ Pass |
| 3 | Submit for Approval button on DRAFT PO detail | po-submit-button.spec.ts |
TECH | ⚠️ Selector fix needed |
| 4 | In-app notification bell with unread badge | notification-bell.spec.ts |
TECH, MANAGER, ACCOUNTS | ✅ Pass |
| 5 | Export gate — PDF/XLSX only on MGR_APPROVED+ | export-gate.spec.ts |
TECH, MANAGER | ✅ Pass |
| 6 | Approver name as signatory on exported docs | export-gate.spec.ts |
ACCOUNTS | ✅ Pass |
| 7 | Payment history page at /payments/history |
payment-history.spec.ts |
ACCOUNTS, MANAGER, TECH | ✅ Pass |
| 8 | Partial receipt confirmation (per-item delivery) | partial-receipt.spec.ts |
ACCOUNTS, TECH | ✅ Pass |
| 9 | Auto-verify vendor on first successful payment | vendor-auto-verify.spec.ts |
ADMIN, ACCOUNTS | ✅ Pass (UI only; full flow skipped) |
| 10 | Bordered buttons on admin pages | admin-bordered-buttons.spec.ts |
ADMIN | ✅ Pass |
| 11 | User profile page and manager signature | profile.spec.ts |
TECH, ACCOUNTS, MANAGER, SUPERUSER | ✅ 6/7 pass |
| 12 | Cheapest / ★ Closest tags on inventory items | inventory/items-tags.spec.ts |
TECH | ✅ Pass |
| 13 | Auto-sort by distance when site is selected | inventory/items-tags.spec.ts |
TECH | ✅ Pass |
| 14 | Cart icon in header with item count badge | inventory/cart-icon.spec.ts |
TECH | ✅ Pass |
| 15 | Item and vendor detail pages at /inventory/…/[id] |
inventory/cart-icon.spec.ts |
TECH | ✅ Pass |
| 16 | Desktop Required overlay for non-mobile roles | mobile/desktop-required.spec.ts |
AUDITOR, TECH | ✅ Pass |
| 17 | Manager approval queue as mobile cards | mobile/manager-approvals.spec.ts |
MANAGER | ✅ Pass |
| 18 | Accounts payment actions on mobile | mobile/accounts-payments.spec.ts |
ACCOUNTS | ✅ Pass |
| 19 | Sign-out button on Desktop Required overlay | mobile/desktop-required.spec.ts |
AUDITOR | ✅ Pass |
| 20 | Home tab in mobile bottom navigation | mobile/bottom-nav.spec.ts |
MANAGER, ACCOUNTS | ✅ Pass |
| 21 | Edit-highlight diff on resubmitted POs | approvals-edit-highlight.spec.ts |
TECH, MANAGER | ⚡ Flaky |
6 · Test Case Descriptions
Feature 1 — PPMS Rebrand
| ID | Description | Expected |
|---|---|---|
| US-1a | Visit /login |
Page shows text "PPMS" and "Pelagia Payment Management System" |
| US-1a | Visit /login |
Page does NOT show "Pelagia Portal" |
| US-1b | Log in as any user | Sidebar displays "PPMS" |
| US-1c | Log in as any user | Browser tab title matches /PPMS/i |
Feature 2 — Dashboard Status Badges
| ID | Description | Expected |
|---|---|---|
| US-2a | TECHNICAL logs in, visits /dashboard |
Each PO row has a visible badge element with a background-color class |
| US-2b | MANAGER logs in, visits /dashboard |
Same — badges present on manager view |
Feature 4 — Notification Bell
| ID | Description | Expected |
|---|---|---|
| US-4a | Any user logs in | A bell icon button is visible in the header |
| US-4b | User has unread notifications | A numeric badge or dot is visible on/near the bell |
| US-4c | User clicks the bell | A dropdown/panel appears containing notification items |
Feature 5 & 6 — Export Gate
| ID | Description | Expected |
|---|---|---|
| US-5a | Visit a DRAFT PO detail page | No "Export PDF" or "Export XLSX" buttons visible |
| US-5b | Visit a MGR_APPROVED PO detail page | Export buttons are visible |
| US-5c | GET /api/po/[draftId]/export?format=pdf |
HTTP 403 with error JSON |
| US-6a | GET /api/po/[approvedId]/export?format=xlsx |
HTTP 200, content-type application/vnd.openxmlformats… |
| US-6b | GET /api/po/[approvedId]/export?format=pdf |
HTTP 200, content-type application/pdf |
Feature 7 — Payment History
| ID | Description | Expected |
|---|---|---|
| US-7a | ACCOUNTS visits /payments/history |
Page loads; shows table or empty-state |
| US-7a | MANAGER visits /payments/history |
Page loads (MANAGER has view_all_pos permission) |
| US-7b | TECHNICAL visits /payments/history |
Redirected to /dashboard |
| US-7b | MANNING visits /payments/history |
Redirected to /dashboard |
Feature 10 — Admin Bordered Buttons
| ID | Description | Expected |
|---|---|---|
| US-10a | ADMIN visits /admin/vendors |
Edit and Delete/Deactivate buttons have a CSS class containing border |
| US-10b | ADMIN visits /admin/users |
Same |
| US-10c | ADMIN visits /admin/vessels |
Same |
| US-10d | ADMIN visits /admin/accounts |
Same |
Feature 16–19 — Mobile Experience
| ID | Description | Viewport | Expected |
|---|---|---|---|
| US-16a | AUDITOR logs in | 375 × 812 | "Desktop Required" overlay covers the page |
| US-16a | TECHNICAL logs in | 375 × 812 | "Desktop Required" overlay visible |
| US-16a | MANAGER logs in | 375 × 812 | No overlay — portal content visible |
| US-16a | ACCOUNTS logs in | 375 × 812 | No overlay — portal content visible |
| US-19a | AUDITOR on Desktop Required screen | 375 × 812 | "Sign out" button present in overlay |
| US-19b | AUDITOR clicks "Sign out" | 375 × 812 | Redirected to /login |
| US-17a | MANAGER visits /approvals |
375 × 812 | PO cards rendered (not a table) |
| US-17b | MANAGER taps a PO card | 375 × 812 | Navigates to /approvals/[id] |
| US-17c | MANAGER on /approvals/[id] |
375 × 812 | Edit form hidden; Approve/Reject buttons visible |
| US-18a | ACCOUNTS visits /payments |
375 × 812 | Payment queue loads; no Desktop Required overlay |
| US-18b | ACCOUNTS sees MGR_APPROVED PO | 375 × 812 | "Start Payment Processing" button visible |
| US-18c | ACCOUNTS sees SENT_FOR_PAYMENT PO | 375 × 812 | Reference input + "Confirm Payment Sent" button visible |
Feature 20 — Mobile Bottom Navigation
| ID | Description | Viewport | Expected |
|---|---|---|---|
| US-20a | MANAGER logs in | 375 × 812 | Bottom nav has links to /dashboard, /approvals, /profile |
| US-20b | MANAGER taps Home tab | 375 × 812 | Navigates to /dashboard |
| US-20c | ACCOUNTS logs in | 375 × 812 | Bottom nav has links to /dashboard, /payments, /profile |
| US-20c | ACCOUNTS taps Home tab | 375 × 812 | Navigates to /dashboard |
7 · Regression Checklist
Run after any change to the following areas:
| Area changed | Specs to run |
|---|---|
| Auth / login / NextAuth config | auth.spec.ts, rebrand.spec.ts |
| Portal layout (sidebar, header, mobile nav) | mobile/bottom-nav.spec.ts, mobile/desktop-required.spec.ts, rebrand.spec.ts |
| PO state machine / status transitions | export-gate.spec.ts, po-submit-button.spec.ts, approvals-edit-highlight.spec.ts |
| Payment / Accounts flows | accounts-payment.spec.ts, payment-history.spec.ts, mobile/accounts-payments.spec.ts |
| Approval / Manager flows | manager-approvals.spec.ts, mobile/manager-approvals.spec.ts |
| Admin pages | admin-bordered-buttons.spec.ts |
| Inventory / Items | inventory/items-tags.spec.ts, inventory/cart-icon.spec.ts |
| Profile page | profile.spec.ts |
| Notifications | notification-bell.spec.ts |
| Export endpoint | export-gate.spec.ts, po-export.spec.ts |
8 · Gaps & Future Test Coverage
The following areas are not yet covered by automated E2E tests:
| Gap | Priority | Notes |
|---|---|---|
| Full vendor auto-verify flow (TECH → submit → MANAGER → approve → ACCOUNTS → pay → verify) | Medium | Requires beforeAll multi-role setup; skip currently in place |
PO edit form (/po/[id]/edit) — field pre-population |
High | submitter-journey.spec.ts covers this but currently fails due to selector issue |
| Edits-requested email trigger | Low | Email is console-logged in dev; not directly testable in browser |
| AUDITOR read-only views | Medium | AUDITOR can view all POs; no spec yet |
| Superuser access requests on profile page | Low | UI exists; no spec |
| PDF/XLSX content verification (signature name, PO fields) | Medium | API returns correct status; content inspection not yet asserted |
| MANNING/TECHNICAL Desktop Required overlay | Done | Covered in desktop-required.spec.ts |
| Password change flow | Low | Form exists on profile page; not yet exercised |
9 · Continuous Integration (Planned)
When wired into CI (GitHub Actions), the following configuration applies:
# .github/workflows/e2e.yml
- name: Install Playwright browsers
run: pnpm exec playwright install --with-deps chromium
- name: Run E2E tests
run: pnpm test:e2e
env:
CI: "true"
DATABASE_URL: ${{ secrets.TEST_DATABASE_URL }}
NEXTAUTH_SECRET: ${{ secrets.NEXTAUTH_SECRET }}
NEXTAUTH_URL: "http://localhost:3000"
In CI mode (process.env.CI = "true"), the config uses:
workers: 1— no concurrency, avoids auth flooding on constrained runnersretries: 2— two retry attempts before marking a test as failedforbidOnly: true— fails the run if anytest.onlyis left in the code