1Business context
ShowTime sells cinema tickets. Revenue depends on filling seats quickly and fairly: seats are held for a limited time, pricing varies by seat tier, and promos must only apply when eligible. Payment includes OTP (card) and async approval (UPI).
Pick city, date and showtime, select seats on a live seat map, add snacks, apply promos and pay with an OTP under a hold timer.
2Users & roles
- 👤 Moviegoer — picks a show, seats, snacks and pays (no login needed)
- 👤 Returning customer — views and cancels bookings
3Modules & screens
| Screen | Route | What it does |
|---|---|---|
| Movies | /tickets | Date strip, city, genre/language filters and showtimes per cinema |
| Seat map | /tickets/show/[showId] | Seat tiers, availability, 8-seat limit and hold timer |
| Checkout | /tickets/checkout | Contact details, snacks, promo codes, card (OTP) or UPI payment |
| Confirmation | /tickets/confirmation | Booking reference (ST + 6 characters) and summary |
| My bookings | /tickets/bookings | Upcoming and cancelled bookings, cancel with confirmation |
4Main end-to-end journey
Book seats with card and OTP
- Open /tickets and pick tomorrow in London
- Choose Nebula Drift and an available showtime
- Select 2 available seats and proceed
- Add contact details and a Large Popcorn
- Apply MOVIE50
- Pay by card and enter OTP 123456
- Open My bookings
Expected: Confirmation shows an ST reference with the discounted total, and the booking is listed under upcoming bookings
5Business rules & validations
- Date stripBeginner
Seven date-option chips from today; dates are computed from the browser clock.
- FiltersBeginner
Combine genre-* toggles, language-filter and movie-search; assert movie-card count.
- Showtime statesIntermediate
data-status is available / filling / soldout / started — disabled ones can't be clicked.
- Seat mapIntermediate
Pick seats by data-status, verify selected-seat chips and seat-total per tier.
- Seat limitIntermediate
The 9th seat shows seat-limit-error.
- Snacks & promo codesIntermediate
MOVIE50 halves tickets (max $10); FIRSTSHOW only works on a first booking.
- OTP paymentAdvanced
Card payments open otp-modal; 123456 passes, anything else shows otp-error.
- Async UPI approvalAdvanced
UPI shows payment-processing for ~3s before the confirmation page.
- Hold timerAdvanced
Seats are held for 5:00. Mock the clock to hit timer-expired without waiting.
- Cancel a bookingAdvanced
Cancel from My bookings, confirm the dialog, and find it under the Cancelled tab.
6Test data & credentials
- URL
- /tickets
- Login
- not required
- Promos
- MOVIE50 · FIRSTSHOW
- Card OTP
- 123456
- Seat hold
- 5 minutes
7Glossary
- Hold timer
- Selected seats are reserved for 5:00; expiry releases them
- MOVIE50 / FIRSTSHOW
- 50% off tickets (max $10) / first-booking-only promo
- Showtime status
- available, filling, soldout or started — the last two can't be clicked
8Watch-outs for automation
- ⚠️Dates are computed from the browser clock — don't hard-code dates
- ⚠️Mock the clock to test hold-timer expiry instead of waiting 5 minutes
- ⚠️UPI approval is async (~3 s) — wait for the confirmation page
9Suggested test strategy
1 · Smoke
4
P1 positive and end-to-end cases — run on every build.
2 · Regression
16
All cases, incl. 4 negative and 3 edge — run before release.
3 · End-to-end
3
Full user journeys — run nightly.
Start with these smoke cases
- SHOWTIME-01 — Book two seats with card and OTP
- SHOWTIME-02 — Pay by UPI
- SHOWTIME-E2E-01 — Book seats with card and OTP
- SHOWTIME-E2E-02 — Book by UPI then cancel