@mohasinac/appkit 4.34.0 → 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/_internal/server/features/seo/sitemap.js +2 -2
- package/dist/_internal/server/functions/scheduled.d.ts +1 -2
- package/dist/_internal/server/functions/scheduled.js +8 -9
- package/dist/_internal/server/jobs/core/testerSandboxCleanup.d.ts +15 -0
- package/dist/_internal/server/jobs/core/testerSandboxCleanup.js +15 -6
- package/dist/_internal/server/jobs/handlers/index.d.ts +0 -1
- package/dist/_internal/server/jobs/handlers/index.js +0 -1
- package/dist/features/auth/schemas/firestore.d.ts +1 -0
- 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/repository/tester-checklist-item.repository.d.ts +16 -1
- package/dist/features/tester/repository/tester-checklist-item.repository.js +32 -6
- 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/events-tester-seed-data.js +77 -5
- package/dist/features/tester/seed-data/offers-tester-seed-data.js +23 -9
- package/dist/features/tester/seed-data/products-tester-seed-data.js +65 -49
- package/dist/features/tester/seed-data/tester-checklist-seed-data.js +744 -1
- package/dist/features/tester/seed-data/tester-window.d.ts +25 -0
- package/dist/features/tester/seed-data/tester-window.js +66 -0
- 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/dist/seed/users-seed-data.js +107 -4
- package/package.json +1 -1
- package/scripts/seed-cli.mjs +6 -0
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* WHY: Authored six-part procedures for the selling/sectionised-forms page.
|
|
3
|
+
* WHAT: 9 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
|
+
* 🛑 THE FIRST AND LAST CASES ARE THE SAME ASSERTION AT TWO SCALES: saving a form
|
|
10
|
+
* writes back only what changed. A form that submits its whole object from
|
|
11
|
+
* partly-populated state overwrites every field it did not load, returns a normal
|
|
12
|
+
* success, and is invisible without a reload — which is why both end in one.
|
|
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-sectionised-forms-form-sections-save-unchanged": {
|
|
23
|
+
roles: ["seller"],
|
|
24
|
+
startPage: "/store/products",
|
|
25
|
+
steps: [
|
|
26
|
+
"Sign in as tyson@beybladearena.in / TempPass123!.",
|
|
27
|
+
"Open the editor for 'Beyblade Burst B-01 Valkyrie' and expand every section.",
|
|
28
|
+
"Write down the value of every field in every section.",
|
|
29
|
+
"Change one field in ONE section — the description — and save.",
|
|
30
|
+
"RELOAD the editor and expand every section again.",
|
|
31
|
+
"Compare every field against what was written down.",
|
|
32
|
+
"Restore the description and save.",
|
|
33
|
+
],
|
|
34
|
+
inputs: { productId: "product-beyblade-burst-valkyrie" },
|
|
35
|
+
expectedBehaviour: "Editing one section leaves every other section's values untouched. A sectionised form that submits its whole object from state populated only by the sections the user opened silently blanks the rest — and the save reports success either way.",
|
|
36
|
+
expectedUiState: "After the reload only the description differs. Every other field in every other section holds its original value, including images, category, brand, stock and the type-specific fields.",
|
|
37
|
+
expectedData: { unintendedFieldChanges: 0 },
|
|
38
|
+
endResult: "The product is restored. Any field that emptied itself is the failure, and it is invisible without expanding every section after the reload.",
|
|
39
|
+
},
|
|
40
|
+
"checklist-selling-sectionised-forms-form-error-summary-jumps": {
|
|
41
|
+
roles: ["seller"],
|
|
42
|
+
startPage: "/store/products/new",
|
|
43
|
+
steps: [
|
|
44
|
+
"Sign in as tyson@beybladearena.in / TempPass123!.",
|
|
45
|
+
"Open /store/products/new and read the page before typing — note whether any errors are listed.",
|
|
46
|
+
"Leave required fields empty in two DIFFERENT sections.",
|
|
47
|
+
"Collapse both of those sections.",
|
|
48
|
+
"Attempt to publish.",
|
|
49
|
+
"Read the error summary and click an error belonging to a collapsed section.",
|
|
50
|
+
],
|
|
51
|
+
expectedBehaviour: "The summary appears only after a submit is attempted, and clicking an entry expands the owning section and moves to the field. An error in a collapsed section is otherwise unreachable — the user is told something is wrong and cannot see what.",
|
|
52
|
+
expectedUiState: "No summary before the publish attempt. Afterwards it lists errors from both sections, tagged with their section. Clicking one expands that section and scrolls the field into view.",
|
|
53
|
+
endResult: "Nothing is published. Leave the editor without saving.",
|
|
54
|
+
},
|
|
55
|
+
"checklist-selling-sectionised-forms-required-section-has-no-dead-chevron": {
|
|
56
|
+
roles: ["seller"],
|
|
57
|
+
startPage: "/store/products/new",
|
|
58
|
+
steps: [
|
|
59
|
+
"Sign in as tyson@beybladearena.in / TempPass123!.",
|
|
60
|
+
"Open /store/products/new and look at every section header.",
|
|
61
|
+
"Find any section that is always open because it is required.",
|
|
62
|
+
"Look at whether it still shows an expand chevron.",
|
|
63
|
+
"Click that chevron and read what happens.",
|
|
64
|
+
"Compare against a collapsible section's chevron.",
|
|
65
|
+
],
|
|
66
|
+
expectedBehaviour: "A section that cannot collapse does not display a collapse control. A chevron that responds to nothing teaches the user the whole form's chevrons are unreliable, which is a worse cost than the one dead control.",
|
|
67
|
+
expectedUiState: "Always-open sections have no chevron, or their chevron is visibly non-interactive. A chevron that looks identical to a working one and does nothing on click is the failure.",
|
|
68
|
+
endResult: "Read-only; leave the editor without saving.",
|
|
69
|
+
},
|
|
70
|
+
"checklist-selling-sectionised-forms-open-section-does-not-clip-dropdowns": {
|
|
71
|
+
roles: ["seller"],
|
|
72
|
+
startPage: "/store/products/new",
|
|
73
|
+
steps: [
|
|
74
|
+
"Sign in as tyson@beybladearena.in / TempPass123!.",
|
|
75
|
+
"Open /store/products/new and expand a section containing a picker.",
|
|
76
|
+
"Open that picker and read whether its full option list is visible.",
|
|
77
|
+
"Scroll while it is open and check it stays anchored to its field.",
|
|
78
|
+
"Open a picker in the LAST section of the form, near the bottom of the page.",
|
|
79
|
+
"Read whether its list is clipped by the section's own boundary.",
|
|
80
|
+
"Resize to 390 pixels wide and open the same picker.",
|
|
81
|
+
],
|
|
82
|
+
inputs: { mobileWidth: 390 },
|
|
83
|
+
expectedBehaviour: "A picker's list escapes its section's bounds. A section with overflow hidden — which is what a collapsing container needs to animate — clips any list that opens inside it, so the options exist and cannot be seen.",
|
|
84
|
+
expectedUiState: "The full option list is visible in every case, including in the last section and at 390 pixels. A list cut off at the section's edge is the failure, and it is worst at the bottom of the form where there is least room.",
|
|
85
|
+
endResult: "Read-only; leave the editor without saving.",
|
|
86
|
+
},
|
|
87
|
+
"checklist-selling-sectionised-forms-error-jump-lands-on-the-field": {
|
|
88
|
+
roles: ["seller"],
|
|
89
|
+
startPage: "/store/products/new",
|
|
90
|
+
steps: [
|
|
91
|
+
"Sign in as tyson@beybladearena.in / TempPass123!.",
|
|
92
|
+
"Open /store/products/new and leave a required field empty in a section far down the form.",
|
|
93
|
+
"Collapse that section and attempt to publish.",
|
|
94
|
+
"Click the error for that field in the summary.",
|
|
95
|
+
"Read where the page has scrolled to and whether the field is visible.",
|
|
96
|
+
"Check whether the field is focused and marked, not merely on screen.",
|
|
97
|
+
],
|
|
98
|
+
expectedBehaviour: "Clicking an error lands ON the field — section expanded, field scrolled into view, focused and marked. Landing on the section heading leaves the user hunting through a section that may hold a dozen fields.",
|
|
99
|
+
expectedUiState: "The offending field is visible, focused, and carries its own error message. Scrolling to the section heading and stopping there is the failure, as is scrolling past the field so it sits under a sticky bar.",
|
|
100
|
+
endResult: "Nothing is published. Leave the editor without saving.",
|
|
101
|
+
},
|
|
102
|
+
"checklist-selling-sectionised-forms-long-form-typing-is-smooth": {
|
|
103
|
+
roles: ["seller"],
|
|
104
|
+
startPage: "/store/products/new",
|
|
105
|
+
steps: [
|
|
106
|
+
"Sign in as tyson@beybladearena.in / TempPass123!.",
|
|
107
|
+
"Open /store/products/new and expand every section.",
|
|
108
|
+
"Type a long paragraph into the description field at normal speed.",
|
|
109
|
+
"Watch for characters lagging behind the keystrokes.",
|
|
110
|
+
"Attempt a publish so validation is running live, then keep typing into another field.",
|
|
111
|
+
"Watch again for lag.",
|
|
112
|
+
],
|
|
113
|
+
expectedBehaviour: "Typing stays responsive with every section open and live validation running. Validation runs on every change once a submit has been attempted — that is what keeps the error summary current — so this is the state where a form is most likely to stutter.",
|
|
114
|
+
expectedUiState: "Characters appear as they are typed, with no visible catch-up. The error summary updates as fields are fixed without the field itself becoming laggy.",
|
|
115
|
+
endResult: "Nothing is published. Leave the editor without saving.",
|
|
116
|
+
},
|
|
117
|
+
"checklist-selling-sectionised-forms-form-mobile-action-bar": {
|
|
118
|
+
roles: ["seller"],
|
|
119
|
+
startPage: "/store/products/new",
|
|
120
|
+
steps: [
|
|
121
|
+
"Sign in as tyson@beybladearena.in / TempPass123!.",
|
|
122
|
+
"Resize the browser window to 390 pixels wide and open /store/products/new.",
|
|
123
|
+
"Read the action bar at the bottom and every control in it.",
|
|
124
|
+
"Type into a field so the form becomes dirty and read the bar again.",
|
|
125
|
+
"Attempt a publish with fields missing and read what the bar shows.",
|
|
126
|
+
"Open the error sheet from the bar, close it, then attempt a publish again and check it reopens.",
|
|
127
|
+
"Count the fixed bars at the bottom.",
|
|
128
|
+
],
|
|
129
|
+
inputs: { mobileWidth: 390 },
|
|
130
|
+
expectedBehaviour: "The form's save row and its error sheet occupy the same measured bottom tier as everything else. The sheet's label carries the error COUNT, because the panel only republishes when that label changes — a static label would freeze the sheet's contents while the user fixes fields. Reopening on a second failed submit is driven by a counter rather than a flag, so an ordinary re-render does not reopen what the user just closed.",
|
|
131
|
+
expectedUiState: "Discard, Save draft and Publish are all reachable and none is clipped. The sheet's label states how many issues remain and that number falls as fields are fixed. Closing it and submitting again reopens it. Exactly one bottom tab bar sits below the action bar.",
|
|
132
|
+
endResult: "Nothing is published. Restore the window width afterwards.",
|
|
133
|
+
},
|
|
134
|
+
"checklist-selling-sectionised-forms-form-conditional-fields-drop-values": {
|
|
135
|
+
roles: ["seller"],
|
|
136
|
+
startPage: "/store/products/new",
|
|
137
|
+
steps: [
|
|
138
|
+
"Sign in as tyson@beybladearena.in / TempPass123!.",
|
|
139
|
+
"Open /store/products/new and find a control that reveals conditional fields — a listing type or a shipping choice.",
|
|
140
|
+
"Set it so the conditional fields appear and fill them in, noting each value.",
|
|
141
|
+
"Change the controlling field so those conditionals are hidden.",
|
|
142
|
+
"Change it back so they reappear.",
|
|
143
|
+
"Read whether the values are still there.",
|
|
144
|
+
"Publish and then reload the editor, reading those fields again.",
|
|
145
|
+
],
|
|
146
|
+
expectedBehaviour: "A hidden conditional field either keeps its value or is genuinely dropped — but whichever it does, the saved record must match what the form displayed at submit. The dangerous case is a field that looks retained on screen and is dropped on save, or one dropped from view and still written.",
|
|
147
|
+
expectedUiState: "Toggling the controlling field back and forth leaves the conditional values in a state the form shows honestly. After publishing and reloading, the stored values match what was on screen when Publish was pressed.",
|
|
148
|
+
endResult: "Delete the created listing afterwards. A field the form showed and did not save is the failure, and so is one it hid and saved anyway.",
|
|
149
|
+
},
|
|
150
|
+
"checklist-selling-sectionised-forms-site-settings-save-still-writes-everything": {
|
|
151
|
+
roles: ["admin"],
|
|
152
|
+
startPage: "/admin/site",
|
|
153
|
+
steps: [
|
|
154
|
+
"Sign in as admin@letitrip.in / TempPass123!.",
|
|
155
|
+
"Open /admin/site and walk every tab, writing down a distinctive value from each.",
|
|
156
|
+
"Open one tab — Fees — and change a single field.",
|
|
157
|
+
"Save.",
|
|
158
|
+
"RELOAD /admin/site and walk every tab again.",
|
|
159
|
+
"Compare each noted value against what was written down.",
|
|
160
|
+
"Restore the changed field and save.",
|
|
161
|
+
],
|
|
162
|
+
expectedBehaviour: "Saving one tab of the settings singleton preserves every other tab. This is the same defect as the first case at the largest possible scale: the whole document is one record, so a form submitting its full object from a partly-populated state can blank branding, fees, integrations and legal copy in one save that reports success.",
|
|
163
|
+
expectedUiState: "After the reload only the Fees field differs. Every noted value on every other tab is unchanged — branding, announcement copy, integrations, shipping, legal pages. The masked credentials are still shown as masked rather than blank.",
|
|
164
|
+
expectedData: { unintendedFieldChanges: 0 },
|
|
165
|
+
endResult: "The changed field is restored. This is the highest-blast-radius save in the application; check every tab rather than sampling two.",
|
|
166
|
+
},
|
|
167
|
+
};
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* WHY: Authored six-part procedures for the selling/seller-analytics-payouts page.
|
|
3
|
+
* WHAT: 6 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 PAYOUT IS MONEY LEAVING THE PLATFORM, so several cases here read the FULL
|
|
10
|
+
* deduction breakdown rather than only the net figure. A net amount alone cannot
|
|
11
|
+
* distinguish a correct deduction from a wrong one, and the seller-side deduction
|
|
12
|
+
* is deliberately uncapped where the buyer-facing platform fee is capped — so the
|
|
13
|
+
* two are not expected to agree and a case that assumes they do is wrong.
|
|
14
|
+
*
|
|
15
|
+
* @tag domain:tester
|
|
16
|
+
* @tag layer:seed
|
|
17
|
+
* @tag pattern:none
|
|
18
|
+
* @tag access:server-only
|
|
19
|
+
* @tag consumers:seed-data/authored/index.ts
|
|
20
|
+
* @tag sideEffects:none
|
|
21
|
+
*/
|
|
22
|
+
export const authored = {
|
|
23
|
+
"checklist-selling-seller-analytics-payouts-view-analytics": {
|
|
24
|
+
roles: ["seller"],
|
|
25
|
+
startPage: "/store/analytics",
|
|
26
|
+
steps: [
|
|
27
|
+
"Sign in as tyson@beybladearena.in / TempPass123!.",
|
|
28
|
+
"Open the store's analytics page and read every figure and chart on it.",
|
|
29
|
+
"Write down any figure reading zero, a dash, or 'undefined'.",
|
|
30
|
+
"Change the date range if one is offered and read the figures again.",
|
|
31
|
+
"Compare the order count shown against the number of orders in /store/orders.",
|
|
32
|
+
"Reload the page and check the figures are the same.",
|
|
33
|
+
],
|
|
34
|
+
expectedBehaviour: "Analytics read from pre-computed rollups rather than scanning every order per request — that is the pattern this codebase uses to keep a dashboard load inside its read budget. A figure that fails to compute must read as unknown rather than as zero: zero is a claim, and it is the wrong one.",
|
|
35
|
+
expectedUiState: "Figures and charts render with real values. The order count is consistent with the orders list. A dash for a genuinely unavailable metric is acceptable; a confident zero beside a list that clearly has rows is not.",
|
|
36
|
+
endResult: "Read-only; nothing persists. Note any metric reading zero against visible data — that is the failure this case exists for.",
|
|
37
|
+
},
|
|
38
|
+
"checklist-selling-seller-analytics-payouts-view-payouts": {
|
|
39
|
+
roles: ["seller"],
|
|
40
|
+
startPage: "/store/payouts",
|
|
41
|
+
steps: [
|
|
42
|
+
"Sign in as tyson@beybladearena.in / TempPass123!.",
|
|
43
|
+
"Open /store/payouts and read every row — period, gross, deductions, net and status.",
|
|
44
|
+
"Read every status filter offered and select each in turn.",
|
|
45
|
+
"Write down any filter returning zero rows, then check the unfiltered list for rows of that status.",
|
|
46
|
+
"Read the sort dropdown's default and confirm it is one of the offered options.",
|
|
47
|
+
"Open one payout row.",
|
|
48
|
+
],
|
|
49
|
+
expectedBehaviour: "The list shows each payout with its own deductions rather than a bare net figure. Status filters use the values payouts actually hold — and a default sort that is not among the offered options opens the dropdown with nothing selected, which is a real defect on this listing family.",
|
|
50
|
+
expectedUiState: "Rows show period, gross, deductions and net. Every status filter either returns its own rows or is empty with none in the unfiltered list either. The sort default is one of the options. Rows open a detail view.",
|
|
51
|
+
endResult: "Read-only; nothing persists beyond the URL.",
|
|
52
|
+
},
|
|
53
|
+
"checklist-selling-seller-analytics-payouts-payouts-checkbox-select": {
|
|
54
|
+
roles: ["seller"],
|
|
55
|
+
startPage: "/store/payouts",
|
|
56
|
+
steps: [
|
|
57
|
+
"Sign in as tyson@beybladearena.in / TempPass123!.",
|
|
58
|
+
"Open /store/payouts and tick the checkbox on one row.",
|
|
59
|
+
"Read the bulk action bar that appears and the count it states.",
|
|
60
|
+
"Click the row itself, away from the checkbox, and read what happens.",
|
|
61
|
+
"Tick a second row and read the count again.",
|
|
62
|
+
"Use select-all and read the count against the number of rows on the page.",
|
|
63
|
+
"Clear the selection and check the bar disappears.",
|
|
64
|
+
],
|
|
65
|
+
expectedBehaviour: "Selecting rows and opening a row are separate gestures — merely WIRING selection must not disable navigation. A card or row that stops opening the moment a selection handler exists, regardless of whether anything is selected, is the specific defect this checks.",
|
|
66
|
+
expectedUiState: "Ticking a checkbox shows a bulk bar with an accurate count. Clicking the row body with nothing selected still opens the payout. Select-all matches the visible row count. Clearing hides the bar without leaving an empty strip behind.",
|
|
67
|
+
endResult: "Clear the selection; nothing is mutated. A row that will not open while a checkbox exists is the failure.",
|
|
68
|
+
},
|
|
69
|
+
"checklist-selling-seller-analytics-payouts-payouts-detail-panel": {
|
|
70
|
+
roles: ["seller"],
|
|
71
|
+
startPage: "/store/payouts",
|
|
72
|
+
steps: [
|
|
73
|
+
"Sign in as tyson@beybladearena.in / TempPass123!.",
|
|
74
|
+
"Open /store/payouts and open a payout's detail panel from the list.",
|
|
75
|
+
"Write down every field label it shows, in order.",
|
|
76
|
+
"Read the deduction lines and check they add up to gross minus net.",
|
|
77
|
+
"Read the list of orders included in the payout.",
|
|
78
|
+
"Close the panel and check the list is unchanged behind it.",
|
|
79
|
+
],
|
|
80
|
+
expectedBehaviour: "The panel shows the full breakdown — gross, each deduction, net — and the orders that make it up. The arithmetic is the check: a net figure alone cannot distinguish a correct deduction from a wrong one, and a payout is money actually leaving.",
|
|
81
|
+
expectedUiState: "Gross minus the listed deductions equals the net shown, to the paisa. The included orders are listed and identifiable. Any rounding gap is a finding, not a rounding artefact.",
|
|
82
|
+
expectedData: { deductionsReconcile: true },
|
|
83
|
+
endResult: "Read-only; close the panel without acting.",
|
|
84
|
+
},
|
|
85
|
+
"checklist-selling-seller-analytics-payouts-payouts-reminder-toggle": {
|
|
86
|
+
roles: ["seller"],
|
|
87
|
+
startPage: "/store/payouts",
|
|
88
|
+
steps: [
|
|
89
|
+
"Sign in as tyson@beybladearena.in / TempPass123!.",
|
|
90
|
+
"Open /store/payouts and find the payout reminder toggle.",
|
|
91
|
+
"Read its current state.",
|
|
92
|
+
"Turn it OFF and save if a save is required.",
|
|
93
|
+
"RELOAD the page and read the toggle's state.",
|
|
94
|
+
"Turn it back on, save, and reload to confirm.",
|
|
95
|
+
],
|
|
96
|
+
expectedBehaviour: "The preference persists server-side. Off is the direction worth testing when the default is on: a toggle that never saves reads back as its default and passes a test that only ever turns it on.",
|
|
97
|
+
expectedUiState: "After the reload the toggle is still off. A toggle that has reverted to on is the failure, and the save will have reported success.",
|
|
98
|
+
expectedData: { reminderEnabled: false },
|
|
99
|
+
endResult: "The toggle is back on by the final step, so payout reminders are not left suppressed.",
|
|
100
|
+
},
|
|
101
|
+
"checklist-selling-seller-analytics-payouts-seller-payout-detail-full-page": {
|
|
102
|
+
roles: ["seller"],
|
|
103
|
+
startPage: "/store/payouts",
|
|
104
|
+
steps: [
|
|
105
|
+
"Sign in as tyson@beybladearena.in / TempPass123!.",
|
|
106
|
+
"Open /store/payouts and open a payout's detail panel from the list.",
|
|
107
|
+
"Write down every field label it shows.",
|
|
108
|
+
"Note the payout's id and close the panel.",
|
|
109
|
+
"Open that payout's standalone detail page directly by URL.",
|
|
110
|
+
"Write down every field label it shows and compare the two lists.",
|
|
111
|
+
"Reload the standalone page and confirm it still renders.",
|
|
112
|
+
],
|
|
113
|
+
expectedBehaviour: "The panel and the page render from one shared content component, so their fields are identical by construction. The standalone page exists because a panel cannot be bookmarked, shared with a colleague, or reopened after a crash — and a payout is exactly the record someone needs to send to someone else.",
|
|
114
|
+
expectedUiState: "Both surfaces show the same fields with the same values. The standalone page survives a reload with the same payout loaded. A field present in one and missing from the other means a second copy of the content component has appeared.",
|
|
115
|
+
endResult: "Read-only; nothing persists.",
|
|
116
|
+
},
|
|
117
|
+
};
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* WHY: Authored six-part procedures for the selling/seller-bids-bundles-filters page.
|
|
3
|
+
* WHAT: 4 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 FILTER CHIP'S id IS PASSED STRAIGHT INTO AN EQUALITY, and the comparison is
|
|
10
|
+
* byte-exact. A chip whose value is a display label, a wrong case, or a status the
|
|
11
|
+
* documents never hold returns zero rows forever with no error anywhere — so every
|
|
12
|
+
* case here reads the chip's ROWS, not merely that the chip responds.
|
|
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-bids-bundles-filters-seller-bids-status-filter": {
|
|
23
|
+
roles: ["seller"],
|
|
24
|
+
startPage: "/store/bids",
|
|
25
|
+
steps: [
|
|
26
|
+
"Sign in as tyson@beybladearena.in / TempPass123!.",
|
|
27
|
+
"Open the store's bids page and note the total row count with no filter applied.",
|
|
28
|
+
"Read every status chip offered and write the list down.",
|
|
29
|
+
"Select each chip in turn and read the row count and the statuses shown in the rows.",
|
|
30
|
+
"Write down any chip that returns zero rows.",
|
|
31
|
+
"For each such chip, check the unfiltered list for rows carrying that status.",
|
|
32
|
+
],
|
|
33
|
+
expectedBehaviour: "Every chip offered corresponds to a status bids actually hold. The last step is what separates an empty chip from a broken one: a chip returning nothing while the unfiltered list contains rows of that status is a wrong filter value, and it fails silently because a byte-exact equality that matches nothing is not an error.",
|
|
34
|
+
expectedUiState: "Each chip either returns rows of its own status, or returns none AND the unfiltered list has none either. A chip that is empty while matching rows are visible unfiltered is the failure, named by chip.",
|
|
35
|
+
expectedData: { chipsEmptyWithMatchingRows: 0 },
|
|
36
|
+
endResult: "Read-only; nothing persists beyond the URL.",
|
|
37
|
+
},
|
|
38
|
+
"checklist-selling-seller-bids-bundles-filters-seller-bids-sort-dropdown": {
|
|
39
|
+
roles: ["seller"],
|
|
40
|
+
startPage: "/store/bids",
|
|
41
|
+
steps: [
|
|
42
|
+
"Sign in as tyson@beybladearena.in / TempPass123!.",
|
|
43
|
+
"Open the store's bids page and read the sort dropdown's default selection and the row order.",
|
|
44
|
+
"Select each other sort option in turn, reading the row order after each.",
|
|
45
|
+
"Write down any option that does not change the order.",
|
|
46
|
+
"Check that the dropdown's default is one of the options it offers.",
|
|
47
|
+
"Reload with a sort applied and read the order on first paint.",
|
|
48
|
+
],
|
|
49
|
+
expectedBehaviour: "Every sort option reorders the rows. An option whose field is not marked sortable is dropped before the query runs, so the dropdown selection changes and nothing moves. A default that is not among the offered options opens the dropdown with nothing selected.",
|
|
50
|
+
expectedUiState: "Each option produces a visibly different order. The default is one of the listed options. After the reload the rows are in the selected order on first paint, not the default order that then re-sorts.",
|
|
51
|
+
expectedData: { inertSortOptions: 0 },
|
|
52
|
+
endResult: "Read-only; nothing persists beyond the URL.",
|
|
53
|
+
},
|
|
54
|
+
"checklist-selling-seller-bids-bundles-filters-seller-bids-bidder-search": {
|
|
55
|
+
roles: ["seller"],
|
|
56
|
+
startPage: "/store/bids",
|
|
57
|
+
steps: [
|
|
58
|
+
"Sign in as tyson@beybladearena.in / TempPass123!.",
|
|
59
|
+
"Open the store's bids page and read a bidder identifier from any row.",
|
|
60
|
+
"Read the search box's placeholder or helper text for how it matches.",
|
|
61
|
+
"Type that identifier exactly and read the results.",
|
|
62
|
+
"Clear the box, type only the first half of it, and read the results.",
|
|
63
|
+
"Clear the box, type zzzznope, and read the results.",
|
|
64
|
+
],
|
|
65
|
+
inputs: { nonsenseQuery: "zzzznope" },
|
|
66
|
+
expectedBehaviour: "Bidder identities are PII-encrypted at rest, so they can only be matched exactly through a blind index — a partial match is impossible by design rather than by omission. The box must SAY so, because otherwise a partial search returning nothing reads as broken.",
|
|
67
|
+
expectedUiState: "The exact identifier returns its rows. The partial one returns none, and the box states that matching is exact. 'zzzznope' returns none rather than the full list.",
|
|
68
|
+
expectedData: { nonsenseResultCount: 0 },
|
|
69
|
+
endResult: "Read-only. Bidder names shown in these rows should be masked — an unmasked full name here is a separate and more serious finding than anything about the search.",
|
|
70
|
+
},
|
|
71
|
+
"checklist-selling-seller-bids-bundles-filters-seller-bundles-active-filter": {
|
|
72
|
+
roles: ["seller"],
|
|
73
|
+
startPage: "/store/bundles",
|
|
74
|
+
steps: [
|
|
75
|
+
"Sign in as tyson@beybladearena.in / TempPass123!.",
|
|
76
|
+
"Open the store's bundles page and note the total row count.",
|
|
77
|
+
"Read the active filter's options.",
|
|
78
|
+
"Select active and read the rows and their states.",
|
|
79
|
+
"Select inactive and read the rows and their states.",
|
|
80
|
+
"Confirm the two counts add up to the unfiltered total.",
|
|
81
|
+
"Open one bundle and check its member list is populated rather than reading zero items.",
|
|
82
|
+
],
|
|
83
|
+
expectedBehaviour: "The two filter states partition the list, so their counts sum to the total. The member check matters separately: a bundle's members are mirrored onto the bundle for index-friendly reads, and a reader trusting only that mirror shows an empty bundle whenever a write path forgot to update it.",
|
|
84
|
+
expectedUiState: "Active and inactive each return their own rows and the counts sum to the unfiltered total. The opened bundle lists its members with titles and images rather than reading '0 items'.",
|
|
85
|
+
expectedData: { partitionSumsToTotal: true },
|
|
86
|
+
endResult: "Read-only; nothing persists beyond the URL.",
|
|
87
|
+
},
|
|
88
|
+
};
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* WHY: Authored six-part procedures for the selling/seller-catalog-org page.
|
|
3
|
+
* WHAT: 7 case(s), keyed by full checklist id.
|
|
4
|
+
*
|
|
5
|
+
* Written by hand, case by case, against the label each one states. There is no
|
|
6
|
+
* generator: the authoring scripts were deleted once it was clear they were
|
|
7
|
+
* scaffolding around work that is simply writing.
|
|
8
|
+
*
|
|
9
|
+
* 🛑 A PRODUCT CARRIES ITS FULL ANCESTOR CHAIN so a parent category page can match
|
|
10
|
+
* on its own id alone. Nothing on the WRITE side derives that chain yet — the
|
|
11
|
+
* convention is maintained by hand in the seed — so a product filed through a form
|
|
12
|
+
* against a deep category gets a single-slug array and is invisible on every
|
|
13
|
+
* ancestor page. The first category case checks exactly that.
|
|
14
|
+
*
|
|
15
|
+
* @tag domain:tester
|
|
16
|
+
* @tag layer:seed
|
|
17
|
+
* @tag pattern:none
|
|
18
|
+
* @tag access:server-only
|
|
19
|
+
* @tag consumers:seed-data/authored/index.ts
|
|
20
|
+
* @tag sideEffects:none
|
|
21
|
+
*/
|
|
22
|
+
export const authored = {
|
|
23
|
+
"checklist-selling-seller-catalog-org-seller-categories-crud": {
|
|
24
|
+
roles: ["seller"],
|
|
25
|
+
startPage: "/store/categories",
|
|
26
|
+
steps: [
|
|
27
|
+
"Sign in as tyson@beybladearena.in / TempPass123!.",
|
|
28
|
+
"Open the store's categories page and read the list.",
|
|
29
|
+
"Create one named 'QA Category catalog-org' and save.",
|
|
30
|
+
"RELOAD and confirm it is listed.",
|
|
31
|
+
"Rename it to 'QA Category catalog-org renamed' and save, then RELOAD and read the name.",
|
|
32
|
+
"Delete it and RELOAD to confirm it is gone.",
|
|
33
|
+
],
|
|
34
|
+
inputs: {
|
|
35
|
+
name: "QA Category catalog-org",
|
|
36
|
+
renamed: "QA Category catalog-org renamed",
|
|
37
|
+
},
|
|
38
|
+
expectedBehaviour: "Create, rename and delete all persist. The rename is the one worth watching: a create handler that derives a slug from the name while the update handler leaves the slug alone is the deliberate convention here, so the NAME must change while the URL stays stable.",
|
|
39
|
+
expectedUiState: "Each operation survives its reload. After the rename the new name is shown; the category's own URL is unchanged, which is correct rather than a bug — an auto-recomputed slug would break every existing link.",
|
|
40
|
+
endResult: "The category is deleted by the final step.",
|
|
41
|
+
},
|
|
42
|
+
"checklist-selling-seller-catalog-org-seller-sublisting-categories-crud": {
|
|
43
|
+
roles: ["seller"],
|
|
44
|
+
startPage: "/store/sublisting-categories",
|
|
45
|
+
steps: [
|
|
46
|
+
"Sign in as tyson@beybladearena.in / TempPass123!.",
|
|
47
|
+
"Open the store's sublisting-categories page and read the list.",
|
|
48
|
+
"Create one named 'QA Sublisting catalog-org' with a description and save.",
|
|
49
|
+
"RELOAD and read every field.",
|
|
50
|
+
"Rename it to 'QA Sublisting catalog-org renamed', save, and RELOAD.",
|
|
51
|
+
"Read the page title and description shown for it, and check they reflect the new name.",
|
|
52
|
+
"Delete it.",
|
|
53
|
+
],
|
|
54
|
+
inputs: {
|
|
55
|
+
name: "QA Sublisting catalog-org",
|
|
56
|
+
renamed: "QA Sublisting catalog-org renamed",
|
|
57
|
+
},
|
|
58
|
+
expectedBehaviour: "A sublisting category's derived page metadata is recomputed on rename. Deriving it only at creation freezes the title and description at the original name, so the page keeps describing itself as something it is no longer called — a create-time transform the update path does not repeat.",
|
|
59
|
+
expectedUiState: "After the rename and reload, both the name AND the derived title and description reflect the new name. Metadata still naming the original is the failure.",
|
|
60
|
+
endResult: "The sublisting category is deleted by the final step.",
|
|
61
|
+
},
|
|
62
|
+
"checklist-selling-seller-catalog-org-sublisting-categories-standard-toolbar": {
|
|
63
|
+
roles: ["seller"],
|
|
64
|
+
startPage: "/store/sublisting-categories",
|
|
65
|
+
steps: [
|
|
66
|
+
"Sign in as tyson@beybladearena.in / TempPass123!.",
|
|
67
|
+
"Open the store's sublisting-categories page and write down every toolbar control, left to right.",
|
|
68
|
+
"Open /store/products and write down its toolbar controls the same way.",
|
|
69
|
+
"Compare the two orderings.",
|
|
70
|
+
"Type zzzznope into the search box and read the result count.",
|
|
71
|
+
"Look for any empty gap in the toolbar where a control would sit.",
|
|
72
|
+
],
|
|
73
|
+
inputs: { nonsenseQuery: "zzzznope" },
|
|
74
|
+
expectedBehaviour: "This listing uses the shared toolbar scaffold, so its controls match every other listing's in kind and order. The nonsense query is the control that proves the search box filters rather than decorates.",
|
|
75
|
+
expectedUiState: "The two toolbars present the same controls in the same order. 'zzzznope' returns zero rows and an empty state, not the full list. No empty gap where a control was removed.",
|
|
76
|
+
expectedData: { nonsenseResultCount: 0 },
|
|
77
|
+
endResult: "Read-only; nothing persists beyond the URL.",
|
|
78
|
+
},
|
|
79
|
+
"checklist-selling-seller-catalog-org-seller-listing-templates-crud": {
|
|
80
|
+
roles: ["seller"],
|
|
81
|
+
startPage: "/store/listing-templates",
|
|
82
|
+
steps: [
|
|
83
|
+
"Sign in as tyson@beybladearena.in / TempPass123!.",
|
|
84
|
+
"Open /store/listing-templates and read the list.",
|
|
85
|
+
"Create a template named 'QA Template catalog-org' with a category, a condition and a description filled in, and save.",
|
|
86
|
+
"RELOAD and read every field of the saved template.",
|
|
87
|
+
"Open /store/products/new and apply that template.",
|
|
88
|
+
"Read which fields it populated.",
|
|
89
|
+
"Delete the template.",
|
|
90
|
+
],
|
|
91
|
+
inputs: { name: "QA Template catalog-org" },
|
|
92
|
+
expectedBehaviour: "A template stores a reusable set of field values and applying it populates them in a new listing form. There are two template features in this codebase — an older product-template one superseded by this listing-template one — so confirming which page is reachable from the sidebar matters as much as the CRUD itself.",
|
|
93
|
+
expectedUiState: "The template survives its reload with every field. Applying it in the product form fills those fields rather than only the name. A template that saves but populates nothing is the failure.",
|
|
94
|
+
endResult: "The template is deleted by the final step; leave the product editor without saving.",
|
|
95
|
+
},
|
|
96
|
+
"checklist-selling-seller-catalog-org-seller-category-inline-create": {
|
|
97
|
+
roles: ["seller"],
|
|
98
|
+
startPage: "/store/products/new",
|
|
99
|
+
steps: [
|
|
100
|
+
"Sign in as tyson@beybladearena.in / TempPass123!.",
|
|
101
|
+
"Open /store/products/new and find the category picker.",
|
|
102
|
+
"Type QA Category inline-create into its search box.",
|
|
103
|
+
"Read what the picker offers when nothing matches.",
|
|
104
|
+
"Use the create control and complete the form it opens.",
|
|
105
|
+
"Read the picker's selection afterwards.",
|
|
106
|
+
],
|
|
107
|
+
inputs: { categoryName: "QA Category inline-create" },
|
|
108
|
+
expectedBehaviour: "The category picker offers inline creation for the same reason the brand picker does — a seller listing something genuinely new should not have to abandon the form. The created option is auto-selected.",
|
|
109
|
+
expectedUiState: "A create control appears when the search matches nothing, and after saving the picker shows the new category as selected without being re-opened.",
|
|
110
|
+
endResult: "A category exists. Leave the editor without saving — it is what the next case reads.",
|
|
111
|
+
},
|
|
112
|
+
"checklist-selling-seller-catalog-org-seller-category-inline-create-persists": {
|
|
113
|
+
roles: ["seller", "guest"],
|
|
114
|
+
startPage: "/store/products/new",
|
|
115
|
+
steps: [
|
|
116
|
+
"Sign in as tyson@beybladearena.in / TempPass123!.",
|
|
117
|
+
"Open /store/products/new, search the category picker for QA Category inline-create, and confirm it is offered.",
|
|
118
|
+
"Type 'QA Product inline-category' as the title, select that category, type 400 as the price, and publish.",
|
|
119
|
+
"Open the product's public page and read its category links below the title.",
|
|
120
|
+
"Count how many category links are shown.",
|
|
121
|
+
"Click the one naming QA Category inline-create.",
|
|
122
|
+
"Delete the product and the category afterwards.",
|
|
123
|
+
],
|
|
124
|
+
inputs: {
|
|
125
|
+
categoryName: "QA Category inline-create",
|
|
126
|
+
title: "QA Product inline-category",
|
|
127
|
+
price: 400,
|
|
128
|
+
},
|
|
129
|
+
expectedBehaviour: "The category persists and the product is filed under it. The product's category list is supposed to be the full ancestor chain, and nothing on the write side derives that chain today — so a product created through this form gets a single slug and is unreachable from every ancestor page.",
|
|
130
|
+
expectedUiState: "The category is offered after a reload and the product's public page links it. Record how many category links the product shows: ONE, where the chosen category has ancestors, is the known gap this case is here to make visible rather than a surprise.",
|
|
131
|
+
expectedData: { categoryLinksShown: 1 },
|
|
132
|
+
endResult: "The product and the category are deleted by the final step. If only one link appears, report it — the ancestor chain being seed-only is a documented outstanding follow-up.",
|
|
133
|
+
},
|
|
134
|
+
"checklist-selling-seller-catalog-org-seller-category-inline-create-duplicate-rejected": {
|
|
135
|
+
roles: ["seller"],
|
|
136
|
+
startPage: "/store/products/new",
|
|
137
|
+
steps: [
|
|
138
|
+
"Sign in as tyson@beybladearena.in / TempPass123!.",
|
|
139
|
+
"Open /store/products/new and open the category picker.",
|
|
140
|
+
"Use the create control and type the name of a category that already exists — Beyblade Burst.",
|
|
141
|
+
"Save and read the message.",
|
|
142
|
+
"Open the picker and search that name, counting the matching options.",
|
|
143
|
+
"Try again with a case variant: beyblade BURST.",
|
|
144
|
+
],
|
|
145
|
+
inputs: { existingCategory: "Beyblade Burst", caseVariant: "beyblade BURST" },
|
|
146
|
+
expectedBehaviour: "A duplicate category is refused. Categories are matched by id on the read side rather than by name, so a duplicate is less immediately destructive than a duplicate brand — but it splits a seller's own catalogue across two near-identical entries with no way to merge them.",
|
|
147
|
+
expectedUiState: "Both attempts are refused with a readable message, and exactly one option matches the name in the picker.",
|
|
148
|
+
expectedData: { matchingOptionCount: 1 },
|
|
149
|
+
endResult: "Leave the editor without saving.",
|
|
150
|
+
},
|
|
151
|
+
};
|