QA Handbook
Updated · Aug 15, 2026How to test OnPageIQ: smoke checklist, regression rules, job queues, and what to file as bugs.
What changed
New step: Runtime Diagnostics capture — fixture pages at /test/diagnostics each trigger one real browser fault, so you can confirm the capture records it instead of assuming it would. Those pages were missing for four and a half months (a .gitignore rule swallowed them in March), so anything you checked there before now was never actually covered. Run the crash fixtures last: they freeze or kill the tab on purpose.
User goal
Run repeatable smoke and regression passes before releases; know what “correct” looks like.
- Tier
- All testers
- Nav label
- N/A (meta guide)
- Route
- /docs
- Gates
- —
Prerequisites
- Local app running (Herd: https://onpageiq.test or composer run dev: http://localhost:8000)
- Queue worker / Horizon running for async features
- Platform docs at /docs (standalone — not in product sidebar; full URL shown on docs home)
- At least one seeded demo org (see Test Environment guide)
QA focus
- Tenant isolation on every project-scoped URL
- Feature gates show upgrade UX, not raw errors
- Async jobs complete; UI reflects terminal state
- Credits and billing side effects are correct
Overview
OnPageIQ is org-scoped multi-tenant SaaS. Every test should use an explicit org and user; never assume “whatever is logged in” is enough.
What you get
- Smoke and regression patterns that match the feature guides under
/docs - Clear expectations for gates (upgrade UX), async jobs, credits, and billing side effects
- Mandatory cross-org and tier-downgrade coverage before release
How it works
- Pre-flight: seed demo data, start Horizon/queue, confirm login
- Run happy paths from each feature guide, then cross-org probes and tier/flag downgrades
- File bugs with org tier, flags, route, steps, expected vs actual, and Horizon job ID when async
Common issues & false alarms
- Horizon not running → scans/audits stuck in “processing”
- Playwright/browser not installed → scan or diagnostics failures
- Feature flag off for org → 403 or upgrade page (expected, not a bug)
- public/docs folder breaks artisan serve /docs route — images live under public/platform-doc-images/
- Local Listings / Company Intelligence scrapes stuck → Horizon must watch directory-listings and company-enrichment; restart supervisors after deploy
- Local Listings Incomplete / Failed confirms → unlock refunded, nothing linked; retry later or another URL (ops: BBB collector parity runbook §19)
Interactive guide
Step of
All steps (reference)
-
Step 1. Pre-flight
Seed demo data, start queue, confirm login works.
What to do: Run PlatformDocsDemoSeeder; open Horizon; log in as platform-docs@onpageiq.test
Where: Terminal + /login
Expected (pass)
- Dashboard loads with credit balance
- Horizon shows workers active (including company-enrichment and directory-listings supervisors when those addons are in scope)
- No 500 on first navigation
Negative cases (must fail safely)
- Wrong password shows validation error, not 500
Tips
- Use composer run dev for server + horizon + vite together
-
Step 2. Smoke pass (30 min)
Walk the smoke checklist on the docs home page: auth, scan, navigation, jobs, addons.
What to do: Follow each bullet in the Smoke checklist section on /docs
Where: /docs → Smoke checklist
Expected (pass)
- Each checklist item pass or documented known limitation
Negative cases (must fail safely)
- Do not skip cross-org check — it is mandatory
-
Step 3. Runtime Diagnostics capture
Fixture pages that each trigger one real browser fault, so you can confirm the diagnostics capture records it rather than trusting that it would. Registered in local and test environments only — these never serve to customers.
What to do: Open /test/diagnostics and work down the list; visiting a page is usually enough, since the cheap faults fire on load
Where: /test/diagnostics
Expected (pass)
- Console errors, uncaught exceptions and unhandled rejections are captured with their message and source
- Mixed content and CSP violations are captured as security events, not as generic errors
- Network failures record the failing URL and status (a 404, and a host that does not resolve)
- Sensitive-data logging is captured REDACTED — the page logs fabricated API keys, a JWT, a card number and a password, and none of those values may appear in stored diagnostics
Negative cases (must fail safely)
- Dialogs (alert/confirm/prompt) sit behind buttons on purpose — firing them on load would block the page before anything could observe it
- The page-crash fixtures freeze or kill the tab by design and ask for confirmation first; run them last, in a tab you do not mind losing
Tips
- These pages were missing for four and a half months (a .gitignore rule swallowed them), so anything you remember checking here before mid-2026 was never actually covered
-
Step 4. Feature-deep pass
For each changed area in the release, open the matching /docs/{feature} guide and run every step.
What to do: Use interactive guide stepper; compare UI to screenshots
Where: /docs → category → feature guide
Expected (pass)
- All “Expected results” assertions pass
- Screenshots match current UI (or file doc drift ticket)
-
Step 5. Admin: Filament Intelligence caches
Ops inspect shared enrichment caches in Filament. Company Intelligence → Company Profiles; Local Listings → Directory Profiles. Enable addons per org under Organizations → Add-ons (Pennant overrides).
What to do: Filament → Intelligence → Company Profiles / Directory Profiles; Organizations → Add-ons
Expected (pass)
- Directory Profiles lists BBB cache rows after a successful Local listings confirm
- reported_bad flag visible when a tenant reports a bad listing
- Raw JSON / artifacts / unlocks / project links relation managers render
Negative cases (must fail safely)
- No free-edit of scraped fields (view/purge/refresh only)
Tips
- Queues: company-enrichment (CI), directory-listings (BBB profile + phase-2 artifacts).
-
Step 6. File bugs
Include org tier, feature flags, URL, steps, expected vs actual, Horizon job ID if async.
What to do: Reproduce once; capture screenshot + network tab for API issues
Expected (pass)
- Bug report contains route name and org slug
Related guides
Test Environment & Accounts
Seeders, demo credentials, and commands to reset local QA data.
Tiers & Feature Gates
What each subscription tier unlocks and how Pennant flags / addons interact.
Reading a System Error
What a system_error audit row tells you, and how to see the real error on a testing environment instead of "Server Error".
Tenant Isolation Testing
Mandatory cross-org tests: Org A data must never leak to Org B.
Getting Started
First-run orientation: log in, create a project, run a content scan, and read results.
Local Listings
Match BBB, Yelp, Angi, Trustpilot, and G2 listings to a project (Google Business Profile sync planned), confirm the right business, and surface reputation proofs in Business Profile, Local SEO, and Intelligence.
Company Intelligence
Look up firmographic detail for a list of company domains and keep it in a shared, org-level library.