@mohasinac/appkit 4.34.1 → 4.35.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_internal/client/features/lottery/LotteryAdminEditView.js +32 -2
- package/dist/features/tester/components/TesterChecklistStepRow.d.ts +9 -1
- package/dist/features/tester/components/TesterChecklistStepRow.js +31 -2
- package/dist/features/tester/components/TesterHubView.js +8 -0
- package/dist/features/tester/schemas/firestore.d.ts +109 -0
- package/dist/features/tester/schemas/firestore.js +14 -0
- package/dist/features/tester/seed-data/_money-flows.d.ts +23 -0
- package/dist/features/tester/seed-data/_money-flows.js +430 -0
- package/dist/features/tester/seed-data/authored/_types.d.ts +33 -0
- package/dist/features/tester/seed-data/authored/_types.js +35 -0
- package/dist/features/tester/seed-data/authored/account-auth__profile-settings.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/account-auth__profile-settings.js +207 -0
- package/dist/features/tester/seed-data/authored/account-auth__signup-login.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/account-auth__signup-login.js +298 -0
- package/dist/features/tester/seed-data/authored/account-auth__testing-program--admin.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/account-auth__testing-program--admin.js +33 -0
- package/dist/features/tester/seed-data/authored/account-auth__testing-program.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/account-auth__testing-program.js +138 -0
- package/dist/features/tester/seed-data/authored/addresses__address-filters.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/addresses__address-filters.js +36 -0
- package/dist/features/tester/seed-data/authored/addresses__postal-lookup.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/addresses__postal-lookup.js +75 -0
- package/dist/features/tester/seed-data/authored/addresses__postal-validation.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/addresses__postal-validation.js +72 -0
- package/dist/features/tester/seed-data/authored/addresses__state-picker.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/addresses__state-picker.js +54 -0
- package/dist/features/tester/seed-data/authored/addresses__unban-request.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/addresses__unban-request.js +39 -0
- package/dist/features/tester/seed-data/authored/admin__bans-and-trust.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/admin__bans-and-trust.js +226 -0
- package/dist/features/tester/seed-data/authored/admin__blog-faqs.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/admin__blog-faqs.js +82 -0
- package/dist/features/tester/seed-data/authored/admin__bulk-actions.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/admin__bulk-actions.js +177 -0
- package/dist/features/tester/seed-data/authored/admin__bundles.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/admin__bundles.js +97 -0
- package/dist/features/tester/seed-data/authored/admin__buyer-data-admin.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/admin__buyer-data-admin.js +232 -0
- package/dist/features/tester/seed-data/authored/admin__catalog-listings.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/admin__catalog-listings.js +306 -0
- package/dist/features/tester/seed-data/authored/admin__category-brand-authoring.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/admin__category-brand-authoring.js +158 -0
- package/dist/features/tester/seed-data/authored/admin__classifieds-digitalcodes-live.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/admin__classifieds-digitalcodes-live.js +78 -0
- package/dist/features/tester/seed-data/authored/admin__content-deletes.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/admin__content-deletes.js +261 -0
- package/dist/features/tester/seed-data/authored/admin__content-marketing.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/admin__content-marketing.js +151 -0
- package/dist/features/tester/seed-data/authored/admin__coupons.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/admin__coupons.js +214 -0
- package/dist/features/tester/seed-data/authored/admin__events-raffles-spin.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/admin__events-raffles-spin.js +160 -0
- package/dist/features/tester/seed-data/authored/admin__media-watermark.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/admin__media-watermark.js +104 -0
- package/dist/features/tester/seed-data/authored/admin__orders-fulfillment.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/admin__orders-fulfillment.js +350 -0
- package/dist/features/tester/seed-data/authored/admin__prize-draws-lotteries.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/admin__prize-draws-lotteries.js +105 -0
- package/dist/features/tester/seed-data/authored/admin__site-system.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/admin__site-system.js +590 -0
- package/dist/features/tester/seed-data/authored/admin__uncovered-admin-pages.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/admin__uncovered-admin-pages.js +235 -0
- package/dist/features/tester/seed-data/authored/admin__users-trust.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/admin__users-trust.js +569 -0
- package/dist/features/tester/seed-data/authored/buying__bidding.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/buying__bidding.js +417 -0
- package/dist/features/tester/seed-data/authored/buying__browsing-search.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/buying__browsing-search.js +653 -0
- package/dist/features/tester/seed-data/authored/buying__buying-checkout.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/buying__buying-checkout.js +533 -0
- package/dist/features/tester/seed-data/authored/buying__buying-coupons.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/buying__buying-coupons.js +379 -0
- package/dist/features/tester/seed-data/authored/buying__cart.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/buying__cart.js +1171 -0
- package/dist/features/tester/seed-data/authored/buying__image-tile-layout.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/buying__image-tile-layout.js +140 -0
- package/dist/features/tester/seed-data/authored/buying__my-orders.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/buying__my-orders.js +257 -0
- package/dist/features/tester/seed-data/authored/buying__offers.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/buying__offers.js +1111 -0
- package/dist/features/tester/seed-data/authored/buying__order-status-lifecycle.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/buying__order-status-lifecycle.js +252 -0
- package/dist/features/tester/seed-data/authored/buying__product-detail.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/buying__product-detail.js +387 -0
- package/dist/features/tester/seed-data/authored/buying__return-request.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/buying__return-request.js +152 -0
- package/dist/features/tester/seed-data/authored/buying__reviews-pagination.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/buying__reviews-pagination.js +242 -0
- package/dist/features/tester/seed-data/authored/buying__reviews.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/buying__reviews.js +113 -0
- package/dist/features/tester/seed-data/authored/buying__user-dashboard-extras.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/buying__user-dashboard-extras.js +283 -0
- package/dist/features/tester/seed-data/authored/buying__user-dashboard-navigation.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/buying__user-dashboard-navigation.js +167 -0
- package/dist/features/tester/seed-data/authored/buying__user-uncovered-pages.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/buying__user-uncovered-pages.js +90 -0
- package/dist/features/tester/seed-data/authored/buying__wishlist-history.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/buying__wishlist-history.js +344 -0
- package/dist/features/tester/seed-data/authored/community-support__public-profile.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/community-support__public-profile.js +53 -0
- package/dist/features/tester/seed-data/authored/community-support__support-tickets.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/community-support__support-tickets.js +76 -0
- package/dist/features/tester/seed-data/authored/content-discovery__blog.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/content-discovery__blog.js +93 -0
- package/dist/features/tester/seed-data/authored/content-discovery__category-brand-relations.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/content-discovery__category-brand-relations.js +149 -0
- package/dist/features/tester/seed-data/authored/content-discovery__coupons.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/content-discovery__coupons.js +121 -0
- package/dist/features/tester/seed-data/authored/content-discovery__event-participation.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/content-discovery__event-participation.js +207 -0
- package/dist/features/tester/seed-data/authored/content-discovery__events.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/content-discovery__events.js +318 -0
- package/dist/features/tester/seed-data/authored/content-discovery__faq-help.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/content-discovery__faq-help.js +65 -0
- package/dist/features/tester/seed-data/authored/content-discovery__notifications.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/content-discovery__notifications.js +147 -0
- package/dist/features/tester/seed-data/authored/content-discovery__search.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/content-discovery__search.js +332 -0
- package/dist/features/tester/seed-data/authored/cta-layout__checkout-bottom-bar.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/cta-layout__checkout-bottom-bar.js +53 -0
- package/dist/features/tester/seed-data/authored/cta-layout__dialog-footers.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/cta-layout__dialog-footers.js +52 -0
- package/dist/features/tester/seed-data/authored/cta-layout__editor-action-bar.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/cta-layout__editor-action-bar.js +35 -0
- package/dist/features/tester/seed-data/authored/cta-layout__navbar-ctas.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/cta-layout__navbar-ctas.js +141 -0
- package/dist/features/tester/seed-data/authored/cta-layout__product-bottom-bar.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/cta-layout__product-bottom-bar.js +35 -0
- package/dist/features/tester/seed-data/authored/design-ux__back-to-top-button.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/design-ux__back-to-top-button.js +95 -0
- package/dist/features/tester/seed-data/authored/design-ux__carousel-arrow-bounds.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/design-ux__carousel-arrow-bounds.js +191 -0
- package/dist/features/tester/seed-data/authored/design-ux__dashboard-layout.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/design-ux__dashboard-layout.js +158 -0
- package/dist/features/tester/seed-data/authored/design-ux__footer-theme.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/design-ux__footer-theme.js +106 -0
- package/dist/features/tester/seed-data/authored/design-ux__form-validation-errors.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/design-ux__form-validation-errors.js +88 -0
- package/dist/features/tester/seed-data/authored/design-ux__general-design.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/design-ux__general-design.js +204 -0
- package/dist/features/tester/seed-data/authored/design-ux__hand-mode-layout.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/design-ux__hand-mode-layout.js +301 -0
- package/dist/features/tester/seed-data/authored/design-ux__homepage-carousels.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/design-ux__homepage-carousels.js +407 -0
- package/dist/features/tester/seed-data/authored/design-ux__status-badge-legibility.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/design-ux__status-badge-legibility.js +214 -0
- package/dist/features/tester/seed-data/authored/design-ux__sticky-cta-bar.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/design-ux__sticky-cta-bar.js +275 -0
- package/dist/features/tester/seed-data/authored/index.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/index.js +237 -0
- package/dist/features/tester/seed-data/authored/page-wiring__data-loss.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/page-wiring__data-loss.js +102 -0
- package/dist/features/tester/seed-data/authored/page-wiring__detail-pages.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/page-wiring__detail-pages.js +50 -0
- package/dist/features/tester/seed-data/authored/page-wiring__drawer-pages.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/page-wiring__drawer-pages.js +66 -0
- package/dist/features/tester/seed-data/authored/page-wiring__reachability.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/page-wiring__reachability.js +115 -0
- package/dist/features/tester/seed-data/authored/public-pages__auth-error-pages.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/public-pages__auth-error-pages.js +136 -0
- package/dist/features/tester/seed-data/authored/public-pages__bug-hunters.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/public-pages__bug-hunters.js +69 -0
- package/dist/features/tester/seed-data/authored/public-pages__core-listing-pages.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/public-pages__core-listing-pages.js +263 -0
- package/dist/features/tester/seed-data/authored/public-pages__help-how-it-works.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/public-pages__help-how-it-works.js +102 -0
- package/dist/features/tester/seed-data/authored/public-pages__help-scams-guides-subpages.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/public-pages__help-scams-guides-subpages.js +234 -0
- package/dist/features/tester/seed-data/authored/public-pages__legal-policy-pages.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/public-pages__legal-policy-pages.js +126 -0
- package/dist/features/tester/seed-data/authored/public-pages__stores-sellers-directories.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/public-pages__stores-sellers-directories.js +255 -0
- package/dist/features/tester/seed-data/authored/search-and-nav__employee-permissions.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/search-and-nav__employee-permissions.js +59 -0
- package/dist/features/tester/seed-data/authored/search-and-nav__header-search.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/search-and-nav__header-search.js +88 -0
- package/dist/features/tester/seed-data/authored/search-and-nav__settings-deep-links.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/search-and-nav__settings-deep-links.js +51 -0
- package/dist/features/tester/seed-data/authored/search-and-nav__sidebar-search.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/search-and-nav__sidebar-search.js +35 -0
- package/dist/features/tester/seed-data/authored/selling__become-seller.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/selling__become-seller.js +94 -0
- package/dist/features/tester/seed-data/authored/selling__final-sale-authoring.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/selling__final-sale-authoring.js +107 -0
- package/dist/features/tester/seed-data/authored/selling__listing-a-product.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/selling__listing-a-product.js +285 -0
- package/dist/features/tester/seed-data/authored/selling__listing-lifecycle.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/selling__listing-lifecycle.js +326 -0
- package/dist/features/tester/seed-data/authored/selling__listing-type-fields-roundtrip.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/selling__listing-type-fields-roundtrip.js +136 -0
- package/dist/features/tester/seed-data/authored/selling__media-limits.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/selling__media-limits.js +128 -0
- package/dist/features/tester/seed-data/authored/selling__sectionised-forms.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/selling__sectionised-forms.js +167 -0
- package/dist/features/tester/seed-data/authored/selling__seller-analytics-payouts.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/selling__seller-analytics-payouts.js +117 -0
- package/dist/features/tester/seed-data/authored/selling__seller-bids-bundles-filters.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/selling__seller-bids-bundles-filters.js +88 -0
- package/dist/features/tester/seed-data/authored/selling__seller-catalog-org.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/selling__seller-catalog-org.js +151 -0
- package/dist/features/tester/seed-data/authored/selling__seller-custom-brands.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/selling__seller-custom-brands.js +105 -0
- package/dist/features/tester/seed-data/authored/selling__seller-guide.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/selling__seller-guide.js +33 -0
- package/dist/features/tester/seed-data/authored/selling__seller-listing-types.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/selling__seller-listing-types.js +347 -0
- package/dist/features/tester/seed-data/authored/selling__seller-marketing-extras.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/selling__seller-marketing-extras.js +166 -0
- package/dist/features/tester/seed-data/authored/selling__seller-ops-comms.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/selling__seller-ops-comms.js +89 -0
- package/dist/features/tester/seed-data/authored/selling__seller-orders.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/selling__seller-orders.js +195 -0
- package/dist/features/tester/seed-data/authored/selling__seller-shipping-payouts-setup.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/selling__seller-shipping-payouts-setup.js +180 -0
- package/dist/features/tester/seed-data/authored/selling__store-dashboard-navigation.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/selling__store-dashboard-navigation.js +164 -0
- package/dist/features/tester/seed-data/authored/selling__store-uncovered-pages.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/selling__store-uncovered-pages.js +116 -0
- package/dist/features/tester/seed-data/authored/seo__canonical-and-host.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/seo__canonical-and-host.js +111 -0
- package/dist/features/tester/seed-data/authored/seo__og-images.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/seo__og-images.js +91 -0
- package/dist/features/tester/seed-data/authored/seo__page-metadata.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/seo__page-metadata.js +122 -0
- package/dist/features/tester/seed-data/authored/seo__sitemap-and-robots.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/seo__sitemap-and-robots.js +105 -0
- package/dist/features/tester/seed-data/tester-checklist-seed-data.js +744 -1
- package/dist/seed/carousel-slides-seed-data.js +1 -1
- package/dist/seed/products-standard-seed-data.js +2 -2
- package/dist/seed/reviews-seed-data.js +6 -1
- package/package.json +1 -1
- package/scripts/seed-cli.mjs +6 -0
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* WHY: Authored six-part procedures for the selling/seller-custom-brands page.
|
|
3
|
+
* WHAT: 5 case(s), keyed by full checklist id.
|
|
4
|
+
*
|
|
5
|
+
* Written by hand, case by case, against the label each one states. There is no
|
|
6
|
+
* generator: the authoring scripts were deleted once it was clear they were
|
|
7
|
+
* scaffolding around work that is simply writing.
|
|
8
|
+
*
|
|
9
|
+
* 🛑 A BRAND PAGE MATCHES ITS PRODUCTS BY DISPLAY NAME, not by slug. So a brand
|
|
10
|
+
* created here and the brand string written onto the product must agree exactly,
|
|
11
|
+
* and the public brand page is the only place that disagreement becomes visible —
|
|
12
|
+
* the seller's own dashboard shows the product filed correctly either way.
|
|
13
|
+
*
|
|
14
|
+
* @tag domain:tester
|
|
15
|
+
* @tag layer:seed
|
|
16
|
+
* @tag pattern:none
|
|
17
|
+
* @tag access:server-only
|
|
18
|
+
* @tag consumers:seed-data/authored/index.ts
|
|
19
|
+
* @tag sideEffects:none
|
|
20
|
+
*/
|
|
21
|
+
export const authored = {
|
|
22
|
+
"checklist-selling-seller-custom-brands-seller-brand-inline-create": {
|
|
23
|
+
roles: ["seller"],
|
|
24
|
+
startPage: "/store/products/new",
|
|
25
|
+
steps: [
|
|
26
|
+
"Sign in as tyson@beybladearena.in / TempPass123!.",
|
|
27
|
+
"Open /store/products/new and find the brand picker.",
|
|
28
|
+
"Type QA Brand inline-create into its search box.",
|
|
29
|
+
"Read what the picker offers when nothing matches.",
|
|
30
|
+
"Use the create control the picker offers and fill the form it opens.",
|
|
31
|
+
"Save the new brand and read the picker's selection afterwards.",
|
|
32
|
+
],
|
|
33
|
+
inputs: { brandName: "QA Brand inline-create" },
|
|
34
|
+
expectedBehaviour: "A picker with more than five options is searchable, and where a seller might legitimately need a value that does not exist it offers inline creation. The newly created option is auto-selected — making the seller find it again in the list is the half-finished version of this feature.",
|
|
35
|
+
expectedUiState: "Searching a name that does not exist shows a create control rather than only an empty state. After saving, the picker shows 'QA Brand inline-create' as the current selection without the seller re-opening it.",
|
|
36
|
+
endResult: "A brand exists. Leave the product editor without saving — the brand is what the next cases read.",
|
|
37
|
+
},
|
|
38
|
+
"checklist-selling-seller-custom-brands-seller-brand-inline-create-persists": {
|
|
39
|
+
roles: ["seller"],
|
|
40
|
+
startPage: "/store/products/new",
|
|
41
|
+
steps: [
|
|
42
|
+
"Sign in as tyson@beybladearena.in / TempPass123!.",
|
|
43
|
+
"Open /store/products/new and open the brand picker.",
|
|
44
|
+
"Search for QA Brand inline-create.",
|
|
45
|
+
"Read whether it is offered as an existing option.",
|
|
46
|
+
"Reload the page and search for it again.",
|
|
47
|
+
"Open a different creation form — the auction one — and search for it there.",
|
|
48
|
+
],
|
|
49
|
+
inputs: { brandName: "QA Brand inline-create" },
|
|
50
|
+
expectedBehaviour: "The brand was written to the shared categories collection as a brand-typed row, so it is available to every form that reads brands, not only the one that created it. A value that exists only in the creating form's local state disappears on reload.",
|
|
51
|
+
expectedUiState: "The brand is offered as an existing option in the product form, after a reload, and in the auction form. Being absent from any of the three is the failure.",
|
|
52
|
+
endResult: "Leave every editor without saving.",
|
|
53
|
+
},
|
|
54
|
+
"checklist-selling-seller-custom-brands-seller-brand-inline-create-duplicate-rejected": {
|
|
55
|
+
roles: ["seller"],
|
|
56
|
+
startPage: "/store/products/new",
|
|
57
|
+
steps: [
|
|
58
|
+
"Sign in as tyson@beybladearena.in / TempPass123!.",
|
|
59
|
+
"Open /store/products/new and open the brand picker.",
|
|
60
|
+
"Use the create control and type QA Brand inline-create — the name that already exists.",
|
|
61
|
+
"Save and read the message.",
|
|
62
|
+
"Open the picker again and search that name.",
|
|
63
|
+
"Count how many options match it.",
|
|
64
|
+
"Try once more with the same name in different case: qa brand INLINE-CREATE.",
|
|
65
|
+
],
|
|
66
|
+
inputs: { brandName: "QA Brand inline-create", caseVariant: "qa brand INLINE-CREATE" },
|
|
67
|
+
expectedBehaviour: "A duplicate is refused rather than creating a second row. Because a brand page matches products by DISPLAY NAME, two rows with the same name are two brands the read side cannot tell apart — and a case-differing duplicate is the same problem wearing a disguise.",
|
|
68
|
+
expectedUiState: "The duplicate attempt is refused with a readable message. Exactly one option matches the name in the picker. The case-differing attempt is refused too — accepting it creates the ambiguity this rule exists to prevent.",
|
|
69
|
+
expectedData: { matchingOptionCount: 1 },
|
|
70
|
+
endResult: "Leave the editor without saving.",
|
|
71
|
+
},
|
|
72
|
+
"checklist-selling-seller-custom-brands-seller-brand-product-saves-with-new-brand": {
|
|
73
|
+
roles: ["seller"],
|
|
74
|
+
startPage: "/store/products/new",
|
|
75
|
+
steps: [
|
|
76
|
+
"Sign in as tyson@beybladearena.in / TempPass123!.",
|
|
77
|
+
"Open /store/products/new and type 'QA Product custom-brand' as the title.",
|
|
78
|
+
"Select QA Brand inline-create in the brand picker.",
|
|
79
|
+
"Type 500 as the price, fill every other required field, and publish.",
|
|
80
|
+
"RELOAD the product's editor and read the brand.",
|
|
81
|
+
"Open the product's public page and read the brand link below the title.",
|
|
82
|
+
"Click that link.",
|
|
83
|
+
],
|
|
84
|
+
inputs: { title: "QA Product custom-brand", brandName: "QA Brand inline-create", price: 500 },
|
|
85
|
+
expectedBehaviour: "The product stores both the brand's slug and its display name, and the two stay in lockstep. The public page's brand link resolves to the brand's own page — a link built from one field while the page matches on the other lands somewhere empty.",
|
|
86
|
+
expectedUiState: "After the reload the editor shows the brand. The public page shows a brand link reading 'QA Brand inline-create' and clicking it opens that brand's page rather than a 404.",
|
|
87
|
+
endResult: "The product exists and is the fixture the next case reads. Delete it after that case.",
|
|
88
|
+
},
|
|
89
|
+
"checklist-selling-seller-custom-brands-seller-brand-appears-on-public-brands-page": {
|
|
90
|
+
roles: ["guest"],
|
|
91
|
+
startPage: "/brands",
|
|
92
|
+
steps: [
|
|
93
|
+
"Open /brands in a private window with no session.",
|
|
94
|
+
"Look for QA Brand inline-create in the list.",
|
|
95
|
+
"Open its brand page.",
|
|
96
|
+
"Read the product grid and look for 'QA Product custom-brand'.",
|
|
97
|
+
"Sign in as tyson@beybladearena.in / TempPass123! and delete the QA product, then the QA brand.",
|
|
98
|
+
],
|
|
99
|
+
inputs: { brandName: "QA Brand inline-create", productTitle: "QA Product custom-brand" },
|
|
100
|
+
expectedBehaviour: "A seller-created brand becomes a real public brand page listing its products. The match is on display name, so this page is where a name-versus-slug mismatch finally shows — the brand page renders and its grid is empty, which reads as a brand with no stock rather than as a broken link.",
|
|
101
|
+
expectedUiState: "The brand is listed on /brands and its page shows 'QA Product custom-brand' in the grid. An empty grid on a brand that demonstrably has a product is the failure this whole page builds toward.",
|
|
102
|
+
expectedData: { productsOnBrandPage: 1 },
|
|
103
|
+
endResult: "Both the product and the brand are deleted by the final step, so nothing accumulates across runs.",
|
|
104
|
+
},
|
|
105
|
+
};
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* WHY: Authored six-part procedures for the selling/seller-guide page.
|
|
3
|
+
* WHAT: 1 case, keyed by full checklist id.
|
|
4
|
+
*
|
|
5
|
+
* Written by hand, case by case, against the label each one states. There is no
|
|
6
|
+
* generator: the authoring scripts were deleted once it was clear they were
|
|
7
|
+
* scaffolding around work that is simply writing.
|
|
8
|
+
*
|
|
9
|
+
* @tag domain:tester
|
|
10
|
+
* @tag layer:seed
|
|
11
|
+
* @tag pattern:none
|
|
12
|
+
* @tag access:server-only
|
|
13
|
+
* @tag consumers:seed-data/authored/index.ts
|
|
14
|
+
* @tag sideEffects:none
|
|
15
|
+
*/
|
|
16
|
+
export const authored = {
|
|
17
|
+
"checklist-selling-seller-guide-seller-guide-pages": {
|
|
18
|
+
roles: ["seller"],
|
|
19
|
+
startPage: "/store",
|
|
20
|
+
steps: [
|
|
21
|
+
"Sign in as tyson@beybladearena.in / TempPass123!.",
|
|
22
|
+
"Open /store and find the guide or help entries in the sidebar.",
|
|
23
|
+
"Open each guide page in turn and read its content.",
|
|
24
|
+
"Write down any that renders empty, 404s, or repeats another page's text.",
|
|
25
|
+
"Check each guide against the feature it describes — open that feature and confirm the guide's instructions match what is on screen.",
|
|
26
|
+
"Follow every link inside the guides and note where each lands.",
|
|
27
|
+
],
|
|
28
|
+
expectedBehaviour: "Every seller guide renders its own content and every link in it resolves. The fifth step is the one that matters most: a guide describing a screen that has since changed is worse than no guide, because the seller trusts it and then cannot find what it names.",
|
|
29
|
+
expectedUiState: "Each guide shows a heading and body specific to its topic, with no two identical. Every internal link lands on a real page. Instructions match the current screens — a guide naming a control that no longer exists is the finding, quoted exactly.",
|
|
30
|
+
expectedData: { brokenGuideLinks: 0 },
|
|
31
|
+
endResult: "Read-only; nothing persists. Report stale instructions with the guide's name and the sentence that is wrong, not just that the page loads.",
|
|
32
|
+
},
|
|
33
|
+
};
|
|
@@ -0,0 +1,347 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* WHY: Authored six-part procedures for the selling/seller-listing-types page.
|
|
3
|
+
* WHAT: 18 case(s), keyed by full checklist id.
|
|
4
|
+
*
|
|
5
|
+
* Written by hand, case by case, against the label each one states. There is no
|
|
6
|
+
* generator: the authoring scripts were deleted once it was clear they were
|
|
7
|
+
* scaffolding around work that is simply writing.
|
|
8
|
+
*
|
|
9
|
+
* 🛑 ADDING A LISTING TYPE IS A FIVE-PLACE CHANGE and the compiler catches three.
|
|
10
|
+
* The two it misses are the repository's filter-alias map — omit a type there and
|
|
11
|
+
* the alias returns an empty value that is then DROPPED, so the query runs with no
|
|
12
|
+
* type filter and returns everything — and the enabled-types map. Several cases
|
|
13
|
+
* here exist to make that specific silence visible from the UI.
|
|
14
|
+
*
|
|
15
|
+
* The seller coupon cases mirror the buyer-side stacking ones deliberately: the
|
|
16
|
+
* buckets are one coupon per store plus one platform-wide, and a seller must not
|
|
17
|
+
* be able to mint the platform-wide kind.
|
|
18
|
+
*
|
|
19
|
+
* @tag domain:tester
|
|
20
|
+
* @tag layer:seed
|
|
21
|
+
* @tag pattern:none
|
|
22
|
+
* @tag access:server-only
|
|
23
|
+
* @tag consumers:seed-data/authored/index.ts
|
|
24
|
+
* @tag sideEffects:none
|
|
25
|
+
*/
|
|
26
|
+
export const authored = {
|
|
27
|
+
"checklist-selling-seller-listing-types-seller-listing-type-dropdown-all-types": {
|
|
28
|
+
roles: ["seller"],
|
|
29
|
+
startPage: "/store/products",
|
|
30
|
+
steps: [
|
|
31
|
+
"Sign in as tyson@beybladearena.in / TempPass123!.",
|
|
32
|
+
"Open /store/products and open the listing-type dropdown.",
|
|
33
|
+
"Write down every option offered.",
|
|
34
|
+
"Compare that list against the nine types the catalogue supports.",
|
|
35
|
+
"Select each option in turn and read the rows returned.",
|
|
36
|
+
"Write down any option returning the full unfiltered list rather than its own type.",
|
|
37
|
+
],
|
|
38
|
+
expectedBehaviour: "Every type is offered and each filters to its own. A type present in the union and the plugin registry but missing from the repository's alias map produces an empty filter value that is silently dropped — so the page returns EVERYTHING under that heading, which reads as the seller owning far more than they do rather than as a broken filter.",
|
|
39
|
+
expectedUiState: "Nine options, and each returns only its own type. An option showing the full catalogue is the dropped-filter failure; an option missing entirely is the other half of the same defect. `bundle` must NOT be offered — it stopped being a listing type and a chip for it matches zero rows forever.",
|
|
40
|
+
expectedData: { typeOptionCount: 9 },
|
|
41
|
+
endResult: "Read-only; nothing persists beyond the URL.",
|
|
42
|
+
},
|
|
43
|
+
"checklist-selling-seller-listing-types-seller-products-badge-per-type": {
|
|
44
|
+
roles: ["seller"],
|
|
45
|
+
startPage: "/store/products",
|
|
46
|
+
steps: [
|
|
47
|
+
"Sign in as tyson@beybladearena.in / TempPass123!.",
|
|
48
|
+
"Open /store/products with no type filter so every type is listed.",
|
|
49
|
+
"Read the badge on a row of each type present.",
|
|
50
|
+
"Write down any two types sharing an identical badge.",
|
|
51
|
+
"Switch to dark mode and read the badges again.",
|
|
52
|
+
],
|
|
53
|
+
expectedBehaviour: "Each type renders its own badge. The badge map is keyed on the type union, and a map covering only some types renders an identical fallback for the rest — five of nine once looked the same, which makes the list unreadable at a glance without telling anyone anything is wrong.",
|
|
54
|
+
expectedUiState: "Every type shows a distinct badge and each is readable in both themes. Two types sharing a badge is the failure, named by the pair.",
|
|
55
|
+
endResult: "Read-only; return the site to light mode afterwards.",
|
|
56
|
+
},
|
|
57
|
+
"checklist-selling-seller-listing-types-seller-products-featured-promoted-sorts": {
|
|
58
|
+
roles: ["seller"],
|
|
59
|
+
startPage: "/store/products",
|
|
60
|
+
steps: [
|
|
61
|
+
"Sign in as tyson@beybladearena.in / TempPass123!.",
|
|
62
|
+
"Open /store/products and read the sort dropdown's options.",
|
|
63
|
+
"Select 'Featured first' and read the row order.",
|
|
64
|
+
"Select 'Promoted first' and read the row order.",
|
|
65
|
+
"Compare both against the default order.",
|
|
66
|
+
"Reload with one applied and read the order on first paint.",
|
|
67
|
+
],
|
|
68
|
+
expectedBehaviour: "Both sorts reorder the rows. A sort whose field is not marked sortable is dropped before the query runs, so the dropdown changes and nothing moves — these two shipped exactly that way and were dead on arrival, unreported, because a sort that does nothing looks like a list that happens to already be in that order.",
|
|
69
|
+
expectedUiState: "Featured rows rise to the top under the first sort and promoted rows under the second, and both orders differ from the default. After a reload the chosen order holds on first paint. An unchanged order under either is the failure.",
|
|
70
|
+
endResult: "Read-only; nothing persists beyond the URL.",
|
|
71
|
+
},
|
|
72
|
+
"checklist-selling-seller-listing-types-seller-products-auctions-default-load": {
|
|
73
|
+
roles: ["seller"],
|
|
74
|
+
startPage: "/store/products",
|
|
75
|
+
steps: [
|
|
76
|
+
"Sign in as tyson@beybladearena.in / TempPass123!.",
|
|
77
|
+
"Open /store/products with no query parameters and read the availability scope selected.",
|
|
78
|
+
"Read the rows and note whether sold or ended listings are among them.",
|
|
79
|
+
"Open the store's auctions listing the same way and read its scope and rows.",
|
|
80
|
+
"Switch each to the 'All' scope and compare the counts.",
|
|
81
|
+
],
|
|
82
|
+
expectedBehaviour: "A seller's own listing pages default to a scope that shows their live inventory, and the scope is derived from one shared helper so the server's first paint and the control agree. Where they are computed separately the first paint shows one set and the control claims another — and because the client caches the server's data indefinitely, the disagreement never resolves.",
|
|
83
|
+
expectedUiState: "Both pages open on the same declared scope with the tabs reflecting it. The All scope returns more rows than the default on at least one of them, which is what proves the default is scoping rather than showing everything already.",
|
|
84
|
+
endResult: "Read-only; nothing persists beyond the URL.",
|
|
85
|
+
},
|
|
86
|
+
"checklist-selling-seller-listing-types-auction-row-shows-bid-info": {
|
|
87
|
+
roles: ["seller"],
|
|
88
|
+
startPage: "/store/auctions",
|
|
89
|
+
steps: [
|
|
90
|
+
"Sign in as tyson@beybladearena.in / TempPass123!.",
|
|
91
|
+
"Open the store's auctions listing and read each row.",
|
|
92
|
+
"Check each shows the current bid, the bid count and time remaining.",
|
|
93
|
+
"Compare one row's figures against that auction's public page.",
|
|
94
|
+
"Find an ended auction and read what its row shows in place of time remaining.",
|
|
95
|
+
],
|
|
96
|
+
expectedBehaviour: "An auction row carries the three figures a seller needs to decide anything — current bid, bid count, time left. A row showing only a title and a price is a row that forces them to open every auction to learn its state.",
|
|
97
|
+
expectedUiState: "Every live row shows current bid, bid count and remaining time, and they match the public page. An ended row reads as ended rather than showing a negative or frozen countdown.",
|
|
98
|
+
endResult: "Read-only; nothing persists.",
|
|
99
|
+
},
|
|
100
|
+
"checklist-selling-seller-listing-types-seller-coupons-crud": {
|
|
101
|
+
roles: ["seller"],
|
|
102
|
+
startPage: "/store/coupons",
|
|
103
|
+
steps: [
|
|
104
|
+
"Sign in as tyson@beybladearena.in / TempPass123!.",
|
|
105
|
+
"Open the store's coupons page and read the existing coupons.",
|
|
106
|
+
"Create one with the code QASELLER10, 10% off, a minimum purchase of 500 and an end date a week out.",
|
|
107
|
+
"Save, RELOAD, and read every field.",
|
|
108
|
+
"Edit only the minimum purchase to 800, save, RELOAD, and read every field again.",
|
|
109
|
+
// A coupon field was once labelled with this word while storing decimal rupees —
|
|
110
|
+
// a 100x data-entry hazard — and a tester cannot search for a word the case
|
|
111
|
+
// refuses to name. The literal IS the thing being looked for.
|
|
112
|
+
// audit-money-units-ok: the word is the search target, not a stale reference
|
|
113
|
+
"Read the label and helper text on every money field, looking for the word 'paise'.",
|
|
114
|
+
"Type 799.50 into the minimum purchase and read whether it is accepted.",
|
|
115
|
+
"Delete the coupon and RELOAD to confirm.",
|
|
116
|
+
],
|
|
117
|
+
inputs: { code: "QASELLER10", percent: 10, minPurchaseBefore: 500, minPurchaseAfter: 800 },
|
|
118
|
+
expectedBehaviour: "Create, edit and delete persist, and an edit to one field leaves the rest alone — including the validity dates, which a wholesale replace would wipe when only one sub-field was sent. Money is stored in rupees with decimals throughout, so a money field labelled or validated in the hundredth sub-unit is a hundredfold data-entry hazard.",
|
|
119
|
+
expectedUiState: "Each operation survives its reload. After the minimum-purchase edit the dates and percentage are unchanged. No money field's label or helper text names a sub-unit, and 799.50 is accepted rather than rejected as a non-integer.",
|
|
120
|
+
endResult: "The coupon is deleted by the final step.",
|
|
121
|
+
},
|
|
122
|
+
"checklist-selling-seller-listing-types-seller-coupon-auto-scoped-to-own-store": {
|
|
123
|
+
roles: ["seller"],
|
|
124
|
+
startPage: "/store/coupons",
|
|
125
|
+
steps: [
|
|
126
|
+
"Sign in as tyson@beybladearena.in / TempPass123!.",
|
|
127
|
+
"Open the store's coupons page and start creating a coupon.",
|
|
128
|
+
"Read every field for a store or scope selector.",
|
|
129
|
+
"Create one coded QASCOPE10 and save.",
|
|
130
|
+
"RELOAD and read which store it is attached to.",
|
|
131
|
+
"Sign out, sign in as tester@letitrip.in / TempPass123!, and check QASCOPE10 does not appear in that seller's coupons.",
|
|
132
|
+
"Sign back in as tyson and delete it.",
|
|
133
|
+
],
|
|
134
|
+
inputs: { code: "QASCOPE10" },
|
|
135
|
+
expectedBehaviour: "The store is resolved from the session and written server-side — the form never offers it. A seller choosing their own scope could attach a discount to someone else's catalogue, so the absence of that control IS the security property.",
|
|
136
|
+
expectedUiState: "No store or scope selector is offered. The saved coupon is attached to Beyblade Arena and is absent from the other seller's list.",
|
|
137
|
+
expectedData: { scope: "seller" },
|
|
138
|
+
endResult: "The coupon is deleted by the final step.",
|
|
139
|
+
},
|
|
140
|
+
"checklist-selling-seller-listing-types-seller-coupon-cannot-be-site-wide": {
|
|
141
|
+
roles: ["seller"],
|
|
142
|
+
startPage: "/store/coupons",
|
|
143
|
+
steps: [
|
|
144
|
+
"Sign in as tyson@beybladearena.in / TempPass123!.",
|
|
145
|
+
"Open the store's coupon creation form and read every option.",
|
|
146
|
+
"Look for any control that would make the coupon platform-wide or apply it to all stores.",
|
|
147
|
+
"Create one coded QASITEWIDE10 and save.",
|
|
148
|
+
"Sign out and sign in as admin@letitrip.in / TempPass123!.",
|
|
149
|
+
"Open /admin/coupons, find QASITEWIDE10, and read its scope and store.",
|
|
150
|
+
"Sign back in as tyson and delete it.",
|
|
151
|
+
],
|
|
152
|
+
inputs: { code: "QASITEWIDE10" },
|
|
153
|
+
expectedBehaviour: "A seller cannot mint a platform-wide coupon. There is exactly one platform-wide slot per cart, and a discount in it is paid for across every store — that is an admin decision by definition.",
|
|
154
|
+
expectedUiState: "No site-wide or all-stores option is offered. In the admin list the coupon reads as seller-scoped and attached to Beyblade Arena, not as an admin coupon.",
|
|
155
|
+
expectedData: { scope: "seller" },
|
|
156
|
+
endResult: "The coupon is deleted by the final step.",
|
|
157
|
+
},
|
|
158
|
+
"checklist-selling-seller-listing-types-seller-coupon-no-stacking-toggle": {
|
|
159
|
+
roles: ["seller"],
|
|
160
|
+
startPage: "/store/coupons",
|
|
161
|
+
steps: [
|
|
162
|
+
"Sign in as tyson@beybladearena.in / TempPass123!.",
|
|
163
|
+
"Open the store's coupon creation form and read every field and toggle.",
|
|
164
|
+
"Look for any control about combining with other coupons or with platform coupons.",
|
|
165
|
+
"Open the store's 'How coupons work' help panel if one is offered and read the rules it states.",
|
|
166
|
+
"Compare those rules against what the form lets the seller configure.",
|
|
167
|
+
],
|
|
168
|
+
expectedBehaviour: "Stacking is a platform rule, not a per-coupon setting — one coupon per store plus one platform-wide, unconditionally. The old opt-out toggle was removed because nothing read it, and a control that appears to configure a rule it cannot change is worse than no control.",
|
|
169
|
+
expectedUiState: "No combine-with-other-coupons toggle is offered. Any help copy shown states the platform rule rather than implying the seller controls it.",
|
|
170
|
+
endResult: "Read-only; leave the form without saving.",
|
|
171
|
+
},
|
|
172
|
+
"checklist-selling-seller-listing-types-seller-coupon-second-for-same-store-rejected": {
|
|
173
|
+
roles: ["seller", "buyer"],
|
|
174
|
+
startPage: "/store/coupons",
|
|
175
|
+
steps: [
|
|
176
|
+
"Sign in as tyson@beybladearena.in / TempPass123!.",
|
|
177
|
+
"Create two seller coupons on this store: QAFIRST10 at 10% and QASECOND10 at 10%, both with no minimum purchase.",
|
|
178
|
+
"Sign out and sign in as vivaan.kapoor@gmail.com / TempPass123!.",
|
|
179
|
+
"Add product-beyblade-burst-regalia-genesis (₹1,399, Beyblade Arena) to the cart.",
|
|
180
|
+
"Open /checkout, complete the address and add-ons steps, and apply QAFIRST10.",
|
|
181
|
+
"Apply QASECOND10 and read the error.",
|
|
182
|
+
"Sign back in as tyson and delete both coupons.",
|
|
183
|
+
],
|
|
184
|
+
inputs: { coupon1: "QAFIRST10", coupon2: "QASECOND10" },
|
|
185
|
+
expectedBehaviour: "Two coupons from the same store cannot both apply. The second is refused rather than swapped in — silently replacing the first would change the discount under a buyer who thought they were adding to it.",
|
|
186
|
+
expectedUiState: "QAFIRST10 stays applied with its amount unchanged, and the error names it as the coupon already occupying the store's slot. QASECOND10 does not enter the applied list.",
|
|
187
|
+
expectedData: { storeCouponCount: 1 },
|
|
188
|
+
endResult: "Both coupons are deleted by the final step, and the cart is emptied.",
|
|
189
|
+
},
|
|
190
|
+
"checklist-selling-seller-listing-types-seller-coupon-stacks-with-admin-coupon": {
|
|
191
|
+
roles: ["seller", "buyer"],
|
|
192
|
+
startPage: "/store/coupons",
|
|
193
|
+
steps: [
|
|
194
|
+
"Sign in as tyson@beybladearena.in / TempPass123! and create QASTACK10 at 10% with no minimum purchase.",
|
|
195
|
+
"Sign out and sign in as vivaan.kapoor@gmail.com / TempPass123!.",
|
|
196
|
+
"Add product-beyblade-burst-regalia-genesis (₹1,399) and product-beyblade-original-driger-v (₹1,799) to the cart.",
|
|
197
|
+
"Open /checkout, complete the address and add-ons steps, and apply QASTACK10.",
|
|
198
|
+
"Apply FREESHIP499, a platform-wide coupon.",
|
|
199
|
+
"Read the applied list, both discount amounts and the total.",
|
|
200
|
+
"Sign back in as tyson and delete QASTACK10.",
|
|
201
|
+
],
|
|
202
|
+
inputs: { sellerCoupon: "QASTACK10", adminCoupon: "FREESHIP499" },
|
|
203
|
+
expectedBehaviour: "A seller coupon and a platform-wide one occupy different buckets, so both apply at once. This is the positive case the two rejection cases mirror — without it, a rule that refused everything would also pass them.",
|
|
204
|
+
expectedUiState: "Both codes are listed, each with its own amount and remove control, and the total falls by the sum. The seller coupon's amount is computed from this store's items only.",
|
|
205
|
+
expectedData: { appliedCouponCount: 2 },
|
|
206
|
+
endResult: "The coupon is deleted and the cart emptied by the final step.",
|
|
207
|
+
},
|
|
208
|
+
"checklist-selling-seller-listing-types-seller-coupon-category-restriction-works": {
|
|
209
|
+
roles: ["seller", "buyer"],
|
|
210
|
+
startPage: "/store/coupons",
|
|
211
|
+
steps: [
|
|
212
|
+
"Sign in as tyson@beybladearena.in / TempPass123!.",
|
|
213
|
+
"Create QACAT20 at 20%, restricted to the Beyblade Burst category, with no minimum purchase.",
|
|
214
|
+
"Sign out and sign in as vivaan.kapoor@gmail.com / TempPass123!.",
|
|
215
|
+
"Add product-beyblade-metal-storm-pegasus (₹1,299, Metal Fight) to the cart alone.",
|
|
216
|
+
"Open /checkout, complete the address and add-ons steps, and apply QACAT20 — read the error.",
|
|
217
|
+
"Add product-beyblade-burst-regalia-genesis (₹1,399, Burst) and apply QACAT20 again.",
|
|
218
|
+
"Read the discount amount and compare it against 20% of ₹1,399.",
|
|
219
|
+
"Sign back in as tyson and delete QACAT20.",
|
|
220
|
+
],
|
|
221
|
+
inputs: { code: "QACAT20", percent: 20, burstItemPrice: 1399, metalItemPrice: 1299 },
|
|
222
|
+
expectedBehaviour: "The restriction is tested by set intersection against the product's full category chain, and the discount applies only to the eligible items. The category is resolved lazily — the cart snapshots none — so the lookup fires only when a coupon actually carries a restriction.",
|
|
223
|
+
expectedUiState: "The Metal-only cart is refused with a message naming the category rather than reading 'Invalid coupon'. With the Burst item added the coupon applies, and its amount is about ₹279.80 — 20% of ₹1,399 — not 20% of the ₹2,698 combined subtotal.",
|
|
224
|
+
expectedData: { eligibleSubtotal: 1399 },
|
|
225
|
+
endResult: "The coupon is deleted and the cart emptied by the final step.",
|
|
226
|
+
},
|
|
227
|
+
"checklist-selling-seller-listing-types-seller-bundles-crud": {
|
|
228
|
+
roles: ["seller"],
|
|
229
|
+
startPage: "/store/bundles",
|
|
230
|
+
steps: [
|
|
231
|
+
"Sign in as tyson@beybladearena.in / TempPass123!.",
|
|
232
|
+
"Open the store's bundles page and create one named 'QA Bundle seller-crud'.",
|
|
233
|
+
"Add product-beyblade-burst-valkyrie (₹999) and product-beyblade-x-wizard-arrow (₹899) as members, and set the bundle price to 1500.",
|
|
234
|
+
"Save, RELOAD, and read the members, the price and the discount shown.",
|
|
235
|
+
"Attempt to add product-tester-standard-1, which belongs to a different store, as a member and read what happens.",
|
|
236
|
+
"Open the bundle's public page and read its members and price.",
|
|
237
|
+
"Delete the bundle.",
|
|
238
|
+
],
|
|
239
|
+
inputs: {
|
|
240
|
+
name: "QA Bundle seller-crud",
|
|
241
|
+
member1: "product-beyblade-burst-valkyrie",
|
|
242
|
+
member2: "product-beyblade-x-wizard-arrow",
|
|
243
|
+
bundlePrice: 1500,
|
|
244
|
+
memberTotal: 1898,
|
|
245
|
+
},
|
|
246
|
+
expectedBehaviour: "A bundle is all-or-nothing at a locked price below the sum of its members, and its members must come from ONE store — the store id is the key orders split on, so a cross-store bundle produces an order belonging to one seller containing another's products, with no notification, no shipping resolution and no payout for the second. That is refused at SAVE time rather than at add-to-cart, so existing bundles keep working.",
|
|
247
|
+
expectedUiState: "After the reload the bundle holds both members at ₹1,500 against a ₹1,898 total, with a discount shown. The cross-store member is refused with a message naming the reason. The public page lists both members rather than reading '0 items'.",
|
|
248
|
+
expectedData: { memberCount: 2, bundlePrice: 1500 },
|
|
249
|
+
endResult: "The bundle is deleted by the final step.",
|
|
250
|
+
},
|
|
251
|
+
"checklist-selling-seller-listing-types-seller-classified-crud": {
|
|
252
|
+
roles: ["seller"],
|
|
253
|
+
startPage: "/store/classified",
|
|
254
|
+
steps: [
|
|
255
|
+
"Sign in as tyson@beybladearena.in / TempPass123!.",
|
|
256
|
+
"Open the store's classifieds page and create one titled 'QA Classified seller-crud' at 900, city Pune, contact method phone, negotiable off.",
|
|
257
|
+
"Save, RELOAD, and read all four type-specific values.",
|
|
258
|
+
"Edit only the price to 1100, save, RELOAD, and read all four again.",
|
|
259
|
+
"Open the public page and read the purchase panel.",
|
|
260
|
+
"Delete the listing.",
|
|
261
|
+
],
|
|
262
|
+
inputs: { title: "QA Classified seller-crud", price: 900, city: "Pune", contactMethod: "phone" },
|
|
263
|
+
expectedBehaviour: "Classified-specific fields round-trip and the public purchase panel offers the contact path only — classifieds are capability-blocked from the cart entirely, so an Add to Cart here would be a purchase route the checkout cannot honour.",
|
|
264
|
+
expectedUiState: "After each reload all four values hold, including negotiable staying off. The public panel offers Make Offer or Request to Buy and no cart control.",
|
|
265
|
+
endResult: "The listing is deleted by the final step.",
|
|
266
|
+
},
|
|
267
|
+
"checklist-selling-seller-listing-types-seller-digitalcodes-crud": {
|
|
268
|
+
roles: ["seller"],
|
|
269
|
+
startPage: "/store/digital-codes",
|
|
270
|
+
steps: [
|
|
271
|
+
"Sign in as tyson@beybladearena.in / TempPass123!.",
|
|
272
|
+
"Open the store's digital-codes page and create one titled 'QA Digital Code seller-crud' at 350 with auto-claim delivery.",
|
|
273
|
+
"Add three codes to the pool, save, RELOAD, and read the mode and the pool count.",
|
|
274
|
+
"Remove one code, save, RELOAD, and read the pool count.",
|
|
275
|
+
"Open the public page and read the availability shown.",
|
|
276
|
+
"Delete the listing.",
|
|
277
|
+
],
|
|
278
|
+
inputs: { title: "QA Digital Code seller-crud", price: 350, codeCount: 3 },
|
|
279
|
+
expectedBehaviour: "The pool and the delivery mode round-trip, and availability for this type reads the NESTED pool count rather than a separate stock figure — a listing with stock remaining and an empty pool must read as unavailable, which is the one case that proves the right field is being consulted.",
|
|
280
|
+
expectedUiState: "After each reload the mode holds and the pool count matches what was saved. The public page's availability follows the pool.",
|
|
281
|
+
expectedData: { codesAvailable: 2 },
|
|
282
|
+
endResult: "The listing is deleted by the final step.",
|
|
283
|
+
},
|
|
284
|
+
"checklist-selling-seller-listing-types-seller-live-crud": {
|
|
285
|
+
roles: ["seller"],
|
|
286
|
+
startPage: "/store/live",
|
|
287
|
+
steps: [
|
|
288
|
+
"Sign in as tyson@beybladearena.in / TempPass123!.",
|
|
289
|
+
"Open the store's live-items page and create one titled 'QA Live Item seller-crud' at 3000, species Dog, breed Labrador, sex female, age 8 months.",
|
|
290
|
+
"Set the allowed jurisdictions to Maharashtra only.",
|
|
291
|
+
"Attempt to save WITHOUT a video and read the error.",
|
|
292
|
+
"Upload public/test-media/sample-video.mp4 and save.",
|
|
293
|
+
"RELOAD and read every type-specific value including the jurisdiction list.",
|
|
294
|
+
"Open the public page and read the species line and delivery restrictions.",
|
|
295
|
+
"Delete the listing.",
|
|
296
|
+
],
|
|
297
|
+
inputs: {
|
|
298
|
+
title: "QA Live Item seller-crud",
|
|
299
|
+
price: 3000,
|
|
300
|
+
species: "Dog",
|
|
301
|
+
jurisdictions: "Maharashtra",
|
|
302
|
+
video: "public/test-media/sample-video.mp4",
|
|
303
|
+
},
|
|
304
|
+
expectedBehaviour: "A live listing requires a video where every other type treats it as optional, and its jurisdiction list gates who may buy it at all. A list that saves empty silently removes the restriction rather than failing loudly, which is the one failure here with a consequence beyond the page.",
|
|
305
|
+
expectedUiState: "The videoless save is refused inline with the typed values preserved. After the reload every field holds, with Maharashtra still selected. The public page states the species line and the delivery restriction.",
|
|
306
|
+
endResult: "The listing is deleted by the final step.",
|
|
307
|
+
},
|
|
308
|
+
"checklist-selling-seller-listing-types-seller-prizedraws-crud": {
|
|
309
|
+
roles: ["seller"],
|
|
310
|
+
startPage: "/store/prize-draws",
|
|
311
|
+
steps: [
|
|
312
|
+
"Sign in as tyson@beybladearena.in / TempPass123!.",
|
|
313
|
+
"Open the store's prize-draws page and create one titled 'QA Prize Draw seller-crud' at 75 per entry, 20 entries, instant-reveal mode.",
|
|
314
|
+
"Save, RELOAD, and read the mode, the per-entry price and the entry count.",
|
|
315
|
+
"Open the public page and read the purchase panel's wording.",
|
|
316
|
+
"Check the panel describes buying an ENTRY rather than buying the prize.",
|
|
317
|
+
"Delete the listing.",
|
|
318
|
+
],
|
|
319
|
+
inputs: { title: "QA Prize Draw seller-crud", pricePerEntry: 75, entryCount: 20 },
|
|
320
|
+
expectedBehaviour: "A prize draw sells entries at a per-entry price, in one of two modes. The public wording matters as much as the data: a panel reading 'Buy now' beside a price misrepresents what the money buys, and that is a consumer claim rather than a copy preference.",
|
|
321
|
+
expectedUiState: "After the reload the mode, price and entry count hold. The public panel names an entry and its per-entry price rather than presenting the prize as the thing being bought.",
|
|
322
|
+
endResult: "The listing is deleted by the final step.",
|
|
323
|
+
},
|
|
324
|
+
"checklist-selling-seller-listing-types-seller-art-stickers-crud": {
|
|
325
|
+
roles: ["seller", "guest"],
|
|
326
|
+
startPage: "/store/products",
|
|
327
|
+
steps: [
|
|
328
|
+
"Sign in as tyson@beybladearena.in / TempPass123!.",
|
|
329
|
+
"Create an art listing titled 'QA Art Print seller-crud' at 650 with a size, material, finish and edition size.",
|
|
330
|
+
"Save, RELOAD, and read all four print fields.",
|
|
331
|
+
"Open /stores/store-beyblade-arena/art in a private window and look for the listing.",
|
|
332
|
+
"Read every other card in that tab and check none is an ordinary product.",
|
|
333
|
+
"Create a sticker listing titled 'QA Sticker Sheet seller-crud' at 200 and check it appears in the same tab.",
|
|
334
|
+
"Delete both listings.",
|
|
335
|
+
],
|
|
336
|
+
inputs: {
|
|
337
|
+
artTitle: "QA Art Print seller-crud",
|
|
338
|
+
artPrice: 650,
|
|
339
|
+
stickerTitle: "QA Sticker Sheet seller-crud",
|
|
340
|
+
stickerPrice: 200,
|
|
341
|
+
},
|
|
342
|
+
expectedBehaviour: "Art and stickers are real listing types with their own fields and their own public tab. They were added to the type union and the plugin registry without being added to the repository's alias map, so their queries ran with NO type filter — the tab rendered and returned the whole catalogue, which looks like a working page.",
|
|
343
|
+
expectedUiState: "Both listings round-trip their print fields and both appear in the store's Art & Stickers tab. Every card in that tab is an art or sticker listing — an ordinary Beyblade product among them is the dropped-filter failure.",
|
|
344
|
+
expectedData: { ordinaryProductsInTab: 0 },
|
|
345
|
+
endResult: "Both listings are deleted by the final step.",
|
|
346
|
+
},
|
|
347
|
+
};
|