@mohasinac/appkit 4.34.1 → 4.35.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_internal/client/features/lottery/LotteryAdminEditView.js +32 -2
- package/dist/features/tester/components/TesterChecklistStepRow.d.ts +9 -1
- package/dist/features/tester/components/TesterChecklistStepRow.js +31 -2
- package/dist/features/tester/components/TesterHubView.js +8 -0
- package/dist/features/tester/schemas/firestore.d.ts +109 -0
- package/dist/features/tester/schemas/firestore.js +14 -0
- package/dist/features/tester/seed-data/_money-flows.d.ts +23 -0
- package/dist/features/tester/seed-data/_money-flows.js +430 -0
- package/dist/features/tester/seed-data/authored/_types.d.ts +33 -0
- package/dist/features/tester/seed-data/authored/_types.js +35 -0
- package/dist/features/tester/seed-data/authored/account-auth__profile-settings.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/account-auth__profile-settings.js +207 -0
- package/dist/features/tester/seed-data/authored/account-auth__signup-login.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/account-auth__signup-login.js +298 -0
- package/dist/features/tester/seed-data/authored/account-auth__testing-program--admin.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/account-auth__testing-program--admin.js +33 -0
- package/dist/features/tester/seed-data/authored/account-auth__testing-program.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/account-auth__testing-program.js +138 -0
- package/dist/features/tester/seed-data/authored/addresses__address-filters.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/addresses__address-filters.js +36 -0
- package/dist/features/tester/seed-data/authored/addresses__postal-lookup.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/addresses__postal-lookup.js +75 -0
- package/dist/features/tester/seed-data/authored/addresses__postal-validation.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/addresses__postal-validation.js +72 -0
- package/dist/features/tester/seed-data/authored/addresses__state-picker.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/addresses__state-picker.js +54 -0
- package/dist/features/tester/seed-data/authored/addresses__unban-request.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/addresses__unban-request.js +39 -0
- package/dist/features/tester/seed-data/authored/admin__bans-and-trust.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/admin__bans-and-trust.js +226 -0
- package/dist/features/tester/seed-data/authored/admin__blog-faqs.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/admin__blog-faqs.js +82 -0
- package/dist/features/tester/seed-data/authored/admin__bulk-actions.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/admin__bulk-actions.js +177 -0
- package/dist/features/tester/seed-data/authored/admin__bundles.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/admin__bundles.js +97 -0
- package/dist/features/tester/seed-data/authored/admin__buyer-data-admin.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/admin__buyer-data-admin.js +232 -0
- package/dist/features/tester/seed-data/authored/admin__catalog-listings.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/admin__catalog-listings.js +306 -0
- package/dist/features/tester/seed-data/authored/admin__category-brand-authoring.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/admin__category-brand-authoring.js +158 -0
- package/dist/features/tester/seed-data/authored/admin__classifieds-digitalcodes-live.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/admin__classifieds-digitalcodes-live.js +78 -0
- package/dist/features/tester/seed-data/authored/admin__content-deletes.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/admin__content-deletes.js +261 -0
- package/dist/features/tester/seed-data/authored/admin__content-marketing.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/admin__content-marketing.js +151 -0
- package/dist/features/tester/seed-data/authored/admin__coupons.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/admin__coupons.js +214 -0
- package/dist/features/tester/seed-data/authored/admin__events-raffles-spin.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/admin__events-raffles-spin.js +160 -0
- package/dist/features/tester/seed-data/authored/admin__media-watermark.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/admin__media-watermark.js +104 -0
- package/dist/features/tester/seed-data/authored/admin__orders-fulfillment.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/admin__orders-fulfillment.js +350 -0
- package/dist/features/tester/seed-data/authored/admin__prize-draws-lotteries.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/admin__prize-draws-lotteries.js +105 -0
- package/dist/features/tester/seed-data/authored/admin__site-system.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/admin__site-system.js +590 -0
- package/dist/features/tester/seed-data/authored/admin__uncovered-admin-pages.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/admin__uncovered-admin-pages.js +235 -0
- package/dist/features/tester/seed-data/authored/admin__users-trust.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/admin__users-trust.js +569 -0
- package/dist/features/tester/seed-data/authored/buying__bidding.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/buying__bidding.js +417 -0
- package/dist/features/tester/seed-data/authored/buying__browsing-search.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/buying__browsing-search.js +653 -0
- package/dist/features/tester/seed-data/authored/buying__buying-checkout.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/buying__buying-checkout.js +533 -0
- package/dist/features/tester/seed-data/authored/buying__buying-coupons.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/buying__buying-coupons.js +379 -0
- package/dist/features/tester/seed-data/authored/buying__cart.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/buying__cart.js +1171 -0
- package/dist/features/tester/seed-data/authored/buying__image-tile-layout.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/buying__image-tile-layout.js +140 -0
- package/dist/features/tester/seed-data/authored/buying__my-orders.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/buying__my-orders.js +257 -0
- package/dist/features/tester/seed-data/authored/buying__offers.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/buying__offers.js +1111 -0
- package/dist/features/tester/seed-data/authored/buying__order-status-lifecycle.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/buying__order-status-lifecycle.js +252 -0
- package/dist/features/tester/seed-data/authored/buying__product-detail.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/buying__product-detail.js +387 -0
- package/dist/features/tester/seed-data/authored/buying__return-request.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/buying__return-request.js +152 -0
- package/dist/features/tester/seed-data/authored/buying__reviews-pagination.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/buying__reviews-pagination.js +242 -0
- package/dist/features/tester/seed-data/authored/buying__reviews.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/buying__reviews.js +113 -0
- package/dist/features/tester/seed-data/authored/buying__user-dashboard-extras.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/buying__user-dashboard-extras.js +283 -0
- package/dist/features/tester/seed-data/authored/buying__user-dashboard-navigation.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/buying__user-dashboard-navigation.js +167 -0
- package/dist/features/tester/seed-data/authored/buying__user-uncovered-pages.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/buying__user-uncovered-pages.js +90 -0
- package/dist/features/tester/seed-data/authored/buying__wishlist-history.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/buying__wishlist-history.js +344 -0
- package/dist/features/tester/seed-data/authored/community-support__public-profile.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/community-support__public-profile.js +53 -0
- package/dist/features/tester/seed-data/authored/community-support__support-tickets.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/community-support__support-tickets.js +76 -0
- package/dist/features/tester/seed-data/authored/content-discovery__blog.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/content-discovery__blog.js +93 -0
- package/dist/features/tester/seed-data/authored/content-discovery__category-brand-relations.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/content-discovery__category-brand-relations.js +149 -0
- package/dist/features/tester/seed-data/authored/content-discovery__coupons.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/content-discovery__coupons.js +121 -0
- package/dist/features/tester/seed-data/authored/content-discovery__event-participation.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/content-discovery__event-participation.js +207 -0
- package/dist/features/tester/seed-data/authored/content-discovery__events.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/content-discovery__events.js +318 -0
- package/dist/features/tester/seed-data/authored/content-discovery__faq-help.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/content-discovery__faq-help.js +65 -0
- package/dist/features/tester/seed-data/authored/content-discovery__notifications.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/content-discovery__notifications.js +147 -0
- package/dist/features/tester/seed-data/authored/content-discovery__search.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/content-discovery__search.js +332 -0
- package/dist/features/tester/seed-data/authored/cta-layout__checkout-bottom-bar.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/cta-layout__checkout-bottom-bar.js +53 -0
- package/dist/features/tester/seed-data/authored/cta-layout__dialog-footers.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/cta-layout__dialog-footers.js +52 -0
- package/dist/features/tester/seed-data/authored/cta-layout__editor-action-bar.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/cta-layout__editor-action-bar.js +35 -0
- package/dist/features/tester/seed-data/authored/cta-layout__navbar-ctas.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/cta-layout__navbar-ctas.js +141 -0
- package/dist/features/tester/seed-data/authored/cta-layout__product-bottom-bar.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/cta-layout__product-bottom-bar.js +35 -0
- package/dist/features/tester/seed-data/authored/design-ux__back-to-top-button.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/design-ux__back-to-top-button.js +95 -0
- package/dist/features/tester/seed-data/authored/design-ux__carousel-arrow-bounds.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/design-ux__carousel-arrow-bounds.js +191 -0
- package/dist/features/tester/seed-data/authored/design-ux__dashboard-layout.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/design-ux__dashboard-layout.js +158 -0
- package/dist/features/tester/seed-data/authored/design-ux__footer-theme.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/design-ux__footer-theme.js +106 -0
- package/dist/features/tester/seed-data/authored/design-ux__form-validation-errors.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/design-ux__form-validation-errors.js +88 -0
- package/dist/features/tester/seed-data/authored/design-ux__general-design.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/design-ux__general-design.js +204 -0
- package/dist/features/tester/seed-data/authored/design-ux__hand-mode-layout.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/design-ux__hand-mode-layout.js +301 -0
- package/dist/features/tester/seed-data/authored/design-ux__homepage-carousels.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/design-ux__homepage-carousels.js +407 -0
- package/dist/features/tester/seed-data/authored/design-ux__status-badge-legibility.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/design-ux__status-badge-legibility.js +214 -0
- package/dist/features/tester/seed-data/authored/design-ux__sticky-cta-bar.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/design-ux__sticky-cta-bar.js +275 -0
- package/dist/features/tester/seed-data/authored/index.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/index.js +237 -0
- package/dist/features/tester/seed-data/authored/page-wiring__data-loss.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/page-wiring__data-loss.js +102 -0
- package/dist/features/tester/seed-data/authored/page-wiring__detail-pages.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/page-wiring__detail-pages.js +50 -0
- package/dist/features/tester/seed-data/authored/page-wiring__drawer-pages.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/page-wiring__drawer-pages.js +66 -0
- package/dist/features/tester/seed-data/authored/page-wiring__reachability.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/page-wiring__reachability.js +115 -0
- package/dist/features/tester/seed-data/authored/public-pages__auth-error-pages.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/public-pages__auth-error-pages.js +136 -0
- package/dist/features/tester/seed-data/authored/public-pages__bug-hunters.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/public-pages__bug-hunters.js +69 -0
- package/dist/features/tester/seed-data/authored/public-pages__core-listing-pages.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/public-pages__core-listing-pages.js +263 -0
- package/dist/features/tester/seed-data/authored/public-pages__help-how-it-works.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/public-pages__help-how-it-works.js +102 -0
- package/dist/features/tester/seed-data/authored/public-pages__help-scams-guides-subpages.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/public-pages__help-scams-guides-subpages.js +234 -0
- package/dist/features/tester/seed-data/authored/public-pages__legal-policy-pages.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/public-pages__legal-policy-pages.js +126 -0
- package/dist/features/tester/seed-data/authored/public-pages__stores-sellers-directories.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/public-pages__stores-sellers-directories.js +255 -0
- package/dist/features/tester/seed-data/authored/search-and-nav__employee-permissions.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/search-and-nav__employee-permissions.js +59 -0
- package/dist/features/tester/seed-data/authored/search-and-nav__header-search.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/search-and-nav__header-search.js +88 -0
- package/dist/features/tester/seed-data/authored/search-and-nav__settings-deep-links.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/search-and-nav__settings-deep-links.js +51 -0
- package/dist/features/tester/seed-data/authored/search-and-nav__sidebar-search.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/search-and-nav__sidebar-search.js +35 -0
- package/dist/features/tester/seed-data/authored/selling__become-seller.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/selling__become-seller.js +94 -0
- package/dist/features/tester/seed-data/authored/selling__final-sale-authoring.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/selling__final-sale-authoring.js +107 -0
- package/dist/features/tester/seed-data/authored/selling__listing-a-product.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/selling__listing-a-product.js +285 -0
- package/dist/features/tester/seed-data/authored/selling__listing-lifecycle.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/selling__listing-lifecycle.js +326 -0
- package/dist/features/tester/seed-data/authored/selling__listing-type-fields-roundtrip.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/selling__listing-type-fields-roundtrip.js +136 -0
- package/dist/features/tester/seed-data/authored/selling__media-limits.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/selling__media-limits.js +128 -0
- package/dist/features/tester/seed-data/authored/selling__sectionised-forms.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/selling__sectionised-forms.js +167 -0
- package/dist/features/tester/seed-data/authored/selling__seller-analytics-payouts.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/selling__seller-analytics-payouts.js +117 -0
- package/dist/features/tester/seed-data/authored/selling__seller-bids-bundles-filters.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/selling__seller-bids-bundles-filters.js +88 -0
- package/dist/features/tester/seed-data/authored/selling__seller-catalog-org.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/selling__seller-catalog-org.js +151 -0
- package/dist/features/tester/seed-data/authored/selling__seller-custom-brands.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/selling__seller-custom-brands.js +105 -0
- package/dist/features/tester/seed-data/authored/selling__seller-guide.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/selling__seller-guide.js +33 -0
- package/dist/features/tester/seed-data/authored/selling__seller-listing-types.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/selling__seller-listing-types.js +347 -0
- package/dist/features/tester/seed-data/authored/selling__seller-marketing-extras.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/selling__seller-marketing-extras.js +166 -0
- package/dist/features/tester/seed-data/authored/selling__seller-ops-comms.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/selling__seller-ops-comms.js +89 -0
- package/dist/features/tester/seed-data/authored/selling__seller-orders.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/selling__seller-orders.js +195 -0
- package/dist/features/tester/seed-data/authored/selling__seller-shipping-payouts-setup.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/selling__seller-shipping-payouts-setup.js +180 -0
- package/dist/features/tester/seed-data/authored/selling__store-dashboard-navigation.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/selling__store-dashboard-navigation.js +164 -0
- package/dist/features/tester/seed-data/authored/selling__store-uncovered-pages.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/selling__store-uncovered-pages.js +116 -0
- package/dist/features/tester/seed-data/authored/seo__canonical-and-host.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/seo__canonical-and-host.js +111 -0
- package/dist/features/tester/seed-data/authored/seo__og-images.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/seo__og-images.js +91 -0
- package/dist/features/tester/seed-data/authored/seo__page-metadata.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/seo__page-metadata.js +122 -0
- package/dist/features/tester/seed-data/authored/seo__sitemap-and-robots.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/seo__sitemap-and-robots.js +105 -0
- package/dist/features/tester/seed-data/tester-checklist-seed-data.js +744 -1
- package/dist/seed/carousel-slides-seed-data.js +1 -1
- package/dist/seed/products-standard-seed-data.js +2 -2
- package/dist/seed/reviews-seed-data.js +6 -1
- package/package.json +1 -1
- package/scripts/seed-cli.mjs +6 -0
|
@@ -0,0 +1,387 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* WHY: Authored six-part procedures for the buying/product-detail checklist page.
|
|
3
|
+
* WHAT: 23 case(s), keyed by full checklist id.
|
|
4
|
+
*
|
|
5
|
+
* Written by hand, case by case, against the label each one states. There is no
|
|
6
|
+
* generator: the authoring scripts were deleted once it was clear they were
|
|
7
|
+
* scaffolding around work that is simply writing.
|
|
8
|
+
*
|
|
9
|
+
* Upload steps cite the committed fixtures in public/test-media/, whose bytes are
|
|
10
|
+
* asserted against the same detector /api/media/finalize uses. "Any short clip
|
|
11
|
+
* under 50 MB" is not a test — two runs of it are two different tests.
|
|
12
|
+
*
|
|
13
|
+
* @tag domain:tester
|
|
14
|
+
* @tag layer:seed
|
|
15
|
+
* @tag pattern:none
|
|
16
|
+
* @tag access:server-only
|
|
17
|
+
* @tag consumers:seed-data/authored/index.ts
|
|
18
|
+
* @tag sideEffects:none
|
|
19
|
+
*/
|
|
20
|
+
export const authored = {
|
|
21
|
+
"checklist-buying-product-detail-auction-detail": {
|
|
22
|
+
roles: ["guest"],
|
|
23
|
+
startPage: "/auctions/auction-tester-sandbox-cycle-1",
|
|
24
|
+
steps: [
|
|
25
|
+
"Open /auctions/auction-tester-sandbox-cycle-1.",
|
|
26
|
+
"Read the countdown beside the 'Place a bid' button.",
|
|
27
|
+
"Wait 3 seconds without touching anything.",
|
|
28
|
+
"Read the countdown again.",
|
|
29
|
+
],
|
|
30
|
+
expectedBehaviour: "The page renders a live auction whose countdown ticks client-side against the stored end date. Auction listings offer bidding, never Add to Cart — the capability is per listing type, not a styling choice.",
|
|
31
|
+
expectedUiState: "The heading names the sandbox auction. A countdown in the shape '47m 06s' or 'Xd Xh Xm Xs' sits next to 'Place a bid', and its seconds figure is lower after the 3-second wait — a frozen countdown is a fail even though the number looks plausible. Current bid ₹15,000.00 and a minimum increment of ₹1,000.00 are shown. There is a 'Place a bid' button and no 'Add to Cart' button anywhere on the page.",
|
|
32
|
+
expectedData: { currentBid: 15000, minIncrement: 1000 },
|
|
33
|
+
endResult: "Nothing persists — bid state and end time are read from the server on each load. The seconds figure moving is the whole check.",
|
|
34
|
+
},
|
|
35
|
+
"checklist-buying-product-detail-bundle-purchase": {
|
|
36
|
+
roles: ["buyer"],
|
|
37
|
+
startPage: "/bundles/bundle-tester-sandbox",
|
|
38
|
+
steps: [
|
|
39
|
+
"Sign in as rehan.sheikh@gmail.com / TempPass123!.",
|
|
40
|
+
"Open /bundles/bundle-tester-sandbox.",
|
|
41
|
+
"Click 'Buy now'.",
|
|
42
|
+
"On the checkout address step, select the first saved address, or add one named 'QA Address bundle-purchase' if none exists.",
|
|
43
|
+
"Continue to the payment step and choose Cash on Delivery.",
|
|
44
|
+
"Place the order.",
|
|
45
|
+
"Open /user/orders and open the order just created.",
|
|
46
|
+
],
|
|
47
|
+
inputs: { bundleId: "bundle-tester-sandbox", bundlePrice: 199, paymentMethod: "Cash on Delivery" },
|
|
48
|
+
expectedBehaviour: "The bundle is charged at its own locked price of ₹199, not the ₹348 sum of its two members, and the receipt collapses the members back into one line. A bundle is all-or-nothing: the buyer never chose which parts to include, so presenting them as separate purchasable lines would misrepresent what was bought.",
|
|
49
|
+
expectedUiState: "The order detail page shows ONE line reading 'Test Bundle' at ₹199.00. It does not show 'Test Gadget — Standard Listing #1' and 'Test Collectible — Standard Listing #2' as two rows, and the total is not ₹348. A 'What's included' expander beneath the line is fine — that is detail, not a second line.",
|
|
50
|
+
expectedData: { orderLineCount: 1, lineTotal: 199 },
|
|
51
|
+
endResult: "Reloading the order still shows the single 'Test Bundle' line at ₹199.00. A total of ₹348 means the bundle discount was thrown away at checkout.",
|
|
52
|
+
},
|
|
53
|
+
"checklist-buying-product-detail-classified-buy-request-pinned-to-price": {
|
|
54
|
+
roles: ["buyer"],
|
|
55
|
+
startPage: "/classified/classified-beyblade-burst-collection-bengaluru",
|
|
56
|
+
steps: [
|
|
57
|
+
"Sign in as rehan.sheikh@gmail.com / TempPass123!.",
|
|
58
|
+
"Open /classified/classified-beyblade-burst-collection-bengaluru.",
|
|
59
|
+
"Click 'Request to Buy'.",
|
|
60
|
+
"Read the amount field in the form that opens and try to type 3000 over it.",
|
|
61
|
+
"Open browser DevTools, remove the field's readonly/disabled attribute, set its value to 3000, and submit the form.",
|
|
62
|
+
"Open /user/offers.",
|
|
63
|
+
],
|
|
64
|
+
inputs: { listedPrice: 4500, forcedAmount: 3000 },
|
|
65
|
+
expectedBehaviour: "The amount is pinned to the listed ₹4,500 in the UI and re-checked on the server, so forcing a lower value past the disabled attribute is refused rather than accepted. A field that is only read-only in the browser is not a rule, it is a suggestion — which is why this case bypasses it deliberately.",
|
|
66
|
+
expectedUiState: "The amount field is pre-filled 4500 and refuses typing. After the DevTools-forced submit an error appears in the shape of 'This seller is not taking lower offers', and no success confirmation is shown. /user/offers lists no offer at ₹3,000 for this listing.",
|
|
67
|
+
expectedData: { offersCreatedAtForcedAmount: 0 },
|
|
68
|
+
endResult: "No offer exists at ₹3,000. Reloading the listing still shows 'Request to Buy' pinned at ₹4,500. A created ₹3,000 offer means the server trusted the client.",
|
|
69
|
+
},
|
|
70
|
+
"checklist-buying-product-detail-classified-full-price-offer-accepted": {
|
|
71
|
+
roles: ["buyer"],
|
|
72
|
+
startPage: "/classified/classified-beyblade-stadium-set",
|
|
73
|
+
steps: [
|
|
74
|
+
"Sign in as rehan.sheikh@gmail.com / TempPass123!.",
|
|
75
|
+
"Open /classified/classified-beyblade-stadium-set.",
|
|
76
|
+
"Click 'Make Offer'.",
|
|
77
|
+
"Type 1200 in the offer amount field — exactly the listed price.",
|
|
78
|
+
"Submit the offer.",
|
|
79
|
+
"Open /user/offers.",
|
|
80
|
+
],
|
|
81
|
+
inputs: { listedPrice: 1200, offerAmount: 1200 },
|
|
82
|
+
expectedBehaviour: "On a classified, an offer AT the listed price is valid, because the offer is the purchase path — there is no Add to Cart to redirect the buyer to. The same amount on a standard /products listing would be refused with 'use Add to Cart instead', and importing that rule here is the bug this case guards.",
|
|
83
|
+
expectedUiState: "The form closes with a success confirmation such as 'Offer sent'. No error reading 'use Add to Cart instead' and none reading 'Offer must be below the listed price'. /user/offers lists a pending offer at ₹1,200 against 'Used Beyblade Stadium Set — Local Pickup Only'.",
|
|
84
|
+
expectedData: { offerAmount: 1200, offerStatus: "pending" },
|
|
85
|
+
endResult: "The ₹1,200 offer persists and is visible in /user/offers after a reload.",
|
|
86
|
+
},
|
|
87
|
+
"checklist-buying-product-detail-classified-offer-is-the-purchase-path": {
|
|
88
|
+
roles: ["guest"],
|
|
89
|
+
startPage: "/classified/classified-beyblade-stadium-set",
|
|
90
|
+
steps: [
|
|
91
|
+
"Open /classified/classified-beyblade-stadium-set.",
|
|
92
|
+
"Read the purchase panel and the note beneath its button.",
|
|
93
|
+
"Open /classified/classified-beyblade-burst-collection-bengaluru.",
|
|
94
|
+
"Read the purchase panel and the note beneath its button.",
|
|
95
|
+
"Open /classified/classified-beyblade-x-starter-pune.",
|
|
96
|
+
"Read the purchase panel.",
|
|
97
|
+
],
|
|
98
|
+
expectedBehaviour: "Every classified offers exactly one purchase action — 'Make Offer' where the seller negotiates, 'Request to Buy' where they do not — and never a cart path, because a classified is capability-blocked from the cart entirely.",
|
|
99
|
+
expectedUiState: "classified-beyblade-stadium-set reads 'Make Offer' with a note in the shape of 'Offer what you think it's worth — the seller can accept, decline or counter.' classified-beyblade-burst-collection-bengaluru reads 'Request to Buy' with a note about the seller confirming. None of the three shows 'Add to Cart' or 'Buy Now', and none shows an empty purchase panel — a blank panel is as much a failure as a wrong button.",
|
|
100
|
+
endResult: "Nothing persists — read-only for a guest.",
|
|
101
|
+
},
|
|
102
|
+
"checklist-buying-product-detail-digitalcode-delivery": {
|
|
103
|
+
roles: ["buyer"],
|
|
104
|
+
startPage: "/digital-codes/digitalcode-tester-sandbox-1",
|
|
105
|
+
steps: [
|
|
106
|
+
"Sign in as rehan.sheikh@gmail.com / TempPass123!.",
|
|
107
|
+
"Open /digital-codes/digitalcode-tester-sandbox-1.",
|
|
108
|
+
"Click 'Buy Now'.",
|
|
109
|
+
"On the checkout address step, select the first saved address.",
|
|
110
|
+
"Continue to the payment step and choose Cash on Delivery.",
|
|
111
|
+
"Place the order.",
|
|
112
|
+
"Open /user/orders and open the order just created.",
|
|
113
|
+
"Reload the order page.",
|
|
114
|
+
],
|
|
115
|
+
inputs: { productId: "digitalcode-tester-sandbox-1", price: 99, paymentMethod: "Cash on Delivery" },
|
|
116
|
+
expectedBehaviour: "This fixture is auto-claim, so the code is allocated and delivered as soon as the order is confirmed, with no seller action in between. The pool's remaining count drops by one.",
|
|
117
|
+
expectedUiState: "The order page shows a digital-code panel containing an actual code string that can be selected and copied. It does not read 'Pending delivery' or 'Waiting for seller' — for an auto-claim listing those states mean the delivery never fired.",
|
|
118
|
+
expectedData: { codeDelivered: true },
|
|
119
|
+
endResult: "Reloading the order still shows the same delivered code. A code that appears once and is blank after reload was never persisted against the order.",
|
|
120
|
+
},
|
|
121
|
+
"checklist-buying-product-detail-grouped-listings-carousel-on-detail": {
|
|
122
|
+
roles: ["guest"],
|
|
123
|
+
startPage: "/products/product-tester-standard-1",
|
|
124
|
+
steps: [
|
|
125
|
+
"Open /products/product-tester-standard-1.",
|
|
126
|
+
"Scroll past the description tab and past the 'More in this category' and 'More by' carousels.",
|
|
127
|
+
"Read the heading of the themed carousel below them.",
|
|
128
|
+
"Click the first card in that carousel.",
|
|
129
|
+
],
|
|
130
|
+
expectedBehaviour: "The grouped-listings carousel is a distinct section from the four related-items carousels — it is fed by the groupedListings collection, not by category/brand/tag/store similarity — and each card links to its own detail page.",
|
|
131
|
+
expectedUiState: "A carousel with a theme heading (the group's own name, e.g. 'From the same set') sits below the related-items sections. Every card shows a real title and a rendered image tile, not a placeholder or a spinner. Clicking the first card lands on that product's detail page — /products/product-tester-standard-2 or similar — not back on the current page.",
|
|
132
|
+
endResult: "Nothing persists — read-only navigation.",
|
|
133
|
+
},
|
|
134
|
+
"checklist-buying-product-detail-image-gallery": {
|
|
135
|
+
roles: ["guest"],
|
|
136
|
+
startPage: "/auctions/auction-tester-sandbox-cycle-1",
|
|
137
|
+
steps: [
|
|
138
|
+
"Open /auctions/auction-tester-sandbox-cycle-1.",
|
|
139
|
+
"Look at every thumbnail in the strip below the main image.",
|
|
140
|
+
"Hard-reload with Ctrl+Shift+R and look at the strip again.",
|
|
141
|
+
"Hard-reload twice more, looking at the strip each time.",
|
|
142
|
+
"Click the main gallery image.",
|
|
143
|
+
"Click the rotate (R) control in the lightbox toolbar.",
|
|
144
|
+
"Click the zoom-in (+) control in the lightbox toolbar.",
|
|
145
|
+
"Close the lightbox.",
|
|
146
|
+
],
|
|
147
|
+
expectedBehaviour: "Every thumbnail resolves its image on every load, and the lightbox's rotate and zoom transforms apply to the displayed image. Three reloads are the point: an intermittently-blank tile is the failure, and one load cannot distinguish it from a working one.",
|
|
148
|
+
expectedUiState: "On all four loads every thumbnail shows a picture — no broken-image glyph, no grey square, no zero-height tile. The lightbox opens with a toolbar carrying +, − and R. Rotate turns the image 90°; zoom-in visibly enlarges it. Closing returns to the auction page with the gallery intact.",
|
|
149
|
+
endResult: "Nothing persists — no user state changes.",
|
|
150
|
+
},
|
|
151
|
+
"checklist-buying-product-detail-image-gallery-thumbnails-not-blank": {
|
|
152
|
+
roles: ["guest"],
|
|
153
|
+
startPage: "/products/product-beyblade-burst-valkyrie",
|
|
154
|
+
steps: [
|
|
155
|
+
"Open /products/product-beyblade-burst-valkyrie.",
|
|
156
|
+
"Look at the strip of small thumbnail buttons below the main image.",
|
|
157
|
+
"Click the second thumbnail button.",
|
|
158
|
+
"Click the third thumbnail button.",
|
|
159
|
+
],
|
|
160
|
+
expectedBehaviour: "Each thumbnail button renders its own image at its own size and swapping the selection changes the main image. A thumbnail collapsing to a 0×0 box inside its button — which is what an unsized fill-image child does — reads as an empty bordered square and is the specific failure here.",
|
|
161
|
+
expectedUiState: "Three thumbnail buttons, each showing a distinct photo rather than an empty outline or grey box, and each the same size as its neighbours. The selected one carries a highlight. Clicking the second changes the main image; clicking the third changes it again to a different picture.",
|
|
162
|
+
expectedData: { thumbnailCount: 3 },
|
|
163
|
+
endResult: "Nothing persists — no state changes.",
|
|
164
|
+
},
|
|
165
|
+
"checklist-buying-product-detail-live-item-detail": {
|
|
166
|
+
roles: ["guest"],
|
|
167
|
+
startPage: "/live/live-tester-sandbox-1",
|
|
168
|
+
steps: [
|
|
169
|
+
"Open /live/live-tester-sandbox-1.",
|
|
170
|
+
"Read the heading, the species line, the price and the delivery restrictions.",
|
|
171
|
+
"Look at the gallery thumbnail strip.",
|
|
172
|
+
],
|
|
173
|
+
expectedBehaviour: "A live listing renders its species-specific fields — species, breed, sex, age and the jurisdiction restrictions — which no other listing type carries, and offers a cart path once those restrictions are satisfied.",
|
|
174
|
+
expectedUiState: "Heading 'Test Live Item — Golden Retriever Puppy'. A species line in the shape 'Dog (Golden Retriever) · male · 6mo'. Price ₹1,500.00. Delivery restrictions are stated rather than blank. The thumbnail strip carries a 'View video' entry alongside 'View image 1'. An 'Add to Cart' button is present.",
|
|
175
|
+
expectedData: { price: 1500 },
|
|
176
|
+
endResult: "Nothing persists — read-only for a guest.",
|
|
177
|
+
},
|
|
178
|
+
"checklist-buying-product-detail-live-item-video-mandatory": {
|
|
179
|
+
roles: ["seller"],
|
|
180
|
+
startPage: "/store/live/new",
|
|
181
|
+
steps: [
|
|
182
|
+
"Sign in as tyson@beybladearena.in / TempPass123!.",
|
|
183
|
+
"Open /store/live/new.",
|
|
184
|
+
"Type 'QA Live Item video-mandatory' in the title field.",
|
|
185
|
+
"Type Dog in the species field and 1500 in the price field.",
|
|
186
|
+
"Fill every other required field, leaving the Video field empty.",
|
|
187
|
+
"Submit the form.",
|
|
188
|
+
"Attach public/test-media/sample-video.mp4 to the Video field.",
|
|
189
|
+
"Submit the form again.",
|
|
190
|
+
"Open the public detail page for the listing just created.",
|
|
191
|
+
"Click the 'View video' thumbnail in the gallery strip.",
|
|
192
|
+
"Click play in the lightbox.",
|
|
193
|
+
],
|
|
194
|
+
inputs: {
|
|
195
|
+
title: "QA Live Item video-mandatory",
|
|
196
|
+
species: "Dog",
|
|
197
|
+
price: 1500,
|
|
198
|
+
videoFile: "public/test-media/sample-video.mp4",
|
|
199
|
+
},
|
|
200
|
+
expectedBehaviour: "A live listing cannot be saved without a video — a buyer purchasing an animal or plant needs to see it move. The first submit is refused; the second succeeds. On the public page the poster frame carries the site watermark, because the media proxy stamps images even when the video itself is streamed raw.",
|
|
201
|
+
expectedUiState: "First submit: an inline error on or beside the Video field in the shape of 'A video is required for live items', and the form stays open with the typed values intact. Second submit: it saves and lands on the listing. The public page shows a 'View video' thumbnail with a visible watermark on its poster, and the video plays in the lightbox rather than showing 'No video with supported format'.",
|
|
202
|
+
endResult: "The new listing exists with its video attached and survives a reload. Delete it afterwards so it does not accumulate in the seller's catalogue across runs.",
|
|
203
|
+
},
|
|
204
|
+
"checklist-buying-product-detail-preorder-detail": {
|
|
205
|
+
roles: ["guest"],
|
|
206
|
+
startPage: "/pre-orders/preorder-tester-sandbox-1",
|
|
207
|
+
steps: [
|
|
208
|
+
"Open /pre-orders/preorder-tester-sandbox-1.",
|
|
209
|
+
"Read the heading, the price, the status badge and the delivery line.",
|
|
210
|
+
"Read the note beside the 'Reserve Now' button.",
|
|
211
|
+
],
|
|
212
|
+
expectedBehaviour: "A pre-order shows an estimated delivery date and takes a deposit rather than the full price, which is what distinguishes it from a standard listing that happens to be out of stock.",
|
|
213
|
+
expectedUiState: "Heading 'Test Pre-order — Reserve Me!'. Price ₹299.00. An 'Estimated delivery:' label with an actual date beside it, not an empty value or the word 'undefined'. A 'Reserve Now' button with a note naming the 25% deposit of ₹74.75. Status badge 'In Production'.",
|
|
214
|
+
expectedData: { price: 299, depositAmount: 74.75 },
|
|
215
|
+
endResult: "Nothing persists — read-only for a guest.",
|
|
216
|
+
},
|
|
217
|
+
"checklist-buying-product-detail-prizedraw-buy-reveal": {
|
|
218
|
+
roles: ["buyer"],
|
|
219
|
+
startPage: "/prize-draws/prizedraw-tester-sandbox-1",
|
|
220
|
+
steps: [
|
|
221
|
+
"Sign in as rehan.sheikh@gmail.com / TempPass123!.",
|
|
222
|
+
"Open /prize-draws/prizedraw-tester-sandbox-1.",
|
|
223
|
+
"Click 'Buy now'.",
|
|
224
|
+
"On the checkout address step, select the first saved address.",
|
|
225
|
+
"Continue to the payment step and choose Cash on Delivery.",
|
|
226
|
+
"Place the order for 1 entry at ₹50.",
|
|
227
|
+
"Open /user/orders and open the order just created.",
|
|
228
|
+
"Reload the page.",
|
|
229
|
+
],
|
|
230
|
+
inputs: { productId: "prizedraw-tester-sandbox-1", entries: 1, pricePerEntry: 50 },
|
|
231
|
+
expectedBehaviour: "This fixture is instant-reveal, so the prize is drawn and assigned at confirmation rather than held until a scheduled close. The draw's remaining entry count drops by one.",
|
|
232
|
+
expectedUiState: "The order page names the prize assigned to this entry. It does not show a pending spinner or a 'draw not yet closed' message — those belong to prizedraw-beyblade-scheduled-demo, not to this fixture, and seeing them here means the mode was ignored.",
|
|
233
|
+
expectedData: { entriesPurchased: 1, revealed: true },
|
|
234
|
+
endResult: "Reloading the order shows the same prize. A prize that changes on reload was never persisted and was being drawn per render.",
|
|
235
|
+
},
|
|
236
|
+
"checklist-buying-product-detail-product-group-set-widget": {
|
|
237
|
+
roles: ["guest"],
|
|
238
|
+
startPage: "/products/product-tester-standard-1",
|
|
239
|
+
steps: [
|
|
240
|
+
"Open /products/product-tester-standard-1.",
|
|
241
|
+
"Scroll to the 'Part of / Parts in this group' panel.",
|
|
242
|
+
"Click its expand control.",
|
|
243
|
+
"Read the member list.",
|
|
244
|
+
"Click 'View whole group'.",
|
|
245
|
+
"Close what opens, then open /products/product-tester-standard-2 and expand the same panel.",
|
|
246
|
+
"Open /products/group-tester-sandbox-bundle and expand the same panel.",
|
|
247
|
+
],
|
|
248
|
+
expectedBehaviour: "The group panel appears on the parent and on both children, because membership is symmetric — a child knows its groupId and the parent knows its child slugs. A panel that renders only on the parent means the children's side of the link was never written.",
|
|
249
|
+
expectedUiState: "The panel is present on all three pages. Its expand control renders as a real triangle or chevron glyph, not a literal character like '▸' rendered at font-fallback size and not a missing box. Expanded, it lists 'Test Gadget — Standard Listing #1' and 'Test Collectible — Standard Listing #2' with image tiles. 'View whole group' opens a modal or drawer showing both members.",
|
|
250
|
+
expectedData: { groupMemberCount: 2 },
|
|
251
|
+
endResult: "Nothing persists — read-only panel.",
|
|
252
|
+
},
|
|
253
|
+
"checklist-buying-product-detail-related-listings-sections": {
|
|
254
|
+
roles: ["guest"],
|
|
255
|
+
startPage: "/products/product-beyblade-burst-valkyrie",
|
|
256
|
+
steps: [
|
|
257
|
+
"Open /products/product-beyblade-burst-valkyrie.",
|
|
258
|
+
"Scroll past the description tab to the carousels below the main content.",
|
|
259
|
+
"Read each carousel heading and look at the cards inside it.",
|
|
260
|
+
],
|
|
261
|
+
expectedBehaviour: "Four independent related-items signals are rendered — same category, same brand, shared tags, same store — each capped and each filtered for items that are still available, so an ended auction or a sold-out listing does not appear as a suggestion.",
|
|
262
|
+
expectedUiState: "Four carousel sections, in the shape 'More in this category', 'More by Beyblade', 'You might also like' and 'More from Beyblade Arena'. Each holds at least one card carrying a real title, a rendered image tile and a price. A heading with an empty rail beneath it is a fail — the section should not render at all rather than render empty.",
|
|
263
|
+
expectedData: { carouselCount: 4 },
|
|
264
|
+
endResult: "Nothing persists — read-only page.",
|
|
265
|
+
},
|
|
266
|
+
"checklist-buying-product-detail-seed-images-are-labelled-tiles": {
|
|
267
|
+
roles: ["guest"],
|
|
268
|
+
startPage: "/products",
|
|
269
|
+
steps: [
|
|
270
|
+
"Open /products.",
|
|
271
|
+
"Look at every card in the first two rows of the grid.",
|
|
272
|
+
"Read the text rendered on each card's image tile.",
|
|
273
|
+
],
|
|
274
|
+
expectedBehaviour: "Seed imagery is generated as labelled tiles carrying each item's own name, so a wrong image is visible as wrong text rather than being indistinguishable from every other placeholder.",
|
|
275
|
+
expectedUiState: "Each card's tile shows that card's own product name as text on a distinct colour. No card shows a broken-image glyph or alt-text fallback. No two adjacent cards show the same blank grey square, which is what an unresolved image looks like when it fails silently.",
|
|
276
|
+
endResult: "Nothing persists — images are served on each page load.",
|
|
277
|
+
},
|
|
278
|
+
"checklist-buying-product-detail-standard-detail": {
|
|
279
|
+
roles: ["guest"],
|
|
280
|
+
startPage: "/products/product-tester-standard-1",
|
|
281
|
+
steps: [
|
|
282
|
+
"Open /products/product-tester-standard-1.",
|
|
283
|
+
"Read the heading, price, stock badge and description.",
|
|
284
|
+
"Read the category and brand links below the heading.",
|
|
285
|
+
"Read the seller line at the bottom of the info panel.",
|
|
286
|
+
],
|
|
287
|
+
expectedBehaviour: "A standard listing renders every panel a buyer needs to decide, and the purchase actions are present but inert for a signed-out visitor rather than absent — a missing button reads as a broken page, a disabled one reads as a prompt to sign in.",
|
|
288
|
+
expectedUiState: "Heading 'Test Gadget — Standard Listing #1'. Price ₹199.00. Stock badge in the shape '✓ In Stock — only 10 left'. 'Buy Now', 'Add to Cart' and 'Add to Wishlist' are visible and disabled. Category links 'Test Gadgets' and 'Tester Sandbox' and brand link 'TestBrand' appear below the heading. A description paragraph is present. 'Sold by Tester Sandbox Store' with a 'Visit Store →' link is shown.",
|
|
289
|
+
expectedData: { price: 199, stockQuantity: 10 },
|
|
290
|
+
endResult: "Nothing persists — read-only for a guest.",
|
|
291
|
+
},
|
|
292
|
+
"checklist-buying-product-detail-tester-fixtures-hidden-from-the-public": {
|
|
293
|
+
roles: ["guest", "buyer"],
|
|
294
|
+
startPage: "/products",
|
|
295
|
+
steps: [
|
|
296
|
+
"Open a private/incognito window with no session and open /products.",
|
|
297
|
+
"Read every card title on the grid and every card's URL slug, looking for the word 'Tester' or 'tester'.",
|
|
298
|
+
"Page through the grid to the end, reading titles the same way.",
|
|
299
|
+
"In a normal window, sign in as tester@letitrip.in / TempPass123!.",
|
|
300
|
+
"Open /products and read the card titles again.",
|
|
301
|
+
],
|
|
302
|
+
expectedBehaviour: "Sandbox rows are filtered out of every public read in the application layer, not by a Firestore query — an inequality on isTestData would exclude every document that lacks the field, which is all the real content, and the page would show ONLY test data. Signed in as a tester, the same page includes them.",
|
|
303
|
+
expectedUiState: "Private window: not one card title contains 'Tester' and not one slug contains 'tester', on any page of the grid. Signed in as the tester: sandbox items such as 'Test Gadget — Standard Listing #1' are present.",
|
|
304
|
+
endResult: "Nothing persists — the rule is applied per request. Reading only the first page is not enough; a leak on page three is still a leak.",
|
|
305
|
+
},
|
|
306
|
+
"checklist-buying-product-detail-unreachable-image-degrades-to-placeholder": {
|
|
307
|
+
roles: ["guest"],
|
|
308
|
+
startPage: "/products",
|
|
309
|
+
steps: [
|
|
310
|
+
"Open /api/media/ext?url=https%3A%2F%2Fexample.invalid%2Fx.png in a browser tab and look at what renders.",
|
|
311
|
+
"Open DevTools, reload the tab, and read the response status and headers for that request.",
|
|
312
|
+
],
|
|
313
|
+
// .invalid is reserved by RFC 2606 and can never resolve. This URL is the INPUT
|
|
314
|
+
// to the placeholder path, not media anyone renders — seedPhoto() would defeat
|
|
315
|
+
// the case by supplying one that works.
|
|
316
|
+
// audit-seed-media-host-ok: deliberately unreachable upstream, the case's input
|
|
317
|
+
inputs: { upstreamUrl: "https://example.invalid/x.png" },
|
|
318
|
+
expectedBehaviour: "An upstream image that cannot be fetched degrades to a served placeholder rather than a 502, so a single dead third-party host cannot punch broken tiles through a whole grid. The placeholder is cached briefly, not for the long TTL a real image gets, so recovery is quick once the host returns.",
|
|
319
|
+
expectedUiState: "The tab renders an SVG tile reading 'Image unavailable' — not the browser's broken-image glyph and not an error body. DevTools shows a 2xx with Content-Type image/svg+xml, an X-Media-Placeholder: 1 header, and a Cache-Control whose max-age is around 60 rather than the month-long immutable value real media carries.",
|
|
320
|
+
expectedData: { placeholderHeader: "X-Media-Placeholder: 1" },
|
|
321
|
+
endResult: "Nothing persists. This case reads a URL directly because no seeded listing points at a dead host — and deliberately none does, since a permanently-broken tile in the catalogue would fail the seed-images-are-labelled-tiles case next to it.",
|
|
322
|
+
},
|
|
323
|
+
"checklist-buying-product-detail-video-lightbox-fullscreen-sizing": {
|
|
324
|
+
roles: ["guest"],
|
|
325
|
+
startPage: "/products/product-beyblade-burst-spryzen-video-demo",
|
|
326
|
+
steps: [
|
|
327
|
+
"Resize the browser window to 375 × 667.",
|
|
328
|
+
"Open /products/product-beyblade-burst-spryzen-video-demo.",
|
|
329
|
+
"Click the 'View video' thumbnail to open the lightbox.",
|
|
330
|
+
"Look at the height of the video area.",
|
|
331
|
+
"Click the expand / maximise button in the lightbox top bar.",
|
|
332
|
+
"Press Escape.",
|
|
333
|
+
"Resize the browser to 1280 × 800 and open the same page again.",
|
|
334
|
+
"Click the 'View video' thumbnail and then the expand button.",
|
|
335
|
+
],
|
|
336
|
+
inputs: { mobileWidth: 375, mobileHeight: 667, desktopWidth: 1280, desktopHeight: 800 },
|
|
337
|
+
expectedBehaviour: "The expand control calls the native Fullscreen API — it used to be an exact duplicate of the zoom-reset button and did nothing of the kind. The video area also carries an explicit minimum size, so a source that fails to resolve still occupies a real box instead of collapsing to the browser's default 300×150.",
|
|
338
|
+
expectedUiState: "At 375 wide the video area is clearly taller than a 150px default, and at 1280 it is larger again. Clicking expand enters real fullscreen — browser chrome disappears — and the button's glyph changes to a shrink icon. Escape exits and the glyph reverts, with the video still in the lightbox rather than the lightbox having closed.",
|
|
339
|
+
endResult: "Nothing persists — no state changes.",
|
|
340
|
+
},
|
|
341
|
+
"checklist-buying-product-detail-video-playback": {
|
|
342
|
+
roles: ["guest"],
|
|
343
|
+
startPage: "/products/product-beyblade-original-dragoon-f-video-demo",
|
|
344
|
+
steps: [
|
|
345
|
+
"Open /products/product-beyblade-original-dragoon-f-video-demo.",
|
|
346
|
+
"Click the 'View video' thumbnail, the third button in the strip.",
|
|
347
|
+
"Click the play badge on the video slide to open theater mode.",
|
|
348
|
+
"Click the rotate (R) button in the lightbox toolbar.",
|
|
349
|
+
"Click the zoom-in (+) button in the lightbox toolbar.",
|
|
350
|
+
"Close the lightbox.",
|
|
351
|
+
],
|
|
352
|
+
expectedBehaviour: "A raw-file video renders as a native <video> element and plays. This fixture points at the committed public/test-media/sample-video.mp4 rather than an external bucket, because the host it used to use started returning 403 for every file and the case then failed for a reason that was not a bug.",
|
|
353
|
+
expectedUiState: "The strip carries a 'View video' button with a play badge over its poster. Clicking it puts the video in the main gallery area; the lightbox shows it playing or paused and ready. The toolbar has +, − and R, and both rotate and zoom visibly transform the video, not just the images.",
|
|
354
|
+
endResult: "Nothing persists — no state changes.",
|
|
355
|
+
},
|
|
356
|
+
"checklist-buying-product-detail-video-playback-youtube": {
|
|
357
|
+
roles: ["guest"],
|
|
358
|
+
startPage: "/products/product-beyblade-metal-dark-bull-video-demo",
|
|
359
|
+
steps: [
|
|
360
|
+
"Open /products/product-beyblade-metal-dark-bull-video-demo.",
|
|
361
|
+
"Click the 'View video' thumbnail in the strip.",
|
|
362
|
+
"Click play on the video slide.",
|
|
363
|
+
],
|
|
364
|
+
expectedBehaviour: "A YouTube-sourced video is embedded as a youtube-nocookie.com iframe, because a native <video> element cannot play a YouTube watch-page URL. The upload field has always offered a YouTube tab; for a long time nothing on the render side knew what to do with what it stored.",
|
|
365
|
+
expectedUiState: "The slide shows an embedded YouTube player and it plays on click. What must not appear is 'No video with supported format and MIME type found', which is exactly what a raw <video src> pointed at a watch URL produces.",
|
|
366
|
+
endResult: "Nothing persists — no state changes.",
|
|
367
|
+
},
|
|
368
|
+
"checklist-buying-product-detail-video-real-file-upload": {
|
|
369
|
+
roles: ["seller"],
|
|
370
|
+
startPage: "/store/products",
|
|
371
|
+
steps: [
|
|
372
|
+
"Sign in as tyson@beybladearena.in / TempPass123!.",
|
|
373
|
+
"Open /store/products and click Edit on 'Beyblade Burst B-01 Valkyrie'.",
|
|
374
|
+
"Scroll to the Video field and select the 'Upload' tab rather than 'YouTube' or 'External URL'.",
|
|
375
|
+
"Upload public/test-media/sample-video.mp4.",
|
|
376
|
+
"Wait for the upload to finish and look at the preview panel.",
|
|
377
|
+
"Save the product and open /products/product-beyblade-burst-valkyrie in a new tab.",
|
|
378
|
+
"Click the 'View video' thumbnail in the gallery strip.",
|
|
379
|
+
"Go back to the editor, remove the video, upload public/test-media/sample-video.mp4 again, and save.",
|
|
380
|
+
"Remove the video once more and save, so the product ends as it started.",
|
|
381
|
+
],
|
|
382
|
+
inputs: { productId: "product-beyblade-burst-valkyrie", videoFile: "public/test-media/sample-video.mp4" },
|
|
383
|
+
expectedBehaviour: "Bytes go straight from the browser to storage through a signed URL and never through an API route, so a 4.5 MB request cap never applies. A poster frame is captured on upload, and replacing the video removes the previous object rather than orphaning it.",
|
|
384
|
+
expectedUiState: "The editor preview shows a still poster frame after upload, not an empty box. The public page gains a 'View video' thumbnail that plays in the lightbox. Removing and re-uploading produces no 'Failed to delete' toast and no duplicate thumbnail.",
|
|
385
|
+
endResult: "The final step removes the video, so product-beyblade-burst-valkyrie is left exactly as seeded — other cases read this product and a leftover video changes its gallery from 3 thumbnails to 4.",
|
|
386
|
+
},
|
|
387
|
+
};
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* WHY: Authored six-part procedures for the buying/return-request page.
|
|
3
|
+
* WHAT: 7 case(s), keyed by full checklist id.
|
|
4
|
+
*
|
|
5
|
+
* Written by hand, case by case, against the label each one states. There is no
|
|
6
|
+
* generator: the authoring scripts were deleted once it was clear they were
|
|
7
|
+
* scaffolding around work that is simply writing.
|
|
8
|
+
*
|
|
9
|
+
* 🛑 A RETURN IS AN ORDER STATUS, NOT AN ENTITY. Returns are views over orders, so
|
|
10
|
+
* the request rides the order's own timeline and `return_requested` belongs to the
|
|
11
|
+
* ACTIVE scope — it is the seller's next action item, and filing it under Closed
|
|
12
|
+
* removes it from the queue the seller actually works from.
|
|
13
|
+
*
|
|
14
|
+
* Final sale is the axis these cases turn on, and it is not a blanket refusal:
|
|
15
|
+
* "it never arrived" must be accepted on a final-sale item, because final sale is
|
|
16
|
+
* a statement about changing your mind, not about the seller's obligation to
|
|
17
|
+
* deliver. The two refusal cases and the two acceptance cases exist to keep those
|
|
18
|
+
* apart.
|
|
19
|
+
*
|
|
20
|
+
* @tag domain:tester
|
|
21
|
+
* @tag layer:seed
|
|
22
|
+
* @tag pattern:none
|
|
23
|
+
* @tag access:server-only
|
|
24
|
+
* @tag consumers:seed-data/authored/index.ts
|
|
25
|
+
* @tag sideEffects:none
|
|
26
|
+
*/
|
|
27
|
+
export const authored = {
|
|
28
|
+
"checklist-buying-return-request-return-cta-only-when-returnable": {
|
|
29
|
+
roles: ["buyer"],
|
|
30
|
+
startPage: "/user/orders",
|
|
31
|
+
steps: [
|
|
32
|
+
"Sign in as tester@letitrip.in / TempPass123!.",
|
|
33
|
+
"Open /user/orders and open a DELIVERED order and read whether a return control is offered.",
|
|
34
|
+
"Open a PENDING order and read whether one is offered.",
|
|
35
|
+
"Open a SHIPPED order and read the same.",
|
|
36
|
+
"Open a CANCELLED order and read the same.",
|
|
37
|
+
"Open a REFUNDED order and read the same.",
|
|
38
|
+
"Open an order already in the return-requested state and read the same.",
|
|
39
|
+
],
|
|
40
|
+
expectedBehaviour: "The return control appears only where a return is actually possible — after delivery and before a return has already been requested. Offering it on a pending or cancelled order produces a request nobody can action, and offering it twice on the same order produces a duplicate the seller has to reconcile.",
|
|
41
|
+
expectedUiState: "Only the delivered order offers the control. Pending, shipped, cancelled and refunded orders do not. An order already in the return-requested state shows its state rather than offering the control again.",
|
|
42
|
+
expectedData: { returnControlOnDeliveredOnly: true },
|
|
43
|
+
endResult: "Read-only; request nothing. The seed carries an order in each status, so all six are reachable.",
|
|
44
|
+
},
|
|
45
|
+
"checklist-buying-return-request-return-not-received-accepted-on-final-sale": {
|
|
46
|
+
roles: ["buyer"],
|
|
47
|
+
startPage: "/user/orders",
|
|
48
|
+
steps: [
|
|
49
|
+
"Sign in as tester@letitrip.in / TempPass123!.",
|
|
50
|
+
"Open /user/orders and find a delivered order whose item was marked final sale.",
|
|
51
|
+
"Confirm the order or its item shows the final-sale term.",
|
|
52
|
+
"Open the return control and read every reason it offers.",
|
|
53
|
+
"Select the not-received reason.",
|
|
54
|
+
"Type 'QA Return not-received — the parcel never arrived.' and submit.",
|
|
55
|
+
"RELOAD the order and read its status.",
|
|
56
|
+
],
|
|
57
|
+
inputs: { reason: "not received", note: "QA Return not-received — the parcel never arrived." },
|
|
58
|
+
expectedBehaviour: "Final sale does not override non-delivery. It is a statement about changing your mind, not about whether the seller has to deliver — so a not-received claim must be accepted on a final-sale item, and refusing it converts a delivery failure into a term the buyer never agreed to.",
|
|
59
|
+
expectedUiState: "The not-received reason is offered and accepted despite the final-sale term. After the reload the order reads as return-requested. A blanket refusal citing final sale is the failure.",
|
|
60
|
+
expectedData: { accepted: true },
|
|
61
|
+
endResult: "The order carries a return request. Leave it for the admin triage case to pick up.",
|
|
62
|
+
},
|
|
63
|
+
"checklist-buying-return-request-return-change-of-mind-refused-by-name": {
|
|
64
|
+
roles: ["buyer"],
|
|
65
|
+
startPage: "/user/orders",
|
|
66
|
+
steps: [
|
|
67
|
+
"Sign in as tester@letitrip.in / TempPass123!.",
|
|
68
|
+
"Open /user/orders and find a different delivered final-sale order.",
|
|
69
|
+
"Open the return control and read every reason offered.",
|
|
70
|
+
"Select the change-of-mind reason.",
|
|
71
|
+
"Read what happens — whether it is refused, and what the message says.",
|
|
72
|
+
"Read whether the message names FINAL SALE as the reason for the refusal.",
|
|
73
|
+
],
|
|
74
|
+
inputs: { reason: "change of mind" },
|
|
75
|
+
expectedBehaviour: "Change of mind is refused on a final-sale item and the refusal NAMES final sale. A generic 'returns are not available' leaves the buyer believing the item is broken or the site is; naming the term tells them it was disclosed before purchase and points them at where they agreed to it.",
|
|
76
|
+
expectedUiState: "The refusal names final sale specifically rather than reading as a generic unavailability. The reason is either not offered at all for this item, or offered and refused with that explanation.",
|
|
77
|
+
expectedData: { accepted: false },
|
|
78
|
+
endResult: "No return is created. A refusal that does not name the term is the finding, even though the outcome is correct.",
|
|
79
|
+
},
|
|
80
|
+
"checklist-buying-return-request-return-reason-is-persisted": {
|
|
81
|
+
roles: ["buyer", "admin"],
|
|
82
|
+
startPage: "/user/orders",
|
|
83
|
+
steps: [
|
|
84
|
+
"Sign in as tester@letitrip.in / TempPass123!.",
|
|
85
|
+
"Open a delivered order and open the return control.",
|
|
86
|
+
"Select a reason and type 'QA Return reason-persisted — item arrived damaged in transit.' as the note.",
|
|
87
|
+
"Submit and RELOAD the order.",
|
|
88
|
+
"Read the reason and the note shown on the buyer's own view.",
|
|
89
|
+
"Sign out and sign in as admin@letitrip.in / TempPass123!.",
|
|
90
|
+
"Open the admin returns surface, find that order, and read the reason and the note there.",
|
|
91
|
+
],
|
|
92
|
+
inputs: { note: "QA Return reason-persisted — item arrived damaged in transit." },
|
|
93
|
+
expectedBehaviour: "The reason and the buyer's note are stored on the order and readable by both sides. The note is the entire case an admin triages on — a request that persists its status and drops its note leaves the reviewer with nothing to judge, and the buyer with no record of what they said.",
|
|
94
|
+
expectedUiState: "After the reload the buyer's view shows the reason and the full note. The admin surface shows the same text word for word rather than a truncated or summarised version.",
|
|
95
|
+
expectedData: { notePersisted: true },
|
|
96
|
+
endResult: "The return request carries its reason and note on both sides.",
|
|
97
|
+
},
|
|
98
|
+
"checklist-buying-return-request-return-partial-gates-selected-lines-only": {
|
|
99
|
+
roles: ["buyer"],
|
|
100
|
+
startPage: "/user/orders",
|
|
101
|
+
steps: [
|
|
102
|
+
"Sign in as tester@letitrip.in / TempPass123!.",
|
|
103
|
+
"Open /user/orders and open a delivered order containing several items.",
|
|
104
|
+
"Open the return control and read whether individual lines can be selected.",
|
|
105
|
+
"Select ONE line and leave the others unselected.",
|
|
106
|
+
"Read the refund figure the form states and compare it against that line's own price.",
|
|
107
|
+
"Submit the request.",
|
|
108
|
+
"RELOAD and read which lines are marked as being returned.",
|
|
109
|
+
],
|
|
110
|
+
expectedBehaviour: "A partial return covers only the selected lines and the stated refund matches their prices — not the order total. Cancellation and return quantities are tracked per product, which is why a bundle or grouped line is stored as one row per member: the buyer returning one part of a set must not be quoted for all of it.",
|
|
111
|
+
expectedUiState: "Individual lines are selectable, the stated refund matches only the selected line, and after the reload only that line is marked. An order-total refund for a single-line return is the failure.",
|
|
112
|
+
expectedData: { linesReturned: 1 },
|
|
113
|
+
endResult: "One line is under return and the others are untouched.",
|
|
114
|
+
},
|
|
115
|
+
"checklist-buying-return-request-return-prize-draw-still-refused-entirely": {
|
|
116
|
+
roles: ["buyer"],
|
|
117
|
+
startPage: "/user/orders",
|
|
118
|
+
steps: [
|
|
119
|
+
"Sign in as tester@letitrip.in / TempPass123!.",
|
|
120
|
+
"Open /user/orders and open a delivered prize-draw order.",
|
|
121
|
+
"Read whether a return control is offered at all.",
|
|
122
|
+
"If one is offered, open it and read every reason available.",
|
|
123
|
+
"Attempt a return and read the refusal.",
|
|
124
|
+
"Read whether the refusal explains why a draw entry cannot be returned.",
|
|
125
|
+
],
|
|
126
|
+
expectedBehaviour: "A prize-draw entry cannot be returned once the draw has run, whatever the reason — the entry was consumed by the draw and the outcome is already assigned. This refusal is broader than the final-sale one, which still admits non-delivery, and the two must not be collapsed into the same message.",
|
|
127
|
+
expectedUiState: "Either no return control is offered, or every reason is refused with an explanation naming the draw. A not-received reason being accepted here would be wrong, unlike on a final-sale physical item.",
|
|
128
|
+
expectedData: { accepted: false },
|
|
129
|
+
endResult: "No return exists. The contrast with the final-sale case is the point — one admits non-delivery and this one does not.",
|
|
130
|
+
},
|
|
131
|
+
"checklist-buying-return-request-return-terms-snapshotted-at-purchase": {
|
|
132
|
+
roles: ["buyer", "seller"],
|
|
133
|
+
startPage: "/user/orders",
|
|
134
|
+
steps: [
|
|
135
|
+
"Sign in as tyson@beybladearena.in / TempPass123! and set a product's return policy to 'QA Policy snapshot — 7 days, unopened.' with final sale OFF.",
|
|
136
|
+
"Sign out and sign in as rehan.sheikh@gmail.com / TempPass123!, then buy that product.",
|
|
137
|
+
"Open the order and read the return terms recorded on it.",
|
|
138
|
+
"Sign back in as tyson and change the product's return policy to 'QA Policy snapshot — no returns.' with final sale ON.",
|
|
139
|
+
"Sign back in as the buyer and open the SAME order again.",
|
|
140
|
+
"Read the return terms shown on it now.",
|
|
141
|
+
"Open the return control and read which terms apply.",
|
|
142
|
+
],
|
|
143
|
+
inputs: {
|
|
144
|
+
policyAtPurchase: "QA Policy snapshot — 7 days, unopened.",
|
|
145
|
+
policyAfter: "QA Policy snapshot — no returns.",
|
|
146
|
+
},
|
|
147
|
+
expectedBehaviour: "The terms are captured on the order at purchase and do not follow later edits to the listing. Reading them live from the product would let a seller retroactively withdraw a return right the buyer already agreed to — the same reasoning that stores an order's provenance once at creation and never recomputes it.",
|
|
148
|
+
expectedUiState: "The order still shows the terms that applied when it was placed, and the return control honours those rather than the seller's new policy. Terms that changed under an existing order is the failure, and it is the one with a consumer consequence.",
|
|
149
|
+
expectedData: { termsFollowPurchase: true },
|
|
150
|
+
endResult: "Restore the product's original return policy and final-sale flag. The order should still show what it was bought under.",
|
|
151
|
+
},
|
|
152
|
+
};
|