@mohasinac/appkit 4.58.0 → 4.59.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/.build-stamp.json +3 -3
- package/dist/_internal/server/jobs/handlers/messages.d.ts +1 -1
- package/dist/_internal/server/jobs/handlers/messages.js +1 -1
- package/dist/_internal/shared/types/base-document.d.ts +1 -1
- package/dist/constants/seed-meta.d.ts +113 -0
- package/dist/constants/seed-meta.js +91 -0
- package/dist/index.d.ts +0 -131
- package/dist/index.js +50 -294
- package/dist/server.d.ts +0 -69
- package/dist/server.js +0 -69
- package/package.json +4 -2
- package/scripts/seed-cli.mjs +69 -1
- package/dist/features/tester/seed-data/_happy-path.d.ts +0 -23
- package/dist/features/tester/seed-data/_happy-path.js +0 -710
- package/dist/features/tester/seed-data/_money-flows.d.ts +0 -23
- package/dist/features/tester/seed-data/_money-flows.js +0 -610
- package/dist/features/tester/seed-data/authored/_types.d.ts +0 -57
- package/dist/features/tester/seed-data/authored/_types.js +0 -35
- package/dist/features/tester/seed-data/authored/account-auth__profile-settings.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/account-auth__profile-settings.js +0 -226
- package/dist/features/tester/seed-data/authored/account-auth__signup-login.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/account-auth__signup-login.js +0 -329
- package/dist/features/tester/seed-data/authored/addresses__address-filters.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/addresses__address-filters.js +0 -41
- package/dist/features/tester/seed-data/authored/addresses__postal-lookup.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/addresses__postal-lookup.js +0 -76
- package/dist/features/tester/seed-data/authored/addresses__postal-validation.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/addresses__postal-validation.js +0 -78
- package/dist/features/tester/seed-data/authored/addresses__state-picker.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/addresses__state-picker.js +0 -59
- package/dist/features/tester/seed-data/authored/addresses__unban-request.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/addresses__unban-request.js +0 -77
- package/dist/features/tester/seed-data/authored/admin__admin-detail-round-trips.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__admin-detail-round-trips.js +0 -151
- package/dist/features/tester/seed-data/authored/admin__bans-and-trust.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__bans-and-trust.js +0 -265
- package/dist/features/tester/seed-data/authored/admin__blog-faqs.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__blog-faqs.js +0 -131
- package/dist/features/tester/seed-data/authored/admin__bug-hunter-rewards.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__bug-hunter-rewards.js +0 -143
- package/dist/features/tester/seed-data/authored/admin__bulk-actions.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__bulk-actions.js +0 -207
- package/dist/features/tester/seed-data/authored/admin__bundles.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__bundles.js +0 -144
- package/dist/features/tester/seed-data/authored/admin__buyer-data-admin.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__buyer-data-admin.js +0 -265
- package/dist/features/tester/seed-data/authored/admin__catalog-listings.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__catalog-listings.js +0 -318
- package/dist/features/tester/seed-data/authored/admin__category-brand-authoring.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__category-brand-authoring.js +0 -177
- package/dist/features/tester/seed-data/authored/admin__classifieds-digitalcodes-live.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__classifieds-digitalcodes-live.js +0 -165
- package/dist/features/tester/seed-data/authored/admin__content-deletes.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__content-deletes.js +0 -267
- package/dist/features/tester/seed-data/authored/admin__content-marketing.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__content-marketing.js +0 -188
- package/dist/features/tester/seed-data/authored/admin__coupons.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__coupons.js +0 -215
- package/dist/features/tester/seed-data/authored/admin__events-raffles-spin.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__events-raffles-spin.js +0 -202
- package/dist/features/tester/seed-data/authored/admin__firebase-function-effects.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__firebase-function-effects.js +0 -249
- package/dist/features/tester/seed-data/authored/admin__media-watermark.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__media-watermark.js +0 -148
- package/dist/features/tester/seed-data/authored/admin__orders-fulfillment.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__orders-fulfillment.js +0 -350
- package/dist/features/tester/seed-data/authored/admin__prize-draws-lotteries.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__prize-draws-lotteries.js +0 -129
- package/dist/features/tester/seed-data/authored/admin__site-system.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__site-system.js +0 -586
- package/dist/features/tester/seed-data/authored/admin__uncovered-admin-pages.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__uncovered-admin-pages.js +0 -260
- package/dist/features/tester/seed-data/authored/admin__users-trust.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__users-trust.js +0 -569
- package/dist/features/tester/seed-data/authored/buying__bidding.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__bidding.js +0 -449
- package/dist/features/tester/seed-data/authored/buying__browsing-search.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__browsing-search.js +0 -684
- package/dist/features/tester/seed-data/authored/buying__buying-checkout.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__buying-checkout.js +0 -546
- package/dist/features/tester/seed-data/authored/buying__buying-coupons.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__buying-coupons.js +0 -379
- package/dist/features/tester/seed-data/authored/buying__cart.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__cart.js +0 -1264
- package/dist/features/tester/seed-data/authored/buying__image-tile-layout.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__image-tile-layout.js +0 -122
- package/dist/features/tester/seed-data/authored/buying__my-orders.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__my-orders.js +0 -279
- package/dist/features/tester/seed-data/authored/buying__offers.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__offers.js +0 -1127
- package/dist/features/tester/seed-data/authored/buying__order-detail-actions.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__order-detail-actions.js +0 -153
- package/dist/features/tester/seed-data/authored/buying__order-status-lifecycle.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__order-status-lifecycle.js +0 -252
- package/dist/features/tester/seed-data/authored/buying__product-detail.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__product-detail.js +0 -474
- package/dist/features/tester/seed-data/authored/buying__return-request.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__return-request.js +0 -165
- package/dist/features/tester/seed-data/authored/buying__reviews-pagination.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__reviews-pagination.js +0 -260
- package/dist/features/tester/seed-data/authored/buying__reviews.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__reviews.js +0 -128
- package/dist/features/tester/seed-data/authored/buying__spares-and-groups.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__spares-and-groups.js +0 -96
- package/dist/features/tester/seed-data/authored/buying__user-dashboard-extras.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__user-dashboard-extras.js +0 -283
- package/dist/features/tester/seed-data/authored/buying__user-dashboard-navigation.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__user-dashboard-navigation.js +0 -169
- package/dist/features/tester/seed-data/authored/buying__user-uncovered-pages.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__user-uncovered-pages.js +0 -105
- package/dist/features/tester/seed-data/authored/buying__wishlist-history.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__wishlist-history.js +0 -374
- package/dist/features/tester/seed-data/authored/community-support__messages.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/community-support__messages.js +0 -200
- package/dist/features/tester/seed-data/authored/community-support__public-profile.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/community-support__public-profile.js +0 -54
- package/dist/features/tester/seed-data/authored/community-support__support-tickets.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/community-support__support-tickets.js +0 -76
- package/dist/features/tester/seed-data/authored/content-discovery__authenticity-checker.d.ts +0 -4
- package/dist/features/tester/seed-data/authored/content-discovery__authenticity-checker.js +0 -590
- package/dist/features/tester/seed-data/authored/content-discovery__blog.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/content-discovery__blog.js +0 -110
- package/dist/features/tester/seed-data/authored/content-discovery__category-brand-relations.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/content-discovery__category-brand-relations.js +0 -149
- package/dist/features/tester/seed-data/authored/content-discovery__category-counts-and-rollup.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/content-discovery__category-counts-and-rollup.js +0 -145
- package/dist/features/tester/seed-data/authored/content-discovery__category-tabs-franchise-bundles.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/content-discovery__category-tabs-franchise-bundles.js +0 -174
- package/dist/features/tester/seed-data/authored/content-discovery__coupons.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/content-discovery__coupons.js +0 -169
- package/dist/features/tester/seed-data/authored/content-discovery__event-detail-subroutes.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/content-discovery__event-detail-subroutes.js +0 -209
- package/dist/features/tester/seed-data/authored/content-discovery__event-participation.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/content-discovery__event-participation.js +0 -207
- package/dist/features/tester/seed-data/authored/content-discovery__events.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/content-discovery__events.js +0 -377
- package/dist/features/tester/seed-data/authored/content-discovery__faq-help.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/content-discovery__faq-help.js +0 -87
- package/dist/features/tester/seed-data/authored/content-discovery__notifications.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/content-discovery__notifications.js +0 -147
- package/dist/features/tester/seed-data/authored/content-discovery__overflowing-pill-rows.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/content-discovery__overflowing-pill-rows.js +0 -209
- package/dist/features/tester/seed-data/authored/content-discovery__parts-database.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/content-discovery__parts-database.js +0 -167
- package/dist/features/tester/seed-data/authored/content-discovery__price-index-and-compare.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/content-discovery__price-index-and-compare.js +0 -73
- package/dist/features/tester/seed-data/authored/content-discovery__search.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/content-discovery__search.js +0 -363
- package/dist/features/tester/seed-data/authored/content-discovery__site-wide-index.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/content-discovery__site-wide-index.js +0 -340
- package/dist/features/tester/seed-data/authored/content-discovery__store-reviews-aggregate.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/content-discovery__store-reviews-aggregate.js +0 -88
- package/dist/features/tester/seed-data/authored/cta-layout__checkout-bottom-bar.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/cta-layout__checkout-bottom-bar.js +0 -78
- package/dist/features/tester/seed-data/authored/cta-layout__dialog-footers.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/cta-layout__dialog-footers.js +0 -76
- package/dist/features/tester/seed-data/authored/cta-layout__editor-action-bar.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/cta-layout__editor-action-bar.js +0 -62
- package/dist/features/tester/seed-data/authored/cta-layout__navbar-ctas.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/cta-layout__navbar-ctas.js +0 -163
- package/dist/features/tester/seed-data/authored/cta-layout__product-bottom-bar.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/cta-layout__product-bottom-bar.js +0 -61
- package/dist/features/tester/seed-data/authored/design-ux__action-bar-placement.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/design-ux__action-bar-placement.js +0 -89
- package/dist/features/tester/seed-data/authored/design-ux__back-to-top-button.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/design-ux__back-to-top-button.js +0 -95
- package/dist/features/tester/seed-data/authored/design-ux__carousel-arrow-bounds.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/design-ux__carousel-arrow-bounds.js +0 -191
- package/dist/features/tester/seed-data/authored/design-ux__dashboard-layout.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/design-ux__dashboard-layout.js +0 -158
- package/dist/features/tester/seed-data/authored/design-ux__feature-badge-picker.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/design-ux__feature-badge-picker.js +0 -82
- package/dist/features/tester/seed-data/authored/design-ux__footer-theme.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/design-ux__footer-theme.js +0 -106
- package/dist/features/tester/seed-data/authored/design-ux__form-validation-errors.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/design-ux__form-validation-errors.js +0 -88
- package/dist/features/tester/seed-data/authored/design-ux__general-design.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/design-ux__general-design.js +0 -204
- package/dist/features/tester/seed-data/authored/design-ux__hand-mode-layout.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/design-ux__hand-mode-layout.js +0 -301
- package/dist/features/tester/seed-data/authored/design-ux__header-brand-mark-centring.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/design-ux__header-brand-mark-centring.js +0 -90
- package/dist/features/tester/seed-data/authored/design-ux__header-controls-and-messages.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/design-ux__header-controls-and-messages.js +0 -85
- package/dist/features/tester/seed-data/authored/design-ux__homepage-carousels.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/design-ux__homepage-carousels.js +0 -407
- package/dist/features/tester/seed-data/authored/design-ux__nav-reachability.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/design-ux__nav-reachability.js +0 -88
- package/dist/features/tester/seed-data/authored/design-ux__rich-text-readability.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/design-ux__rich-text-readability.js +0 -84
- package/dist/features/tester/seed-data/authored/design-ux__status-badge-legibility.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/design-ux__status-badge-legibility.js +0 -214
- package/dist/features/tester/seed-data/authored/design-ux__sticky-cta-bar.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/design-ux__sticky-cta-bar.js +0 -275
- package/dist/features/tester/seed-data/authored/index.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/index.js +0 -301
- package/dist/features/tester/seed-data/authored/page-wiring__data-loss.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/page-wiring__data-loss.js +0 -125
- package/dist/features/tester/seed-data/authored/page-wiring__detail-pages.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/page-wiring__detail-pages.js +0 -85
- package/dist/features/tester/seed-data/authored/page-wiring__drawer-pages.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/page-wiring__drawer-pages.js +0 -92
- package/dist/features/tester/seed-data/authored/page-wiring__reachability.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/page-wiring__reachability.js +0 -115
- package/dist/features/tester/seed-data/authored/public-pages__auth-error-pages.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/public-pages__auth-error-pages.js +0 -137
- package/dist/features/tester/seed-data/authored/public-pages__core-listing-pages.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/public-pages__core-listing-pages.js +0 -263
- package/dist/features/tester/seed-data/authored/public-pages__help-how-it-works.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/public-pages__help-how-it-works.js +0 -229
- package/dist/features/tester/seed-data/authored/public-pages__help-scams-guides-subpages.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/public-pages__help-scams-guides-subpages.js +0 -325
- package/dist/features/tester/seed-data/authored/public-pages__legal-policy-pages.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/public-pages__legal-policy-pages.js +0 -126
- package/dist/features/tester/seed-data/authored/public-pages__newly-wired-browse-indexes.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/public-pages__newly-wired-browse-indexes.js +0 -141
- package/dist/features/tester/seed-data/authored/public-pages__store-tabs.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/public-pages__store-tabs.js +0 -115
- package/dist/features/tester/seed-data/authored/public-pages__stores-sellers-directories.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/public-pages__stores-sellers-directories.js +0 -253
- package/dist/features/tester/seed-data/authored/search-and-nav__employee-permissions.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/search-and-nav__employee-permissions.js +0 -93
- package/dist/features/tester/seed-data/authored/search-and-nav__header-search.d.ts +0 -3
- package/dist/features/tester/seed-data/authored/search-and-nav__header-search.js +0 -185
- package/dist/features/tester/seed-data/authored/search-and-nav__settings-deep-links.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/search-and-nav__settings-deep-links.js +0 -82
- package/dist/features/tester/seed-data/authored/search-and-nav__sidebar-search.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/search-and-nav__sidebar-search.js +0 -60
- package/dist/features/tester/seed-data/authored/selling__become-seller.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__become-seller.js +0 -117
- package/dist/features/tester/seed-data/authored/selling__digital-content-delivery.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__digital-content-delivery.js +0 -148
- package/dist/features/tester/seed-data/authored/selling__final-sale-authoring.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__final-sale-authoring.js +0 -108
- package/dist/features/tester/seed-data/authored/selling__listing-a-product.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__listing-a-product.js +0 -274
- package/dist/features/tester/seed-data/authored/selling__listing-edit-roundtrip.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__listing-edit-roundtrip.js +0 -145
- package/dist/features/tester/seed-data/authored/selling__listing-lifecycle.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__listing-lifecycle.js +0 -336
- package/dist/features/tester/seed-data/authored/selling__listing-type-fields-roundtrip.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__listing-type-fields-roundtrip.js +0 -136
- package/dist/features/tester/seed-data/authored/selling__media-limits.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__media-limits.js +0 -135
- package/dist/features/tester/seed-data/authored/selling__product-upload-details.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__product-upload-details.js +0 -155
- package/dist/features/tester/seed-data/authored/selling__quick-add-minimum-details.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__quick-add-minimum-details.js +0 -138
- package/dist/features/tester/seed-data/authored/selling__sectionised-forms.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__sectionised-forms.js +0 -191
- package/dist/features/tester/seed-data/authored/selling__seller-analytics-payouts.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__seller-analytics-payouts.js +0 -138
- package/dist/features/tester/seed-data/authored/selling__seller-bids-bundles-filters.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__seller-bids-bundles-filters.js +0 -106
- package/dist/features/tester/seed-data/authored/selling__seller-catalog-org.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__seller-catalog-org.js +0 -192
- package/dist/features/tester/seed-data/authored/selling__seller-custom-brands.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__seller-custom-brands.js +0 -109
- package/dist/features/tester/seed-data/authored/selling__seller-guide.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__seller-guide.js +0 -34
- package/dist/features/tester/seed-data/authored/selling__seller-listing-types.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__seller-listing-types.js +0 -348
- package/dist/features/tester/seed-data/authored/selling__seller-marketing-extras.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__seller-marketing-extras.js +0 -87
- package/dist/features/tester/seed-data/authored/selling__seller-ops-comms.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__seller-ops-comms.js +0 -90
- package/dist/features/tester/seed-data/authored/selling__seller-orders-at-scale.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__seller-orders-at-scale.js +0 -85
- package/dist/features/tester/seed-data/authored/selling__seller-orders.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__seller-orders.js +0 -213
- package/dist/features/tester/seed-data/authored/selling__seller-shipping-payouts-setup.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__seller-shipping-payouts-setup.js +0 -192
- package/dist/features/tester/seed-data/authored/selling__spares-and-group-editing.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__spares-and-group-editing.js +0 -77
- package/dist/features/tester/seed-data/authored/selling__store-dashboard-navigation.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__store-dashboard-navigation.js +0 -165
- package/dist/features/tester/seed-data/authored/selling__store-uncovered-pages.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__store-uncovered-pages.js +0 -116
- package/dist/features/tester/seed-data/authored/seo__canonical-and-host.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/seo__canonical-and-host.js +0 -127
- package/dist/features/tester/seed-data/authored/seo__og-images.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/seo__og-images.js +0 -107
- package/dist/features/tester/seed-data/authored/seo__page-metadata.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/seo__page-metadata.js +0 -120
- package/dist/features/tester/seed-data/authored/seo__sitemap-and-robots.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/seo__sitemap-and-robots.js +0 -105
- package/dist/features/tester/seed-data/authored/tools__sticker-promote-to-listings.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/tools__sticker-promote-to-listings.js +0 -58
- package/dist/features/tester/seed-data/authored/tools__sticker-tracer.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/tools__sticker-tracer.js +0 -284
- package/dist/features/tester/seed-data/index.d.ts +0 -2
- package/dist/features/tester/seed-data/index.js +0 -2
- package/dist/features/tester/seed-data/tester-checklist-seed-data.d.ts +0 -2
- package/dist/features/tester/seed-data/tester-checklist-seed-data.js +0 -7601
- package/dist/features/tester/seed-data/tester-responses-seed-data.d.ts +0 -2
- package/dist/features/tester/seed-data/tester-responses-seed-data.js +0 -95
- package/dist/features/tester/seed-data/tester-window.d.ts +0 -25
- package/dist/features/tester/seed-data/tester-window.js +0 -66
- package/dist/seed/_helpers/brand-rows.d.ts +0 -35
- package/dist/seed/_helpers/brand-rows.js +0 -600
- package/dist/seed/_helpers/category-content-generated.d.ts +0 -24
- package/dist/seed/_helpers/category-content-generated.js +0 -1853
- package/dist/seed/_helpers/category-content.d.ts +0 -68
- package/dist/seed/_helpers/category-content.js +0 -731
- package/dist/seed/_helpers/category-forest.d.ts +0 -4
- package/dist/seed/_helpers/category-forest.js +0 -824
- package/dist/seed/_helpers/category-images-generated.d.ts +0 -57
- package/dist/seed/_helpers/category-images-generated.js +0 -618
- package/dist/seed/_helpers/category-models/chunk0.d.ts +0 -2
- package/dist/seed/_helpers/category-models/chunk0.js +0 -2648
- package/dist/seed/_helpers/category-models/chunk1.d.ts +0 -2
- package/dist/seed/_helpers/category-models/chunk1.js +0 -2318
- package/dist/seed/_helpers/category-models/chunk2.d.ts +0 -2
- package/dist/seed/_helpers/category-models/chunk2.js +0 -2560
- package/dist/seed/_helpers/category-models/chunk3.d.ts +0 -2
- package/dist/seed/_helpers/category-models/chunk3.js +0 -2196
- package/dist/seed/_helpers/category-models/chunk4.d.ts +0 -2
- package/dist/seed/_helpers/category-models/chunk4.js +0 -1732
- package/dist/seed/_helpers/category-models.d.ts +0 -12
- package/dist/seed/_helpers/category-models.js +0 -45
- package/dist/seed/_helpers/category-names.d.ts +0 -54
- package/dist/seed/_helpers/category-names.js +0 -118
- package/dist/seed/_helpers/category-parts-glossary-map.d.ts +0 -1
- package/dist/seed/_helpers/category-parts-glossary-map.js +0 -2499
- package/dist/seed/_helpers/category-parts.d.ts +0 -9
- package/dist/seed/_helpers/category-parts.js +0 -15022
- package/dist/seed/_helpers/category-tree.d.ts +0 -27
- package/dist/seed/_helpers/category-tree.js +0 -119
- package/dist/seed/_helpers/character-features.d.ts +0 -10
- package/dist/seed/_helpers/character-features.js +0 -120
- package/dist/seed/_helpers/final-sale-fixtures.d.ts +0 -35
- package/dist/seed/_helpers/final-sale-fixtures.js +0 -61
- package/dist/seed/_helpers/franchise-rows.d.ts +0 -43
- package/dist/seed/_helpers/franchise-rows.js +0 -189
- package/dist/seed/_helpers/media.d.ts +0 -67
- package/dist/seed/_helpers/media.js +0 -172
- package/dist/seed/_helpers/part-colours-generated.d.ts +0 -18
- package/dist/seed/_helpers/part-colours-generated.js +0 -273
- package/dist/seed/_helpers/product-search-txt.d.ts +0 -18
- package/dist/seed/_helpers/product-search-txt.js +0 -23
- package/dist/seed/_helpers/search-txt-wrappers.d.ts +0 -26
- package/dist/seed/_helpers/search-txt-wrappers.js +0 -58
- package/dist/seed/addresses-seed-data.d.ts +0 -2
- package/dist/seed/addresses-seed-data.js +0 -78
- package/dist/seed/authenticity-knowledge-seed-data.d.ts +0 -78
- package/dist/seed/authenticity-knowledge-seed-data.js +0 -10729
- package/dist/seed/bey-products-seed-data.d.ts +0 -18
- package/dist/seed/bey-products-seed-data.js +0 -18011
- package/dist/seed/beys/chunk0.d.ts +0 -17
- package/dist/seed/beys/chunk0.js +0 -36733
- package/dist/seed/beys/chunk1.d.ts +0 -17
- package/dist/seed/beys/chunk1.js +0 -35728
- package/dist/seed/beys/chunk2.d.ts +0 -17
- package/dist/seed/beys/chunk2.js +0 -35857
- package/dist/seed/beys/chunk3.d.ts +0 -17
- package/dist/seed/beys/chunk3.js +0 -34476
- package/dist/seed/beys-seed-data.d.ts +0 -18
- package/dist/seed/beys-seed-data.js +0 -11
- package/dist/seed/bids-seed-data.d.ts +0 -2
- package/dist/seed/bids-seed-data.js +0 -206
- package/dist/seed/blog-posts-seed-data.d.ts +0 -6
- package/dist/seed/blog-posts-seed-data.js +0 -442
- package/dist/seed/carousel-slides-seed-data.d.ts +0 -2
- package/dist/seed/carousel-slides-seed-data.js +0 -411
- package/dist/seed/carousels-seed-data.d.ts +0 -2
- package/dist/seed/carousels-seed-data.js +0 -36
- package/dist/seed/cart-seed-data.d.ts +0 -2
- package/dist/seed/cart-seed-data.js +0 -241
- package/dist/seed/catalogue-seed-data.d.ts +0 -2
- package/dist/seed/catalogue-seed-data.js +0 -112
- package/dist/seed/categories-seed-data.d.ts +0 -3
- package/dist/seed/categories-seed-data.js +0 -816
- package/dist/seed/claimed-coupons-seed-data.d.ts +0 -2
- package/dist/seed/claimed-coupons-seed-data.js +0 -85
- package/dist/seed/coupon-usage-seed-data.d.ts +0 -9
- package/dist/seed/coupon-usage-seed-data.js +0 -55
- package/dist/seed/coupons-seed-data.d.ts +0 -2
- package/dist/seed/coupons-seed-data.js +0 -226
- package/dist/seed/defaults/categories.d.ts +0 -2
- package/dist/seed/defaults/categories.js +0 -12
- package/dist/seed/defaults/faqs.d.ts +0 -2
- package/dist/seed/defaults/faqs.js +0 -40
- package/dist/seed/events-seed-data.d.ts +0 -7
- package/dist/seed/events-seed-data.js +0 -482
- package/dist/seed/factories/address.factory.d.ts +0 -21
- package/dist/seed/factories/address.factory.js +0 -44
- package/dist/seed/factories/bid.factory.d.ts +0 -15
- package/dist/seed/factories/bid.factory.js +0 -33
- package/dist/seed/factories/blog-post.factory.d.ts +0 -15
- package/dist/seed/factories/blog-post.factory.js +0 -22
- package/dist/seed/factories/carousel.factory.d.ts +0 -11
- package/dist/seed/factories/carousel.factory.js +0 -17
- package/dist/seed/factories/cart.factory.d.ts +0 -25
- package/dist/seed/factories/cart.factory.js +0 -35
- package/dist/seed/factories/category.factory.d.ts +0 -11
- package/dist/seed/factories/category.factory.js +0 -16
- package/dist/seed/factories/coupon.factory.d.ts +0 -21
- package/dist/seed/factories/coupon.factory.js +0 -43
- package/dist/seed/factories/faq.factory.d.ts +0 -10
- package/dist/seed/factories/faq.factory.js +0 -15
- package/dist/seed/factories/notification.factory.d.ts +0 -18
- package/dist/seed/factories/notification.factory.js +0 -39
- package/dist/seed/factories/order.factory.d.ts +0 -20
- package/dist/seed/factories/order.factory.js +0 -20
- package/dist/seed/factories/payout.factory.d.ts +0 -21
- package/dist/seed/factories/payout.factory.js +0 -38
- package/dist/seed/factories/product.factory.d.ts +0 -27
- package/dist/seed/factories/product.factory.js +0 -80
- package/dist/seed/factories/review.factory.d.ts +0 -14
- package/dist/seed/factories/review.factory.js +0 -52
- package/dist/seed/factories/session.factory.d.ts +0 -15
- package/dist/seed/factories/session.factory.js +0 -31
- package/dist/seed/factories/store.factory.d.ts +0 -23
- package/dist/seed/factories/store.factory.js +0 -47
- package/dist/seed/factories/user.factory.d.ts +0 -19
- package/dist/seed/factories/user.factory.js +0 -56
- package/dist/seed/faq-seed-data.d.ts +0 -18
- package/dist/seed/faq-seed-data.js +0 -1956
- package/dist/seed/firestore-indexes.d.ts +0 -12
- package/dist/seed/firestore-indexes.js +0 -31
- package/dist/seed/grouped-listings-seed-data.d.ts +0 -2
- package/dist/seed/grouped-listings-seed-data.js +0 -283
- package/dist/seed/history-seed-data.d.ts +0 -12
- package/dist/seed/history-seed-data.js +0 -70
- package/dist/seed/homepage-sections-seed-data.d.ts +0 -2
- package/dist/seed/homepage-sections-seed-data.js +0 -1034
- package/dist/seed/index.d.ts +0 -100
- package/dist/seed/index.js +0 -115
- package/dist/seed/lottery-entries-seed-data.d.ts +0 -2
- package/dist/seed/lottery-entries-seed-data.js +0 -108
- package/dist/seed/manifest.d.ts +0 -16
- package/dist/seed/manifest.js +0 -235
- package/dist/seed/media-assets-seed-data.d.ts +0 -22
- package/dist/seed/media-assets-seed-data.js +0 -5593
- package/dist/seed/model-composition-seed-data.d.ts +0 -15
- package/dist/seed/model-composition-seed-data.js +0 -9032
- package/dist/seed/notifications-seed-data.d.ts +0 -2
- package/dist/seed/notifications-seed-data.js +0 -606
- package/dist/seed/offers-seed-data.d.ts +0 -2
- package/dist/seed/offers-seed-data.js +0 -398
- package/dist/seed/orders-seed-data.d.ts +0 -2
- package/dist/seed/orders-seed-data.js +0 -845
- package/dist/seed/part-glossary/chunk0.d.ts +0 -9
- package/dist/seed/part-glossary/chunk0.js +0 -35448
- package/dist/seed/part-glossary/chunk1.d.ts +0 -9
- package/dist/seed/part-glossary/chunk1.js +0 -40494
- package/dist/seed/part-glossary/chunk2.d.ts +0 -9
- package/dist/seed/part-glossary/chunk2.js +0 -51242
- package/dist/seed/part-glossary/chunk3.d.ts +0 -9
- package/dist/seed/part-glossary/chunk3.js +0 -53337
- package/dist/seed/part-glossary/chunk4.d.ts +0 -9
- package/dist/seed/part-glossary/chunk4.js +0 -51454
- package/dist/seed/part-glossary-seed-data.d.ts +0 -15
- package/dist/seed/part-glossary-seed-data.js +0 -25
- package/dist/seed/payouts-seed-data.d.ts +0 -2
- package/dist/seed/payouts-seed-data.js +0 -302
- package/dist/seed/product-features-seed-data.d.ts +0 -3
- package/dist/seed/product-features-seed-data.js +0 -366
- package/dist/seed/products-art-seed-data.d.ts +0 -2
- package/dist/seed/products-art-seed-data.js +0 -289
- package/dist/seed/products-auctions-seed-data.d.ts +0 -2
- package/dist/seed/products-auctions-seed-data.js +0 -475
- package/dist/seed/products-beyblade-x-seed-data.d.ts +0 -2
- package/dist/seed/products-beyblade-x-seed-data.js +0 -476
- package/dist/seed/products-catalogue/chunk0.d.ts +0 -12
- package/dist/seed/products-catalogue/chunk0.js +0 -7262
- package/dist/seed/products-catalogue/chunk1.d.ts +0 -12
- package/dist/seed/products-catalogue/chunk1.js +0 -7290
- package/dist/seed/products-catalogue/chunk10.d.ts +0 -12
- package/dist/seed/products-catalogue/chunk10.js +0 -7290
- package/dist/seed/products-catalogue/chunk11.d.ts +0 -12
- package/dist/seed/products-catalogue/chunk11.js +0 -7005
- package/dist/seed/products-catalogue/chunk12.d.ts +0 -12
- package/dist/seed/products-catalogue/chunk12.js +0 -7002
- package/dist/seed/products-catalogue/chunk13.d.ts +0 -12
- package/dist/seed/products-catalogue/chunk13.js +0 -7002
- package/dist/seed/products-catalogue/chunk14.d.ts +0 -12
- package/dist/seed/products-catalogue/chunk14.js +0 -7002
- package/dist/seed/products-catalogue/chunk15.d.ts +0 -12
- package/dist/seed/products-catalogue/chunk15.js +0 -7002
- package/dist/seed/products-catalogue/chunk16.d.ts +0 -12
- package/dist/seed/products-catalogue/chunk16.js +0 -7002
- package/dist/seed/products-catalogue/chunk17.d.ts +0 -12
- package/dist/seed/products-catalogue/chunk17.js +0 -7002
- package/dist/seed/products-catalogue/chunk18.d.ts +0 -12
- package/dist/seed/products-catalogue/chunk18.js +0 -4398
- package/dist/seed/products-catalogue/chunk2.d.ts +0 -12
- package/dist/seed/products-catalogue/chunk2.js +0 -7268
- package/dist/seed/products-catalogue/chunk3.d.ts +0 -12
- package/dist/seed/products-catalogue/chunk3.js +0 -7264
- package/dist/seed/products-catalogue/chunk4.d.ts +0 -12
- package/dist/seed/products-catalogue/chunk4.js +0 -7268
- package/dist/seed/products-catalogue/chunk5.d.ts +0 -12
- package/dist/seed/products-catalogue/chunk5.js +0 -7258
- package/dist/seed/products-catalogue/chunk6.d.ts +0 -12
- package/dist/seed/products-catalogue/chunk6.js +0 -7268
- package/dist/seed/products-catalogue/chunk7.d.ts +0 -12
- package/dist/seed/products-catalogue/chunk7.js +0 -7311
- package/dist/seed/products-catalogue/chunk8.d.ts +0 -12
- package/dist/seed/products-catalogue/chunk8.js +0 -7304
- package/dist/seed/products-catalogue/chunk9.d.ts +0 -12
- package/dist/seed/products-catalogue/chunk9.js +0 -7309
- package/dist/seed/products-catalogue-seed-data.d.ts +0 -2
- package/dist/seed/products-catalogue-seed-data.js +0 -60
- package/dist/seed/products-classifieds-seed-data.d.ts +0 -7
- package/dist/seed/products-classifieds-seed-data.js +0 -435
- package/dist/seed/products-digital-codes-seed-data.d.ts +0 -7
- package/dist/seed/products-digital-codes-seed-data.js +0 -395
- package/dist/seed/products-live-items-seed-data.d.ts +0 -7
- package/dist/seed/products-live-items-seed-data.js +0 -269
- package/dist/seed/products-preorders-seed-data.d.ts +0 -2
- package/dist/seed/products-preorders-seed-data.js +0 -360
- package/dist/seed/products-prize-draws-seed-data.d.ts +0 -7
- package/dist/seed/products-prize-draws-seed-data.js +0 -427
- package/dist/seed/products-spares-seed-data.d.ts +0 -2
- package/dist/seed/products-spares-seed-data.js +0 -368
- package/dist/seed/products-standard-seed-data.d.ts +0 -2
- package/dist/seed/products-standard-seed-data.js +0 -632
- package/dist/seed/products-stickers-seed-data.d.ts +0 -2
- package/dist/seed/products-stickers-seed-data.js +0 -319
- package/dist/seed/reviews-seed-data.d.ts +0 -1
- package/dist/seed/reviews-seed-data.js +0 -185
- package/dist/seed/runner.d.ts +0 -2
- package/dist/seed/runner.js +0 -125
- package/dist/seed/scammers-seed-data.d.ts +0 -2
- package/dist/seed/scammers-seed-data.js +0 -235
- package/dist/seed/seed-market-config.d.ts +0 -48
- package/dist/seed/seed-market-config.js +0 -199
- package/dist/seed/seed-purpose.d.ts +0 -299
- package/dist/seed/seed-purpose.js +0 -440
- package/dist/seed/sessions-seed-data.d.ts +0 -3
- package/dist/seed/sessions-seed-data.js +0 -116
- package/dist/seed/shipments-seed-data.d.ts +0 -5
- package/dist/seed/shipments-seed-data.js +0 -185
- package/dist/seed/site-settings-seed-data.d.ts +0 -2
- package/dist/seed/site-settings-seed-data.js +0 -1069
- package/dist/seed/store-addresses-seed-data.d.ts +0 -18
- package/dist/seed/store-addresses-seed-data.js +0 -71
- package/dist/seed/store-extensions-seed-data.d.ts +0 -11
- package/dist/seed/store-extensions-seed-data.js +0 -292
- package/dist/seed/stores-seed-data.d.ts +0 -6
- package/dist/seed/stores-seed-data.js +0 -242
- package/dist/seed/support-tickets-seed-data.d.ts +0 -16
- package/dist/seed/support-tickets-seed-data.js +0 -239
- package/dist/seed/tax-codes-seed-data.d.ts +0 -34
- package/dist/seed/tax-codes-seed-data.js +0 -100
- package/dist/seed/test-data-ttl.d.ts +0 -29
- package/dist/seed/test-data-ttl.js +0 -31
- package/dist/seed/test-utils.d.ts +0 -49
- package/dist/seed/test-utils.js +0 -110
- package/dist/seed/types.d.ts +0 -89
- package/dist/seed/types.js +0 -15
- package/dist/seed/users-seed-data.d.ts +0 -2
- package/dist/seed/users-seed-data.js +0 -597
- package/dist/seed/wishlists-seed-data.d.ts +0 -12
- package/dist/seed/wishlists-seed-data.js +0 -54
|
@@ -1,1264 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* WHY: Authored six-part procedures for the buying/cart checklist page.
|
|
3
|
-
* WHAT: 71 case(s), keyed by full checklist id. The largest page in the catalogue.
|
|
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
|
-
* 🛑 THREE RULES RUN THROUGH ALMOST EVERY CASE HERE.
|
|
10
|
-
*
|
|
11
|
-
* LANES. A cart holds three kinds of line with three different obligations, and
|
|
12
|
-
* only the highest-ranked non-empty lane may be checked out. The lane is DERIVED
|
|
13
|
-
* from each line, never stored — a mirror field would drift the first time a write
|
|
14
|
-
* path forgot it. Totals, coupons, select-all and the OTP threshold are all scoped
|
|
15
|
-
* to a lane, and the cart prices whichever tab is OPEN while gating on the active
|
|
16
|
-
* one, so a blocked tab must show its own figure and say why it cannot be paid.
|
|
17
|
-
*
|
|
18
|
-
* THE QUANTITY INVARIANT. A bundle line's quantity is COPIES of the whole
|
|
19
|
-
* selection; a group line's quantity is pinned at 1 and each member carries its
|
|
20
|
-
* own. That pinning is what lets one price rule keep returning a unit price that
|
|
21
|
-
* every existing call site multiplies by the line quantity — so never render both
|
|
22
|
-
* a line-level and a per-member stepper.
|
|
23
|
-
*
|
|
24
|
-
* PER-STORE FEES. Add-ons are per store, keyed on the same id the cart splits
|
|
25
|
-
* orders by. Accumulating a cart-wide flag inside the per-group loop bills it once
|
|
26
|
-
* per seller; applying it once outside bills less than the orders record.
|
|
27
|
-
*
|
|
28
|
-
* @tag domain:tester
|
|
29
|
-
* @tag layer:seed
|
|
30
|
-
* @tag pattern:none
|
|
31
|
-
* @tag access:server-only
|
|
32
|
-
* @tag consumers:seed-data/authored/index.ts
|
|
33
|
-
* @tag sideEffects:none
|
|
34
|
-
*/
|
|
35
|
-
export const authored = {
|
|
36
|
-
"checklist-buying-cart-update-qty": {
|
|
37
|
-
roles: ["buyer"],
|
|
38
|
-
startPage: "/cart",
|
|
39
|
-
steps: [
|
|
40
|
-
"Sign in as rehan.sheikh@gmail.com / TempPass123!.",
|
|
41
|
-
"Add product-beyblade-burst-valkyrie (₹999) to the cart and open /cart.",
|
|
42
|
-
"Read the line total, the seller subtotal and the summary total.",
|
|
43
|
-
"Set the quantity stepper on that line to 3.",
|
|
44
|
-
"Read all three figures again.",
|
|
45
|
-
"RELOAD and read the quantity and the figures.",
|
|
46
|
-
],
|
|
47
|
-
inputs: { productId: "product-beyblade-burst-valkyrie", quantity: 3, unitPrice: 999 },
|
|
48
|
-
expectedBehaviour: "The quantity is written to the cart document and every derived figure recomputes from it. The line price is a UNIT price that the quantity multiplies — a rule the cart, the checkout preview and the order-creation paths all share, so all three agree by construction.",
|
|
49
|
-
expectedUiState: "The line reads 3 × ₹999.00 = ₹2,997.00, and the seller subtotal and summary total move with it. After the reload the quantity is still 3.",
|
|
50
|
-
expectedData: { cartLineQuantity: 3, lineTotal: 2997 },
|
|
51
|
-
endResult: "The cart holds three copies. Empty it afterwards.",
|
|
52
|
-
},
|
|
53
|
-
"checklist-buying-cart-remove-item": {
|
|
54
|
-
roles: ["buyer"],
|
|
55
|
-
startPage: "/cart",
|
|
56
|
-
steps: [
|
|
57
|
-
"Sign in as rehan.sheikh@gmail.com / TempPass123!.",
|
|
58
|
-
"Add three different products to the cart and open /cart.",
|
|
59
|
-
"Note which item is in the MIDDLE position.",
|
|
60
|
-
"Remove that item.",
|
|
61
|
-
"Read which items remain and in what order.",
|
|
62
|
-
"RELOAD and read them again, and read the header badge.",
|
|
63
|
-
],
|
|
64
|
-
expectedBehaviour: "Remove acts on the line it belongs to. A remove keyed on array position deletes the wrong line once the list has shifted, and both survivors still look like valid rows — which is why the middle item is the one removed.",
|
|
65
|
-
expectedUiState: "The two remaining items are the first and third, in that order, and the badge reads 2. After the reload the same two remain.",
|
|
66
|
-
expectedData: { remainingItems: 2 },
|
|
67
|
-
endResult: "Two items remain. Empty the cart afterwards.",
|
|
68
|
-
},
|
|
69
|
-
"checklist-buying-cart-remove-all-confirmation": {
|
|
70
|
-
roles: ["buyer"],
|
|
71
|
-
startPage: "/cart",
|
|
72
|
-
steps: [
|
|
73
|
-
"Sign in as rehan.sheikh@gmail.com / TempPass123!.",
|
|
74
|
-
"Add two products to the cart and open /cart.",
|
|
75
|
-
"Click 'Remove all'.",
|
|
76
|
-
"Read the dialog that opens WITHOUT confirming.",
|
|
77
|
-
"Check it names what will be cleared rather than asking a generic question.",
|
|
78
|
-
"Cancel the dialog and confirm the cart is unchanged.",
|
|
79
|
-
],
|
|
80
|
-
expectedBehaviour: "Clearing a cart is destructive and irreversible, so it carries a confirmation naming the action. Every danger-kind action holds its confirmation copy in the shared registry — an action defined inline bypasses that, and executes immediately with no warning.",
|
|
81
|
-
expectedUiState: "A dialog reading in the shape of 'Clear your cart?' opens before anything is removed. Cancelling leaves both items present.",
|
|
82
|
-
endResult: "The cart still holds both items.",
|
|
83
|
-
},
|
|
84
|
-
"checklist-buying-cart-remove-all-stays-empty": {
|
|
85
|
-
roles: ["buyer"],
|
|
86
|
-
startPage: "/cart",
|
|
87
|
-
steps: [
|
|
88
|
-
"Sign in as rehan.sheikh@gmail.com / TempPass123!.",
|
|
89
|
-
"Add two products to the cart and open /cart.",
|
|
90
|
-
"Use 'Remove all' and confirm it.",
|
|
91
|
-
"Read the cart immediately.",
|
|
92
|
-
"Wait sixty seconds without touching anything and read it again.",
|
|
93
|
-
"RELOAD and read it once more.",
|
|
94
|
-
"Open /cart in a second tab and read it there.",
|
|
95
|
-
],
|
|
96
|
-
expectedBehaviour: "The clear is written to the cart document, so it holds. Items reappearing after a moment mean the clear was local while a cached copy re-hydrated over it — the cart is one document written with a whole-object set, so a stale copy losing that race restores what was removed.",
|
|
97
|
-
expectedUiState: "The cart is empty immediately, still empty after sixty seconds, after a reload, and in a second tab. Items returning at any point is the failure.",
|
|
98
|
-
expectedData: { itemCount: 0 },
|
|
99
|
-
endResult: "The cart is empty.",
|
|
100
|
-
},
|
|
101
|
-
"checklist-buying-cart-remove-all-badge-zero": {
|
|
102
|
-
roles: ["buyer"],
|
|
103
|
-
startPage: "/cart",
|
|
104
|
-
steps: [
|
|
105
|
-
"Sign in as rehan.sheikh@gmail.com / TempPass123!.",
|
|
106
|
-
"Add three products to the cart and read the header badge.",
|
|
107
|
-
"Open /cart and use 'Remove all', confirming it.",
|
|
108
|
-
"Read the header badge immediately, without reloading.",
|
|
109
|
-
"Navigate to /products and read the badge.",
|
|
110
|
-
"RELOAD and read it again.",
|
|
111
|
-
],
|
|
112
|
-
expectedBehaviour: "The badge is derived from the same cart the page reads, so clearing updates both. A badge holding its own count independently keeps a leftover number that no page can explain — and the header persists across navigation, so it never re-mounts to correct itself.",
|
|
113
|
-
expectedUiState: "The badge reads 0 or disappears immediately, stays that way on /products, and is still correct after a reload. A leftover count is the failure.",
|
|
114
|
-
expectedData: { badgeCount: 0 },
|
|
115
|
-
endResult: "The cart is empty and the badge agrees.",
|
|
116
|
-
},
|
|
117
|
-
"checklist-buying-cart-remove-all-keeps-won-auction": {
|
|
118
|
-
roles: ["buyer"],
|
|
119
|
-
startPage: "/cart",
|
|
120
|
-
steps: [
|
|
121
|
-
"Sign in as rehan.sheikh@gmail.com / TempPass123!, whose cart holds a won auction.",
|
|
122
|
-
"Add two ordinary products to the cart.",
|
|
123
|
-
"Open /cart and note the Won Auctions tab holds a line.",
|
|
124
|
-
"Use 'Remove all' from the Cart tab and confirm it.",
|
|
125
|
-
"Read what the confirmation or the resulting message says about the won auction.",
|
|
126
|
-
"Open the Won Auctions tab and check the line is still there.",
|
|
127
|
-
],
|
|
128
|
-
expectedBehaviour: "A won-auction line is LOCKED and cannot be removed — settlement is its only writer, and the buyer has already committed to that purchase. 'Remove all' therefore clears the ordinary lines and says so, rather than silently doing less than its label promises.",
|
|
129
|
-
expectedUiState: "The ordinary items are gone, the won-auction line remains, and the interface states that it was kept. Silently keeping it with no explanation is a failure, and removing it is a worse one.",
|
|
130
|
-
expectedData: { wonAuctionLinesRemaining: 1 },
|
|
131
|
-
endResult: "The won-auction line is intact.",
|
|
132
|
-
},
|
|
133
|
-
"checklist-buying-cart-cart-empty-state": {
|
|
134
|
-
roles: ["buyer"],
|
|
135
|
-
startPage: "/cart",
|
|
136
|
-
steps: [
|
|
137
|
-
"Sign in as karthik.new@gmail.com / TempPass123! with an empty cart.",
|
|
138
|
-
"Open /cart and read the page.",
|
|
139
|
-
"Check it offers a route back into browsing rather than only stating the cart is empty.",
|
|
140
|
-
"Follow that link and read where it lands.",
|
|
141
|
-
"Return and check no summary panel, coupon field or checkout button is rendered over the empty state.",
|
|
142
|
-
"RELOAD and confirm the empty state is still shown.",
|
|
143
|
-
],
|
|
144
|
-
expectedBehaviour: "An empty cart shows a named empty state with a way onward. Controls that cannot act on anything are not rendered over it — a checkout button on an empty cart is a control whose only possible outcome is a refusal.",
|
|
145
|
-
expectedUiState: "A readable message and a working link to browse. No checkout button, coupon field or summary panel. A bare white area is the failure.",
|
|
146
|
-
endResult: "The cart is empty.",
|
|
147
|
-
},
|
|
148
|
-
"checklist-buying-cart-cart-persists-across-session": {
|
|
149
|
-
roles: ["buyer"],
|
|
150
|
-
startPage: "/cart",
|
|
151
|
-
steps: [
|
|
152
|
-
"Sign in as rehan.sheikh@gmail.com / TempPass123!.",
|
|
153
|
-
"Add two products to the cart and note their titles and quantities.",
|
|
154
|
-
"RELOAD /cart and read the contents.",
|
|
155
|
-
"Sign out.",
|
|
156
|
-
"Sign back in as the same account and open /cart.",
|
|
157
|
-
"Read the contents and quantities.",
|
|
158
|
-
"Open /cart in a different browser signed in as the same account.",
|
|
159
|
-
],
|
|
160
|
-
expectedBehaviour: "The cart is a server document keyed on the user's id, so it survives a reload, a sign-out and a different browser. A cart held only in browser storage is per-device and disappears at the moment a buyer switches from phone to laptop to pay.",
|
|
161
|
-
expectedUiState: "Both items with their quantities are present after the reload, after signing back in, and in the second browser.",
|
|
162
|
-
endResult: "The cart holds both items. Empty it afterwards.",
|
|
163
|
-
},
|
|
164
|
-
"checklist-buying-cart-cart-guest-to-login-merge": {
|
|
165
|
-
roles: ["guest", "buyer"],
|
|
166
|
-
startPage: "/products",
|
|
167
|
-
steps: [
|
|
168
|
-
"Sign in as karthik.new@gmail.com / TempPass123!, add one product, and sign out.",
|
|
169
|
-
"In the same window, add two DIFFERENT products as a guest and note their titles.",
|
|
170
|
-
"Add one of the account's existing products as a guest as well.",
|
|
171
|
-
"Open /cart as a guest and confirm the three guest items.",
|
|
172
|
-
"Sign in as karthik.new@gmail.com / TempPass123!.",
|
|
173
|
-
"Open /cart and read every line and quantity.",
|
|
174
|
-
"Check the duplicated product appears ONCE with a sensible quantity.",
|
|
175
|
-
],
|
|
176
|
-
expectedBehaviour: "The guest cart merges into the account's rather than replacing it or being discarded. A product present in both must resolve to one line — the merge rebuilds lines from products, which is also why a grouped line cannot survive a guest cart and is not offered to one.",
|
|
177
|
-
expectedUiState: "All the guest items and the account's original item are present. The product added in both states appears exactly once. A cart that lost either side is the failure.",
|
|
178
|
-
expectedData: { duplicateProductLines: 0 },
|
|
179
|
-
endResult: "The merged cart holds each product once. Empty it afterwards.",
|
|
180
|
-
},
|
|
181
|
-
"checklist-buying-cart-cart-price-revalidated": {
|
|
182
|
-
roles: ["buyer", "seller"],
|
|
183
|
-
startPage: "/cart",
|
|
184
|
-
steps: [
|
|
185
|
-
"Sign in as rehan.sheikh@gmail.com / TempPass123! and add product-beyblade-burst-valkyrie (₹999) to the cart.",
|
|
186
|
-
"Note the price shown in the cart.",
|
|
187
|
-
"Sign out and sign in as tyson@beybladearena.in / TempPass123!.",
|
|
188
|
-
"Change that product's price to 1199 and save.",
|
|
189
|
-
"Sign back in as the buyer and open /cart.",
|
|
190
|
-
"Read the line price and the total.",
|
|
191
|
-
"Go to checkout and read the amount at every step.",
|
|
192
|
-
"Restore the product's original price.",
|
|
193
|
-
],
|
|
194
|
-
inputs: { priceBefore: 999, priceAfter: 1199 },
|
|
195
|
-
expectedBehaviour: "The price is re-read from the product rather than trusted from the cart snapshot. A cart that charges the price captured at add time lets a buyer hold an old price indefinitely — and the reverse, a price rise the buyer is not shown before paying, is worse.",
|
|
196
|
-
expectedUiState: "The cart and every checkout step read ₹1,199.00, and the change is visible before payment rather than appearing only on the order. A cart still showing ₹999.00 at the payment step is the failure.",
|
|
197
|
-
expectedData: { chargedPrice: 1199 },
|
|
198
|
-
endResult: "The product's price is restored; do not place the order.",
|
|
199
|
-
},
|
|
200
|
-
"checklist-buying-cart-cart-checkout-button-visible": {
|
|
201
|
-
roles: ["buyer"],
|
|
202
|
-
startPage: "/cart",
|
|
203
|
-
steps: [
|
|
204
|
-
"Sign in as rehan.sheikh@gmail.com / TempPass123! and add a product.",
|
|
205
|
-
"Open /cart at 1280 pixels wide and find the checkout control without scrolling past the summary.",
|
|
206
|
-
"Resize to 390 pixels and find it again.",
|
|
207
|
-
"Scroll to the bottom of the cart at 390 pixels and check it is still reachable.",
|
|
208
|
-
"Check it is not hidden behind the bottom tab bar.",
|
|
209
|
-
"Click it and confirm it reaches checkout.",
|
|
210
|
-
],
|
|
211
|
-
inputs: { desktopWidth: 1280, mobileWidth: 390 },
|
|
212
|
-
expectedBehaviour: "The checkout control is reachable at both widths. On mobile it lives in the measured bottom tier above the tab bar, so neither has to know the other's height — a bar that hides by transform rather than by collapsing leaves its height behind and pushes this control off screen.",
|
|
213
|
-
expectedUiState: "The control is visible and clickable at both widths, above the tab bar on mobile, and reaches checkout.",
|
|
214
|
-
endResult: "Leave checkout without ordering; empty the cart.",
|
|
215
|
-
},
|
|
216
|
-
"checklist-buying-cart-apply-coupon": {
|
|
217
|
-
roles: ["buyer"],
|
|
218
|
-
startPage: "/cart",
|
|
219
|
-
steps: [
|
|
220
|
-
"Sign in as vivaan.kapoor@gmail.com / TempPass123!.",
|
|
221
|
-
"Add product-beyblade-burst-regalia-genesis (₹1,399, Beyblade Arena) to the cart.",
|
|
222
|
-
"Open /cart and look for a coupon input anywhere on the page.",
|
|
223
|
-
"Open the 'How coupons work' panel and read its rules.",
|
|
224
|
-
"Go to /checkout and complete the address and add-ons steps.",
|
|
225
|
-
"Type ARENA25 in the coupon field and click Apply.",
|
|
226
|
-
"Read the discount and the recalculated total.",
|
|
227
|
-
],
|
|
228
|
-
inputs: { coupon: "ARENA25", itemPrice: 1399 },
|
|
229
|
-
expectedBehaviour: "Codes are entered at CHECKOUT only — the cart explains the rules and takes no codes. One place to type a coupon means one place for it to be wrong, and the cart panel is explanatory rather than a second entry point.",
|
|
230
|
-
expectedUiState: "No coupon input on /cart, only the explanatory panel. At checkout ARENA25 applies with its discount and the total falls accordingly.",
|
|
231
|
-
endResult: "Remove the coupon and empty the cart afterwards.",
|
|
232
|
-
},
|
|
233
|
-
"checklist-buying-cart-remove-coupon": {
|
|
234
|
-
roles: ["buyer"],
|
|
235
|
-
startPage: "/cart",
|
|
236
|
-
steps: [
|
|
237
|
-
"Sign in as vivaan.kapoor@gmail.com / TempPass123!.",
|
|
238
|
-
"Add product-beyblade-burst-regalia-genesis (₹1,399) to the cart and reach the checkout coupon step.",
|
|
239
|
-
"Apply ARENA25 and note the discount amount and the total.",
|
|
240
|
-
"Remove the coupon.",
|
|
241
|
-
"Read the total immediately.",
|
|
242
|
-
"Check it rose by exactly the discount amount.",
|
|
243
|
-
"RELOAD and confirm the coupon is gone and the total holds.",
|
|
244
|
-
],
|
|
245
|
-
inputs: { coupon: "ARENA25" },
|
|
246
|
-
expectedBehaviour: "Removing a coupon recomputes the total by exactly the amount it was giving. A removal that clears the row without recomputing, or that clears the whole stack, are the two failures — and the arithmetic is what separates them from a correct removal.",
|
|
247
|
-
expectedUiState: "The coupon leaves the applied list and the total rises by precisely its discount. After the reload it is still absent.",
|
|
248
|
-
endResult: "The cart is emptied afterwards.",
|
|
249
|
-
},
|
|
250
|
-
"checklist-buying-cart-cart-added-toast-totals": {
|
|
251
|
-
roles: ["buyer"],
|
|
252
|
-
startPage: "/products/product-beyblade-burst-valkyrie",
|
|
253
|
-
steps: [
|
|
254
|
-
"Sign in as rehan.sheikh@gmail.com / TempPass123! with an empty cart.",
|
|
255
|
-
"Open /products/product-beyblade-burst-valkyrie and click 'Add to Cart'.",
|
|
256
|
-
"Read the toast that appears — the item named, the item count and any total.",
|
|
257
|
-
"Compare the count and total against the header badge.",
|
|
258
|
-
"Add a second, different product and read the toast again.",
|
|
259
|
-
"Open /cart and compare the toast's figures against the cart page.",
|
|
260
|
-
],
|
|
261
|
-
expectedBehaviour: "The toast names what was added and reports the cart's updated state, and those figures come from the same cart the badge and the page read. Three sources disagreeing is how a buyer ends up trusting none of them.",
|
|
262
|
-
expectedUiState: "The toast names the item and shows an updated count and total that match the badge and the cart page. A toast reporting a stale count is the failure.",
|
|
263
|
-
endResult: "Two items are in the cart. Empty it afterwards.",
|
|
264
|
-
},
|
|
265
|
-
"checklist-buying-cart-cart-badge-matches-cart-page": {
|
|
266
|
-
roles: ["buyer"],
|
|
267
|
-
startPage: "/products",
|
|
268
|
-
steps: [
|
|
269
|
-
"Sign in as rehan.sheikh@gmail.com / TempPass123! with an empty cart.",
|
|
270
|
-
"Add three different products from the grid, reading the badge after each.",
|
|
271
|
-
"Open /cart and count the lines and the total quantity.",
|
|
272
|
-
"Compare against the badge.",
|
|
273
|
-
"Change one line's quantity to 2 and read the badge.",
|
|
274
|
-
"Remove a line and read the badge.",
|
|
275
|
-
"RELOAD and compare once more.",
|
|
276
|
-
],
|
|
277
|
-
expectedBehaviour: "The badge and the cart page read one document, so they cannot disagree. The badge counting lines while the page counts units, or the reverse, is a real ambiguity — whichever it counts, it must count consistently through adds, quantity changes and removals.",
|
|
278
|
-
expectedUiState: "The badge tracks the cart through every operation and matches the page after the reload. Record whether it counts lines or units — a badge that switches between the two is the failure.",
|
|
279
|
-
endResult: "Empty the cart afterwards.",
|
|
280
|
-
},
|
|
281
|
-
"checklist-buying-cart-bottom-nav-cart-not-wishlist": {
|
|
282
|
-
roles: ["buyer"],
|
|
283
|
-
startPage: "/",
|
|
284
|
-
steps: [
|
|
285
|
-
"Sign in as rehan.sheikh@gmail.com / TempPass123! with items in the cart.",
|
|
286
|
-
"Resize the browser to 390 pixels wide and open /.",
|
|
287
|
-
"Read every tab in the bottom navigation bar.",
|
|
288
|
-
"Check a Cart tab is present with a live item-count badge.",
|
|
289
|
-
"Check Wishlist is NOT one of the tabs.",
|
|
290
|
-
"Add an item and check the Cart tab's badge updates.",
|
|
291
|
-
"Count the bottom bars present.",
|
|
292
|
-
],
|
|
293
|
-
inputs: { mobileWidth: 390 },
|
|
294
|
-
expectedBehaviour: "The bottom bar carries Cart with a live badge and not Wishlist — the cart is the path to a purchase and the badge is the signal that matters. Exactly one bottom bar may be mounted per route: it is the sole publisher of the tab-bar height, so two means two bars on the same pixels and a height nobody owns.",
|
|
295
|
-
expectedUiState: "A Cart tab with a badge that tracks the cart. No Wishlist tab. Exactly one bottom bar.",
|
|
296
|
-
expectedData: { bottomNavCount: 1 },
|
|
297
|
-
endResult: "Restore the window width; empty the cart.",
|
|
298
|
-
},
|
|
299
|
-
"checklist-buying-cart-cart-mobile-no-overflow": {
|
|
300
|
-
roles: ["buyer"],
|
|
301
|
-
startPage: "/cart",
|
|
302
|
-
steps: [
|
|
303
|
-
"Sign in as rehan.sheikh@gmail.com / TempPass123! and add items from two different sellers.",
|
|
304
|
-
"Resize the browser to 390 pixels wide and open /cart.",
|
|
305
|
-
"Look at each item card's right edge against the seller card containing it.",
|
|
306
|
-
"Try to scroll the page sideways.",
|
|
307
|
-
"Resize to 320 pixels and look again.",
|
|
308
|
-
"Check every thumbnail, title and price stays inside its card.",
|
|
309
|
-
],
|
|
310
|
-
inputs: { widths: "390, 320" },
|
|
311
|
-
expectedBehaviour: "Item rows stay inside their seller card. A bare checkbox in a flex row is the classic cause here: its wrapper claims the full row width, its sibling shrinks toward zero, and a fixed-width thumbnail then overflows past a card that has no clipping — which is exactly what 'cart cards floating outside the screen' looks like.",
|
|
312
|
-
expectedUiState: "Nothing overflows its card at either width and the page does not scroll sideways. A thumbnail pushed past the card's edge is the failure.",
|
|
313
|
-
endResult: "Restore the window width; empty the cart.",
|
|
314
|
-
},
|
|
315
|
-
"checklist-buying-cart-cart-seller-group-contains-items": {
|
|
316
|
-
roles: ["buyer"],
|
|
317
|
-
startPage: "/cart",
|
|
318
|
-
steps: [
|
|
319
|
-
"Sign in as rehan.sheikh@gmail.com / TempPass123! and add items from two different sellers.",
|
|
320
|
-
"Resize the browser to 360 pixels wide and open /cart.",
|
|
321
|
-
"Look at each seller's rounded card and the rows inside it.",
|
|
322
|
-
"Check every row sits fully within its card's border with visible separation between rows.",
|
|
323
|
-
"Check the seller name and any per-seller fee lines are inside the same card.",
|
|
324
|
-
"Scroll the whole cart and check no row escapes its card.",
|
|
325
|
-
],
|
|
326
|
-
inputs: { viewportWidth: 360 },
|
|
327
|
-
expectedBehaviour: "Each seller's card visually contains its own rows, because the store is the unit the cart splits orders by — a row that appears outside its card misrepresents which seller it belongs to, and that is the key coupons, shipping, add-ons and payouts all hang off.",
|
|
328
|
-
expectedUiState: "At 360 pixels every row, the seller name and the per-seller fee lines sit inside the rounded card, with rows separated from one another. A row overflowing its card is the failure.",
|
|
329
|
-
endResult: "Restore the window width; empty the cart.",
|
|
330
|
-
},
|
|
331
|
-
"checklist-buying-cart-group-picker-opens": {
|
|
332
|
-
roles: ["guest"],
|
|
333
|
-
startPage: "/groups/group-beyblade-original-lineage",
|
|
334
|
-
steps: [
|
|
335
|
-
"Open /groups/group-beyblade-original-lineage in a private window with no session — the seeded grouped listing 'Original Series Lineage', whose members are product-beyblade-original-dranzer-s and product-beyblade-original-driger-v.",
|
|
336
|
-
"Read what the page names and what controls it offers.",
|
|
337
|
-
"Find the member picker.",
|
|
338
|
-
"Read what opens and whether every member is listed.",
|
|
339
|
-
"Check each member shows a thumbnail, a title, a unit price and a quantity control.",
|
|
340
|
-
],
|
|
341
|
-
expectedBehaviour: "A grouped listing offers a picker on its own page. A group is pick-as-you-wish — unlike a bundle, which is all-or-nothing — so the picker exists to let the buyer choose members and quantities before adding anything.",
|
|
342
|
-
expectedUiState: "The page names the group and its picker lists both members with thumbnail, title, unit price and a stepper. A member list with no way to pick quantities is the failure.",
|
|
343
|
-
endResult: "Close the picker without adding.",
|
|
344
|
-
},
|
|
345
|
-
"checklist-buying-cart-group-picker-running-total": {
|
|
346
|
-
roles: ["buyer"],
|
|
347
|
-
startPage: "/groups/group-beyblade-original-lineage",
|
|
348
|
-
steps: [
|
|
349
|
-
"Sign in as rehan.sheikh@gmail.com / TempPass123!.",
|
|
350
|
-
"Open /groups/group-beyblade-original-lineage and open the member picker.",
|
|
351
|
-
"Read the running total shown — Dranzer S is ₹1,499.00 and Driger V is ₹1,799.00.",
|
|
352
|
-
"Raise one member's quantity by one and read the total again.",
|
|
353
|
-
"Check it rose by exactly that member's unit price.",
|
|
354
|
-
"Lower another member to zero and read the total and the item count.",
|
|
355
|
-
"Check the count reflects the members still selected.",
|
|
356
|
-
],
|
|
357
|
-
expectedBehaviour: "The running total recomputes immediately from the selected members and their quantities. It is the figure the buyer decides on, and it must match what the cart line will cost — the line's price is derived from the members by the repository at every write, so no caller can set it independently.",
|
|
358
|
-
expectedUiState: "The total updates on every change, moving by exactly the affected member's unit price, and the item count follows the selection. A total that lags or that ignores quantity is the failure.",
|
|
359
|
-
endResult: "Close the picker without adding.",
|
|
360
|
-
},
|
|
361
|
-
"checklist-buying-cart-group-picker-stock-cap": {
|
|
362
|
-
roles: ["buyer"],
|
|
363
|
-
startPage: "/groups/group-beyblade-original-lineage",
|
|
364
|
-
steps: [
|
|
365
|
-
"Sign in as rehan.sheikh@gmail.com / TempPass123!.",
|
|
366
|
-
"Open /groups/group-beyblade-original-lineage and open the member picker.",
|
|
367
|
-
"Read the available stock on product-beyblade-original-driger-v, seeded at 2.",
|
|
368
|
-
"Raise its quantity repeatedly until the control stops.",
|
|
369
|
-
"Compare the quantity reached against the stated stock.",
|
|
370
|
-
"Check the control is disabled at the cap rather than silently ignoring presses.",
|
|
371
|
-
],
|
|
372
|
-
expectedBehaviour: "Each member's stepper stops at that member's own stock. The cap is per member rather than per line, because a group line's members are independent products with independent inventory.",
|
|
373
|
-
expectedUiState: "The quantity stops at 2 for Driger V and at 4 for Dranzer S, and the increase control becomes visibly disabled at that point. A control that accepts presses and does nothing is the failure — the buyer cannot tell it from an unresponsive page.",
|
|
374
|
-
endResult: "Close the picker without adding.",
|
|
375
|
-
},
|
|
376
|
-
"checklist-buying-cart-group-picker-blocked-member": {
|
|
377
|
-
roles: ["buyer"],
|
|
378
|
-
startPage: "/groups/group-beyblade-local-meetup-picks",
|
|
379
|
-
steps: [
|
|
380
|
-
"Sign in as rehan.sheikh@gmail.com / TempPass123!.",
|
|
381
|
-
"Open /groups/group-beyblade-local-meetup-picks \u2014 'Local Meetup Picks', whose three members are all classified listings and therefore cannot be added to a cart at all.",
|
|
382
|
-
"Find classified-beyblade-stadium-set among the members.",
|
|
383
|
-
"Read what is shown in place of its quantity stepper.",
|
|
384
|
-
"Check a reason is stated rather than the row being blank or absent.",
|
|
385
|
-
"Try to include it in the selection.",
|
|
386
|
-
"Read whether the running total counts it.",
|
|
387
|
-
],
|
|
388
|
-
inputs: { blockedMember: "classified-beyblade-stadium-set" },
|
|
389
|
-
expectedBehaviour: "A member that cannot be bought shows WHY in place of its stepper. A classified listing's cart capability is blocked outright \u2014 it is a contact-the-seller listing, not a purchasable one \u2014 so every member of this group is in that state. Hiding them entirely would misrepresent the group's contents, and showing an inert stepper would let the buyer build a selection that the server then refuses.",
|
|
390
|
-
expectedUiState: "Each blocked member is listed with a reason chip instead of a stepper, cannot be selected, and does not contribute to the running total. A blank cell where the stepper would be is the failure, and so is a working stepper on a classified listing.",
|
|
391
|
-
endResult: "Close the picker without adding.",
|
|
392
|
-
},
|
|
393
|
-
"checklist-buying-cart-group-picker-one-line": {
|
|
394
|
-
roles: ["buyer"],
|
|
395
|
-
startPage: "/groups/group-beyblade-original-lineage",
|
|
396
|
-
steps: [
|
|
397
|
-
"Sign in as rehan.sheikh@gmail.com / TempPass123!.",
|
|
398
|
-
"Open /groups/group-beyblade-original-lineage and select BOTH members — Dranzer S at quantity 1 and Driger V at quantity 2.",
|
|
399
|
-
"Note the running total.",
|
|
400
|
-
"Add the selection to the cart.",
|
|
401
|
-
"Open /cart and count the lines that appeared.",
|
|
402
|
-
"Read the line's price and compare it against the running total.",
|
|
403
|
-
],
|
|
404
|
-
expectedBehaviour: "A multi-member selection becomes ONE cart line carrying its members, not one line per product. The line's price is derived from the members by the repository at every write of that member list, so no caller can set it — which is why the cart's subtotals stayed correct with no changes of their own.",
|
|
405
|
-
expectedUiState: "Exactly one new line appears, priced at the picker's running total. Two separate lines is the failure.",
|
|
406
|
-
expectedData: { newCartLines: 1 },
|
|
407
|
-
endResult: "The cart holds one grouped line; later cases read it.",
|
|
408
|
-
},
|
|
409
|
-
"checklist-buying-cart-group-picker-single-member-plain-line": {
|
|
410
|
-
roles: ["buyer"],
|
|
411
|
-
startPage: "/groups/group-beyblade-original-lineage",
|
|
412
|
-
steps: [
|
|
413
|
-
"Sign in as rehan.sheikh@gmail.com / TempPass123! and empty the cart first.",
|
|
414
|
-
"Open /groups/group-beyblade-original-lineage and select exactly ONE member — product-beyblade-original-driger-v — at quantity 2.",
|
|
415
|
-
"Add the selection to the cart.",
|
|
416
|
-
"Open /cart and read the line.",
|
|
417
|
-
"Check it has an ordinary line-level quantity stepper.",
|
|
418
|
-
"Check it does not expand to a member list.",
|
|
419
|
-
],
|
|
420
|
-
expectedBehaviour: "A one-member selection becomes an ordinary product line, because one item at quantity N is already exactly what a normal line means. Wrapping it as a group line would give it the pinned quantity and per-member steppers for no benefit.",
|
|
421
|
-
expectedUiState: "The line looks like any other product line, with a working line-level stepper reading 2, and no member expansion.",
|
|
422
|
-
endResult: "Empty the cart afterwards.",
|
|
423
|
-
},
|
|
424
|
-
/*
|
|
425
|
-
* 🛑 THE CROSS-STORE GROUP HAS TO BE BUILT — there is no fixture to read.
|
|
426
|
-
*
|
|
427
|
-
* This case used to drive `product-tester-crossstore-a` / `-b`, two listings
|
|
428
|
-
* seeded in the banned shape on purpose so a buyer could open a group spanning
|
|
429
|
-
* two sellers and confirm the picker rendered read-only. They were
|
|
430
|
-
* tester-sandbox rows and went with the rest of them on 2026-09-14.
|
|
431
|
-
*
|
|
432
|
-
* The guard is NOT at save time for a grouped listing — that is the bundle
|
|
433
|
-
* rule. `POST /api/admin/grouped-listings` takes the group's own `storeId` and
|
|
434
|
-
* never checks that each member belongs to it, and the single-store refusal
|
|
435
|
-
* lives in the picker and in `addGroupLineToCart`. So the banned state is still
|
|
436
|
-
* reachable through a supported admin path, which is what keeps the BUYER-facing
|
|
437
|
-
* half of this guard testable at all: the case creates it, reads the refusal,
|
|
438
|
-
* and deletes it again.
|
|
439
|
-
*
|
|
440
|
-
* The one pairing the real catalogue allows is an Arena product plus a
|
|
441
|
-
* letitrip-official prize draw. Both could be refused for their own reasons, so
|
|
442
|
-
* the case turns on the refusal MESSAGE naming the seller conflict — a case
|
|
443
|
-
* that cannot tell its two failure modes apart would pass against the bug.
|
|
444
|
-
*/
|
|
445
|
-
"checklist-buying-cart-group-picker-cross-store": {
|
|
446
|
-
roles: ["admin", "buyer"],
|
|
447
|
-
startPage: "/admin/grouped-listings",
|
|
448
|
-
steps: [
|
|
449
|
-
"Sign in as admin@letitrip.in / TempPass123!.",
|
|
450
|
-
"Open /admin/grouped-listings and create a group titled 'QA Group cross-store' with exactly two members: product-beyblade-original-dranzer-s (store-beyblade-arena) and prizedraw-beyblade-mystery-box (store-letitrip-official).",
|
|
451
|
-
"Save it and note its slug.",
|
|
452
|
-
"Sign out and sign in as rehan.sheikh@gmail.com / TempPass123!.",
|
|
453
|
-
"Open that group's public page at /groups/<the slug you noted>.",
|
|
454
|
-
"Read whether quantity controls are offered.",
|
|
455
|
-
"Read whether an add control is offered.",
|
|
456
|
-
"Read what the picker says about why.",
|
|
457
|
-
"Using DevTools, POST the two member ids to /api/cart/group anyway and read the response.",
|
|
458
|
-
],
|
|
459
|
-
inputs: {
|
|
460
|
-
groupTitle: "QA Group cross-store",
|
|
461
|
-
memberStoreA: "product-beyblade-original-dranzer-s",
|
|
462
|
-
memberStoreB: "prizedraw-beyblade-mystery-box",
|
|
463
|
-
},
|
|
464
|
-
expectedBehaviour: "A cross-store group renders READ-ONLY, and the server refuses such a selection again. The store id is the order-splitting key and the key per-store shipping, coupons, add-ons and payouts hang off \u2014 a line spanning sellers would produce an order belonging to one seller containing another's products, with no notification, no shipping resolution and no payout for the second. The group has to be BUILT here: the guard means a valid cross-store group cannot exist in the seed, so there is no fixture to read.",
|
|
465
|
-
expectedUiState: "No quantity column and no add control, with a stated reason. The forced POST is refused server-side with an error naming the second store rather than accepted.",
|
|
466
|
-
expectedData: { addControlPresent: false },
|
|
467
|
-
endResult: "Nothing is added. Delete 'QA Group cross-store' afterwards \u2014 it exists in a shape the product forbids and must not be left in the catalogue.",
|
|
468
|
-
},
|
|
469
|
-
"checklist-buying-cart-group-picker-guest": {
|
|
470
|
-
roles: ["guest"],
|
|
471
|
-
startPage: "/groups/group-beyblade-original-lineage",
|
|
472
|
-
steps: [
|
|
473
|
-
"Open /groups/group-beyblade-original-lineage in a private window with no session.",
|
|
474
|
-
"Open the member picker.",
|
|
475
|
-
"Select both members and use the add control.",
|
|
476
|
-
"Read what happens.",
|
|
477
|
-
"Check a sign-in prompt appears rather than the selection being silently lost.",
|
|
478
|
-
"Sign in from that prompt and read whether the selection survived.",
|
|
479
|
-
],
|
|
480
|
-
expectedBehaviour: "A signed-out visitor is prompted to sign in. A guest cart is keyed by product and quantity only and is rebuilt from products on merge, so a grouped line could not survive that merge — which is why the picker asks for sign-in rather than accepting a selection it would then lose.",
|
|
481
|
-
expectedUiState: "A sign-in prompt opens. The selection is not silently discarded without explanation. Record whether it survives the sign-in.",
|
|
482
|
-
endResult: "Nothing is added as a guest.",
|
|
483
|
-
},
|
|
484
|
-
"checklist-buying-cart-group-line-expands-in-cart": {
|
|
485
|
-
roles: ["buyer"],
|
|
486
|
-
startPage: "/cart",
|
|
487
|
-
steps: [
|
|
488
|
-
"Sign in as rehan.sheikh@gmail.com / TempPass123! with a grouped line in the cart.",
|
|
489
|
-
"Open /cart and find the grouped line.",
|
|
490
|
-
"Expand it.",
|
|
491
|
-
"Read every member listed — thumbnail, title, unit price and quantity.",
|
|
492
|
-
"Add up the members and compare against the line total.",
|
|
493
|
-
"Collapse and re-expand it.",
|
|
494
|
-
],
|
|
495
|
-
expectedBehaviour: "The line expands to show what it contains. A grouped line that renders as one opaque row hides which products the buyer is actually buying, and the member list is read through a helper that falls back to the legacy id array so carts written before members existed behave identically.",
|
|
496
|
-
expectedUiState: "Every member is listed with its thumbnail, title, unit price and per-copy quantity, and they sum to the line total. A line that cannot be expanded is the failure.",
|
|
497
|
-
endResult: "The cart still holds the grouped line.",
|
|
498
|
-
},
|
|
499
|
-
"checklist-buying-cart-group-line-no-line-level-stepper": {
|
|
500
|
-
roles: ["buyer"],
|
|
501
|
-
startPage: "/cart",
|
|
502
|
-
steps: [
|
|
503
|
-
"Sign in as rehan.sheikh@gmail.com / TempPass123! with a grouped line in the cart.",
|
|
504
|
-
"Open /cart and look at the grouped line's header row.",
|
|
505
|
-
"Check there is no line-level quantity stepper on it.",
|
|
506
|
-
"Expand the line and check each MEMBER has its own stepper.",
|
|
507
|
-
"Using DevTools, attempt to submit a quantity change against the line itself.",
|
|
508
|
-
"RELOAD and read the line's quantity.",
|
|
509
|
-
],
|
|
510
|
-
expectedBehaviour: "A group line's quantity is pinned at 1 and only its members carry quantities. That pinning is what lets the shared price rule keep returning a UNIT price which every existing call site multiplies by the line quantity — so a line-level stepper would double-count. The repository refuses a quantity change on a group line, making the rule structural rather than a UI convention.",
|
|
511
|
-
expectedUiState: "No stepper on the line header, one per member when expanded. The forced quantity change is refused and the line is still quantity 1 after the reload.",
|
|
512
|
-
expectedData: { lineQuantity: 1 },
|
|
513
|
-
endResult: "The grouped line is unchanged.",
|
|
514
|
-
},
|
|
515
|
-
"checklist-buying-cart-group-line-member-edit-recalculates": {
|
|
516
|
-
roles: ["buyer"],
|
|
517
|
-
startPage: "/cart",
|
|
518
|
-
steps: [
|
|
519
|
-
"Sign in as rehan.sheikh@gmail.com / TempPass123! with a grouped line in the cart.",
|
|
520
|
-
"Open /cart, expand the grouped line, and note the line total, the seller subtotal and the summary total.",
|
|
521
|
-
"Raise one member's quantity by one.",
|
|
522
|
-
"Read all three figures again.",
|
|
523
|
-
"Check each rose by exactly that member's unit price.",
|
|
524
|
-
"RELOAD and confirm the change held.",
|
|
525
|
-
],
|
|
526
|
-
expectedBehaviour: "A member quantity change recomputes the line and everything above it. The whole member array is submitted rather than a delta — the cart is one document written with a whole-object set, so per-member requests would race on a double click and lose one of them.",
|
|
527
|
-
expectedUiState: "The line total, the seller subtotal and the summary total all rise by exactly the member's unit price, and the change survives the reload.",
|
|
528
|
-
endResult: "The grouped line carries the raised quantity.",
|
|
529
|
-
},
|
|
530
|
-
"checklist-buying-cart-group-line-remove-member": {
|
|
531
|
-
roles: ["buyer"],
|
|
532
|
-
startPage: "/cart",
|
|
533
|
-
steps: [
|
|
534
|
-
"Sign in as rehan.sheikh@gmail.com / TempPass123! with a grouped line holding two members.",
|
|
535
|
-
"Open /cart and expand the line.",
|
|
536
|
-
"Remove ONE member.",
|
|
537
|
-
"Read the remaining member and the line total.",
|
|
538
|
-
"Check the line is still present rather than having been removed entirely.",
|
|
539
|
-
"Remove the LAST member and read what happens to the line.",
|
|
540
|
-
"RELOAD and confirm.",
|
|
541
|
-
],
|
|
542
|
-
expectedBehaviour: "Removing one member leaves the line with the rest; removing the last removes the line, enforced in the repository rather than by the UI. A line with an empty member list would price at zero and be indistinguishable from a free item.",
|
|
543
|
-
expectedUiState: "After the first removal the line remains with one member and a reduced total. After the second the line is gone. Both hold after the reload.",
|
|
544
|
-
endResult: "The grouped line is removed.",
|
|
545
|
-
},
|
|
546
|
-
"checklist-buying-cart-group-line-link-target": {
|
|
547
|
-
roles: ["buyer"],
|
|
548
|
-
startPage: "/cart",
|
|
549
|
-
steps: [
|
|
550
|
-
"Sign in as rehan.sheikh@gmail.com / TempPass123!.",
|
|
551
|
-
"Add a grouped selection and a bundle to the cart.",
|
|
552
|
-
"Open /cart and click the grouped line's title.",
|
|
553
|
-
"Read where it lands.",
|
|
554
|
-
"Go back and click the bundle line's title.",
|
|
555
|
-
"Read where that lands.",
|
|
556
|
-
"Expand the grouped line and click a member's title, reading where it lands.",
|
|
557
|
-
],
|
|
558
|
-
expectedBehaviour: "Every title in the cart links somewhere real. A group, a bundle and a member are three different destinations — the group's own page, the bundle's page, and the member product — and a line that links to a route built from the wrong id 404s.",
|
|
559
|
-
expectedUiState: "All three links open real pages: the group page, the bundle page and the member's product page. Any 404 is the failure, named by which link produced it.",
|
|
560
|
-
expectedData: { notFoundCount: 0 },
|
|
561
|
-
endResult: "Empty the cart afterwards.",
|
|
562
|
-
},
|
|
563
|
-
"checklist-buying-cart-bundle-copies-stepper": {
|
|
564
|
-
roles: ["buyer"],
|
|
565
|
-
startPage: "/bundles/bundle-original-collectors-set",
|
|
566
|
-
steps: [
|
|
567
|
-
"Sign in as rehan.sheikh@gmail.com / TempPass123!.",
|
|
568
|
-
"Open /bundles/bundle-original-collectors-set and find the copies stepper.",
|
|
569
|
-
"Read the price shown at one copy.",
|
|
570
|
-
"Raise the copies to 2 and read the price.",
|
|
571
|
-
"Check both 'Buy now' and 'Add to cart' are present.",
|
|
572
|
-
"Use 'Add to cart' and read whether the browser stayed on the bundle page.",
|
|
573
|
-
"Open /cart and read the line.",
|
|
574
|
-
],
|
|
575
|
-
inputs: { bundleId: "bundle-original-collectors-set", copies: 2, bundlePrice: 2999, memberTotal: 4597 },
|
|
576
|
-
expectedBehaviour: "A bundle is all-or-nothing, so its stepper counts COPIES of the whole selection rather than members. Add to cart stays on the page — a buyer adding two copies may want a third — while Buy now proceeds to checkout.",
|
|
577
|
-
expectedUiState: "The price doubles to ₹5,998.00 at two copies. Both controls are present. Add to cart keeps the buyer on the bundle page and the cart gains one line at two copies.",
|
|
578
|
-
expectedData: { copies: 2, lineTotal: 5998 },
|
|
579
|
-
endResult: "The cart holds a bundle line at two copies.",
|
|
580
|
-
},
|
|
581
|
-
"checklist-buying-cart-bundle-line-in-cart": {
|
|
582
|
-
roles: ["buyer"],
|
|
583
|
-
startPage: "/cart",
|
|
584
|
-
steps: [
|
|
585
|
-
"Sign in as rehan.sheikh@gmail.com / TempPass123! with a bundle line in the cart.",
|
|
586
|
-
"Open /cart and expand the bundle line.",
|
|
587
|
-
"Read its members and check they are READ-ONLY — no per-member steppers.",
|
|
588
|
-
"Read the line-level copies stepper.",
|
|
589
|
-
"Raise the copies by one and read the line total.",
|
|
590
|
-
"Check it rose by the bundle price rather than by the members' summed price.",
|
|
591
|
-
"RELOAD and confirm.",
|
|
592
|
-
],
|
|
593
|
-
inputs: { bundleId: "bundle-original-collectors-set", bundlePrice: 2999, memberTotal: 4597 },
|
|
594
|
-
expectedBehaviour: "A bundle's members are fixed and its copies vary — the exact inverse of a group line. The price rule's bundle branch must be evaluated BEFORE its members branch: a bundle line carries members too, and summing them would charge the undiscounted total and throw away the discount that is the entire point of a bundle.",
|
|
595
|
-
expectedUiState: "The three members — Dranzer S, Driger V and Storm Pegasus — are listed without steppers, the copies stepper is on the line, and raising it adds ₹2,999.00 per copy rather than ₹4,597.00. A total rising by the members' sum is the branch-order failure.",
|
|
596
|
-
expectedData: { pricePerCopy: 2999 },
|
|
597
|
-
endResult: "Empty the cart afterwards.",
|
|
598
|
-
},
|
|
599
|
-
"checklist-buying-cart-bundle-cross-store-rejected": {
|
|
600
|
-
roles: ["seller"],
|
|
601
|
-
startPage: "/store/bundles",
|
|
602
|
-
steps: [
|
|
603
|
-
"Sign in as tyson@beybladearena.in / TempPass123!.",
|
|
604
|
-
"Open /store/bundles and start creating one.",
|
|
605
|
-
"Add a member from this store and one from a different store.",
|
|
606
|
-
"Save and read the message.",
|
|
607
|
-
"Check the message names the offending member or store.",
|
|
608
|
-
"Remove the foreign member and save again.",
|
|
609
|
-
"Repeat the attempt from the admin bundle editor.",
|
|
610
|
-
],
|
|
611
|
-
expectedBehaviour: "A cross-store bundle is refused at SAVE time in all four bundle write paths — admin and store, create and update. Save-time rather than add-to-cart-time is deliberate: bundles already in the database keep working and checkout is untouched, while the hole stops being reachable.",
|
|
612
|
-
expectedUiState: "The save is refused with a message naming which member or store is the problem, not a generic error. The same refusal appears from the admin editor.",
|
|
613
|
-
endResult: "No cross-store bundle is created.",
|
|
614
|
-
},
|
|
615
|
-
"checklist-buying-cart-grouped-listing-page-picker": {
|
|
616
|
-
roles: ["buyer"],
|
|
617
|
-
startPage: "/products/product-beyblade-original-dranzer-s",
|
|
618
|
-
steps: [
|
|
619
|
-
"Sign in as rehan.sheikh@gmail.com / TempPass123!.",
|
|
620
|
-
"Open /products/product-beyblade-original-dranzer-s and scroll to the themed grouped-listings carousel.",
|
|
621
|
-
"Follow the link for 'Original Series Lineage' to /groups/group-beyblade-original-lineage.",
|
|
622
|
-
"Read the page — its title, description and member list.",
|
|
623
|
-
"Find the picker on that page and open it.",
|
|
624
|
-
"Select both members and add them, then check the cart line matches the running total.",
|
|
625
|
-
],
|
|
626
|
-
expectedBehaviour: "A grouped listing has its own public page carrying the picker, so the group is reachable and shareable in its own right rather than only as a carousel on a member's page.",
|
|
627
|
-
expectedUiState: "The group page renders with both members and a working picker. Adding from it produces ONE grouped cart line priced at the running total, not one line per member.",
|
|
628
|
-
endResult: "Empty the cart afterwards.",
|
|
629
|
-
},
|
|
630
|
-
"checklist-buying-cart-group-lane-gate": {
|
|
631
|
-
roles: ["buyer"],
|
|
632
|
-
startPage: "/cart",
|
|
633
|
-
steps: [
|
|
634
|
-
"Sign in as rehan.sheikh@gmail.com / TempPass123!, whose cart holds an unpaid won auction.",
|
|
635
|
-
"Open /cart and confirm the Won Auctions tab holds a line.",
|
|
636
|
-
"Open a group's picker, select two members, and try to add them.",
|
|
637
|
-
"Read what happens and any message shown.",
|
|
638
|
-
"Try adding an ordinary product as well.",
|
|
639
|
-
"Try adding a bundle.",
|
|
640
|
-
"Read whether all four entry points behave the same way.",
|
|
641
|
-
],
|
|
642
|
-
expectedBehaviour: "While a higher-ranked lane is pending, nothing new may be added. That gate lived inline in ONE of the four ways a line is created, so bundle adds and the direct cart route bypassed it entirely and a buyer with an unpaid win could keep shopping. All four entry points now call it.",
|
|
643
|
-
expectedUiState: "Every add attempt — group, ordinary product, bundle and any other route — is refused with the same explanation naming the pending win. One route succeeding while the others refuse is the failure.",
|
|
644
|
-
expectedData: { addsPermitted: 0 },
|
|
645
|
-
endResult: "Nothing new is added.",
|
|
646
|
-
},
|
|
647
|
-
"checklist-buying-cart-group-checkout-order-rows": {
|
|
648
|
-
roles: ["buyer"],
|
|
649
|
-
startPage: "/cart",
|
|
650
|
-
steps: [
|
|
651
|
-
"Sign in as rehan.sheikh@gmail.com / TempPass123! with a grouped line of two members in the cart.",
|
|
652
|
-
"Complete checkout with Cash on Delivery.",
|
|
653
|
-
"Open the order and count the item rows.",
|
|
654
|
-
"Check there is one row per MEMBER.",
|
|
655
|
-
"Check all of them share a single group identifier and title.",
|
|
656
|
-
"Read the receipt view and check the members are collapsed back into one line.",
|
|
657
|
-
"Check each row carries its own tax code.",
|
|
658
|
-
],
|
|
659
|
-
expectedBehaviour: "A grouped line becomes N order rows sharing a group identifier — per-product tax codes are a GST invoice requirement and cancellation quantities are per product, so the members cannot be collapsed in storage. The receipt collapses them for display, and its fallback keeps older collapsed bundle orders rendering unchanged with no migration.",
|
|
660
|
-
expectedUiState: "The order holds one row per member, all sharing a group id and title, each with its own tax code. The receipt shows them as one line.",
|
|
661
|
-
expectedData: { orderRowsPerMember: 1 },
|
|
662
|
-
endResult: "One order exists from a grouped line.",
|
|
663
|
-
},
|
|
664
|
-
"checklist-buying-cart-group-checkout-stock": {
|
|
665
|
-
roles: ["buyer", "seller"],
|
|
666
|
-
startPage: "/cart",
|
|
667
|
-
steps: [
|
|
668
|
-
"Sign in as tyson@beybladearena.in / TempPass123! and note the stock of two group members.",
|
|
669
|
-
"Sign in as rehan.sheikh@gmail.com / TempPass123! and build a grouped line with member A at quantity 2 and member B at quantity 1.",
|
|
670
|
-
"If the line supports copies, set them to 2; otherwise note the line quantity is 1.",
|
|
671
|
-
"Complete checkout with Cash on Delivery.",
|
|
672
|
-
"Sign back in as the seller and read both members' stock.",
|
|
673
|
-
"Compare the decrement against per-copy quantity times copies.",
|
|
674
|
-
],
|
|
675
|
-
expectedBehaviour: "Each member decrements by its per-copy quantity multiplied by the number of copies. That is the quantity invariant applied to inventory — demand for a product is the line quantity times the member quantity, and dropping either factor under-decrements and oversells.",
|
|
676
|
-
expectedUiState: "Member A's stock falls by 2 per copy and member B's by 1 per copy. A decrement of one per member regardless of quantity is the failure.",
|
|
677
|
-
endResult: "One order exists; stock is decremented correctly.",
|
|
678
|
-
},
|
|
679
|
-
"checklist-buying-cart-checkout-lanes-auction-blocks-others": {
|
|
680
|
-
roles: ["buyer"],
|
|
681
|
-
startPage: "/cart",
|
|
682
|
-
steps: [
|
|
683
|
-
"Sign in as rehan.sheikh@gmail.com / TempPass123!, whose cart holds an unpaid won auction, an accepted offer and ordinary items.",
|
|
684
|
-
"Open /cart and read the three tabs.",
|
|
685
|
-
"Open the Cart tab and read its checkout button's state.",
|
|
686
|
-
"Open the Accepted Offers tab and read its checkout button's state.",
|
|
687
|
-
"Open the Won Auctions tab and read its checkout button's state.",
|
|
688
|
-
"Read the explanation shown on each disabled button.",
|
|
689
|
-
],
|
|
690
|
-
expectedBehaviour: "The lanes rank auction above offer above standard, and only the highest non-empty lane may be checked out. The lane is derived from each line rather than stored — a mirror field would drift the first time a write path forgot it.",
|
|
691
|
-
expectedUiState: "Won Auctions is payable; the Offers and Cart tabs both show disabled checkout with an explanation naming the pending win. A payable Cart tab while a win is unpaid is the failure.",
|
|
692
|
-
endResult: "Read-only; check out nothing.",
|
|
693
|
-
},
|
|
694
|
-
"checklist-buying-cart-checkout-lanes-offer-blocks-standard-only": {
|
|
695
|
-
roles: ["buyer"],
|
|
696
|
-
startPage: "/cart",
|
|
697
|
-
steps: [
|
|
698
|
-
"Sign in as vivaan.kapoor@gmail.com / TempPass123! with an accepted offer and ordinary items, and NO won auction.",
|
|
699
|
-
"Open /cart and read the tabs present.",
|
|
700
|
-
"Read the Accepted Offers tab's checkout button state.",
|
|
701
|
-
"Read the Cart tab's checkout button state and its explanation.",
|
|
702
|
-
"Check the Won Auctions tab is absent or empty.",
|
|
703
|
-
"Compare against the auction case's behaviour.",
|
|
704
|
-
],
|
|
705
|
-
expectedBehaviour: "With no auction pending the offer lane is the highest non-empty one, so it is payable and only the standard lane is blocked. The gate is relative to what is in the cart rather than a fixed hierarchy of disabled tabs.",
|
|
706
|
-
expectedUiState: "Accepted Offers is payable and the Cart tab is disabled with an explanation naming the pending offer. A disabled Offers tab here would mean the ranking is being applied absolutely rather than against the cart's contents.",
|
|
707
|
-
endResult: "Read-only; check out nothing.",
|
|
708
|
-
},
|
|
709
|
-
"checklist-buying-cart-auction-win-countdown-visible": {
|
|
710
|
-
roles: ["buyer"],
|
|
711
|
-
startPage: "/cart",
|
|
712
|
-
steps: [
|
|
713
|
-
"Sign in as rehan.sheikh@gmail.com / TempPass123! with a won auction in the cart.",
|
|
714
|
-
"Open /cart and switch to the Won Auctions tab.",
|
|
715
|
-
"Find the countdown beside the payment-required note.",
|
|
716
|
-
"Read the time remaining.",
|
|
717
|
-
"Wait ten seconds without touching anything and read it again.",
|
|
718
|
-
"RELOAD and check the countdown continues rather than restarting.",
|
|
719
|
-
],
|
|
720
|
-
expectedBehaviour: "The countdown runs against the win's stored checkout deadline, so a reload continues it. A countdown restarting on every visit would let the window appear to reset indefinitely — and the deadline is what the forfeiture sweep acts on.",
|
|
721
|
-
expectedUiState: "A countdown showing days, hours, minutes and seconds sits beside the payment-required note, its seconds figure lower after ten seconds, continuing from where it was after the reload.",
|
|
722
|
-
endResult: "Read-only; pay nothing.",
|
|
723
|
-
},
|
|
724
|
-
"checklist-buying-cart-auction-win-forfeits-after-deadline": {
|
|
725
|
-
roles: ["buyer"],
|
|
726
|
-
startPage: "/cart",
|
|
727
|
-
steps: [
|
|
728
|
-
"Sign in as rehan.sheikh@gmail.com / TempPass123! with a won auction whose deadline has passed.",
|
|
729
|
-
"Open /cart and read the Won Auctions tab.",
|
|
730
|
-
"Check the line is gone.",
|
|
731
|
-
"Open /user/bids and read that bid's status.",
|
|
732
|
-
"Open /user/notifications and read the forfeiture entry.",
|
|
733
|
-
"Check the Cart tab's checkout is now enabled again.",
|
|
734
|
-
],
|
|
735
|
-
expectedBehaviour: "An unpaid win past its deadline is forfeited, the locked line cleared and the buyer notified. Clearing the line is what unblocks the rest of the cart — a leftover locked line keeps the auction lane non-empty and that lane outranks the others, so the buyer's whole cart stays blocked indefinitely.",
|
|
736
|
-
expectedUiState: "The Won Auctions tab is empty, the bid reads forfeited, a notification exists, and the Cart tab is payable again.",
|
|
737
|
-
endResult: "Read-only. The deadline is set by settlement rather than seed data, so if no lapsed win exists answer null rather than waiting.",
|
|
738
|
-
},
|
|
739
|
-
"checklist-buying-cart-checkout-lanes-totals-scoped": {
|
|
740
|
-
roles: ["buyer"],
|
|
741
|
-
startPage: "/cart",
|
|
742
|
-
steps: [
|
|
743
|
-
"Sign in as rehan.sheikh@gmail.com / TempPass123! with items in all three lanes.",
|
|
744
|
-
"Open /cart on the Cart tab and read the summary total.",
|
|
745
|
-
"Add up the ordinary items yourself and compare.",
|
|
746
|
-
"Switch to the Accepted Offers tab and read its total.",
|
|
747
|
-
"Switch to the Won Auctions tab and read its total.",
|
|
748
|
-
"Check no tab's total includes another lane's items.",
|
|
749
|
-
"Check each total names which lane it covers.",
|
|
750
|
-
],
|
|
751
|
-
expectedBehaviour: "Each tab's total covers only its own lane. A blended total spanning lanes is a figure the buyer can never be charged — and because the cart prices whichever tab is OPEN, including a blocked one, each total has to name its lane or a buyer reads a number for a lane they cannot pay.",
|
|
752
|
-
expectedUiState: "Each tab's total matches its own items and is labelled with its lane. A total spanning lanes is the failure.",
|
|
753
|
-
endResult: "Read-only; check out nothing.",
|
|
754
|
-
},
|
|
755
|
-
"checklist-buying-cart-checkout-lanes-checkout-page-matches-tab": {
|
|
756
|
-
roles: ["buyer"],
|
|
757
|
-
startPage: "/cart",
|
|
758
|
-
steps: [
|
|
759
|
-
"Sign in as rehan.sheikh@gmail.com / TempPass123! with items in more than one lane.",
|
|
760
|
-
"Open /cart on the Won Auctions tab and note its items and total.",
|
|
761
|
-
"Click its checkout control.",
|
|
762
|
-
"Read the checkout page's items and total.",
|
|
763
|
-
"Check they match the tab rather than the whole cart.",
|
|
764
|
-
"Go back, switch to a blocked tab, and try its checkout control.",
|
|
765
|
-
"Read what happens.",
|
|
766
|
-
],
|
|
767
|
-
expectedBehaviour: "Checkout opens the lane it was entered from and shows only that lane's items. The lane in the URL is ADVISORY — it is validated and used to explain a mismatch, never fed to the pricing, because placement refuses anything but the active lane and a URL-supplied lane would otherwise render a payable-looking total for a lane the order will be refused on.",
|
|
768
|
-
expectedUiState: "Checkout from the Won Auctions tab shows only those items and that total. The blocked tab's control is disabled or refuses with an explanation rather than opening a checkout that will fail.",
|
|
769
|
-
endResult: "Leave checkout without ordering.",
|
|
770
|
-
},
|
|
771
|
-
"checklist-buying-cart-cart-mobile-bar-lane-scoped": {
|
|
772
|
-
roles: ["buyer"],
|
|
773
|
-
startPage: "/cart",
|
|
774
|
-
steps: [
|
|
775
|
-
"Sign in as rehan.sheikh@gmail.com / TempPass123! with items in more than one lane.",
|
|
776
|
-
"Open /cart at 1280 pixels and note each tab's desktop summary total.",
|
|
777
|
-
"Resize to 390 pixels and open /cart.",
|
|
778
|
-
"On each tab, read the bottom bar's total and the lane it names.",
|
|
779
|
-
"Compare each against the desktop figure for the same tab.",
|
|
780
|
-
"Check both name the same lane.",
|
|
781
|
-
],
|
|
782
|
-
inputs: { desktopWidth: 1280, mobileWidth: 390 },
|
|
783
|
-
expectedBehaviour: "The mobile bar and the desktop summary read the same lane-scoped figure. The mobile bar was left reading the cross-lane total after the desktop panel was converted — so on a phone a buyer could sit on the Offers tab and read a blended total spanning three lanes.",
|
|
784
|
-
expectedUiState: "On every tab the mobile total equals the desktop total and both name the same lane. A mobile figure larger than the desktop one is the cross-lane failure.",
|
|
785
|
-
endResult: "Restore the window width; check out nothing.",
|
|
786
|
-
},
|
|
787
|
-
"checklist-buying-cart-cart-mobile-bar-lane-gated": {
|
|
788
|
-
roles: ["buyer"],
|
|
789
|
-
startPage: "/cart",
|
|
790
|
-
steps: [
|
|
791
|
-
"Sign in as rehan.sheikh@gmail.com / TempPass123! with an unpaid won auction and ordinary items.",
|
|
792
|
-
"Resize to 390 pixels and open /cart.",
|
|
793
|
-
"Switch to the Cart tab, which is not currently payable.",
|
|
794
|
-
"Read the bottom bar's checkout button state.",
|
|
795
|
-
"Read any explanation shown on it.",
|
|
796
|
-
"Switch to the Won Auctions tab and read the button state there.",
|
|
797
|
-
],
|
|
798
|
-
inputs: { mobileWidth: 390 },
|
|
799
|
-
expectedBehaviour: "The mobile checkout button is gated by the same lane rule as the desktop one and states why. The mobile bar ignored the block entirely — so a phone user could tap into a checkout the desktop button correctly refused.",
|
|
800
|
-
expectedUiState: "On the Cart tab the button is disabled with an explanation naming the pending win. On the Won Auctions tab it is enabled. An enabled button on a blocked tab is the failure.",
|
|
801
|
-
endResult: "Restore the window width; check out nothing.",
|
|
802
|
-
},
|
|
803
|
-
"checklist-buying-cart-cart-mobile-checkout-carries-lane": {
|
|
804
|
-
roles: ["buyer"],
|
|
805
|
-
startPage: "/cart",
|
|
806
|
-
steps: [
|
|
807
|
-
"Sign in as rehan.sheikh@gmail.com / TempPass123! with a payable non-standard lane.",
|
|
808
|
-
"Resize to 390 pixels and open /cart.",
|
|
809
|
-
"Switch to the Won Auctions or Accepted Offers tab.",
|
|
810
|
-
"Tap the bottom bar's Checkout button.",
|
|
811
|
-
"Read the URL and the checkout page's items.",
|
|
812
|
-
"Check they match the lane the tap came from.",
|
|
813
|
-
],
|
|
814
|
-
inputs: { mobileWidth: 390 },
|
|
815
|
-
expectedBehaviour: "The mobile control carries its lane through to checkout. It pushed a lane-less checkout URL, so a tap from the Won Auctions tab landed on the standard lane's checkout — showing the wrong items after the buyer had chosen a tab.",
|
|
816
|
-
expectedUiState: "The checkout page shows the same items as the tab the tap came from, and the URL names that lane.",
|
|
817
|
-
endResult: "Restore the window width; leave checkout without ordering.",
|
|
818
|
-
},
|
|
819
|
-
"checklist-buying-cart-cart-select-all-lane-scoped": {
|
|
820
|
-
roles: ["buyer"],
|
|
821
|
-
startPage: "/cart",
|
|
822
|
-
steps: [
|
|
823
|
-
"Sign in as rehan.sheikh@gmail.com / TempPass123! with items in more than one lane.",
|
|
824
|
-
"Open /cart on the Cart tab and read the 'Select all' control's count.",
|
|
825
|
-
"Compare it against the number of items on that tab only.",
|
|
826
|
-
"Switch to another tab and read the count there.",
|
|
827
|
-
"Use 'Select all' on the Cart tab, then use 'Remove all'.",
|
|
828
|
-
"Check the won-auction line was not removed.",
|
|
829
|
-
],
|
|
830
|
-
expectedBehaviour: "Select-all counts and acts on the current tab only, and remove-all never touches a locked line. Both counted every lane after the desktop summary was scoped — so 'Select all (N)' reported a number the visible tab could not account for, and remove-all deleted lines the lane model defines as non-removable.",
|
|
831
|
-
expectedUiState: "The count matches the current tab's items on every tab. Remove-all clears only that tab's removable lines and leaves the won auction.",
|
|
832
|
-
expectedData: { wonAuctionLinesRemaining: 1 },
|
|
833
|
-
endResult: "The won-auction line is intact.",
|
|
834
|
-
},
|
|
835
|
-
"checklist-buying-cart-cart-breakdown-expand-mobile": {
|
|
836
|
-
roles: ["buyer"],
|
|
837
|
-
startPage: "/cart",
|
|
838
|
-
steps: [
|
|
839
|
-
"Sign in as rehan.sheikh@gmail.com / TempPass123! with items from two sellers.",
|
|
840
|
-
"Resize to 390 pixels and open /cart.",
|
|
841
|
-
"Find the total row in the bottom bar and its up-arrow control.",
|
|
842
|
-
"Tap it and read what opens and where it sits relative to the bar.",
|
|
843
|
-
"Read every fee line in the panel.",
|
|
844
|
-
"Tap again to close it and check the bar returns to its normal height.",
|
|
845
|
-
],
|
|
846
|
-
inputs: { mobileWidth: 390 },
|
|
847
|
-
expectedBehaviour: "The breakdown opens ABOVE the bar rather than pushing the page. The panel and the bar are both children of the measured bottom tier, so opening it grows the tier and everything above reflows — a panel that collapses by transform instead would leave its height behind when closed.",
|
|
848
|
-
expectedUiState: "The arrow opens a panel above the bar showing the fee lines, and closing it returns the tier to its original height with no leftover gap.",
|
|
849
|
-
endResult: "Restore the window width.",
|
|
850
|
-
},
|
|
851
|
-
"checklist-buying-cart-cart-breakdown-expand-desktop": {
|
|
852
|
-
roles: ["buyer"],
|
|
853
|
-
startPage: "/cart",
|
|
854
|
-
steps: [
|
|
855
|
-
"Sign in as rehan.sheikh@gmail.com / TempPass123! with items from two sellers.",
|
|
856
|
-
"Open /cart at 1280 pixels and find 'Show details' in the Summary panel.",
|
|
857
|
-
"Click it and read the breakdown that expands.",
|
|
858
|
-
"Write down every fee line and amount.",
|
|
859
|
-
"Resize to 390 pixels, open the mobile breakdown, and write down the same.",
|
|
860
|
-
"Compare the two lists line by line.",
|
|
861
|
-
],
|
|
862
|
-
inputs: { desktopWidth: 1280, mobileWidth: 390 },
|
|
863
|
-
expectedBehaviour: "Both surfaces render one shared breakdown component, so their lines and amounts are identical by construction. Two copies would drift the first time a fee changed, and the buyer would see different figures depending on their device.",
|
|
864
|
-
expectedUiState: "The desktop breakdown expands below the subtotal with the same lines and amounts as the mobile panel. Any difference is the finding.",
|
|
865
|
-
endResult: "Restore the window width.",
|
|
866
|
-
},
|
|
867
|
-
"checklist-buying-cart-cart-breakdown-aggregate-only": {
|
|
868
|
-
roles: ["buyer"],
|
|
869
|
-
startPage: "/cart",
|
|
870
|
-
steps: [
|
|
871
|
-
"Sign in as rehan.sheikh@gmail.com / TempPass123! with items from two sellers, ticking an add-on on each.",
|
|
872
|
-
"Open /cart and expand the breakdown.",
|
|
873
|
-
"Read every line and count how many lines each fee type produces.",
|
|
874
|
-
"Check each fee type appears ONCE with a qualifier naming the number of stores.",
|
|
875
|
-
"Scroll to each seller card and read its own fee lines.",
|
|
876
|
-
"Check the per-store detail lives on the cards rather than in the panel.",
|
|
877
|
-
],
|
|
878
|
-
expectedBehaviour: "The breakdown is aggregate only — one line per fee type with a store-count qualifier — while per-store detail lives on each seller card. Repeating the per-store rows in the panel would make it a second, competing place to read the same numbers.",
|
|
879
|
-
expectedUiState: "Each fee type appears once in the panel, qualified by store count. The seller cards carry their own fee lines. Duplicated per-store rows in the panel is the failure.",
|
|
880
|
-
endResult: "Empty the cart afterwards.",
|
|
881
|
-
},
|
|
882
|
-
"checklist-buying-cart-cart-breakdown-checked-items-only": {
|
|
883
|
-
roles: ["buyer"],
|
|
884
|
-
startPage: "/cart",
|
|
885
|
-
steps: [
|
|
886
|
-
"Sign in as rehan.sheikh@gmail.com / TempPass123! with several items selected.",
|
|
887
|
-
"Open /cart and expand the breakdown, noting the item count and every fee line.",
|
|
888
|
-
"Deselect one item and read the breakdown again.",
|
|
889
|
-
"Check the item count fell and the affected fee lines changed.",
|
|
890
|
-
"Deselect ALL items and read the breakdown and the checkout control.",
|
|
891
|
-
"Reselect one and check the figures return.",
|
|
892
|
-
],
|
|
893
|
-
expectedBehaviour: "The breakdown covers the selected items only, since those are what will be charged. With nothing selected there is nothing to price — and a fully-zeroed but truthy preview reads as a confident total of zero, so the state has to be distinguished rather than rendered as a number.",
|
|
894
|
-
expectedUiState: "Deselecting lowers the count and the affected lines. With nothing selected the breakdown reports that nothing is selected rather than showing ₹0.00, and checkout is unavailable.",
|
|
895
|
-
endResult: "Reselect the items; empty the cart afterwards.",
|
|
896
|
-
},
|
|
897
|
-
"checklist-buying-cart-cart-breakdown-no-coupon-on-locked-lanes": {
|
|
898
|
-
roles: ["buyer"],
|
|
899
|
-
startPage: "/cart",
|
|
900
|
-
steps: [
|
|
901
|
-
"Sign in as rehan.sheikh@gmail.com / TempPass123! with items in the auction and offer lanes.",
|
|
902
|
-
"Open /cart on the Cart tab and expand the breakdown, noting whether a coupon line can appear.",
|
|
903
|
-
"Switch to the Won Auctions tab and expand the breakdown.",
|
|
904
|
-
"Read whether any coupon-discount line is present.",
|
|
905
|
-
"Switch to the Accepted Offers tab and read the same.",
|
|
906
|
-
"Check each locked lane explains why coupons do not apply.",
|
|
907
|
-
],
|
|
908
|
-
expectedBehaviour: "The locked lanes show no coupon line because the price was already agreed — by a winning bid or an accepted offer. Rendering a coupon row that can only ever read zero invites the buyer to hunt for a code that cannot work.",
|
|
909
|
-
expectedUiState: "Neither locked lane's breakdown carries a coupon line, and each states why. A zero-value coupon row is the failure.",
|
|
910
|
-
endResult: "Read-only; check out nothing.",
|
|
911
|
-
},
|
|
912
|
-
"checklist-buying-cart-cart-guest-breakdown-fallback": {
|
|
913
|
-
roles: ["guest"],
|
|
914
|
-
startPage: "/cart",
|
|
915
|
-
steps: [
|
|
916
|
-
"Open /products in a private window with no session and add two items from different sellers.",
|
|
917
|
-
"Open /cart and read the summary area.",
|
|
918
|
-
"Check subtotals are shown per seller.",
|
|
919
|
-
"Read what is shown in place of shipping and fee lines.",
|
|
920
|
-
"Check a sign-in note explains why they are absent.",
|
|
921
|
-
"Check no confident total including fees is presented.",
|
|
922
|
-
],
|
|
923
|
-
expectedBehaviour: "Shipping and fees depend on a delivery address, which a guest has not given, so they are omitted with an explanation rather than guessed. Presenting a total that omits fees without saying so understates what the buyer will pay.",
|
|
924
|
-
expectedUiState: "Per-seller subtotals appear with a note in the shape of 'Sign in to see shipping & fees'. No fee lines and no final total presented as complete.",
|
|
925
|
-
endResult: "Read-only; nothing persists.",
|
|
926
|
-
},
|
|
927
|
-
"checklist-buying-cart-cart-store-card-fee-lines": {
|
|
928
|
-
roles: ["buyer"],
|
|
929
|
-
startPage: "/cart",
|
|
930
|
-
steps: [
|
|
931
|
-
"Sign in as rehan.sheikh@gmail.com / TempPass123! with items from two sellers.",
|
|
932
|
-
"Open /cart and read each seller card's fee lines below its items.",
|
|
933
|
-
"Note each seller's shipping and any add-on fees.",
|
|
934
|
-
"Add the per-seller fee lines together.",
|
|
935
|
-
"Expand the aggregate breakdown and compare each fee type's total against your sum.",
|
|
936
|
-
"Check the two reconcile exactly.",
|
|
937
|
-
],
|
|
938
|
-
expectedBehaviour: "Per-seller fee lines and the aggregate breakdown are two views of one computation, so they reconcile to the paisa. Where they are computed separately the buyer is shown two different answers to the same question and has no way to tell which they will be charged.",
|
|
939
|
-
expectedUiState: "Each card shows its own shipping and add-on fees, and their sum equals the corresponding aggregate line. Any gap is a finding rather than a rounding artefact.",
|
|
940
|
-
expectedData: { feesReconcile: true },
|
|
941
|
-
endResult: "Empty the cart afterwards.",
|
|
942
|
-
},
|
|
943
|
-
"checklist-buying-cart-cart-addons-per-store": {
|
|
944
|
-
roles: ["buyer"],
|
|
945
|
-
startPage: "/cart",
|
|
946
|
-
steps: [
|
|
947
|
-
"Sign in as rehan.sheikh@gmail.com / TempPass123! with items from TWO sellers.",
|
|
948
|
-
/*
|
|
949
|
-
* 'WhatsApp updates' — the label StoreAddonsPicker actually renders,
|
|
950
|
-
* under an 'Add-ons' heading on each seller's card. This said 'WhatsApp
|
|
951
|
-
* order updates', which appears nowhere; CartPriceBreakdown's matching
|
|
952
|
-
* FEE LINE reads 'WhatsApp updates' too, so neither surface uses the
|
|
953
|
-
* longer form.
|
|
954
|
-
*/
|
|
955
|
-
"Open /cart and tick 'WhatsApp updates' under 'Add-ons' on ONE seller's card only.",
|
|
956
|
-
"Read that seller's fee lines and the aggregate breakdown.",
|
|
957
|
-
"Check the fee is charged once at ₹10.00, not ₹20.00.",
|
|
958
|
-
"Check the other seller's card shows no such fee.",
|
|
959
|
-
"Tick it on the second seller too and check the aggregate reads ₹20.00.",
|
|
960
|
-
],
|
|
961
|
-
inputs: { whatsappFee: 10 },
|
|
962
|
-
expectedBehaviour: "Add-ons are per store, keyed on the same id the cart splits orders by. A cart-wide flag accumulated inside the per-group loop bills it once per seller — one tick, ₹10 times the number of stores — while a sibling payment path applied it once for the whole cart, so the gateway collected less than the orders recorded as owed.",
|
|
963
|
-
expectedUiState: "One tick charges ₹10.00 on that seller only. Two ticks charge ₹20.00 total. One tick charging ₹20.00 on a two-seller cart is the loop failure.",
|
|
964
|
-
expectedData: { whatsappFeeOneStore: 10 },
|
|
965
|
-
endResult: "Untick both; empty the cart.",
|
|
966
|
-
},
|
|
967
|
-
"checklist-buying-cart-cart-addons-deselected-store-excluded": {
|
|
968
|
-
roles: ["buyer"],
|
|
969
|
-
startPage: "/cart",
|
|
970
|
-
steps: [
|
|
971
|
-
"Sign in as rehan.sheikh@gmail.com / TempPass123! with items from two sellers.",
|
|
972
|
-
"Tick an add-on on the first seller's card.",
|
|
973
|
-
"Deselect ALL of that seller's items.",
|
|
974
|
-
"Read that seller's add-on checkboxes and any explanation.",
|
|
975
|
-
"Read the aggregate breakdown and check the fee is gone.",
|
|
976
|
-
"Reselect one of that seller's items and check the checkboxes are usable again.",
|
|
977
|
-
],
|
|
978
|
-
expectedBehaviour: "A store with nothing selected forms no order group, so its add-ons are structurally unreachable rather than needing a flag to suppress them. The controls are disabled with an explanation rather than silently ignored, so the buyer is not left ticking something that will never be charged.",
|
|
979
|
-
expectedUiState: "The deselected seller's add-on checkboxes are disabled with a stated reason and its fee leaves the breakdown. Reselecting restores both.",
|
|
980
|
-
endResult: "Empty the cart afterwards.",
|
|
981
|
-
},
|
|
982
|
-
"checklist-buying-cart-cart-addons-persist-to-checkout": {
|
|
983
|
-
roles: ["buyer"],
|
|
984
|
-
startPage: "/cart",
|
|
985
|
-
steps: [
|
|
986
|
-
"Sign in as rehan.sheikh@gmail.com / TempPass123! with items from two sellers.",
|
|
987
|
-
"Tick gift wrap on the first seller and WhatsApp updates on the second.",
|
|
988
|
-
"Note which add-on belongs to which seller.",
|
|
989
|
-
"Proceed to checkout and open the add-ons step.",
|
|
990
|
-
"Read each seller's add-ons there.",
|
|
991
|
-
"Check each is ticked against the SAME seller as in the cart.",
|
|
992
|
-
"Read the fee lines and check they match the cart's.",
|
|
993
|
-
],
|
|
994
|
-
expectedBehaviour: "Selections live on the cart document keyed by store, so checkout reads them rather than being told. The old request-body flags were deleted rather than kept alongside — two sources of truth for one charge is the drift itself.",
|
|
995
|
-
expectedUiState: "Checkout shows gift wrap against the first seller and WhatsApp updates against the second, with the same fees as the cart. Add-ons attached to the wrong seller is the failure.",
|
|
996
|
-
endResult: "Untick both; leave checkout without ordering.",
|
|
997
|
-
},
|
|
998
|
-
"checklist-buying-cart-cart-addons-editable-at-checkout": {
|
|
999
|
-
roles: ["buyer"],
|
|
1000
|
-
startPage: "/products/product-beyblade-burst-valkyrie",
|
|
1001
|
-
steps: [
|
|
1002
|
-
"Sign in as rehan.sheikh@gmail.com / TempPass123!.",
|
|
1003
|
-
"Use 'Buy now' on a product so checkout is reached without visiting the cart.",
|
|
1004
|
-
"Open the add-ons step and read the controls offered.",
|
|
1005
|
-
"Tick an add-on and read the fee appear.",
|
|
1006
|
-
"Untick it and read the fee disappear.",
|
|
1007
|
-
"Check the seller list comes from the cart rather than only appearing after the pricing request completes.",
|
|
1008
|
-
],
|
|
1009
|
-
expectedBehaviour: "Add-ons are editable at checkout because Buy now skips the cart entirely — a buyer who never saw the cart page must still be able to choose them. The step's seller list is derived from the CART rather than from the pricing response, so the controls exist before that request returns and do not vanish if it fails.",
|
|
1010
|
-
expectedUiState: "The add-ons step renders its per-seller controls immediately, and ticking or unticking changes the fee. Controls that appear only after the pricing request lands, or vanish when it fails, are the failure.",
|
|
1011
|
-
endResult: "Leave checkout without ordering.",
|
|
1012
|
-
},
|
|
1013
|
-
"checklist-buying-cart-cart-addons-hidden-when-disabled": {
|
|
1014
|
-
roles: ["admin", "buyer"],
|
|
1015
|
-
startPage: "/admin/site",
|
|
1016
|
-
steps: [
|
|
1017
|
-
"Sign in as admin@letitrip.in / TempPass123! and open Site Settings → Fees.",
|
|
1018
|
-
"Note which add-ons are enabled, then disable gift wrap and save.",
|
|
1019
|
-
"Sign in as rehan.sheikh@gmail.com / TempPass123! and open /cart with items from two sellers.",
|
|
1020
|
-
"Read each seller card's add-on checkboxes.",
|
|
1021
|
-
"Check no gift-wrap checkbox appears on any card.",
|
|
1022
|
-
"Go to checkout and check it is absent there too.",
|
|
1023
|
-
"Re-enable it in Site Settings and confirm it returns.",
|
|
1024
|
-
],
|
|
1025
|
-
expectedBehaviour: "A disabled add-on does not render. The three add-on flags default to enabled, but an undefined value still means disabled everywhere — so a client-side fallback that treats undefined as enabled would give the buyer a checkbox that bills nothing.",
|
|
1026
|
-
expectedUiState: "With gift wrap disabled its checkbox is absent from every seller card and from checkout. Re-enabling restores it. A checkbox present that charges ₹0.00 is the failure.",
|
|
1027
|
-
endResult: "The add-on is re-enabled.",
|
|
1028
|
-
},
|
|
1029
|
-
"checklist-buying-cart-cart-addons-order-record": {
|
|
1030
|
-
roles: ["buyer"],
|
|
1031
|
-
startPage: "/cart",
|
|
1032
|
-
steps: [
|
|
1033
|
-
"Sign in as rehan.sheikh@gmail.com / TempPass123! with items from two sellers.",
|
|
1034
|
-
"Tick gift wrap on the FIRST seller only and note the fee.",
|
|
1035
|
-
"Complete checkout with Cash on Delivery.",
|
|
1036
|
-
"Open /user/orders and open BOTH resulting orders.",
|
|
1037
|
-
"Read each order's fee lines.",
|
|
1038
|
-
"Check only the first seller's order carries the gift-wrap fee.",
|
|
1039
|
-
"Check the second order carries none.",
|
|
1040
|
-
],
|
|
1041
|
-
expectedBehaviour: "The add-on is recorded on the order of the seller it was ticked for. The cart splits into one order per store, so the fee has to land on the right one — a fee on both orders is the per-group accumulation bug persisted into the record, where it is no longer recoverable.",
|
|
1042
|
-
expectedUiState: "The first seller's order shows the gift-wrap fee and the second shows none. The fee on both orders is the failure.",
|
|
1043
|
-
expectedData: { ordersWithAddon: 1 },
|
|
1044
|
-
endResult: "Two orders exist, one carrying the add-on.",
|
|
1045
|
-
},
|
|
1046
|
-
"checklist-buying-cart-order-addon-icons-visible": {
|
|
1047
|
-
roles: ["buyer"],
|
|
1048
|
-
startPage: "/user/orders",
|
|
1049
|
-
steps: [
|
|
1050
|
-
"Sign in as rehan.sheikh@gmail.com / TempPass123!.",
|
|
1051
|
-
"Open /user/orders and open an order that included add-ons.",
|
|
1052
|
-
"Look for icon chips naming each add-on taken.",
|
|
1053
|
-
"Read each chip's label and check it names the add-on.",
|
|
1054
|
-
"Check the chips are readable against their background.",
|
|
1055
|
-
"Switch to dark mode and read them again.",
|
|
1056
|
-
],
|
|
1057
|
-
expectedBehaviour: "Add-ons taken on an order are shown as labelled chips, so the buyer can see what they paid for without reading the fee lines. A chip is an inline element, so it takes a status tint with matching ink — both halves invert together, and a fixed white ink would be invisible in exactly one theme.",
|
|
1058
|
-
expectedUiState: "One chip per add-on taken, each labelled and readable in both themes. An icon with no label, or a chip whose text is invisible in one theme, are both findings.",
|
|
1059
|
-
endResult: "Read-only; return the site to light mode.",
|
|
1060
|
-
},
|
|
1061
|
-
"checklist-buying-cart-order-gift-message-visible-to-seller": {
|
|
1062
|
-
roles: ["buyer", "seller"],
|
|
1063
|
-
startPage: "/cart",
|
|
1064
|
-
steps: [
|
|
1065
|
-
"Sign in as rehan.sheikh@gmail.com / TempPass123! and add an item from Beyblade Arena.",
|
|
1066
|
-
"Tick gift wrap and type 'QA Gift message — happy birthday from the tester checklist.' as the message.",
|
|
1067
|
-
"Complete checkout with Cash on Delivery.",
|
|
1068
|
-
"Open the order and check the message is shown to the buyer.",
|
|
1069
|
-
"Sign out and sign in as tyson@beybladearena.in / TempPass123!.",
|
|
1070
|
-
"Open that order in /store/orders and read the gift message.",
|
|
1071
|
-
"Check the FULL text is shown rather than a truncation.",
|
|
1072
|
-
],
|
|
1073
|
-
inputs: { giftMessage: "QA Gift message — happy birthday from the tester checklist." },
|
|
1074
|
-
expectedBehaviour: "The seller sees the complete gift message, because they are the one who has to write it on the parcel. A truncated message produces a card with half a sentence on it, and the buyer has no way to know it was cut.",
|
|
1075
|
-
expectedUiState: "Both the buyer's and the seller's views show the message in full, word for word. A truncation or an ellipsis on the seller's view is the failure.",
|
|
1076
|
-
endResult: "One order exists carrying a gift message.",
|
|
1077
|
-
},
|
|
1078
|
-
"checklist-buying-cart-order-addons-queryable": {
|
|
1079
|
-
roles: ["admin"],
|
|
1080
|
-
startPage: "/admin/orders",
|
|
1081
|
-
steps: [
|
|
1082
|
-
"Sign in as admin@letitrip.in / TempPass123!.",
|
|
1083
|
-
"Open /admin/orders and look for a filter on add-ons.",
|
|
1084
|
-
"Filter to orders that took gift wrap and read the rows.",
|
|
1085
|
-
"Open one and confirm it carries that add-on.",
|
|
1086
|
-
"Filter to a different add-on and read those rows.",
|
|
1087
|
-
"Check the two result sets differ.",
|
|
1088
|
-
"Clear the filter and confirm the full list returns.",
|
|
1089
|
-
],
|
|
1090
|
-
expectedBehaviour: "Add-ons taken are stored on the order in a form the list can filter on, so an admin can find every gift-wrap order — which is an operational need at packing time rather than a reporting nicety.",
|
|
1091
|
-
expectedUiState: "Each add-on filter returns orders that carry it and the two sets differ. A filter returning everything, or nothing while such orders demonstrably exist, are both findings.",
|
|
1092
|
-
endResult: "Read-only; nothing persists beyond the URL.",
|
|
1093
|
-
},
|
|
1094
|
-
"checklist-buying-cart-order-coupon-shown-all-lanes": {
|
|
1095
|
-
roles: ["buyer"],
|
|
1096
|
-
startPage: "/user/orders",
|
|
1097
|
-
steps: [
|
|
1098
|
-
"Sign in as rehan.sheikh@gmail.com / TempPass123!.",
|
|
1099
|
-
"Open /user/orders and open a STANDARD order that had a coupon applied.",
|
|
1100
|
-
"Read the discount lines shown.",
|
|
1101
|
-
"Open an order that came from a won auction and read its discount area.",
|
|
1102
|
-
"Open one that came from an accepted offer and read the same.",
|
|
1103
|
-
"Check each lane's order shows whatever coupon it actually carried.",
|
|
1104
|
-
"Check an order with no coupon shows no empty discount row.",
|
|
1105
|
-
],
|
|
1106
|
-
expectedBehaviour: "An order renders its own discount record whichever lane produced it. That record is the authoritative list — the two single-coupon scalar fields survive only for older orders, and rendering from those instead shows the first coupon and silently drops the rest.",
|
|
1107
|
-
expectedUiState: "Each order shows the coupons it carried, one line each, in every lane. An order with none shows no empty row. A multi-coupon order showing only one is the scalar-field failure.",
|
|
1108
|
-
endResult: "Read-only; nothing persists.",
|
|
1109
|
-
},
|
|
1110
|
-
"checklist-buying-cart-platform-fee-capped": {
|
|
1111
|
-
roles: ["buyer"],
|
|
1112
|
-
startPage: "/cart",
|
|
1113
|
-
steps: [
|
|
1114
|
-
"Sign in as admin@letitrip.in / TempPass123! and read the configured platform fee percentage and maximum.",
|
|
1115
|
-
"Sign in as rehan.sheikh@gmail.com / TempPass123! and add a low-value item.",
|
|
1116
|
-
"Open /cart, expand the breakdown, and read the platform fee.",
|
|
1117
|
-
"Add high-value items until the uncapped percentage would exceed the maximum.",
|
|
1118
|
-
"Read the platform fee again.",
|
|
1119
|
-
"Check it stopped at the configured maximum rather than continuing to scale.",
|
|
1120
|
-
],
|
|
1121
|
-
expectedBehaviour: "The buyer's platform fee is capped before tax is applied to it, since tax is levied on the commission actually charged. The seller-side deduction is deliberately UNCAPPED — that is a separate commercial decision, and making the two match would be the wrong fix for the asymmetry.",
|
|
1122
|
-
expectedUiState: "The fee rises with the cart until the maximum and then stops. A fee that keeps scaling is the failure.",
|
|
1123
|
-
endResult: "Empty the cart afterwards.",
|
|
1124
|
-
},
|
|
1125
|
-
"checklist-buying-cart-platform-fee-all-methods": {
|
|
1126
|
-
roles: ["buyer"],
|
|
1127
|
-
startPage: "/cart",
|
|
1128
|
-
steps: [
|
|
1129
|
-
"Sign in as rehan.sheikh@gmail.com / TempPass123! and add an item.",
|
|
1130
|
-
"Go to checkout and select Cash on Delivery, then read the platform fee.",
|
|
1131
|
-
"Select UPI or cash manual payment and read the fee.",
|
|
1132
|
-
"Select the online gateway if enabled and read the fee.",
|
|
1133
|
-
"Compare all three figures.",
|
|
1134
|
-
"Check the fee is present on every method.",
|
|
1135
|
-
],
|
|
1136
|
-
expectedBehaviour: "The platform fee is charged on every payment method. It was gateway-only for a long time, so cash and COD buyers never paid it — which is a revenue gap rather than a display bug, and invisible unless the methods are compared.",
|
|
1137
|
-
expectedUiState: "The same platform fee appears under all three methods. A method showing no fee is the failure, named by method.",
|
|
1138
|
-
endResult: "Leave checkout without ordering.",
|
|
1139
|
-
},
|
|
1140
|
-
"checklist-buying-cart-platform-fee-charged-once": {
|
|
1141
|
-
roles: ["buyer"],
|
|
1142
|
-
startPage: "/cart",
|
|
1143
|
-
steps: [
|
|
1144
|
-
"Sign in as rehan.sheikh@gmail.com / TempPass123! and add items from THREE different sellers.",
|
|
1145
|
-
"Open /cart and expand the breakdown.",
|
|
1146
|
-
"Read the platform fee line and any store-count qualifier on it.",
|
|
1147
|
-
"Compare it against the fee on a single-seller cart.",
|
|
1148
|
-
"Check it was not multiplied by three.",
|
|
1149
|
-
"Go to checkout and read the fee at the payment step.",
|
|
1150
|
-
],
|
|
1151
|
-
expectedBehaviour: "The platform fee is charged once per CHECKOUT, not per seller — it is a fee on the transaction rather than on each order the transaction produces. It is then split pro-rata across the resulting orders, which is the next case.",
|
|
1152
|
-
expectedUiState: "The three-seller cart shows one platform fee, the same as a single-seller cart of comparable value. Three times the fee is the per-group accumulation failure.",
|
|
1153
|
-
endResult: "Empty the cart afterwards.",
|
|
1154
|
-
},
|
|
1155
|
-
"checklist-buying-cart-platform-fee-sums-across-orders": {
|
|
1156
|
-
roles: ["buyer"],
|
|
1157
|
-
startPage: "/cart",
|
|
1158
|
-
steps: [
|
|
1159
|
-
"Sign in as rehan.sheikh@gmail.com / TempPass123! and add items from two sellers.",
|
|
1160
|
-
"Note the platform fee shown at checkout.",
|
|
1161
|
-
"Complete checkout with Cash on Delivery.",
|
|
1162
|
-
"Open both resulting orders in /user/orders.",
|
|
1163
|
-
"Read each order's recorded platform fee.",
|
|
1164
|
-
"Add the two together and compare against the checkout figure.",
|
|
1165
|
-
],
|
|
1166
|
-
expectedBehaviour: "The single fee is allocated pro-rata across the orders the cart produces, with the last group absorbing the rounding remainder — so the per-order values sum to exactly what was charged. Anything else means the platform absorbed or overcharged the difference.",
|
|
1167
|
-
expectedUiState: "The two orders' platform fees sum to the checkout figure exactly, to the paisa. A gap in either direction is the failure.",
|
|
1168
|
-
expectedData: { feesReconcile: true },
|
|
1169
|
-
endResult: "Two orders exist with reconciling fees.",
|
|
1170
|
-
},
|
|
1171
|
-
"checklist-buying-cart-cart-checkout-order-totals-agree": {
|
|
1172
|
-
roles: ["buyer"],
|
|
1173
|
-
startPage: "/cart",
|
|
1174
|
-
steps: [
|
|
1175
|
-
"Sign in as rehan.sheikh@gmail.com / TempPass123! and add items from two sellers, ticking one add-on.",
|
|
1176
|
-
"Open /cart, expand the breakdown, and write down every figure.",
|
|
1177
|
-
"Add up the per-seller card fee lines and write that down.",
|
|
1178
|
-
"Go to checkout and write down the summary at the payment step.",
|
|
1179
|
-
"Complete the order with Cash on Delivery.",
|
|
1180
|
-
"Open both orders and add their totals together.",
|
|
1181
|
-
"Compare all four figures.",
|
|
1182
|
-
],
|
|
1183
|
-
expectedBehaviour: "Four surfaces price one cart and all four must agree: the cart breakdown, the per-seller card lines, the checkout summary and the orders. They share one set of fee helpers precisely so they cannot drift — a fee re-derived inline at any one of them is how they diverge, and the buyer only ever sees two at a time.",
|
|
1184
|
-
expectedUiState: "All four figures are identical to the paisa. Any disagreement is the finding, named by which pair diverged.",
|
|
1185
|
-
expectedData: { totalsReconcile: true },
|
|
1186
|
-
endResult: "Two orders exist. This is the case that catches a re-derived fee anywhere in the chain.",
|
|
1187
|
-
},
|
|
1188
|
-
"checklist-buying-cart-addons-follow-cart-not-checkout-request": {
|
|
1189
|
-
roles: ["buyer"],
|
|
1190
|
-
startPage: "/cart",
|
|
1191
|
-
steps: [
|
|
1192
|
-
"Sign in as rehan.sheikh@gmail.com / TempPass123! with items from two sellers.",
|
|
1193
|
-
"Tick gift wrap on the first seller only and note the fee.",
|
|
1194
|
-
"Go to checkout WITHOUT changing anything.",
|
|
1195
|
-
"Open browser DevTools and inspect the pricing and order requests.",
|
|
1196
|
-
"Check no add-on flags are present in the request bodies.",
|
|
1197
|
-
"Complete the order and read the fees recorded.",
|
|
1198
|
-
"Check they match the cart's per-store checkboxes exactly.",
|
|
1199
|
-
],
|
|
1200
|
-
expectedBehaviour: "Add-on fees follow the cart document's per-store selections, never a request body. The old request flags were DELETED rather than kept alongside — two sources of truth for one charge is the drift itself, and a request body is client-controlled where the cart document is not.",
|
|
1201
|
-
expectedUiState: "No add-on flags appear in the request bodies. The recorded fees match the cart's checkboxes. A body carrying add-on flags is the finding even if the totals happen to agree today.",
|
|
1202
|
-
endResult: "Two orders exist with fees matching the cart.",
|
|
1203
|
-
},
|
|
1204
|
-
/* ── Added 2026-09-14 (F3d) — the SIGNED-OUT cart ───────────────────────────
|
|
1205
|
-
* 71 cart cases existed and 3 were signed-out. Only a case whose `roles` is
|
|
1206
|
-
* exactly ["guest"] is routed into the guest identity slice, which copies an
|
|
1207
|
-
* EMPTY storage state over the fixed session.json path; a two-role case runs
|
|
1208
|
-
* signed in and cannot test any of this.
|
|
1209
|
-
*/
|
|
1210
|
-
"checklist-buying-cart-cart-guest-add-and-persist": {
|
|
1211
|
-
roles: ["guest"],
|
|
1212
|
-
startPage: "/products/product-beyblade-burst-valkyrie",
|
|
1213
|
-
steps: [
|
|
1214
|
-
"Open /products/product-beyblade-burst-valkyrie while signed out.",
|
|
1215
|
-
"Press Add to cart.",
|
|
1216
|
-
"Open /cart and note the line that is there.",
|
|
1217
|
-
"Press the browser reload button and wait for the page to settle.",
|
|
1218
|
-
"Note whether the same line is still there.",
|
|
1219
|
-
],
|
|
1220
|
-
expectedBehaviour: "BEFORE: a signed-out visitor adds an item and the guest cart holds it. AFTER a full reload the same line is still present. The guest cart is localStorage-backed, so a cart that does not survive a reload loses the visitor's selection between any two navigations — and that is invisible to a signed-in tester, which is why this case exists.",
|
|
1221
|
-
expectedUiState: "The cart shows exactly one line for product-beyblade-burst-valkyrie both before and after the reload, with the same quantity. An empty cart after reload is the failure.",
|
|
1222
|
-
expectedData: { cartLinesAfterReload: 1 },
|
|
1223
|
-
endResult: "The line persists in localStorage until cleared. Remove it at the end so the next signed-out case starts clean.",
|
|
1224
|
-
},
|
|
1225
|
-
"checklist-buying-cart-cart-guest-prices-gated": {
|
|
1226
|
-
roles: ["guest"],
|
|
1227
|
-
startPage: "/cart",
|
|
1228
|
-
steps: [
|
|
1229
|
-
"While signed out, add product-beyblade-burst-valkyrie to the cart and open /cart.",
|
|
1230
|
-
"Read the price area of the cart line.",
|
|
1231
|
-
"Read the order summary's total area.",
|
|
1232
|
-
"Reload the page once and watch the price area during the first second after load.",
|
|
1233
|
-
],
|
|
1234
|
-
expectedBehaviour: "A signed-out visitor is shown a sign-in prompt where a price would be, not an amount. The gate has three states and the middle one renders a neutral placeholder, so a signed-in buyer must never see the prompt flash on load — but a signed-out visitor must never see a real amount at all.",
|
|
1235
|
-
expectedUiState: "The cart line and the summary both show the sign-in prompt in place of the money, and the row keeps its height rather than collapsing. No rupee amount for the item price is visible anywhere on the page.",
|
|
1236
|
-
endResult: "Read-only apart from the cart line; remove it afterwards.",
|
|
1237
|
-
},
|
|
1238
|
-
"checklist-buying-cart-cart-guest-checkout-prompts-signin": {
|
|
1239
|
-
roles: ["guest"],
|
|
1240
|
-
startPage: "/cart",
|
|
1241
|
-
steps: [
|
|
1242
|
-
"While signed out, add product-beyblade-burst-valkyrie to the cart and open /cart.",
|
|
1243
|
-
"Press the checkout CTA.",
|
|
1244
|
-
"Note exactly where you land and what is shown.",
|
|
1245
|
-
],
|
|
1246
|
-
expectedBehaviour: "The visitor is asked to sign in. They are not dropped onto a checkout form that will refuse them later, and not left on the cart with a button that appears to do nothing.",
|
|
1247
|
-
expectedUiState: "A sign-in prompt, modal or /auth/login page appears, and it is clear that signing in will continue the purchase. A silent no-op is the failure, and so is an empty checkout page.",
|
|
1248
|
-
endResult: "No order is created. Remove the cart line afterwards.",
|
|
1249
|
-
},
|
|
1250
|
-
"checklist-buying-cart-cart-guest-group-line-refused": {
|
|
1251
|
-
roles: ["guest"],
|
|
1252
|
-
startPage: "/bundles",
|
|
1253
|
-
steps: [
|
|
1254
|
-
"While signed out, open /bundles and pick any bundle.",
|
|
1255
|
-
"Try to add the bundle to the cart.",
|
|
1256
|
-
"Note exactly what happens.",
|
|
1257
|
-
"Open /cart and note whether anything was added.",
|
|
1258
|
-
],
|
|
1259
|
-
expectedBehaviour: "The visitor is told to sign in, explicitly. A grouped or bundle line cannot exist in the guest cart at all — it is keyed on productId and quantity only, so such a line could not survive the login merge — which means a half-added line would be silently lost rather than merged.",
|
|
1260
|
-
expectedUiState: "A sign-in prompt appears. The cart afterwards contains no partial bundle line and no single stray member product.",
|
|
1261
|
-
expectedData: { guestCartBundleLines: 0 },
|
|
1262
|
-
endResult: "Nothing is added to the guest cart. Nothing persists.",
|
|
1263
|
-
},
|
|
1264
|
-
};
|