● General
full-app-test
Run a thorough end-to-end test of the entire app using the Playwright CLI against the deployed environment, with a draft PR, TEST_PLAN.md, scenario specs, fix-as-you-go iteration, and a final coverage report.
Run a thorough end-to-end test of the entire app using the Playwright CLI (playwright is installed globally).
Where to test: Run against the deployed environment, not localhost. This means:
- Frontend → the live Vercel URL (production deployment if it exists, otherwise the latest preview / staging deploy).
- Backend → the live Heroku or DigitalOcean URL the frontend points at.
- Even though these URLs may be labeled "production," the app is still in pre-launch test mode with no real users. Treat the deployed environment as a QA/staging environment: you have full latitude to create, modify, or delete data and to spin up as many user accounts as needed to cover every flow.
- Hard stops: do not touch any environment that is genuinely live with real customer data, do not call third-party APIs in live mode (Stripe live keys, real email/SMS to non-test addresses, real webhooks to external partners), and do not modify shared infrastructure (DNS, prod DB schema outside migrations, secrets).
- If you can't tell whether an environment is safe to write to, stop and ask before proceeding.
Determine the URLs before writing any specs:
- Check
vercel.json,.vercel/project.json, or runvercel ls/vercel inspectfor the frontend URL. - Check
app.json/heroku.yml,Procfile, or runheroku apps:info -a <app>for Heroku; check.do/app.yamlordoctl apps listfor DigitalOcean. - Confirm the frontend's
NEXT_PUBLIC_API_URL(or equivalent) actually resolves to the backend you intend to test, so frontend specs hit the matching backend. - Record both URLs in the
TEST_PLAN.mdunder an "Environment" section.
Workflow
-
Branch & PR setup (do this first, before any testing).
- Create a fresh branch off the current default branch named
qa/full-app-test-<YYYY-MM-DD>. - Open a draft PR titled
QA: Full app test pass (<YYYY-MM-DD>)with an initial body that lists the planned test scopes and notes that the PR will be updated continuously as bugs are found and fixed. - Keep the PR in draft until the entire run is finished. Do not merge.
- Create a fresh branch off the current default branch named
-
Build the test plan. Before writing any specs, write a
TEST_PLAN.mdin the repo root (ordocs/qa/if it exists) covering:- Every user role and the entry points each one has.
- Auth flows: signup, login, logout, password reset, MFA/2FA if present, session expiry, role switching.
- Core CRUD for each primary resource — happy path and at least two failure cases per resource (validation errors, permission errors, race conditions).
- Cross-role interactions (e.g., admin sees what a regular user just submitted).
- Permissions and tenant isolation: prove user A cannot see, edit, or act on user B's data.
- Payment, billing, or webhook flows if applicable — use test mode only.
- File uploads, exports, emails/notifications — verify content and delivery side effects.
- Empty states, loading states, error states, and offline / network-failure behavior.
- Mobile viewport and at least one accessibility smoke pass (keyboard nav, focus order, alt text on key screens).
- Performance smell tests on the heaviest pages (note slow loads, layout shifts, console errors).
-
Set up the Playwright test project.
- If the repo already has a
playwright.config.*and a tests directory, use it. - Otherwise, scaffold one in
tests/e2e/with aplaywright.config.tsthat:- sets
use.trace: 'on-first-retry',use.screenshot: 'only-on-failure',use.video: 'retain-on-failure' - configures
baseURLfromprocess.env.BASE_URL(default to the deployed Vercel URL identified above — never localhost; fail loudly ifBASE_URLis unset) - if specs hit the API directly, expose
process.env.API_URLthe same way (default to the deployed Heroku/DO URL) - does not start a
webServer— we are testing a deployed environment, not booting a local one - registers projects for
chromium,firefox,webkit, and aMobile Safaridevice for the mobile pass - sets
reporter: [['list'], ['html', { open: 'never' }]]
- sets
- Add
@playwright/testas a dev dep if it's missing (npm i -D @playwright/test). The globalplaywrightCLI works against the local install once it exists. - Centralize logins with
storageStatefixtures — auth once per role, reuse across specs.
- If the repo already has a
-
Author specs scenario-by-scenario. Group by area (
auth.spec.ts,crud-<resource>.spec.ts,permissions.spec.ts,payments.spec.ts, etc.). For each scenario, encode: the steps, the expected result viaexpect(...)assertions, and any console/network listeners (page.on('console', ...),page.on('pageerror', ...)) that fail the test on unexpected errors.- Use
playwright codegen <url>when you need to capture a selector or flow quickly, then clean up the output before committing. - Prefer role/text locators (
getByRole,getByLabel,getByText) over CSS selectors.
- Use
-
Run the suite and iterate.
- Headless run for the full pass:
playwright test --reporter=list. - Single-spec debugging:
playwright test path/to.spec.ts --headed --trace=on. - Inspect failures:
playwright show-reportandplaywright show-trace test-results/.../trace.zip. - For each failing scenario, capture in the PR: steps, expected, actual, trace path or screenshot, and any console/network errors.
- Headless run for the full pass:
-
Fix bugs as you go and push to the same PR.
- When a spec catches a bug, fix it on this QA branch, commit with a clear message referencing the failing scenario, and push.
- Re-run the failing spec (
playwright test -g "<scenario name>") to confirm the fix before moving on. - Update the PR description with a running checklist of bugs found and resolved.
- If a bug is out of scope or risky to fix in this pass (e.g., needs a schema migration, design decision, or third-party change), document it in the PR body under "Deferred" with reasoning instead of attempting a fix.
-
Stop conditions.
- Do not merge the PR.
- Do not mark the PR ready for review until every planned scenario has either passed or been explicitly deferred with justification.
- Commit the spec files — they're the durable artifact of this pass and the seed of an ongoing E2E suite.
Final summary (post in chat when done)
Produce a concise report containing:
- Coverage — scopes tested, scopes skipped (and why), spec files added.
- Bugs found & fixed — one line each: scenario → root cause → fix (commit SHA).
- Bugs deferred — one line each: scenario → why deferred → suggested next step.
- Regressions or risks — anything that worked but felt fragile, slow, or inconsistent.
- Suggested follow-ups — specs worth promoting to CI, refactors worth doing, monitoring worth adding.
- PR link — the draft PR URL so I can review before merge.
- How to re-run — the exact
playwright test ...command(s) needed to reproduce the pass locally.
Keep the summary tight — bullets over prose. The PR description is where the long form lives.