@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,158 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* WHY: Authored six-part procedures for the admin/category-brand-authoring page.
|
|
3
|
+
* WHAT: 8 case(s), keyed by full checklist id.
|
|
4
|
+
*
|
|
5
|
+
* The WRITE side of the tree. Its read side is content-discovery/category-brand-relations;
|
|
6
|
+
* these are the operations that can corrupt what that page then renders.
|
|
7
|
+
*
|
|
8
|
+
* 🛑 ONE OF THESE IS A KNOWN OPEN GAP RATHER THAN A REGRESSION. Nothing on the
|
|
9
|
+
* write path derives a product's ancestor chain from the category it was filed
|
|
10
|
+
* under — the convention is maintained by hand in the seed. So a seller picking a
|
|
11
|
+
* tier-3 category through the form today produces a one-element chain and a
|
|
12
|
+
* product invisible on every ancestor page. The case says so and asks for what
|
|
13
|
+
* actually happens, because a case that assumes the answer teaches nothing.
|
|
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-admin-category-brand-authoring-create-child-under-parent": {
|
|
24
|
+
roles: ["admin"],
|
|
25
|
+
startPage: "/admin/categories",
|
|
26
|
+
steps: [
|
|
27
|
+
"Sign in as admin@letitrip.in / TempPass123!.",
|
|
28
|
+
"Open /admin/categories and create a category named 'QA Child Burst Layers'.",
|
|
29
|
+
"Pick Burst Parts as its parent.",
|
|
30
|
+
"Save it.",
|
|
31
|
+
"Open /categories/category-burst-parts on the public site and read its children.",
|
|
32
|
+
"Click down into the new category and read the path shown.",
|
|
33
|
+
"Delete the category afterwards.",
|
|
34
|
+
],
|
|
35
|
+
inputs: { name: "QA Child Burst Layers", parentId: "category-burst-parts" },
|
|
36
|
+
expectedBehaviour: "Picking a parent files the category at that parent's depth plus one and makes it appear beneath it publicly. Depth and lineage are computed from the parent — there is nothing else for the author to get right.",
|
|
37
|
+
expectedUiState: "The new category is listed as a child of Burst Parts on the public tree and its breadcrumb reads Spinning Tops, Beyblade Burst, Burst Parts, then itself.",
|
|
38
|
+
endResult: "The QA category is deleted.",
|
|
39
|
+
},
|
|
40
|
+
"checklist-admin-category-brand-authoring-structural-fields-derived-not-typed": {
|
|
41
|
+
roles: ["admin"],
|
|
42
|
+
startPage: "/admin/categories",
|
|
43
|
+
steps: [
|
|
44
|
+
"Sign in as admin@letitrip.in / TempPass123!.",
|
|
45
|
+
"Open /admin/categories and start creating a category.",
|
|
46
|
+
"Read every field the form offers.",
|
|
47
|
+
"Check there is no input for tier, path, ancestors, children, position or subtree size.",
|
|
48
|
+
"Check the only structural input is the parent picker.",
|
|
49
|
+
"Open an existing deep category for edit and read the same.",
|
|
50
|
+
],
|
|
51
|
+
expectedBehaviour: "Every structural field is derived from the parent. Exposing one lets an author write a tier that disagrees with the parent they picked, and the tree is then internally inconsistent in a way no page reports — a category can appear at one depth in the breadcrumb and a different one in the listing.",
|
|
52
|
+
expectedUiState: "The create and edit forms both offer a parent picker and no structural field. Any such input is the finding, named.",
|
|
53
|
+
endResult: "Nothing is saved.",
|
|
54
|
+
},
|
|
55
|
+
"checklist-admin-category-brand-authoring-reparent-moves-whole-subtree": {
|
|
56
|
+
roles: ["admin"],
|
|
57
|
+
startPage: "/admin/categories",
|
|
58
|
+
steps: [
|
|
59
|
+
"Sign in as admin@letitrip.in / TempPass123!.",
|
|
60
|
+
"Note that Burst Parts sits under Beyblade Burst and note its own children.",
|
|
61
|
+
"Edit Burst Parts and change its parent to Beyblade X.",
|
|
62
|
+
"Save and open /categories/category-beyblade-x publicly.",
|
|
63
|
+
"Check Burst Parts is listed there and click into it.",
|
|
64
|
+
"Check its children are still present and still reachable.",
|
|
65
|
+
"Restore its parent to Beyblade Burst.",
|
|
66
|
+
],
|
|
67
|
+
inputs: { categoryId: "category-burst-parts", newParentId: "category-beyblade-x" },
|
|
68
|
+
expectedBehaviour: "Re-parenting carries the whole subtree. A move that updates only the moved row leaves its descendants pointing at a lineage that no longer describes them — they are still in the collection and reachable by direct URL, and absent from every page that walks the tree.",
|
|
69
|
+
expectedUiState: "Burst Parts appears under Beyblade X with all its children intact and clickable. A child that 404s or vanishes from the tree is the finding.",
|
|
70
|
+
endResult: "The original parent is restored.",
|
|
71
|
+
},
|
|
72
|
+
"checklist-admin-category-brand-authoring-product-created-with-deep-category-visible-at-root": {
|
|
73
|
+
roles: ["admin"],
|
|
74
|
+
startPage: "/admin/products",
|
|
75
|
+
steps: [
|
|
76
|
+
"Sign in as admin@letitrip.in / TempPass123!.",
|
|
77
|
+
"Create a product named 'QA Ancestor Chain Probe' priced at 499 and file it under Burst Parts.",
|
|
78
|
+
"Publish it.",
|
|
79
|
+
"Open /categories/category-burst-parts publicly and check the product is listed.",
|
|
80
|
+
"Open /categories/category-beyblade-burst and search for it.",
|
|
81
|
+
"Open /categories/category-spinning-tops and search for it.",
|
|
82
|
+
"Record on which of the three pages it appears.",
|
|
83
|
+
"Delete the product afterwards.",
|
|
84
|
+
],
|
|
85
|
+
inputs: { title: "QA Ancestor Chain Probe", price: 499, categoryId: "category-burst-parts" },
|
|
86
|
+
expectedBehaviour: "A category page matches on its own id alone, which only works if the product carries its full ancestor chain — and nothing on the write path derives that chain today. So a product created here is expected to be visible on Burst Parts and NOT on its ancestors. That is a known open gap, not a fresh regression, and the value of the case is the exact answer rather than the verdict.",
|
|
87
|
+
expectedUiState: "Record exactly which of the three category pages list the product. Visible on all three means the chain is now derived on write and the gap is closed; visible only on Burst Parts is today's expected state.",
|
|
88
|
+
expectedData: { categoryPagesListingIt: 1 },
|
|
89
|
+
endResult: "The QA product is deleted.",
|
|
90
|
+
needsReview: true,
|
|
91
|
+
reviewNote: "Open gap by design — the write side does not append ancestors. The case exists to measure it, and its answer should change once that lands.",
|
|
92
|
+
},
|
|
93
|
+
"checklist-admin-category-brand-authoring-brand-rename-orphan-check": {
|
|
94
|
+
roles: ["admin"],
|
|
95
|
+
startPage: "/admin/brands",
|
|
96
|
+
steps: [
|
|
97
|
+
"Sign in as admin@letitrip.in / TempPass123!.",
|
|
98
|
+
"Open /brands/brand-takara-tomy publicly and count the products listed.",
|
|
99
|
+
"Open /admin/brands, edit Takara-Tomy, and change its name to 'Takara Tomy QA'.",
|
|
100
|
+
"Save it.",
|
|
101
|
+
"Reload /brands/brand-takara-tomy and count the products again.",
|
|
102
|
+
"Read whether any warning was shown at save time about products that would be affected.",
|
|
103
|
+
"Restore the name to 'Takara-Tomy' and reload once more.",
|
|
104
|
+
],
|
|
105
|
+
inputs: { brandId: "brand-takara-tomy", renamedTo: "Takara Tomy QA" },
|
|
106
|
+
expectedBehaviour: "Products are matched to a brand by its display name, so a rename either carries the products with it or warns that it will not. Neither happening is the failure this case is for: the page renders its hero and its editorial panels perfectly over an empty grid, and nothing anywhere connects that to the rename.",
|
|
107
|
+
expectedUiState: "After the rename the brand page lists the same products, or the save warned first. An empty grid with no warning is the finding, with the before and after counts.",
|
|
108
|
+
endResult: "The brand name is restored and the products are listed again.",
|
|
109
|
+
},
|
|
110
|
+
"checklist-admin-category-brand-authoring-brand-cover-image-is-the-hero": {
|
|
111
|
+
roles: ["admin"],
|
|
112
|
+
startPage: "/admin/brands",
|
|
113
|
+
steps: [
|
|
114
|
+
"Sign in as admin@letitrip.in / TempPass123!.",
|
|
115
|
+
"Open /admin/brands and edit Hasbro.",
|
|
116
|
+
"Read every image field the form offers and note each one's label.",
|
|
117
|
+
"Upload /test-media/sample-image.png into the field labelled as the cover image.",
|
|
118
|
+
"Save and open /brands/brand-hasbro publicly.",
|
|
119
|
+
"Check the uploaded image is what renders as the page's hero banner.",
|
|
120
|
+
"If the form offers a second image field, upload a distinguishable image there and check whether anything renders it.",
|
|
121
|
+
],
|
|
122
|
+
inputs: { brandId: "brand-hasbro", imagePath: "/test-media/sample-image.png" },
|
|
123
|
+
expectedBehaviour: "The field labelled as the cover image is the one the hero renders. A form once had a Logo input and a Banner input side by side where Logo wrote the hero's field and Banner wrote a field with no readers at all — so the labels described the reverse of reality and every uploaded banner was discarded silently.",
|
|
124
|
+
expectedUiState: "The image uploaded into the cover field is the hero on the public page. A second image field whose upload appears nowhere is a finding — that field has no reader.",
|
|
125
|
+
endResult: "The brand carries the uploaded cover image.",
|
|
126
|
+
},
|
|
127
|
+
"checklist-admin-category-brand-authoring-category-type-not-guessable": {
|
|
128
|
+
roles: ["admin"],
|
|
129
|
+
startPage: "/admin/categories",
|
|
130
|
+
steps: [
|
|
131
|
+
"Sign in as admin@letitrip.in / TempPass123!.",
|
|
132
|
+
"Open /admin/categories and start creating a category.",
|
|
133
|
+
"Find where the row's kind is chosen and read the options offered.",
|
|
134
|
+
"Check the options match the kinds the site actually renders — a listing category, a brand, a sub-listing group and a bundle.",
|
|
135
|
+
"Check no option is offered that no page renders.",
|
|
136
|
+
"Save nothing and open an existing brand row for edit, checking its kind is shown.",
|
|
137
|
+
],
|
|
138
|
+
expectedBehaviour: "Brands, bundles, sub-listing groups and ordinary categories are all rows in one collection distinguished by a kind field, so the author has to be able to see and set it. An option offered that no page renders creates rows nothing will ever display.",
|
|
139
|
+
expectedUiState: "The kind is an explicit, readable choice on create and visible on edit, and every option corresponds to a kind the site renders.",
|
|
140
|
+
endResult: "Nothing is saved.",
|
|
141
|
+
},
|
|
142
|
+
"checklist-admin-category-brand-authoring-delete-category-with-children-refused": {
|
|
143
|
+
roles: ["admin"],
|
|
144
|
+
startPage: "/admin/categories",
|
|
145
|
+
steps: [
|
|
146
|
+
"Sign in as admin@letitrip.in / TempPass123!.",
|
|
147
|
+
"Open /admin/categories and attempt to delete Beyblade Burst, which has children and products beneath it.",
|
|
148
|
+
"Read the confirmation or refusal.",
|
|
149
|
+
"Check the message names how many children or products depend on it.",
|
|
150
|
+
"If it refuses, cancel and confirm the category is untouched.",
|
|
151
|
+
"If it succeeds, open the public categories tree and record what happened to its children.",
|
|
152
|
+
],
|
|
153
|
+
inputs: { categoryId: "category-beyblade-burst" },
|
|
154
|
+
expectedBehaviour: "A delete that orphans a subtree is unrecoverable, so it is refused with a count of what depends on it. Deletes are the one operation whose bug cannot be undone, which is why the refusal has to be structural rather than a warning the admin can click past.",
|
|
155
|
+
expectedUiState: "The delete is refused with a message naming the dependent children and products. If it succeeds instead, that is the finding and the state of the orphaned subtree is the evidence.",
|
|
156
|
+
endResult: "The category still exists. If the delete succeeded, re-seed rather than attempting a manual repair.",
|
|
157
|
+
},
|
|
158
|
+
};
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* WHY: Authored six-part procedures for the admin/classifieds-digitalcodes-live page.
|
|
3
|
+
* WHAT: 3 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
|
+
* 🛑 THESE ARE MODERATION CASES, so each ends on the PUBLIC page. An approval that
|
|
10
|
+
* updates a dashboard row and never reaches the public listing is the same defect
|
|
11
|
+
* as a rejection that leaves the item live — both look correct from the admin's
|
|
12
|
+
* seat, and only the public view can tell them apart.
|
|
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-admin-classifieds-digitalcodes-live-classified-create-moderate": {
|
|
23
|
+
roles: ["admin", "seller", "guest"],
|
|
24
|
+
startPage: "/admin/products",
|
|
25
|
+
steps: [
|
|
26
|
+
"Sign in as tyson@beybladearena.in / TempPass123! and create a classified titled 'QA Classified admin-moderate' at 900, city Pune.",
|
|
27
|
+
"Sign out and sign in as admin@letitrip.in / TempPass123!.",
|
|
28
|
+
"Open the admin listing that holds classifieds and find it.",
|
|
29
|
+
"Read every status chip offered and select each in turn, noting which returns this listing.",
|
|
30
|
+
"Change its status to a non-published one and save.",
|
|
31
|
+
"Open the listing's public URL in a private window and read what is shown.",
|
|
32
|
+
"Restore it to published, then sign back in as tyson and delete it.",
|
|
33
|
+
],
|
|
34
|
+
inputs: { title: "QA Classified admin-moderate", price: 900, city: "Pune" },
|
|
35
|
+
expectedBehaviour: "An admin status change reaches the public read path. Every status chip must also name a value the documents actually hold — a chip whose id is a display label rather than the stored value matches nothing forever and returns an empty list with no error.",
|
|
36
|
+
expectedUiState: "The listing is findable under its own status chip. After the status change the public URL no longer renders it as a live listing — a public page still showing it is the failure, and the admin row will look correct either way.",
|
|
37
|
+
endResult: "The listing is restored to published and then deleted. A chip returning nothing while the unfiltered list holds rows of that status is a separate finding worth naming.",
|
|
38
|
+
},
|
|
39
|
+
"checklist-admin-classifieds-digitalcodes-live-digitalcode-create-moderate": {
|
|
40
|
+
roles: ["admin", "seller", "guest"],
|
|
41
|
+
startPage: "/admin/products",
|
|
42
|
+
steps: [
|
|
43
|
+
"Sign in as tyson@beybladearena.in / TempPass123! and create a digital-code listing titled 'QA Digital Code admin-moderate' at 350 with three codes.",
|
|
44
|
+
"Sign out and sign in as admin@letitrip.in / TempPass123!.",
|
|
45
|
+
"Find it in the admin listing and open its detail.",
|
|
46
|
+
"Read whether the actual CODE STRINGS are visible to the admin.",
|
|
47
|
+
"Change its status to a non-published one and save.",
|
|
48
|
+
"Open the public URL in a private window and read what is shown.",
|
|
49
|
+
"Restore it, then sign back in as tyson and delete it.",
|
|
50
|
+
],
|
|
51
|
+
inputs: { title: "QA Digital Code admin-moderate", price: 350, codeCount: 3 },
|
|
52
|
+
expectedBehaviour: "Moderation works the same for this type, and the code pool is the thing worth watching: an unsold code is inventory a buyer will pay for, so it must not be readable from a list view. Availability here reads the nested pool count rather than a stock figure.",
|
|
53
|
+
expectedUiState: "The listing is findable and its status change takes effect publicly. Unsold code strings are not displayed in the admin list; if the detail view shows them, record exactly where — that is a finding rather than a pass.",
|
|
54
|
+
endResult: "The listing is restored and deleted. Note whether an admin can read unredeemed codes at all.",
|
|
55
|
+
},
|
|
56
|
+
"checklist-admin-classifieds-digitalcodes-live-live-create-moderate": {
|
|
57
|
+
roles: ["admin", "seller", "guest"],
|
|
58
|
+
startPage: "/admin/products",
|
|
59
|
+
steps: [
|
|
60
|
+
"Sign in as tyson@beybladearena.in / TempPass123! and create a live listing titled 'QA Live Item admin-moderate' at 3000, species Dog, jurisdictions Maharashtra only, with public/test-media/sample-video.mp4 attached.",
|
|
61
|
+
"Sign out and sign in as admin@letitrip.in / TempPass123!.",
|
|
62
|
+
"Find it in the admin listing and open its detail.",
|
|
63
|
+
"Read whether the species, jurisdiction list and video are all shown to the moderator.",
|
|
64
|
+
"Change its status to a non-published one and save.",
|
|
65
|
+
"Open the public URL in a private window and read what is shown.",
|
|
66
|
+
"Restore it, then sign back in as tyson and delete it.",
|
|
67
|
+
],
|
|
68
|
+
inputs: {
|
|
69
|
+
title: "QA Live Item admin-moderate",
|
|
70
|
+
price: 3000,
|
|
71
|
+
species: "Dog",
|
|
72
|
+
jurisdictions: "Maharashtra",
|
|
73
|
+
},
|
|
74
|
+
expectedBehaviour: "A live listing is the one type where moderation has a duty beyond commerce — the jurisdiction list decides who may lawfully receive the animal or plant, and the mandatory video is what the moderator judges the listing on. Both must be visible in the admin view or the moderator is deciding blind.",
|
|
75
|
+
expectedUiState: "The admin detail shows the species line, the jurisdiction list AND the video. The status change takes effect on the public page. A moderation row offering approve and reject without showing the video is the acting-blind failure this page family exists to catch.",
|
|
76
|
+
endResult: "The listing is restored and deleted. Record specifically whether the video was viewable from the moderation surface.",
|
|
77
|
+
},
|
|
78
|
+
};
|
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* WHY: Authored six-part procedures for the admin/content-deletes page.
|
|
3
|
+
* WHAT: 14 case(s), keyed by full checklist id.
|
|
4
|
+
*
|
|
5
|
+
* 🛑 A DELETE IS THE ONE OPERATION WHOSE BUG CANNOT BE UNDONE, AND BEFORE THIS PAGE
|
|
6
|
+
* THE WHOLE CATALOGUE HELD THREE CASES THAT TESTED ONE. Creates and edits were
|
|
7
|
+
* covered thoroughly; the operation that destroys data was not, which is exactly
|
|
8
|
+
* backwards.
|
|
9
|
+
*
|
|
10
|
+
* Every case here deletes something it created, or restores what it changed. Where
|
|
11
|
+
* that is not possible — a seeded record with dependents — the case checks the
|
|
12
|
+
* REFUSAL rather than performing the delete.
|
|
13
|
+
*
|
|
14
|
+
* Two distinctions run through the page: disable is not delete, and unpublish is
|
|
15
|
+
* not delete. A screen that blurs either invites an admin to reach for the
|
|
16
|
+
* irreversible one when they wanted the reversible one.
|
|
17
|
+
*
|
|
18
|
+
* @tag domain:tester
|
|
19
|
+
* @tag layer:seed
|
|
20
|
+
* @tag pattern:none
|
|
21
|
+
* @tag access:server-only
|
|
22
|
+
* @tag consumers:seed-data/authored/index.ts
|
|
23
|
+
* @tag sideEffects:none
|
|
24
|
+
*/
|
|
25
|
+
const SIGN_IN_ADMIN = "Sign in as admin@letitrip.in / TempPass123!.";
|
|
26
|
+
export const authored = {
|
|
27
|
+
"checklist-admin-content-deletes-homepage-section-edit-persists": {
|
|
28
|
+
roles: ["admin"],
|
|
29
|
+
startPage: "/admin/sections",
|
|
30
|
+
steps: [
|
|
31
|
+
SIGN_IN_ADMIN,
|
|
32
|
+
"Open /admin/sections and open a section for edit.",
|
|
33
|
+
"Change its heading to 'QA Section Heading Probe' and save.",
|
|
34
|
+
"Reload the admin page and read the heading.",
|
|
35
|
+
"Open the public homepage and find that section.",
|
|
36
|
+
"Read its heading there.",
|
|
37
|
+
"Restore the original heading.",
|
|
38
|
+
],
|
|
39
|
+
inputs: { heading: "QA Section Heading Probe" },
|
|
40
|
+
expectedBehaviour: "An edit persists and the public page follows. A handler that validates a body, returns success and never calls a write is the failure this checks for — the response echoes the submission back, so it is indistinguishable from a real save without a reload.",
|
|
41
|
+
expectedUiState: "The new heading is on the admin page after the reload and on the public homepage. A value that reverts is the finding despite the success message.",
|
|
42
|
+
endResult: "The original heading is restored.",
|
|
43
|
+
},
|
|
44
|
+
"checklist-admin-content-deletes-homepage-section-delete": {
|
|
45
|
+
roles: ["admin"],
|
|
46
|
+
startPage: "/admin/sections",
|
|
47
|
+
steps: [
|
|
48
|
+
SIGN_IN_ADMIN,
|
|
49
|
+
"Open /admin/sections and note the full order of sections.",
|
|
50
|
+
"Create a new section so the delete has a disposable target.",
|
|
51
|
+
"Note where it sits in the order.",
|
|
52
|
+
"Delete it and confirm.",
|
|
53
|
+
"Read the remaining sections and their order.",
|
|
54
|
+
"Open the public homepage and check the order matches and no gap is left.",
|
|
55
|
+
],
|
|
56
|
+
expectedBehaviour: "Deleting a section removes it and leaves the rest in order. Ordering keyed on array position rather than on a stored order value shifts every later section by one on a delete, so the page silently reorders itself.",
|
|
57
|
+
expectedUiState: "The section is gone from both the admin list and the homepage, with the remaining sections in their original relative order and no empty band where it was.",
|
|
58
|
+
endResult: "Only the section this case created is gone.",
|
|
59
|
+
},
|
|
60
|
+
"checklist-admin-content-deletes-homepage-section-reorder": {
|
|
61
|
+
roles: ["admin"],
|
|
62
|
+
startPage: "/admin/sections",
|
|
63
|
+
steps: [
|
|
64
|
+
SIGN_IN_ADMIN,
|
|
65
|
+
"Open /admin/sections and write down the current order of the first four sections.",
|
|
66
|
+
"Move the third section above the first.",
|
|
67
|
+
"Save if a save is required.",
|
|
68
|
+
"Reload and read the order.",
|
|
69
|
+
"Open the public homepage and read the order there.",
|
|
70
|
+
"Restore the original order.",
|
|
71
|
+
],
|
|
72
|
+
expectedBehaviour: "A reorder persists and the public page follows it. A reorder that holds in the admin list and not publicly means the order is being stored somewhere the public read does not consult.",
|
|
73
|
+
expectedUiState: "The new order survives the reload and matches on the public homepage. Agreement between the two is what makes the reorder real.",
|
|
74
|
+
endResult: "The original order is restored.",
|
|
75
|
+
},
|
|
76
|
+
"checklist-admin-content-deletes-homepage-section-disable-vs-delete": {
|
|
77
|
+
roles: ["admin"],
|
|
78
|
+
startPage: "/admin/sections",
|
|
79
|
+
steps: [
|
|
80
|
+
SIGN_IN_ADMIN,
|
|
81
|
+
"Open /admin/sections and disable a section rather than deleting it.",
|
|
82
|
+
"Open the public homepage and check the section is gone from it.",
|
|
83
|
+
"Return to the admin page and check the section is still listed, marked as disabled.",
|
|
84
|
+
"Re-enable it and check it returns publicly.",
|
|
85
|
+
"Read the two controls side by side and check which is which is obvious without trying them.",
|
|
86
|
+
"Check the delete control carries a confirmation and the disable control does not need one.",
|
|
87
|
+
],
|
|
88
|
+
expectedBehaviour: "Disable hides a section reversibly; delete removes it permanently. The two must be visually distinct, because an admin wanting to hide a section for a week and reaching for the wrong one loses its whole configuration.",
|
|
89
|
+
expectedUiState: "A disabled section is absent publicly and still present, marked, in the admin list. The destructive control is visually distinct and confirms; the reversible one does not.",
|
|
90
|
+
endResult: "The section is re-enabled.",
|
|
91
|
+
},
|
|
92
|
+
"checklist-admin-content-deletes-carousel-slide-edit-persists": {
|
|
93
|
+
roles: ["admin"],
|
|
94
|
+
startPage: "/admin/carousel",
|
|
95
|
+
steps: [
|
|
96
|
+
SIGN_IN_ADMIN,
|
|
97
|
+
"Open /admin/carousel and open a slide for edit.",
|
|
98
|
+
"Change its title to 'QA Slide Title Probe' and change its autoplay delay.",
|
|
99
|
+
"Save.",
|
|
100
|
+
"Reload the admin page and read both values.",
|
|
101
|
+
"Open the public homepage and watch the carousel reach that slide.",
|
|
102
|
+
"Restore both original values.",
|
|
103
|
+
],
|
|
104
|
+
inputs: { title: "QA Slide Title Probe" },
|
|
105
|
+
expectedBehaviour: "Both the content and the settings persist and reach the homepage. Settings are the half more likely to be dropped, because nothing on the admin screen shows whether an autoplay delay was actually written.",
|
|
106
|
+
expectedUiState: "Both values survive the reload and the homepage carousel reflects them. A title that saved while the delay reverted is the finding.",
|
|
107
|
+
endResult: "The original title and delay are restored.",
|
|
108
|
+
},
|
|
109
|
+
"checklist-admin-content-deletes-carousel-slide-delete": {
|
|
110
|
+
roles: ["admin"],
|
|
111
|
+
startPage: "/admin/carousel",
|
|
112
|
+
steps: [
|
|
113
|
+
SIGN_IN_ADMIN,
|
|
114
|
+
"Open /admin/carousel and create a slide titled 'QA Disposable Slide' so the delete has a safe target.",
|
|
115
|
+
"Activate it and check it appears on the homepage rotation.",
|
|
116
|
+
"Delete it and confirm.",
|
|
117
|
+
"Reload the admin list and check it is gone.",
|
|
118
|
+
"Open the public homepage and watch a full rotation.",
|
|
119
|
+
"Check the remaining slides still advance on their own.",
|
|
120
|
+
],
|
|
121
|
+
inputs: { title: "QA Disposable Slide" },
|
|
122
|
+
expectedBehaviour: "Deleting a slide removes it from the rotation and the rest keep autoplaying. A rotation driven by an index into the old list stalls or throws on the removed position, and the carousel then simply stops — which reads as a design choice rather than a failure.",
|
|
123
|
+
expectedUiState: "The slide is gone from the admin list and from the rotation, and the remaining slides advance automatically through a full cycle.",
|
|
124
|
+
endResult: "Only the disposable slide is gone.",
|
|
125
|
+
},
|
|
126
|
+
"checklist-admin-content-deletes-carousel-active-limit-enforced": {
|
|
127
|
+
roles: ["admin"],
|
|
128
|
+
startPage: "/admin/carousel",
|
|
129
|
+
steps: [
|
|
130
|
+
SIGN_IN_ADMIN,
|
|
131
|
+
"Open /admin/carousel and count how many slides are currently active.",
|
|
132
|
+
"Read whether the page states a maximum.",
|
|
133
|
+
"Activate slides until you exceed that maximum.",
|
|
134
|
+
"Read what happens on the attempt that would exceed it.",
|
|
135
|
+
"Open the homepage and count the slides in the rotation.",
|
|
136
|
+
"Restore the original active set.",
|
|
137
|
+
],
|
|
138
|
+
expectedBehaviour: "Exceeding the active-slide maximum is refused with a reason. Silently accepting the extra slide and then rendering only the first few is worse than refusing — the admin sees their slide saved and never learns it is not being shown.",
|
|
139
|
+
expectedUiState: "The attempt is refused with a message naming the maximum, and the homepage's rotation count matches the active count. A saved-but-not-rendered slide is the finding.",
|
|
140
|
+
endResult: "The original active set is restored.",
|
|
141
|
+
},
|
|
142
|
+
"checklist-admin-content-deletes-blog-edit-persists": {
|
|
143
|
+
roles: ["admin"],
|
|
144
|
+
startPage: "/admin/blog",
|
|
145
|
+
steps: [
|
|
146
|
+
SIGN_IN_ADMIN,
|
|
147
|
+
"Open /admin/blog and open a published post for edit.",
|
|
148
|
+
"Change its title to 'QA Blog Title Probe', edit a sentence of its body, and replace its cover image with /test-media/sample-image.png.",
|
|
149
|
+
"Save.",
|
|
150
|
+
"Reload the admin editor and check all three changes are there.",
|
|
151
|
+
"Open the post's public page and check all three again.",
|
|
152
|
+
"Restore the original title, sentence and cover image.",
|
|
153
|
+
],
|
|
154
|
+
inputs: { title: "QA Blog Title Probe", coverImage: "/test-media/sample-image.png" },
|
|
155
|
+
expectedBehaviour: "All three kinds of change persist together — a scalar field, rich body content and a media reference. Media is the one most often dropped on update: a create path that finalises a newly-uploaded file while the update path does not leaves the image in temporary storage, so it renders once and disappears later.",
|
|
156
|
+
expectedUiState: "Title, body and cover image all changed on both the editor and the public page. An image that renders immediately and is broken after a reload is the finalise failure.",
|
|
157
|
+
endResult: "All three original values are restored.",
|
|
158
|
+
},
|
|
159
|
+
"checklist-admin-content-deletes-blog-delete-removes-public-page": {
|
|
160
|
+
roles: ["admin"],
|
|
161
|
+
startPage: "/admin/blog",
|
|
162
|
+
steps: [
|
|
163
|
+
SIGN_IN_ADMIN,
|
|
164
|
+
"Open /admin/blog and create a post titled 'QA Disposable Post', publish it.",
|
|
165
|
+
"Open its public page and note the URL.",
|
|
166
|
+
"Return to /admin/blog and delete it, confirming.",
|
|
167
|
+
"Reload the public URL with the network panel open.",
|
|
168
|
+
"Read the response status.",
|
|
169
|
+
"Open /blog and check the post is gone from the list.",
|
|
170
|
+
],
|
|
171
|
+
inputs: { title: "QA Disposable Post" },
|
|
172
|
+
expectedBehaviour: "A deleted post's URL returns 404. A 200 carrying an empty article keeps the URL in search indexes indefinitely and shows visitors a page that looks broken rather than gone.",
|
|
173
|
+
expectedUiState: "The public URL returns 404 with a readable not-found page, and the post is absent from the blog list. A 200 with an empty article is the finding.",
|
|
174
|
+
expectedData: { statusCode: 404 },
|
|
175
|
+
endResult: "Only the disposable post is gone.",
|
|
176
|
+
},
|
|
177
|
+
"checklist-admin-content-deletes-blog-unpublish-vs-delete": {
|
|
178
|
+
roles: ["admin"],
|
|
179
|
+
startPage: "/admin/blog",
|
|
180
|
+
steps: [
|
|
181
|
+
SIGN_IN_ADMIN,
|
|
182
|
+
"Open /admin/blog and unpublish a post rather than deleting it.",
|
|
183
|
+
"Open /blog publicly and check it is absent from the list.",
|
|
184
|
+
"Open its public URL directly as a signed-out visitor and read what happens.",
|
|
185
|
+
"Return to /admin/blog and check the post is still listed and still editable.",
|
|
186
|
+
"Republish it and check it returns to the public list.",
|
|
187
|
+
"Read the two controls and check delete is visually distinct from unpublish.",
|
|
188
|
+
],
|
|
189
|
+
expectedBehaviour: "Unpublishing hides a post reversibly and keeps it editable; deleting removes it. The controls have to look different, because the reversible and the irreversible action sit next to each other in the same menu.",
|
|
190
|
+
expectedUiState: "The unpublished post is absent publicly, still present and editable in admin, and returns on republish. The delete control is visually distinct and confirms.",
|
|
191
|
+
endResult: "The post is republished.",
|
|
192
|
+
},
|
|
193
|
+
"checklist-admin-content-deletes-listing-delete-removes-public-page": {
|
|
194
|
+
roles: ["admin"],
|
|
195
|
+
startPage: "/admin/products",
|
|
196
|
+
steps: [
|
|
197
|
+
SIGN_IN_ADMIN,
|
|
198
|
+
"Create a product titled 'QA Disposable Listing' priced at 299 and publish it.",
|
|
199
|
+
"Open its public detail page and note the URL, and find it in /products.",
|
|
200
|
+
"Return to /admin/products and delete it, confirming.",
|
|
201
|
+
"Reload the public URL with the network panel open and read the status.",
|
|
202
|
+
"Open /products and search for it.",
|
|
203
|
+
"Open the search page and search for it there too.",
|
|
204
|
+
],
|
|
205
|
+
inputs: { title: "QA Disposable Listing", price: 299 },
|
|
206
|
+
expectedBehaviour: "A deleted listing leaves every grid it appeared in, not only its own page. Search is the one most likely to lag, because its index is written on save — a listing removed from the collection but left in the index renders a result card that 404s when clicked.",
|
|
207
|
+
expectedUiState: "The detail URL returns 404 and the listing is absent from both the catalogue grid and search results. A search result that leads to a 404 is the finding.",
|
|
208
|
+
expectedData: { statusCode: 404 },
|
|
209
|
+
endResult: "Only the disposable listing is gone.",
|
|
210
|
+
},
|
|
211
|
+
"checklist-admin-content-deletes-listing-delete-with-orders-refused-or-archived": {
|
|
212
|
+
roles: ["admin"],
|
|
213
|
+
startPage: "/admin/products",
|
|
214
|
+
steps: [
|
|
215
|
+
SIGN_IN_ADMIN,
|
|
216
|
+
"Open /admin/orders and find an order, noting one product it contains.",
|
|
217
|
+
"Open /admin/products and attempt to delete that product.",
|
|
218
|
+
"Read whether the interface refuses, warns, or deletes.",
|
|
219
|
+
"If it deletes, open that order and read whether its rows still render.",
|
|
220
|
+
"Click the product link on the order's row and read where it lands.",
|
|
221
|
+
"Record which of the three behaviours occurred.",
|
|
222
|
+
],
|
|
223
|
+
expectedBehaviour: "An order's rows denormalise the title, price and image they display, so an existing order survives the product's deletion — but the buyer's link into that product breaks. Either outcome can be defensible; what matters is that it is deliberate and stated rather than discovered by a buyer opening an old order.",
|
|
224
|
+
expectedUiState: "Record exactly what happened: a refusal naming the orders, an archive instead of a delete, or a hard delete. If it deleted, record whether the order still renders and where its product link goes.",
|
|
225
|
+
endResult: "If a product was hard-deleted, re-seed rather than attempting a manual repair.",
|
|
226
|
+
needsReview: true,
|
|
227
|
+
reviewNote: "The intended behaviour is not settled. The case exists to record which of refuse / archive / hard-delete actually happens, and what it does to an existing order.",
|
|
228
|
+
},
|
|
229
|
+
"checklist-admin-content-deletes-delete-confirmations-name-the-record": {
|
|
230
|
+
roles: ["admin"],
|
|
231
|
+
startPage: "/admin/products",
|
|
232
|
+
steps: [
|
|
233
|
+
SIGN_IN_ADMIN,
|
|
234
|
+
"Open /admin/products and trigger a delete on a specific row.",
|
|
235
|
+
"Read the confirmation dialog WITHOUT confirming, and note whether it names that record.",
|
|
236
|
+
"Cancel.",
|
|
237
|
+
"Repeat on /admin/blog, /admin/carousel and /admin/categories.",
|
|
238
|
+
"Record any confirmation that says only 'this item' or 'are you sure'.",
|
|
239
|
+
],
|
|
240
|
+
expectedBehaviour: "A delete confirmation names the record it will remove. A generic prompt gives an admin nothing to check against — the most common delete mistake is the right action on the wrong row, and only the name catches it.",
|
|
241
|
+
expectedUiState: "Each confirmation quotes the record's title or id. A generic prompt is a finding, named by surface.",
|
|
242
|
+
endResult: "Nothing is deleted.",
|
|
243
|
+
},
|
|
244
|
+
"checklist-admin-content-deletes-delete-reflected-immediately": {
|
|
245
|
+
roles: ["admin"],
|
|
246
|
+
startPage: "/admin/products",
|
|
247
|
+
steps: [
|
|
248
|
+
SIGN_IN_ADMIN,
|
|
249
|
+
"Create a product titled 'QA Delete Refresh Probe' priced at 199.",
|
|
250
|
+
"Delete it from the list and confirm.",
|
|
251
|
+
"WITHOUT reloading, read whether the row has gone.",
|
|
252
|
+
"Wait ten seconds and read the list again.",
|
|
253
|
+
"Reload and read it once more.",
|
|
254
|
+
"Open the list in a second tab and read it there.",
|
|
255
|
+
],
|
|
256
|
+
inputs: { title: "QA Delete Refresh Probe", price: 199 },
|
|
257
|
+
expectedBehaviour: "The row goes immediately and stays gone. A row that returns after a moment means a cached copy re-hydrated over the deletion — the delete did happen, but the screen contradicts it, which is the worst possible signal to give somebody who just deleted something.",
|
|
258
|
+
expectedUiState: "The row is gone immediately, still gone after ten seconds, after a reload and in a second tab. A row that reappears at any point is the finding.",
|
|
259
|
+
endResult: "The probe product is deleted.",
|
|
260
|
+
},
|
|
261
|
+
};
|