Browse the Knowledge Hub56 resources
Test cases
Booking test cases, for the slot that sells twice
Twenty eight cases covering concurrent bookings on the last slot, inventory holds that must expire and release, availability rechecked at confirmation, payment without a booking, cancellation policy boundaries, daylight saving slots, overlap and capacity rules, repricing on modification and channel sync.
All 28 test cases, ready to copy
Free to use and adapt, no sign-up. Download as CSV or Markdown, or copy it straight into your own tooling.
Last updated
28 worked examples
Complete a booking for an available slot
TypeFunctionalPriorityHigh- Test data
- A single available slot with valid customer and payment details
- Expected result
- Booking is confirmed with a reference, inventory decreases by one, payment matches the quoted price, and the confirmation states date, time and timezone.
Prevent two concurrent bookings for the last slot
TypeBoundaryPriorityHigh- Test data
- One slot remaining. Two customers confirm at the same instant
- Expected result
- One succeeds and one is refused with a clear message. A read then write on availability lets both through and oversells the slot.
Hold inventory while checkout is in progress
TypeStatePriorityHigh- Test data
- Begin checkout on the last slot, then have a second customer search
- Expected result
- Slot is held for the documented period and is not offered to the second customer, and the holding customer sees the remaining hold time.
Release a hold when checkout is abandoned
TypeStatePriorityHigh- Test data
- Begin checkout, close the browser, then wait past the hold period
- Expected result
- Slot returns to availability automatically. A hold that leaks makes inventory disappear permanently with no order to explain it.
Refuse a booking after the hold has expired
TypeBoundaryPriorityHigh- Test data
- Let the hold expire, then submit the checkout form
- Expected result
- Refused with an explanation and no payment taken, and availability is rechecked at confirmation rather than trusted from the search results.
Avoid a double booking when confirm is pressed repeatedly
TypeSecurityPriorityHigh- Test data
- Press confirm five times quickly, then replay the confirmation request
- Expected result
- Exactly one booking and one payment. The server refuses the repeat on an idempotency key rather than relying on the disabled button.
Resolve a booking that timed out with no response
TypeStatePriorityHigh- Test data
- Kill the connection after confirmation is submitted
- Expected result
- Booking resolves to one definite state and the customer is told which. Showing an unknown outcome as failed produces a second booking and a second payment.
Take payment only alongside a confirmed booking
TypeStatePriorityHigh- Test data
- Force the booking write to fail after the payment succeeds
- Expected result
- Payment is reversed automatically or the booking is completed, never a charge with no reservation, and the discrepancy is reported rather than left silent.
Return inventory when a booking is cancelled
TypeStatePriorityHigh- Test data
- Cancel a confirmed booking, then search the same slot
- Expected result
- Slot becomes available again immediately and the released count matches the cancelled quantity exactly.
Apply the cancellation policy at its boundary
TypeBoundaryPriorityHigh- Test data
- A free cancellation window of 24 hours, tested at 24 hours 1 minute, exactly 24 hours, and 23 hours 59 minutes before start
- Expected result
- Refund treatment matches the stated policy at each point, evaluated in the venue timezone rather than the customer device timezone.
Refuse a booking for a past or out of range date
TypeNegativePriorityHigh- Test data
- A slot in the past, one beyond the booking horizon, and a past slot in a timezone behind the customer
- Expected result
- Each refused, and the comparison uses the venue timezone so a customer in a later timezone cannot book a slot that has already started.
Handle a booking spanning a daylight saving change
TypeBoundaryPriorityHigh- Test data
- A slot inside the repeated hour and one inside the skipped hour of a transition
- Expected result
- Skipped time is not offered, the repeated hour is unambiguous, and duration is calculated in real elapsed time rather than by clock arithmetic.
Prevent overlapping bookings for the same resource
TypeBoundaryPriorityHigh- Test data
- A booking ending at 10:00 and another starting at 10:00, then one starting at 09:59
- Expected result
- Adjacent bookings are permitted and the overlap is refused, with any changeover buffer applied consistently to both ends.
Respect resource capacity rather than slot count alone
TypeBoundaryPriorityHigh- Test data
- A table for four booked by a party of six, and a room capacity exceeded by adding guests after booking
- Expected result
- Refused in both cases, and capacity is revalidated when the party size changes rather than only at the original booking.
Book multiple units in one transaction
TypeFunctionalPriorityHigh- Test data
- Four seats where only three remain, then exactly three
- Expected result
- Partial fulfilment is refused unless the policy allows it, and the exact quantity succeeds atomically rather than booking two and failing on the third.
Keep adjacent seat selection consistent
TypeStatePriorityMedium- Test data
- Select three adjacent seats while another customer takes the middle one
- Expected result
- Conflict is detected at confirmation with a clear message, and the customer is offered an alternative rather than silently given non adjacent seats.
Price the booking correctly across rate rules
TypeFunctionalPriorityHigh- Test data
- A stay spanning a weekday, a weekend and a peak date, with a per person supplement
- Expected result
- Total equals the sum of nightly or hourly rates plus supplements, taxes and fees, and the quoted total is the amount charged.
Hold the quoted price through checkout
TypeStatePriorityHigh- Test data
- Change the underlying rate while a customer is in checkout
- Expected result
- Quoted price is honoured for the hold period or the change is shown and re-accepted explicitly, never silently charged at the new rate.
Apply a promotion within its rules
TypeBoundaryPriorityHigh- Test data
- An expired code, one restricted to certain dates, one at its redemption limit, and two codes together
- Expected result
- Each refused with a specific reason, stacking follows the documented rule, and a promotion cannot reduce the total below zero.
Enforce minimum and maximum duration rules
TypeBoundaryPriorityMedium- Test data
- A booking one unit below the minimum stay, exactly at it, and one above the maximum
- Expected result
- Boundaries are applied as documented and the rule is explained at the point of failure rather than as a generic unavailability message.
Modify a booking and reprice it correctly
TypeStatePriorityHigh- Test data
- Move a booking to a date with a different rate, and extend it by one unit
- Expected result
- New availability is checked, the difference is charged or refunded exactly, and the original slot is released only once the new one is secured.
Handle a modification that fails partway
TypeNegativePriorityHigh- Test data
- Attempt a date change where the new slot becomes unavailable during the request
- Expected result
- Original booking is retained intact. Releasing the old slot before securing the new one leaves the customer with no booking at all.
Refuse access to a booking belonging to someone else
TypeSecurityPriorityHigh- Test data
- Request another customer booking reference, and use a guest lookup with only a reference number
- Expected result
- Refused or requires a second identifying factor. Sequential references with no second factor expose every booking to enumeration.
Send confirmation and reminders with correct details
TypeFunctionalPriorityHigh- Test data
- Confirmation, a reminder, and a message after a modification
- Expected result
- Each states the current date, time, timezone, location, price and cancellation terms, and a modification supersedes the earlier message rather than contradicting it.
Handle an unavailable payment or inventory provider
TypeStatePriorityHigh- Test data
- Make the payment provider time out, then the inventory service
- Expected result
- Customer sees a clear recoverable message, no hold is leaked, no payment is orphaned, and the failure is not presented as a confirmed booking.
Keep availability consistent with a channel manager
TypeStatePriorityHigh- Test data
- A booking taken on another channel while a customer is browsing, and a sync failure
- Expected result
- Availability converges within the documented window, oversell protection holds during a sync failure, and stale availability is not sold as confirmed.
Handle a no show and a waiting list
TypeStatePriorityMedium- Test data
- Mark a booking as no show, then release the slot to a waiting list
- Expected result
- Slot is released once, the waiting list is offered in documented order, and the offer expires so the slot does not sit reserved indefinitely.
Complete a booking with a keyboard and a screen reader
TypeAccessibilityPriorityHigh- Test data
- Keyboard only navigation through the calendar, seat map, guest details and confirmation
- Expected result
- Available dates and seats are reachable and announced with their state, the hold countdown is announced, and the total is announced before payment.
What goes in each field
ID
RequiredStable identifier, prefixed by module.
Test case
RequiredWhat is being verified, in one line.
Type
Functional, negative, boundary, security, state, performance, accessibility or compatibility. Use it to check coverage is spread rather than clustered on the happy path.
Priority
Risk based, measured in oversold inventory. Anything that can sell the same slot twice, hold inventory that is never released, or take payment without confirming a booking is High.
Test data
The specific values, including the invalid and boundary ones.
Expected result
RequiredThe precise observable outcome, including message text where the wording itself is the requirement.
Book the last slot twice at once
Booking an empty calendar always works. These four conditions are where inventory gets sold twice or disappears entirely.
Two customers, one slot, same instant
Fire both confirmations simultaneously. Availability read and then written without a lock lets both succeed, and somebody arrives to find their reservation does not exist.
Abandon checkout on the last slot
Close the browser mid checkout and wait. A hold that never releases makes inventory vanish with no order to explain it, and nobody notices until occupancy looks wrong.
Fail the booking after the payment
Force the booking write to fail once the charge has gone through. A payment with no reservation is the worst outcome in the set and it must never be left silent.
Walk the cancellation boundary
Test at one minute either side of the free cancellation window, in the venue timezone. Policy boundaries are where refunds get disputed and where the timezone bug lives.
Why booking defects oversell inventory
Every serious booking defect is the same defect: finite inventory sold more than once. It happens through concurrency, when two confirmations read the same availability and both write, and it needs a conditional update or a lock rather than a check followed by an insert. It happens through stale availability, when the search result is trusted at confirmation instead of being rechecked. And it happens through holds, which solve the checkout race but introduce a leak of their own: a hold that is never released because the customer closed the browser removes that slot from sale permanently, and there is no order anywhere to explain where it went.
The payment boundary is the most damaging place to fail. A charge that succeeds while the booking write fails leaves a customer who has paid for nothing, and unlike an oversell there is no partial service to offer. The transaction has to either reverse the payment automatically or complete the booking, and any discrepancy has to be surfaced rather than logged quietly. The related case is the timed out confirmation: an outcome that is genuinely unknown must never be presented as a failure, because the customer will immediately book again and now there are two reservations and two charges.
Time is where booking systems accumulate subtle bugs. A slot is only meaningful in the venue timezone, so comparisons against now, cancellation windows and booking horizons all have to use it rather than the customer device clock. Daylight saving transitions produce an hour that does not exist and an hour that happens twice, and a duration calculated by clock arithmetic rather than elapsed time is wrong across both. Adjacency needs deliberate treatment too: a booking ending at ten and another starting at ten is legitimate, while any real overlap is not, and a changeover buffer has to apply consistently at both ends.
Modification is where a well built booking flow still loses a customer reservation. Changing a date means securing new inventory and releasing the old, and doing it in that order matters: release first and a failure partway leaves the customer with nothing. Repricing has to be exact across rate rules, the quoted price has to hold for the duration of the hold or be re-accepted explicitly, and every confirmation message after a change has to supersede the earlier one rather than contradicting it in the customer inbox.
Suggest an improvementTesting a booking or reservation platform?
QAble tests booking flows end to end, including concurrency on finite inventory, hold lifecycle, payment atomicity, timezone handling and channel synchronisation.
E-commerce testing servicesMore test case sets
View allTest cases for a login page
Test cases25 cases across functional, negative, boundary, security, session and accessibility paths, including account enumeration and lockout.Test cases for a registration form
Test cases28 cases covering validation, duplicate accounts, email verification, password rules and the enumeration leak most signup forms ship with.Test cases for search functionality
Test cases28 cases across relevance, partial and fuzzy matching, filters, pagination, empty states, injection attempts and performance under load.Test cases for a shopping cart
Test cases27 cases on quantity limits, price recalculation, stock changes, coupon stacking, guest to account merge and cart persistence.Test cases for checkout and payment
Test cases30 cases including 3D Secure, declines, timeouts, duplicate charges, idempotency, refunds and partial captures.Test cases for file upload
Test cases28 cases on size and type limits, spoofed content types, malicious filenames, progress, resume, virus scanning and storage limits.Test cases for forgot password
Test cases26 cases on reset token expiry, single use enforcement, session invalidation and the enumeration and rate limit gaps that are routine here.Test cases for OTP verification
Test cases26 cases on expiry, resend throttling, attempt limits, code reuse, delivery failure and the brute force window teams forget to close.Test cases for user roles and permissions
Test cases26 cases on horizontal and vertical privilege checks, direct object access, role changes mid-session and permission inheritance.Test cases for form validation
Test cases27 rules-based cases on required fields, length and numeric boundaries, client and server parity, hidden field tampering and error accessibility.Test cases for a date picker
Test cases26 cases on timezone shifts, ambiguous day and month order, impossible dates, min and max limits, leap years and keyboard operation.Test cases for pagination
Test cases24 cases on ordering stability, records changing mid-session, page size caps, deep offset cost, permission-filtered totals and state restore.Test cases for push notifications
Test cases26 cases on app states, deep link routing, token release on sign out, lock screen privacy, preferences, provider failures and platform differences.Test cases for reports and data export
Test cases25 cases on permission filtering in the file, spreadsheet formula injection, encoding, typed numbers and dates, row limits and audit logging.Test cases for a chatbot
Test cases28 cases on paraphrased intents, context, fallback loops, human handoff, policy grounding, prompt injection and data scoping.Test cases for net banking transactions
Test cases28 cases on duplicate debits from a retried request, concurrent transfers against one balance, daily limits across channels, beneficiary cooling periods, second factor binding and reconciliation.Test cases for wallet and UPI payments
Test cases28 cases on payments that time out with no response, idempotency on retry, racing balances, caps across devices, collect request fraud, mandates and refunds.Test cases for insurance claim submission
Test cases28 cases on coverage at the date of loss, waiting periods, deductibles and sub limits, exclusions and riders, duplicate claims and settlement reconciliation.Test cases for patient records in an EHR
Test cases28 cases on duplicate detection and merge, wrong patient entry, units of measure, allergy and interaction alerting, break glass access and audit of reads.Test cases for CRM lead management
Test cases28 cases on duplicate leads under concurrency, routing and the unrouted fallback, round robin races, territory visibility, conversion and bulk import.Test cases for an ERP purchase order
Test cases28 cases on approval thresholds, amendments that must reset approval, budget commitment races, over receipt tolerance, three-way match and duplicate invoices.Test cases for OTT video playback
Test cases28 cases on bitrate recovery after a dip, DRM renewal mid stream, concurrent stream limits and leaked slots, resume conflicts, ad cue points and offline expiry.Test cases for game level progression
Test cases28 cases on save corruption during a crash write, cloud save conflicts, offline queue replay, unlock gating, currency exploits and purchase restore.Test cases for a REST API
Test cases28 cases on status code correctness, cross tenant resource access, mass assignment, idempotent retries, cursor pagination, rate limits and contract drift.Test cases for SSO and social login
Test cases28 cases on linking an account on an unverified email, state and code replay, redirect allow lists, token signature and issuer, deprovisioning and session rotation.Test cases for subscription and billing
Test cases28 cases on mid cycle proration, duplicate and out of order webhooks, renewal double charges, dunning and grace, trials, coupons, metered usage and tax.Test cases for data tables, filters and sorting
Test cases28 cases on unstable sorts across pages, filters that must reset pagination, selection surviving a filter change, bulk action scope and export fidelity.Test cases for session timeout and concurrent login
Test cases28 cases on tokens that survive sign out, refresh token reuse, idle against absolute lifetime, multi tab expiry, session limits and remote revocation.Test cases for a multi step form wizard
Test cases28 cases on values lost to back navigation, refresh and session expiry, step skipping, server side revalidation, duplicate submission and conditional branches.Test cases for email verification
Test cases28 cases on token reuse and expiry, invalidating earlier links, account enumeration, header injection, safe address change and mail scanner prefetching.Test cases for dashboards and analytics widgets
Test cases28 cases on reconciling against source rows, widgets that disagree, timezone aggregation, zero baselines, no data shown as zero and permission leaks in aggregates.Test cases for mobile app install and update
Test cases28 cases on migration chains across skipped versions, crashes during post upgrade migration, forced update lockouts, deep links and clean reinstall.Test cases for accessibility (WCAG 2.2 AA)
Test cases28 cases on keyboard only completion, focus management, live region announcements, contrast, reflow at 320 pixels, target size and screen reader verification.Test cases for performance and load
Test cases28 cases on spikes with no ramp, recovery after peak, soak and leak detection, pool exhaustion, cold caches, retry storms and data correctness under load.Test cases for the OWASP Top 10
Test cases28 cases on broken access control, mass assignment, injection across every input surface, credential stuffing, session invalidation, SSRF and exposed secrets.Test cases for cross browser compatibility
Test cases28 cases on storage that throws in private mode, blocked third party cookies, engine date parsing, mobile viewport units, in app browsers and ad blockers.Test cases for database and data integrity
Test cases28 cases on uniqueness under concurrency, lost updates, counter races, orphaned rows, migration and backfill safety, replica lag and verified restores.Test cases for localisation and multi language support
Test cases28 cases on text expansion, concatenated sentences, plural rules, locale date parsing, decimal separators, right to left layout, collation and encoding.Want your inventory integrity proven, not assumed?
QAble covers functional, boundary and concurrency paths with ISTQB-certified engineers. Start with a free QA audit of your platform.