Skip to content

Merchant Surfaces on Live Data - Manual Test Plan โ€‹

FieldValue
Branch / PRfeat/merchant-dashboard-live-data (PR TBD, targets dev)
Environmentdev after merge (admin portal + dev.ourlantern.app + merchants-api/analytics-api deploys); scenarios marked [PRE-MERGE] run locally
Build flags / confignone new
TesterMechelle + agent (browser-drivable rows)
Date2026-07-26

Automated coverage already run (agent, all green) โ€‹

  • Admin suite 343/343 (Overview rewrite), incl. 3 new deliverySeries unit tests
  • Web: 8 merchant-screen tests (owned venues, honest empty/unavailable states), 3 merchantApplicationService tests
  • merchants-api: 54 tests incl. 4 new POST /merchants/apply route tests (dedup, no-reopen, validation)
  • Rules emulator: 179 incl. new merchant_applications server-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-dev Firestore: merchant_applications, venues.activeLanternCount.

Summary โ€‹

#ScenarioResultNotes
1Admin Overview renders live stats (no SAMPLE anywhere)[ ] pass [ ] fail [ ] blocked
2Admin Overview honest states (metrics endpoint down -> en-dash + notice)[ ] pass [ ] fail [ ] blocked
3Web app: #/merchant is gone; #/merchant/signup still works[ ] pass [ ] fail [ ] blockedscenarios 3-4 rewritten after D28 (dashboard removed)
4Web ProfileSettings: no merchant card, no dev merchant-mode spoof[ ] pass [ ] fail [ ] blocked
5Merchant application E2E: submit -> server-only doc -> resubmit dedup[ ] pass [ ] fail [ ] blocked
6[PRE-MERGE] Storybook: dashboard stories render with venue loaders[x] supersededpassed 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:
    1. Admin portal > Merchants > pick the test merchant > Overview tab.
    2. Compare Active Offers / Draft / Expired against the Offers tab list.
    3. Compare Venues count against the merchant's linked venues.
    4. 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:
    1. DevTools > Network > block the /analytics/merchant/dashboard request (right-click > block URL), reload the Overview.
  • 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:
    1. Signed in as any user (including an admin), navigate to dev.ourlantern.app/#/merchant.
    2. 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:
    1. Signed OUT, open dev.ourlantern.app/#/merchant/signup; submit with a test email (e.g. e2e-apply@example.com).
    2. Agent verifies via Admin SDK: merchant_applications/{sha256(email)} exists, status pending, all fields present.
    3. Submit again with the SAME email in different case and a new message.
    4. Agent verifies: same single doc, updatedAt set, no duplicate.
    5. Agent flips status to approved via Admin SDK, submit a third time: doc unchanged (no reopen), UI still shows the generic success.
    6. 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).

Built with VitePress