Merchant Surfaces on Live Data - Manual Test Plan โ
| Field | Value |
|---|---|
| Branch / PR | feat/merchant-dashboard-live-data (PR TBD, targets dev) |
| Environment | dev after merge (admin portal + dev.ourlantern.app + merchants-api/analytics-api deploys); scenarios marked [PRE-MERGE] run locally |
| Build flags / config | none new |
| Tester | Mechelle + agent (browser-drivable rows) |
| Date | 2026-07-26 |
Automated coverage already run (agent, all green) โ
- Admin suite 343/343 (Overview rewrite), incl. 3 new
deliverySeriesunit tests - Web: 8 merchant-screen tests (owned venues, honest empty/unavailable states), 3
merchantApplicationServicetests - merchants-api: 54 tests incl. 4 new
POST /merchants/applyroute tests (dedup, no-reopen, validation) - Rules emulator: 179 incl. new
merchant_applicationsserver-only test npm run validate -- --scope openapi: merchants-api spec in sync
Setup / preconditions โ
- A merchant identity linked to the test ecosystem:
users/{uid}.merchantId->merchants/{id}owning at least one venue (venues.merchantId). If none exists on dev, create via the admin portal first (that flow is pre-existing). - Admin portal for scenarios 1-2; dev.ourlantern.app signed in as a merchant user for 3-4; no sign-in for 5.
- Verify data in
lantern-app-devFirestore:merchant_applications,venues.activeLanternCount.
Summary โ
| # | Scenario | Result | Notes |
|---|---|---|---|
| 1 | Admin Overview renders live stats (no SAMPLE anywhere) | [ ] pass [ ] fail [ ] blocked | |
| 2 | Admin Overview honest states (metrics endpoint down -> en-dash + notice) | [ ] pass [ ] fail [ ] blocked | |
| 3 | Web app: #/merchant is gone; #/merchant/signup still works | [ ] pass [ ] fail [ ] blocked | scenarios 3-4 rewritten after D28 (dashboard removed) |
| 4 | Web ProfileSettings: no merchant card, no dev merchant-mode spoof | [ ] pass [ ] fail [ ] blocked | |
| 5 | Merchant application E2E: submit -> server-only doc -> resubmit dedup | [ ] pass [ ] fail [ ] blocked | |
| 6 | [PRE-MERGE] Storybook: dashboard stories render with venue loaders | [x] superseded | passed 2026-07-26, then the screen AND stories were removed under D28 |
Scenarios โ
1. Admin Overview renders live stats โ
- Goal: the canonical merchant page shows only real numbers.
- Steps:
- Admin portal > Merchants > pick the test merchant > Overview tab.
- Compare Active Offers / Draft / Expired against the Offers tab list.
- Compare Venues count against the merchant's linked venues.
- Check Lanterns 30d / Waves 30d / Unique visitors are plausible (0 is fine and honest on a quiet venue).
- Expected: no "sample data" banner, no 68% accept rate, no invented recent offers; Recent Offers matches the newest real offers; the chart is "Ad Views" per day (flat zero line is acceptable and honest).
- Verify (data/console):
GET /analytics/merchant/dashboard?period=30d&merchantId=...in the network tab returns the same totals rendered.
Result: [ ] pass [ ] fail [ ] blocked
Actual:
Evidence:
Follow-up:2. Admin Overview honest degradation โ
- Goal: an unavailable metrics source renders placeholders, never fabricated numbers.
- Steps:
- DevTools > Network > block the
/analytics/merchant/dashboardrequest (right-click > block URL), reload the Overview.
- DevTools > Network > block the
- Expected: Venues/Lanterns/Waves cards show the en-dash placeholder + the "unavailable right now" footnote; offers cards still render (different source); page never blanks.
Result: [ ] pass [ ] fail [ ] blocked
Actual:
Evidence:
Follow-up:3. Web app: dashboard gone, funnel intact (D28 regression) โ
- Goal: the web app no longer has a merchant portal surface, and the application funnel still works.
- Steps:
- Signed in as any user (including an admin), navigate to dev.ourlantern.app/#/merchant.
- Navigate to #/merchant/signup.
- Expected: #/merchant renders no merchant dashboard (falls through like an unknown route); #/merchant/signup renders the application form.
Result: [ ] pass [ ] fail [ ] blocked
Actual:
Evidence:
Follow-up:4. ProfileSettings carries no merchant remnants โ
- Goal: the confusing in-app pointers to the removed dashboard are gone.
- Steps: open Profile tab and the dev tools section of Settings; search for "Merchant Dashboard", "Merchant Mode", "Open Dashboard".
- Expected: none present; the dev location-spoof panel is unaffected.
Result: [ ] pass [ ] fail [ ] blocked
Actual:
Evidence:
Follow-up:5. Merchant application E2E โ
- Goal: the public application really persists, dedups, and stays server-only.
- Steps:
- Signed OUT, open dev.ourlantern.app/#/merchant/signup; submit with a test email (e.g. e2e-apply@example.com).
- Agent verifies via Admin SDK:
merchant_applications/{sha256(email)}exists, status pending, all fields present. - Submit again with the SAME email in different case and a new message.
- Agent verifies: same single doc,
updatedAtset, no duplicate. - Agent flips status to
approvedvia Admin SDK, submit a third time: doc unchanged (no reopen), UI still shows the generic success. - Agent cleans up the test doc.
- Expected: success screen each time; exactly one doc; client reads of the collection are PERMISSION_DENIED (covered by rules test, spot-check optional).
Result: [ ] pass [ ] fail [ ] blocked
Actual:
Evidence:
Follow-up:6. [PRE-MERGE] Storybook dashboard stories โ
- Goal: visual check of the reworked screen states.
- Steps:
npm run storybook; open Screens/Merchant/Dashboard stories (Default + suppressed/outage variants). - Expected: Your Venues section renders with the mock loaders (Roastery with "3 lit right now"); no fake-ad UI anywhere; no console errors.
Result: [ ] pass [ ] fail [ ] blocked
Actual:
Evidence:
Follow-up:Notes โ
- Scenarios 1-2 are admin-portal manual (or claude-in-chrome) checks; 3-5 are agent-drivable on dev post-merge (scenario 5 fully, via headless browser + ADC verification, mirroring the push-v1 E2E pattern).