Munchara Regression Checklist
Run through these test cases after every deploy to verify fixes stay fixed.
67 total0 passed67 unchecked
hp-1
Animated pill badges render
- 1.Visit /
Expected: Three orange pill badges animate in below the hero headline. All three use the primary orange color (no gray or default colors).
hp-2
Hero CTA buttons
- 1.Visit /
- 2.Check the two CTA buttons in the hero
Expected: "Explore Restaurants" is a solid orange pill button. "Upload a Video" is a secondary/outlined pill. Both are clickable and navigate correctly.
hp-3
Share button — desktop (copy URL)
- 1.Visit / on desktop
- 2.Click the Share button in the hero
Expected: A ShareMenu popover opens with Facebook, X, LinkedIn, WhatsApp, copy link, and native share options. Clicking "Copy link" copies the URL to clipboard.
hp-4
Share button — mobile (native share)
- 1.Visit / on a mobile device
- 2.Tap the Share button
Expected: The native OS share sheet opens (Web Share API). No crash or blank popover.
hp-5
Community video carousel loads
- 1.Visit /
- 2.Scroll to the Community carousel section
Expected: Carousel fetches from /api/videos/recent and renders video cards. Cards are swipeable. Thumbnails show either a thumbnail image or a <video> element for null thumbnailUrl.
hp-6
Community carousel — circular avatar
- 1.Visit /
- 2.Inspect each community carousel card
Expected: Each card has a circular avatar top-left with a white border ring. If no photo, shows creator initials. No broken image icons.
hp-7
Creator carousel loads
- 1.Visit /
- 2.Scroll to the Creator carousel section
Expected: Carousel fetches from /api/videos/creator. Cards show a gold "Creator" badge and gold heart counts. Each card links to /feed?v={id}&creator=1.
hp-8
Featured restaurant cards
- 1.Visit /
- 2.Scroll to the featured restaurants section
Expected: Restaurant cards render with images, names, and cuisine tags. Clicking a card navigates to /places/:id.
feed-1
Feed loads and plays first video
- 1.Visit /feed
Expected: First video autoplays (muted). No crash or blank screen.
feed-2
Single tap — play / pause
- 1.Visit /feed
- 2.Tap/click the video once
Expected: Video pauses. Tap again — video resumes. No accidental like triggered.
feed-3
Double tap — like
- 1.Visit /feed
- 2.Double-tap the video area
Expected: Like animation fires. For guests: optimistic like (not persisted, no 401 crash). For signed-in users: like is persisted.
feed-4
"Tap to unmute" hint
- 1.Visit /feed
- 2.Wait 1 second after video loads
Expected: "Tap to unmute" hint appears after ~1 second. Tapping it unmutes. Hint does not reappear in the same session after dismissal.
feed-5
Mute state persists across clips
- 1.Visit /feed
- 2.Unmute a video
- 3.Scroll to the next clip
Expected: Next clip plays unmuted. Mute state is lifted to page level and does not reset per clip.
feed-6
Action rail z-index — no tap bleed
- 1.Visit /feed
- 2.Tap the Like, Comment, Share, or Food Spot buttons in the action rail
Expected: Buttons respond correctly. Tapping them does NOT trigger play/pause on the video behind them.
feed-7
Bottom info stays left-constrained
- 1.Visit /feed
- 2.Check the caption / creator info at the bottom
Expected: Text is hard-constrained to the left side, stopping 72px from the right edge. It does not overlap the action rail buttons.
feed-8
Avatar links to creator profile
- 1.Visit /feed
- 2.Tap the creator avatar in the action rail
Expected: Navigates to /creator-profile/:creatorProfileId when available. No 404.
feed-9
Food Spot button only shows when placeId exists
- 1.Visit /feed
- 2.Check multiple clips
Expected: Food Spot button renders only on clips that have a non-null placeId. Clips without a placeId show no Food Spot button.
feed-10
Deep-link: /feed?v=ID&creator=1
- 1.Navigate to /feed?v={a valid video ID}&creator=1
Expected: Feed opens directly on that video. Creator feed context is applied.
feed-11
Share menu in feed
- 1.Visit /feed
- 2.Tap the Share button on a clip
Expected: ShareMenu opens with correct URL for that clip. Tapping outside the menu closes it without triggering play/pause.
cr-1
Public creator profile loads
Known regression- 1.Visit /creator-profile/:id with a valid creator ID
Expected: Profile renders: photo, name, verified badge, city, bio, social links, video grid, Follow button, and Favorite Spots section. No crash.
API route MUST be registered as /api/creator/public/:id — missing :id param caused all lookups to fail.
cr-2
Follow button — unauthenticated
- 1.Log out
- 2.Visit a creator profile
- 3.Click Follow
Expected: Redirected to /login. No crash.
cr-3
Follow button — authenticated toggle
- 1.Log in
- 2.Visit a creator profile
- 3.Click Follow
- 4.Click again
Expected: Button toggles between "Follow" and "Following" pill states. State persists on page refresh.
cr-4
Feed avatar rail follow toggle
- 1.Visit /feed while logged in
- 2.Tap the + icon on the avatar rail
Expected: + icon toggles to a checkmark/following state. Follow is persisted.
cr-5
Creator dashboard — auth gated
- 1.Log out
- 2.Visit /creator-dashboard
Expected: Redirected to login. Dashboard is not accessible without authentication.
cr-6
Creator dashboard — video grid
- 1.Log in as a creator
- 2.Visit /creator-dashboard
Expected: Stats, video grid, upload area, and profile editing section all render. No blank sections.
cr-7
Creator dashboard — video delete
- 1.Log in as a creator
- 2.Visit /creator-dashboard
- 3.Click delete on a video
Expected: Confirmation dialog appears. Confirming removes the video from the grid.
cr-8
Become a creator — 4-step signup
- 1.Visit /become-a-creator
- 2.Complete all 4 steps: personal info → social handles/bio → email OTP → password
Expected: Each step advances correctly. OTP is sent to the entered email. Password step completes registration.
pl-1
Place profile loads — demo restaurant
Known regression- 1.Visit /places/demo (or any demo place ID)
Expected: Page renders without crash. Identity bar shows name, cuisine, rating, and review count.
Review count was previously hardcoded as "312". Must show real fetched value.
pl-2
Review stats load on page mount
Known regression- 1.Visit /places/:id
- 2.Check the identity bar immediately (do NOT click the Reviews tab first)
Expected: Rating and review count are accurate on initial load without needing to click the Reviews tab.
Stats were previously fetched lazily only on tab click — now fetched on mount.
pl-3
Menu Highlights tab — category grouping
Known regression- 1.Visit /places/:id
- 2.Click the Menu Highlights tab
Expected: Menu items are grouped by category (e.g. Tacos, Mains, Drinks) with divider headings between groups. No crash.
Was crashing due to p.demoMenu reference — fixed to use p.menuItems.
pl-4
Menu Highlights — "Most Ordered" badge
- 1.Visit /places/:id
- 2.Click the Menu Highlights tab
Expected: The first item in the menu list has an orange "Most Ordered" badge with a star icon.
pl-5
Menu Highlights — hover zoom
- 1.Visit /places/:id on desktop
- 2.Hover over a menu item card
Expected: Card image zooms in smoothly on hover. Gradient overlay is visible.
pl-6
Menu Highlights — live owner menu
- 1.Visit a place profile for a restaurant with a live owner-managed menu
- 2.Click Menu Highlights
Expected: Live owner menu items also show category grouping and Most Ordered badge — same treatment as demo menu.
pl-7
Gallery tab
- 1.Visit /places/:id
- 2.Click the Gallery tab
Expected: Photo gallery renders. For live restaurants, shows uploaded photos. For demo, shows mock gallery images.
pl-8
Reviews tab
- 1.Visit /places/:id
- 2.Click the Reviews tab
Expected: Review cards render with reviewer name, rating, and text. Stats in identity bar match the count shown in the tab.
pl-9
Videos tab
- 1.Visit /places/:id
- 2.Click the Videos tab
Expected: Community videos tagged to this place render as cards. Clicking a card opens the feed at that video.
up-1
Upload choice page
- 1.Visit /upload-choice
Expected: Two cards: "Food Lover" → /signup, "Food Creator" → /become-a-creator. "Sign in" link → /login.
up-2
Upload page — auth gated
- 1.Log out
- 2.Visit /upload
Expected: Redirected to login or upload-choice. Upload page is not accessible without authentication.
up-3
Video upload — drag and drop
- 1.Log in as a creator
- 2.Visit /upload or /creator-dashboard
- 3.Drag a video file onto the upload area
Expected: File is accepted. Caption field appears. Progress bar shows upload progress.
up-4
Video upload — 500 MB client validation
- 1.Attempt to upload a file larger than 500 MB
Expected: Client-side error shown before upload starts. No server request made for oversized files.
up-5
Thumbnail generation
- 1.Upload a valid video file
Expected: Thumbnail is generated client-side via canvas. If generation times out (5s), upload still proceeds with null thumbnail — no hang or crash.
up-6
Camera recording — back camera default
- 1.On mobile, open the record option in the creator dashboard
Expected: Back camera is used by default. Flip button switches to front camera. Live timer shows recording duration.
biz-1
For Businesses page loads
- 1.Visit /for-businesses
Expected: Page renders with restaurant signup form. No crash.
biz-2
Restaurant signup → Stripe checkout
- 1.Visit /for-businesses
- 2.Fill out the signup form
- 3.Submit
Expected: Redirected to Stripe checkout. Payment page loads correctly.
biz-3
Checkout success — listing created
- 1.Complete Stripe payment
- 2.Land on /checkout/success
Expected: Page validates payment server-side. Shows "Manage your listing" CTA → /manage-listing. Owner receives access email.
biz-4
Stripe webhook — both paid and no_payment_required
Known regression- 1.Trigger a test webhook with payment_status: "paid"
- 2.Trigger with payment_status: "no_payment_required"
Expected: Both statuses create the listing with status: "active". Neither is rejected.
Webhook must accept both paid and no_payment_required statuses.
biz-5
Manage listing — business hours editor
- 1.Visit /manage-listing with a valid owner token
- 2.Toggle a day on/off
- 3.Change open/close times
- 4.Use "Apply all" preset
Expected: Radix Switch toggles per-day. 30-minute interval dropdowns work. "Apply all" fills all active days with selected hours. Changes save successfully.
biz-6
Manage listing — unauthenticated
- 1.Visit /manage-listing without a token
Expected: Form to request a new management link by email is shown. No listing data is exposed.
biz-7
Photo upload — up to 10 photos
- 1.In manage listing, upload photos (up to 10)
Expected: Photos upload successfully. multer reads from file.path. Up to 10 photos accepted; 11th is rejected.
biz-8
Admin outreach panel
- 1.Visit /admin/outreach
Expected: Stats, searchable leads table, preview email, and CSV export all render. AI Owner Discovery panel is visible.
lang-1
Switcher renders in header — desktop
- 1.Visit / on desktop
Expected: Globe icon + "English" and "Spanish" pill buttons appear in the header next to the CTAs. "English" pill is active (orange) by default.
lang-2
Switcher renders in header — mobile
- 1.Visit / on mobile
- 2.Open the hamburger menu
Expected: "English" / "Spanish" switcher appears at the bottom of the mobile menu for both guest and logged-in states.
lang-3
Switch to Spanish
- 1.Visit any page
- 2.Click "Spanish" in the language switcher
Expected: Page content translates to Spanish via Google Translate. "Spanish" pill becomes active (orange). No page crash.
lang-4
Switch back to English
Known regression- 1.Switch to Spanish first
- 2.Click "English" in the language switcher
Expected: Page reloads and returns to original English content. "English" pill is active. No stuck Spanish state.
Was broken — Google Translate has no restore command via select; fix clears the googtrans cookie and reloads.
lang-5
Google toolbar is hidden
- 1.Switch to Spanish
- 2.Check the top of the page
Expected: No Google Translate floating toolbar appears at the top. Page layout is not pushed down.
lang-6
Language persists across navigation
- 1.Switch to Spanish
- 2.Navigate to /explore, /feed, /for-businesses
Expected: Spanish translation persists across page navigations within the session.
lang-7
Switcher does not affect existing functionality
- 1.Switch to Spanish
- 2.Test: carousel swipe, video play/pause, like button, share button
Expected: All interactions work normally in Spanish mode. No JS errors from translation overlay.
auth-1
Sign up
- 1.Visit /signup
- 2.Fill out the form
- 3.Submit
Expected: Account created. Redirected to home or dashboard. No error.
auth-2
Log in
- 1.Visit /login
- 2.Enter valid credentials
- 3.Submit
Expected: Logged in. Header updates to show user name and Upload button. Redirected correctly.
auth-3
Sign out
- 1.Log in
- 2.Open user menu
- 3.Click "Sign out"
Expected: Session cleared. Redirected to /. Header reverts to guest state (Log In / Join Munchara).
auth-4
Forgot password flow
- 1.Visit /forgot-password
- 2.Enter email
- 3.Submit
Expected: Reset email sent. Confirmation message shown.
auth-5
Notification bell — unread count
- 1.Log in
- 2.Check the bell icon in the header
Expected: Unread count badge appears if there are unread notifications. Badge shows "9+" when count exceeds 9.
pwa-1
PWA install banner
- 1.Visit the site on mobile Chrome (first visit)
Expected: Bottom-screen PWA install banner appears. Dismissing it hides it for the session.
pwa-2
PWA icons
- 1.Install the PWA or check manifest.json
Expected: App icon is an orange circle with a white spoon. Theme color is orange.
pwa-3
Subscribe / city waitlist
- 1.Visit /subscribe
- 2.Select a city and enter an email
- 3.Submit
Expected: Confirmation shown. Branded confirmation email sent. Re-submitting the same email deduplicates (no duplicate entry).
pwa-4
Privacy policy and Terms of Use pages
- 1.Visit /privacy
- 2.Visit /terms
Expected: Both pages render with full legal content. No 404.
pwa-5
Health endpoint
- 1.GET /api/health
Expected: Returns 200 with a healthy status response.
This page is noindexed. Bookmark it at /regression-checklist for post-deploy QA runs.