@mohasinac/appkit 4.57.0 → 4.59.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.build-stamp.json +4 -4
- package/dist/_internal/server/features/beys/data.d.ts +44 -0
- package/dist/_internal/server/features/beys/data.js +107 -0
- package/dist/_internal/server/features/beys/og.d.ts +42 -0
- package/dist/_internal/server/features/beys/og.js +89 -0
- package/dist/_internal/server/features/parts/data.js +3 -2
- package/dist/_internal/server/jobs/handlers/messages.d.ts +1 -1
- package/dist/_internal/server/jobs/handlers/messages.js +1 -1
- package/dist/_internal/shared/actions/action-registry.d.ts +1 -1
- package/dist/_internal/shared/actions/action-registry.js +86 -0
- package/dist/_internal/shared/types/base-document.d.ts +1 -1
- package/dist/client.d.ts +2 -0
- package/dist/client.js +1 -0
- package/dist/constants/api-endpoints.d.ts +12 -0
- package/dist/constants/api-endpoints.js +10 -0
- package/dist/constants/field-names.d.ts +46 -0
- package/dist/constants/field-names.js +46 -0
- package/dist/constants/seed-meta.d.ts +113 -0
- package/dist/constants/seed-meta.js +91 -0
- package/dist/features/admin/components/AdminBeysView.d.ts +27 -0
- package/dist/features/admin/components/AdminBeysView.js +178 -0
- package/dist/features/admin/components/AdminPartsView.d.ts +27 -0
- package/dist/features/admin/components/AdminPartsView.js +160 -0
- package/dist/features/admin/components/OwnerQuickActions.d.ts +19 -2
- package/dist/features/admin/components/OwnerQuickActions.js +31 -3
- package/dist/features/admin/components/RecordOwnerQuickActions.d.ts +31 -0
- package/dist/features/admin/components/RecordOwnerQuickActions.js +128 -0
- package/dist/features/admin/components/ReferenceRecordEditor.d.ts +45 -0
- package/dist/features/admin/components/ReferenceRecordEditor.js +153 -0
- package/dist/features/admin/schemas/firestore.d.ts +1 -1
- package/dist/features/auctions/components/MarketplaceAuctionCard.js +15 -2
- package/dist/features/auth/permissions/constants.d.ts +1 -1
- package/dist/features/auth/permissions/constants.js +12 -1
- package/dist/features/beys/components/BeyDetailPageView.d.ts +50 -0
- package/dist/features/beys/components/BeyDetailPageView.js +98 -0
- package/dist/features/beys/schemas/firestore.d.ts +417 -0
- package/dist/features/beys/schemas/firestore.js +65 -0
- package/dist/features/blog/components/BlogFeaturedCard.js +15 -2
- package/dist/features/blog/components/BlogPostView.js +2 -2
- package/dist/features/categories/components/BrandDetailPageView.js +4 -2
- package/dist/features/categories/components/BundleDetailView.js +2 -2
- package/dist/features/categories/components/CategoryDetailPageView.js +36 -3
- package/dist/features/categories/components/CategoryGrid.js +24 -2
- package/dist/features/categories/components/FranchiseDetailPageView.js +2 -3
- package/dist/features/events/components/EventCard.js +15 -2
- package/dist/features/grouped/components/GroupedListingDetailView.js +2 -3
- package/dist/features/homepage/components/CustomCardsSection.js +67 -50
- package/dist/features/homepage/components/ShopByCategorySection.js +23 -10
- package/dist/features/homepage/schemas/index.d.ts +10 -10
- package/dist/features/parts/components/PartDetailPageView.js +5 -3
- package/dist/features/parts/components/PartsSearchBox.js +79 -4
- package/dist/features/parts/schemas/admin-edit.d.ts +81 -0
- package/dist/features/parts/schemas/admin-edit.js +89 -0
- package/dist/features/parts/schemas/firestore.d.ts +2 -1
- package/dist/features/pre-orders/components/MarketplacePreorderCard.js +15 -2
- package/dist/features/products/components/MarketplaceBundleCard.js +15 -2
- package/dist/features/products/components/MarketplacePrizeDrawCard.js +15 -2
- package/dist/features/products/components/ProductGrid.js +18 -2
- package/dist/features/products/schemas/firestore.d.ts +18 -0
- package/dist/features/seller/components/CategoryInlineSelect.d.ts +10 -1
- package/dist/features/seller/components/CategoryInlineSelect.js +53 -5
- package/dist/features/seller/components/SellerProductShell.d.ts +39 -0
- package/dist/features/seller/components/SellerProductShell.js +31 -3
- package/dist/index.d.ts +6 -129
- package/dist/index.js +61 -292
- package/dist/next/routing/route-map.d.ts +13 -1
- package/dist/next/routing/route-map.js +37 -0
- package/dist/schemas/registry.d.ts +6 -6
- package/dist/server.d.ts +2 -69
- package/dist/server.js +8 -69
- package/dist/styles.css +468 -1
- package/dist/tailwind-utilities.css +1 -1
- package/dist/ui/components/PosterCard.d.ts +99 -0
- package/dist/ui/components/PosterCard.js +109 -0
- package/dist/ui/components/PosterCard.style.css +466 -0
- package/dist/ui/components/index.style.css +1 -0
- package/dist/ui/index.d.ts +2 -0
- package/dist/ui/index.js +2 -0
- package/package.json +4 -2
- package/scripts/seed-cli.mjs +177 -2
- package/dist/features/tester/seed-data/_happy-path.d.ts +0 -23
- package/dist/features/tester/seed-data/_happy-path.js +0 -710
- package/dist/features/tester/seed-data/_money-flows.d.ts +0 -23
- package/dist/features/tester/seed-data/_money-flows.js +0 -610
- package/dist/features/tester/seed-data/authored/_types.d.ts +0 -57
- package/dist/features/tester/seed-data/authored/_types.js +0 -35
- package/dist/features/tester/seed-data/authored/account-auth__profile-settings.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/account-auth__profile-settings.js +0 -226
- package/dist/features/tester/seed-data/authored/account-auth__signup-login.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/account-auth__signup-login.js +0 -329
- package/dist/features/tester/seed-data/authored/addresses__address-filters.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/addresses__address-filters.js +0 -41
- package/dist/features/tester/seed-data/authored/addresses__postal-lookup.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/addresses__postal-lookup.js +0 -76
- package/dist/features/tester/seed-data/authored/addresses__postal-validation.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/addresses__postal-validation.js +0 -78
- package/dist/features/tester/seed-data/authored/addresses__state-picker.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/addresses__state-picker.js +0 -59
- package/dist/features/tester/seed-data/authored/addresses__unban-request.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/addresses__unban-request.js +0 -77
- package/dist/features/tester/seed-data/authored/admin__admin-detail-round-trips.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__admin-detail-round-trips.js +0 -151
- package/dist/features/tester/seed-data/authored/admin__bans-and-trust.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__bans-and-trust.js +0 -265
- package/dist/features/tester/seed-data/authored/admin__blog-faqs.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__blog-faqs.js +0 -131
- package/dist/features/tester/seed-data/authored/admin__bug-hunter-rewards.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__bug-hunter-rewards.js +0 -143
- package/dist/features/tester/seed-data/authored/admin__bulk-actions.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__bulk-actions.js +0 -207
- package/dist/features/tester/seed-data/authored/admin__bundles.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__bundles.js +0 -144
- package/dist/features/tester/seed-data/authored/admin__buyer-data-admin.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__buyer-data-admin.js +0 -265
- package/dist/features/tester/seed-data/authored/admin__catalog-listings.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__catalog-listings.js +0 -318
- package/dist/features/tester/seed-data/authored/admin__category-brand-authoring.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__category-brand-authoring.js +0 -177
- package/dist/features/tester/seed-data/authored/admin__classifieds-digitalcodes-live.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__classifieds-digitalcodes-live.js +0 -165
- package/dist/features/tester/seed-data/authored/admin__content-deletes.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__content-deletes.js +0 -267
- package/dist/features/tester/seed-data/authored/admin__content-marketing.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__content-marketing.js +0 -188
- package/dist/features/tester/seed-data/authored/admin__coupons.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__coupons.js +0 -215
- package/dist/features/tester/seed-data/authored/admin__events-raffles-spin.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__events-raffles-spin.js +0 -202
- package/dist/features/tester/seed-data/authored/admin__firebase-function-effects.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__firebase-function-effects.js +0 -249
- package/dist/features/tester/seed-data/authored/admin__media-watermark.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__media-watermark.js +0 -148
- package/dist/features/tester/seed-data/authored/admin__orders-fulfillment.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__orders-fulfillment.js +0 -350
- package/dist/features/tester/seed-data/authored/admin__prize-draws-lotteries.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__prize-draws-lotteries.js +0 -129
- package/dist/features/tester/seed-data/authored/admin__site-system.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__site-system.js +0 -586
- package/dist/features/tester/seed-data/authored/admin__uncovered-admin-pages.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__uncovered-admin-pages.js +0 -260
- package/dist/features/tester/seed-data/authored/admin__users-trust.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__users-trust.js +0 -569
- package/dist/features/tester/seed-data/authored/buying__bidding.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__bidding.js +0 -449
- package/dist/features/tester/seed-data/authored/buying__browsing-search.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__browsing-search.js +0 -684
- package/dist/features/tester/seed-data/authored/buying__buying-checkout.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__buying-checkout.js +0 -546
- package/dist/features/tester/seed-data/authored/buying__buying-coupons.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__buying-coupons.js +0 -379
- package/dist/features/tester/seed-data/authored/buying__cart.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__cart.js +0 -1264
- package/dist/features/tester/seed-data/authored/buying__image-tile-layout.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__image-tile-layout.js +0 -122
- package/dist/features/tester/seed-data/authored/buying__my-orders.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__my-orders.js +0 -279
- package/dist/features/tester/seed-data/authored/buying__offers.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__offers.js +0 -1127
- package/dist/features/tester/seed-data/authored/buying__order-detail-actions.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__order-detail-actions.js +0 -153
- package/dist/features/tester/seed-data/authored/buying__order-status-lifecycle.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__order-status-lifecycle.js +0 -252
- package/dist/features/tester/seed-data/authored/buying__product-detail.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__product-detail.js +0 -474
- package/dist/features/tester/seed-data/authored/buying__return-request.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__return-request.js +0 -165
- package/dist/features/tester/seed-data/authored/buying__reviews-pagination.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__reviews-pagination.js +0 -260
- package/dist/features/tester/seed-data/authored/buying__reviews.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__reviews.js +0 -128
- package/dist/features/tester/seed-data/authored/buying__spares-and-groups.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__spares-and-groups.js +0 -96
- package/dist/features/tester/seed-data/authored/buying__user-dashboard-extras.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__user-dashboard-extras.js +0 -283
- package/dist/features/tester/seed-data/authored/buying__user-dashboard-navigation.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__user-dashboard-navigation.js +0 -169
- package/dist/features/tester/seed-data/authored/buying__user-uncovered-pages.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__user-uncovered-pages.js +0 -105
- package/dist/features/tester/seed-data/authored/buying__wishlist-history.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__wishlist-history.js +0 -374
- package/dist/features/tester/seed-data/authored/community-support__messages.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/community-support__messages.js +0 -200
- package/dist/features/tester/seed-data/authored/community-support__public-profile.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/community-support__public-profile.js +0 -54
- package/dist/features/tester/seed-data/authored/community-support__support-tickets.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/community-support__support-tickets.js +0 -76
- package/dist/features/tester/seed-data/authored/content-discovery__authenticity-checker.d.ts +0 -4
- package/dist/features/tester/seed-data/authored/content-discovery__authenticity-checker.js +0 -590
- package/dist/features/tester/seed-data/authored/content-discovery__blog.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/content-discovery__blog.js +0 -110
- package/dist/features/tester/seed-data/authored/content-discovery__category-brand-relations.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/content-discovery__category-brand-relations.js +0 -149
- package/dist/features/tester/seed-data/authored/content-discovery__category-counts-and-rollup.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/content-discovery__category-counts-and-rollup.js +0 -145
- package/dist/features/tester/seed-data/authored/content-discovery__category-tabs-franchise-bundles.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/content-discovery__category-tabs-franchise-bundles.js +0 -174
- package/dist/features/tester/seed-data/authored/content-discovery__coupons.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/content-discovery__coupons.js +0 -169
- package/dist/features/tester/seed-data/authored/content-discovery__event-detail-subroutes.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/content-discovery__event-detail-subroutes.js +0 -209
- package/dist/features/tester/seed-data/authored/content-discovery__event-participation.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/content-discovery__event-participation.js +0 -207
- package/dist/features/tester/seed-data/authored/content-discovery__events.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/content-discovery__events.js +0 -377
- package/dist/features/tester/seed-data/authored/content-discovery__faq-help.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/content-discovery__faq-help.js +0 -87
- package/dist/features/tester/seed-data/authored/content-discovery__notifications.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/content-discovery__notifications.js +0 -147
- package/dist/features/tester/seed-data/authored/content-discovery__overflowing-pill-rows.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/content-discovery__overflowing-pill-rows.js +0 -209
- package/dist/features/tester/seed-data/authored/content-discovery__parts-database.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/content-discovery__parts-database.js +0 -167
- package/dist/features/tester/seed-data/authored/content-discovery__price-index-and-compare.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/content-discovery__price-index-and-compare.js +0 -73
- package/dist/features/tester/seed-data/authored/content-discovery__search.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/content-discovery__search.js +0 -363
- package/dist/features/tester/seed-data/authored/content-discovery__site-wide-index.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/content-discovery__site-wide-index.js +0 -340
- package/dist/features/tester/seed-data/authored/content-discovery__store-reviews-aggregate.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/content-discovery__store-reviews-aggregate.js +0 -88
- package/dist/features/tester/seed-data/authored/cta-layout__checkout-bottom-bar.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/cta-layout__checkout-bottom-bar.js +0 -78
- package/dist/features/tester/seed-data/authored/cta-layout__dialog-footers.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/cta-layout__dialog-footers.js +0 -76
- package/dist/features/tester/seed-data/authored/cta-layout__editor-action-bar.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/cta-layout__editor-action-bar.js +0 -62
- package/dist/features/tester/seed-data/authored/cta-layout__navbar-ctas.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/cta-layout__navbar-ctas.js +0 -163
- package/dist/features/tester/seed-data/authored/cta-layout__product-bottom-bar.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/cta-layout__product-bottom-bar.js +0 -61
- package/dist/features/tester/seed-data/authored/design-ux__action-bar-placement.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/design-ux__action-bar-placement.js +0 -89
- package/dist/features/tester/seed-data/authored/design-ux__back-to-top-button.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/design-ux__back-to-top-button.js +0 -95
- package/dist/features/tester/seed-data/authored/design-ux__carousel-arrow-bounds.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/design-ux__carousel-arrow-bounds.js +0 -191
- package/dist/features/tester/seed-data/authored/design-ux__dashboard-layout.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/design-ux__dashboard-layout.js +0 -158
- package/dist/features/tester/seed-data/authored/design-ux__feature-badge-picker.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/design-ux__feature-badge-picker.js +0 -82
- package/dist/features/tester/seed-data/authored/design-ux__footer-theme.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/design-ux__footer-theme.js +0 -106
- package/dist/features/tester/seed-data/authored/design-ux__form-validation-errors.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/design-ux__form-validation-errors.js +0 -88
- package/dist/features/tester/seed-data/authored/design-ux__general-design.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/design-ux__general-design.js +0 -204
- package/dist/features/tester/seed-data/authored/design-ux__hand-mode-layout.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/design-ux__hand-mode-layout.js +0 -301
- package/dist/features/tester/seed-data/authored/design-ux__header-brand-mark-centring.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/design-ux__header-brand-mark-centring.js +0 -90
- package/dist/features/tester/seed-data/authored/design-ux__header-controls-and-messages.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/design-ux__header-controls-and-messages.js +0 -85
- package/dist/features/tester/seed-data/authored/design-ux__homepage-carousels.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/design-ux__homepage-carousels.js +0 -407
- package/dist/features/tester/seed-data/authored/design-ux__nav-reachability.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/design-ux__nav-reachability.js +0 -88
- package/dist/features/tester/seed-data/authored/design-ux__rich-text-readability.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/design-ux__rich-text-readability.js +0 -84
- package/dist/features/tester/seed-data/authored/design-ux__status-badge-legibility.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/design-ux__status-badge-legibility.js +0 -214
- package/dist/features/tester/seed-data/authored/design-ux__sticky-cta-bar.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/design-ux__sticky-cta-bar.js +0 -275
- package/dist/features/tester/seed-data/authored/index.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/index.js +0 -301
- package/dist/features/tester/seed-data/authored/page-wiring__data-loss.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/page-wiring__data-loss.js +0 -125
- package/dist/features/tester/seed-data/authored/page-wiring__detail-pages.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/page-wiring__detail-pages.js +0 -85
- package/dist/features/tester/seed-data/authored/page-wiring__drawer-pages.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/page-wiring__drawer-pages.js +0 -92
- package/dist/features/tester/seed-data/authored/page-wiring__reachability.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/page-wiring__reachability.js +0 -115
- package/dist/features/tester/seed-data/authored/public-pages__auth-error-pages.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/public-pages__auth-error-pages.js +0 -137
- package/dist/features/tester/seed-data/authored/public-pages__core-listing-pages.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/public-pages__core-listing-pages.js +0 -263
- package/dist/features/tester/seed-data/authored/public-pages__help-how-it-works.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/public-pages__help-how-it-works.js +0 -229
- package/dist/features/tester/seed-data/authored/public-pages__help-scams-guides-subpages.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/public-pages__help-scams-guides-subpages.js +0 -325
- package/dist/features/tester/seed-data/authored/public-pages__legal-policy-pages.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/public-pages__legal-policy-pages.js +0 -126
- package/dist/features/tester/seed-data/authored/public-pages__newly-wired-browse-indexes.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/public-pages__newly-wired-browse-indexes.js +0 -141
- package/dist/features/tester/seed-data/authored/public-pages__store-tabs.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/public-pages__store-tabs.js +0 -115
- package/dist/features/tester/seed-data/authored/public-pages__stores-sellers-directories.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/public-pages__stores-sellers-directories.js +0 -253
- package/dist/features/tester/seed-data/authored/search-and-nav__employee-permissions.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/search-and-nav__employee-permissions.js +0 -93
- package/dist/features/tester/seed-data/authored/search-and-nav__header-search.d.ts +0 -3
- package/dist/features/tester/seed-data/authored/search-and-nav__header-search.js +0 -185
- package/dist/features/tester/seed-data/authored/search-and-nav__settings-deep-links.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/search-and-nav__settings-deep-links.js +0 -82
- package/dist/features/tester/seed-data/authored/search-and-nav__sidebar-search.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/search-and-nav__sidebar-search.js +0 -60
- package/dist/features/tester/seed-data/authored/selling__become-seller.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__become-seller.js +0 -117
- package/dist/features/tester/seed-data/authored/selling__digital-content-delivery.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__digital-content-delivery.js +0 -148
- package/dist/features/tester/seed-data/authored/selling__final-sale-authoring.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__final-sale-authoring.js +0 -108
- package/dist/features/tester/seed-data/authored/selling__listing-a-product.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__listing-a-product.js +0 -274
- package/dist/features/tester/seed-data/authored/selling__listing-edit-roundtrip.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__listing-edit-roundtrip.js +0 -145
- package/dist/features/tester/seed-data/authored/selling__listing-lifecycle.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__listing-lifecycle.js +0 -336
- package/dist/features/tester/seed-data/authored/selling__listing-type-fields-roundtrip.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__listing-type-fields-roundtrip.js +0 -136
- package/dist/features/tester/seed-data/authored/selling__media-limits.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__media-limits.js +0 -135
- package/dist/features/tester/seed-data/authored/selling__product-upload-details.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__product-upload-details.js +0 -155
- package/dist/features/tester/seed-data/authored/selling__quick-add-minimum-details.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__quick-add-minimum-details.js +0 -138
- package/dist/features/tester/seed-data/authored/selling__sectionised-forms.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__sectionised-forms.js +0 -191
- package/dist/features/tester/seed-data/authored/selling__seller-analytics-payouts.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__seller-analytics-payouts.js +0 -138
- package/dist/features/tester/seed-data/authored/selling__seller-bids-bundles-filters.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__seller-bids-bundles-filters.js +0 -106
- package/dist/features/tester/seed-data/authored/selling__seller-catalog-org.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__seller-catalog-org.js +0 -192
- package/dist/features/tester/seed-data/authored/selling__seller-custom-brands.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__seller-custom-brands.js +0 -109
- package/dist/features/tester/seed-data/authored/selling__seller-guide.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__seller-guide.js +0 -34
- package/dist/features/tester/seed-data/authored/selling__seller-listing-types.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__seller-listing-types.js +0 -348
- package/dist/features/tester/seed-data/authored/selling__seller-marketing-extras.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__seller-marketing-extras.js +0 -87
- package/dist/features/tester/seed-data/authored/selling__seller-ops-comms.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__seller-ops-comms.js +0 -90
- package/dist/features/tester/seed-data/authored/selling__seller-orders-at-scale.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__seller-orders-at-scale.js +0 -85
- package/dist/features/tester/seed-data/authored/selling__seller-orders.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__seller-orders.js +0 -213
- package/dist/features/tester/seed-data/authored/selling__seller-shipping-payouts-setup.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__seller-shipping-payouts-setup.js +0 -192
- package/dist/features/tester/seed-data/authored/selling__spares-and-group-editing.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__spares-and-group-editing.js +0 -77
- package/dist/features/tester/seed-data/authored/selling__store-dashboard-navigation.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__store-dashboard-navigation.js +0 -165
- package/dist/features/tester/seed-data/authored/selling__store-uncovered-pages.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__store-uncovered-pages.js +0 -116
- package/dist/features/tester/seed-data/authored/seo__canonical-and-host.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/seo__canonical-and-host.js +0 -127
- package/dist/features/tester/seed-data/authored/seo__og-images.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/seo__og-images.js +0 -107
- package/dist/features/tester/seed-data/authored/seo__page-metadata.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/seo__page-metadata.js +0 -120
- package/dist/features/tester/seed-data/authored/seo__sitemap-and-robots.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/seo__sitemap-and-robots.js +0 -105
- package/dist/features/tester/seed-data/authored/tools__sticker-promote-to-listings.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/tools__sticker-promote-to-listings.js +0 -58
- package/dist/features/tester/seed-data/authored/tools__sticker-tracer.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/tools__sticker-tracer.js +0 -284
- package/dist/features/tester/seed-data/index.d.ts +0 -2
- package/dist/features/tester/seed-data/index.js +0 -2
- package/dist/features/tester/seed-data/tester-checklist-seed-data.d.ts +0 -2
- package/dist/features/tester/seed-data/tester-checklist-seed-data.js +0 -7601
- package/dist/features/tester/seed-data/tester-responses-seed-data.d.ts +0 -2
- package/dist/features/tester/seed-data/tester-responses-seed-data.js +0 -95
- package/dist/features/tester/seed-data/tester-window.d.ts +0 -25
- package/dist/features/tester/seed-data/tester-window.js +0 -66
- package/dist/seed/_helpers/brand-rows.d.ts +0 -35
- package/dist/seed/_helpers/brand-rows.js +0 -600
- package/dist/seed/_helpers/category-content-generated.d.ts +0 -24
- package/dist/seed/_helpers/category-content-generated.js +0 -1853
- package/dist/seed/_helpers/category-content.d.ts +0 -68
- package/dist/seed/_helpers/category-content.js +0 -731
- package/dist/seed/_helpers/category-forest.d.ts +0 -4
- package/dist/seed/_helpers/category-forest.js +0 -824
- package/dist/seed/_helpers/category-images-generated.d.ts +0 -57
- package/dist/seed/_helpers/category-images-generated.js +0 -618
- package/dist/seed/_helpers/category-models/chunk0.d.ts +0 -2
- package/dist/seed/_helpers/category-models/chunk0.js +0 -2648
- package/dist/seed/_helpers/category-models/chunk1.d.ts +0 -2
- package/dist/seed/_helpers/category-models/chunk1.js +0 -2318
- package/dist/seed/_helpers/category-models/chunk2.d.ts +0 -2
- package/dist/seed/_helpers/category-models/chunk2.js +0 -2560
- package/dist/seed/_helpers/category-models/chunk3.d.ts +0 -2
- package/dist/seed/_helpers/category-models/chunk3.js +0 -2196
- package/dist/seed/_helpers/category-models/chunk4.d.ts +0 -2
- package/dist/seed/_helpers/category-models/chunk4.js +0 -1732
- package/dist/seed/_helpers/category-models.d.ts +0 -12
- package/dist/seed/_helpers/category-models.js +0 -45
- package/dist/seed/_helpers/category-names.d.ts +0 -54
- package/dist/seed/_helpers/category-names.js +0 -118
- package/dist/seed/_helpers/category-parts-glossary-map.d.ts +0 -1
- package/dist/seed/_helpers/category-parts-glossary-map.js +0 -2499
- package/dist/seed/_helpers/category-parts.d.ts +0 -9
- package/dist/seed/_helpers/category-parts.js +0 -15022
- package/dist/seed/_helpers/category-tree.d.ts +0 -27
- package/dist/seed/_helpers/category-tree.js +0 -119
- package/dist/seed/_helpers/character-features.d.ts +0 -10
- package/dist/seed/_helpers/character-features.js +0 -120
- package/dist/seed/_helpers/final-sale-fixtures.d.ts +0 -35
- package/dist/seed/_helpers/final-sale-fixtures.js +0 -61
- package/dist/seed/_helpers/franchise-rows.d.ts +0 -43
- package/dist/seed/_helpers/franchise-rows.js +0 -189
- package/dist/seed/_helpers/media.d.ts +0 -67
- package/dist/seed/_helpers/media.js +0 -172
- package/dist/seed/_helpers/part-colours-generated.d.ts +0 -18
- package/dist/seed/_helpers/part-colours-generated.js +0 -273
- package/dist/seed/_helpers/product-search-txt.d.ts +0 -18
- package/dist/seed/_helpers/product-search-txt.js +0 -23
- package/dist/seed/_helpers/search-txt-wrappers.d.ts +0 -26
- package/dist/seed/_helpers/search-txt-wrappers.js +0 -58
- package/dist/seed/addresses-seed-data.d.ts +0 -2
- package/dist/seed/addresses-seed-data.js +0 -78
- package/dist/seed/authenticity-knowledge-seed-data.d.ts +0 -78
- package/dist/seed/authenticity-knowledge-seed-data.js +0 -10729
- package/dist/seed/bids-seed-data.d.ts +0 -2
- package/dist/seed/bids-seed-data.js +0 -206
- package/dist/seed/blog-posts-seed-data.d.ts +0 -6
- package/dist/seed/blog-posts-seed-data.js +0 -442
- package/dist/seed/carousel-slides-seed-data.d.ts +0 -2
- package/dist/seed/carousel-slides-seed-data.js +0 -411
- package/dist/seed/carousels-seed-data.d.ts +0 -2
- package/dist/seed/carousels-seed-data.js +0 -36
- package/dist/seed/cart-seed-data.d.ts +0 -2
- package/dist/seed/cart-seed-data.js +0 -241
- package/dist/seed/catalogue-seed-data.d.ts +0 -2
- package/dist/seed/catalogue-seed-data.js +0 -112
- package/dist/seed/categories-seed-data.d.ts +0 -3
- package/dist/seed/categories-seed-data.js +0 -816
- package/dist/seed/claimed-coupons-seed-data.d.ts +0 -2
- package/dist/seed/claimed-coupons-seed-data.js +0 -85
- package/dist/seed/coupon-usage-seed-data.d.ts +0 -9
- package/dist/seed/coupon-usage-seed-data.js +0 -55
- package/dist/seed/coupons-seed-data.d.ts +0 -2
- package/dist/seed/coupons-seed-data.js +0 -226
- package/dist/seed/defaults/categories.d.ts +0 -2
- package/dist/seed/defaults/categories.js +0 -12
- package/dist/seed/defaults/faqs.d.ts +0 -2
- package/dist/seed/defaults/faqs.js +0 -40
- package/dist/seed/events-seed-data.d.ts +0 -7
- package/dist/seed/events-seed-data.js +0 -482
- package/dist/seed/factories/address.factory.d.ts +0 -21
- package/dist/seed/factories/address.factory.js +0 -44
- package/dist/seed/factories/bid.factory.d.ts +0 -15
- package/dist/seed/factories/bid.factory.js +0 -33
- package/dist/seed/factories/blog-post.factory.d.ts +0 -15
- package/dist/seed/factories/blog-post.factory.js +0 -22
- package/dist/seed/factories/carousel.factory.d.ts +0 -11
- package/dist/seed/factories/carousel.factory.js +0 -17
- package/dist/seed/factories/cart.factory.d.ts +0 -25
- package/dist/seed/factories/cart.factory.js +0 -35
- package/dist/seed/factories/category.factory.d.ts +0 -11
- package/dist/seed/factories/category.factory.js +0 -16
- package/dist/seed/factories/coupon.factory.d.ts +0 -21
- package/dist/seed/factories/coupon.factory.js +0 -43
- package/dist/seed/factories/faq.factory.d.ts +0 -10
- package/dist/seed/factories/faq.factory.js +0 -15
- package/dist/seed/factories/notification.factory.d.ts +0 -18
- package/dist/seed/factories/notification.factory.js +0 -39
- package/dist/seed/factories/order.factory.d.ts +0 -20
- package/dist/seed/factories/order.factory.js +0 -20
- package/dist/seed/factories/payout.factory.d.ts +0 -21
- package/dist/seed/factories/payout.factory.js +0 -38
- package/dist/seed/factories/product.factory.d.ts +0 -27
- package/dist/seed/factories/product.factory.js +0 -80
- package/dist/seed/factories/review.factory.d.ts +0 -14
- package/dist/seed/factories/review.factory.js +0 -52
- package/dist/seed/factories/session.factory.d.ts +0 -15
- package/dist/seed/factories/session.factory.js +0 -31
- package/dist/seed/factories/store.factory.d.ts +0 -23
- package/dist/seed/factories/store.factory.js +0 -47
- package/dist/seed/factories/user.factory.d.ts +0 -19
- package/dist/seed/factories/user.factory.js +0 -56
- package/dist/seed/faq-seed-data.d.ts +0 -18
- package/dist/seed/faq-seed-data.js +0 -1956
- package/dist/seed/firestore-indexes.d.ts +0 -12
- package/dist/seed/firestore-indexes.js +0 -31
- package/dist/seed/grouped-listings-seed-data.d.ts +0 -2
- package/dist/seed/grouped-listings-seed-data.js +0 -283
- package/dist/seed/history-seed-data.d.ts +0 -12
- package/dist/seed/history-seed-data.js +0 -70
- package/dist/seed/homepage-sections-seed-data.d.ts +0 -2
- package/dist/seed/homepage-sections-seed-data.js +0 -1018
- package/dist/seed/index.d.ts +0 -98
- package/dist/seed/index.js +0 -112
- package/dist/seed/lottery-entries-seed-data.d.ts +0 -2
- package/dist/seed/lottery-entries-seed-data.js +0 -108
- package/dist/seed/manifest.d.ts +0 -16
- package/dist/seed/manifest.js +0 -235
- package/dist/seed/media-assets-seed-data.d.ts +0 -22
- package/dist/seed/media-assets-seed-data.js +0 -5593
- package/dist/seed/model-composition-seed-data.d.ts +0 -15
- package/dist/seed/model-composition-seed-data.js +0 -9032
- package/dist/seed/notifications-seed-data.d.ts +0 -2
- package/dist/seed/notifications-seed-data.js +0 -606
- package/dist/seed/offers-seed-data.d.ts +0 -2
- package/dist/seed/offers-seed-data.js +0 -398
- package/dist/seed/orders-seed-data.d.ts +0 -2
- package/dist/seed/orders-seed-data.js +0 -845
- package/dist/seed/part-glossary/chunk0.d.ts +0 -9
- package/dist/seed/part-glossary/chunk0.js +0 -35448
- package/dist/seed/part-glossary/chunk1.d.ts +0 -9
- package/dist/seed/part-glossary/chunk1.js +0 -40494
- package/dist/seed/part-glossary/chunk2.d.ts +0 -9
- package/dist/seed/part-glossary/chunk2.js +0 -51242
- package/dist/seed/part-glossary/chunk3.d.ts +0 -9
- package/dist/seed/part-glossary/chunk3.js +0 -53337
- package/dist/seed/part-glossary/chunk4.d.ts +0 -9
- package/dist/seed/part-glossary/chunk4.js +0 -51454
- package/dist/seed/part-glossary-seed-data.d.ts +0 -15
- package/dist/seed/part-glossary-seed-data.js +0 -25
- package/dist/seed/payouts-seed-data.d.ts +0 -2
- package/dist/seed/payouts-seed-data.js +0 -302
- package/dist/seed/product-features-seed-data.d.ts +0 -3
- package/dist/seed/product-features-seed-data.js +0 -366
- package/dist/seed/products-art-seed-data.d.ts +0 -2
- package/dist/seed/products-art-seed-data.js +0 -289
- package/dist/seed/products-auctions-seed-data.d.ts +0 -2
- package/dist/seed/products-auctions-seed-data.js +0 -475
- package/dist/seed/products-beyblade-x-seed-data.d.ts +0 -2
- package/dist/seed/products-beyblade-x-seed-data.js +0 -476
- package/dist/seed/products-catalogue-seed-data.d.ts +0 -22
- package/dist/seed/products-catalogue-seed-data.js +0 -86384
- package/dist/seed/products-classifieds-seed-data.d.ts +0 -7
- package/dist/seed/products-classifieds-seed-data.js +0 -435
- package/dist/seed/products-digital-codes-seed-data.d.ts +0 -7
- package/dist/seed/products-digital-codes-seed-data.js +0 -395
- package/dist/seed/products-live-items-seed-data.d.ts +0 -7
- package/dist/seed/products-live-items-seed-data.js +0 -269
- package/dist/seed/products-preorders-seed-data.d.ts +0 -2
- package/dist/seed/products-preorders-seed-data.js +0 -360
- package/dist/seed/products-prize-draws-seed-data.d.ts +0 -7
- package/dist/seed/products-prize-draws-seed-data.js +0 -427
- package/dist/seed/products-spares-seed-data.d.ts +0 -2
- package/dist/seed/products-spares-seed-data.js +0 -368
- package/dist/seed/products-standard-seed-data.d.ts +0 -2
- package/dist/seed/products-standard-seed-data.js +0 -632
- package/dist/seed/products-stickers-seed-data.d.ts +0 -2
- package/dist/seed/products-stickers-seed-data.js +0 -319
- package/dist/seed/reviews-seed-data.d.ts +0 -1
- package/dist/seed/reviews-seed-data.js +0 -185
- package/dist/seed/runner.d.ts +0 -2
- package/dist/seed/runner.js +0 -125
- package/dist/seed/scammers-seed-data.d.ts +0 -2
- package/dist/seed/scammers-seed-data.js +0 -235
- package/dist/seed/seed-market-config.d.ts +0 -48
- package/dist/seed/seed-market-config.js +0 -199
- package/dist/seed/seed-purpose.d.ts +0 -299
- package/dist/seed/seed-purpose.js +0 -431
- package/dist/seed/sessions-seed-data.d.ts +0 -3
- package/dist/seed/sessions-seed-data.js +0 -116
- package/dist/seed/shipments-seed-data.d.ts +0 -5
- package/dist/seed/shipments-seed-data.js +0 -185
- package/dist/seed/site-settings-seed-data.d.ts +0 -2
- package/dist/seed/site-settings-seed-data.js +0 -1069
- package/dist/seed/store-addresses-seed-data.d.ts +0 -18
- package/dist/seed/store-addresses-seed-data.js +0 -71
- package/dist/seed/store-extensions-seed-data.d.ts +0 -11
- package/dist/seed/store-extensions-seed-data.js +0 -292
- package/dist/seed/stores-seed-data.d.ts +0 -6
- package/dist/seed/stores-seed-data.js +0 -242
- package/dist/seed/support-tickets-seed-data.d.ts +0 -16
- package/dist/seed/support-tickets-seed-data.js +0 -239
- package/dist/seed/tax-codes-seed-data.d.ts +0 -34
- package/dist/seed/tax-codes-seed-data.js +0 -100
- package/dist/seed/test-data-ttl.d.ts +0 -29
- package/dist/seed/test-data-ttl.js +0 -31
- package/dist/seed/test-utils.d.ts +0 -49
- package/dist/seed/test-utils.js +0 -110
- package/dist/seed/types.d.ts +0 -89
- package/dist/seed/types.js +0 -15
- package/dist/seed/users-seed-data.d.ts +0 -2
- package/dist/seed/users-seed-data.js +0 -597
- package/dist/seed/wishlists-seed-data.d.ts +0 -12
- package/dist/seed/wishlists-seed-data.js +0 -54
|
@@ -1,377 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* WHY: Authored six-part procedures for the content-discovery/events page.
|
|
3
|
-
* WHAT: 19 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
|
-
* 🛑 EVENTS ARE GLOBAL — the document carries no storeId, no categorySlugs and no
|
|
10
|
-
* brandSlug — which is why their facet counts are unscoped and why no case here
|
|
11
|
-
* filters an event by store. Time-bound event fixtures derive their windows from
|
|
12
|
-
* tester-window.ts, so a run can shorten them and actually watch one close.
|
|
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-content-discovery-events-view-event": {
|
|
23
|
-
roles: ["guest"],
|
|
24
|
-
startPage: "/events",
|
|
25
|
-
steps: [
|
|
26
|
-
"Open /events in a private window with no session.",
|
|
27
|
-
"Click event-favourite-blader-poll.",
|
|
28
|
-
"Read the title, dates, status and description.",
|
|
29
|
-
"Read the tab bar and open each tab in turn.",
|
|
30
|
-
"Read the address bar as each tab opens.",
|
|
31
|
-
],
|
|
32
|
-
inputs: { eventId: "event-favourite-blader-poll" },
|
|
33
|
-
expectedBehaviour: "An event detail page is split into routed child tabs — Overview, Participate and Leaderboard — so each is a real URL rather than local state. The description renders as HTML, which is where an event's extra images live since the document has no gallery field.",
|
|
34
|
-
expectedUiState: "Title, dates and status render. Each tab changes the URL and renders its own content. The description shows formatted prose and any inline images, not raw markup as visible text.",
|
|
35
|
-
endResult: "Read-only; nothing persists.",
|
|
36
|
-
},
|
|
37
|
-
"checklist-content-discovery-events-events-listing-cards-images": {
|
|
38
|
-
roles: ["guest"],
|
|
39
|
-
startPage: "/events",
|
|
40
|
-
steps: [
|
|
41
|
-
"Open /events in a private window with no session.",
|
|
42
|
-
"Look at every card's image.",
|
|
43
|
-
"Hard-reload with Ctrl+Shift+R and look again.",
|
|
44
|
-
"Read every status filter offered and select each in turn.",
|
|
45
|
-
"Read the results for each status.",
|
|
46
|
-
],
|
|
47
|
-
expectedBehaviour: "Every card renders its image, and every status chip corresponds to a real stored status. The seed carries a paused and a cancelled event specifically because those two chips previously had no rows at all and could never return anything.",
|
|
48
|
-
expectedUiState: "All cards show images on both loads, with no broken glyph or grey placeholder. Every status chip returns rows or a named empty state, and the paused and cancelled chips both return their fixtures.",
|
|
49
|
-
endResult: "Read-only; nothing persists beyond the URL.",
|
|
50
|
-
},
|
|
51
|
-
"checklist-content-discovery-events-lottery-cover-image": {
|
|
52
|
-
roles: ["guest"],
|
|
53
|
-
startPage: "/events",
|
|
54
|
-
steps: [
|
|
55
|
-
"Open /events in a private window and find event-pokemon-number-draw-july-2026.",
|
|
56
|
-
"Look at its card image.",
|
|
57
|
-
"Open /lottery/event-pokemon-number-draw-july-2026 — the lottery detail route is /lottery/{id}, not /events/{id}.",
|
|
58
|
-
"Look at the image at the top of that page.",
|
|
59
|
-
"Note whether either shows an emoji instead of a photograph.",
|
|
60
|
-
],
|
|
61
|
-
inputs: { eventId: "event-pokemon-number-draw-july-2026" },
|
|
62
|
-
expectedBehaviour: "A lottery renders its stored cover image on both the card and the detail page. The 🎰 emoji is the fallback for an event with no image, and seeing it where one is set means the field is not reaching the renderer.",
|
|
63
|
-
expectedUiState: "Both the card and the detail hero show the cover photograph. Neither shows the 🎰 emoji placeholder.",
|
|
64
|
-
endResult: "Read-only; nothing persists.",
|
|
65
|
-
},
|
|
66
|
-
"checklist-content-discovery-events-lottery-prize-previews": {
|
|
67
|
-
roles: ["guest"],
|
|
68
|
-
startPage: "/events",
|
|
69
|
-
steps: [
|
|
70
|
-
"Open event-pokemon-number-draw-july-2026's detail page in a private window.",
|
|
71
|
-
"Find the 'Prizes' collage above the numbered slot grid.",
|
|
72
|
-
"Count the tiles in the collage.",
|
|
73
|
-
"Count the slots in the numbered grid below it.",
|
|
74
|
-
"Compare the two numbers and read whether any collage tile is blank.",
|
|
75
|
-
"Read the page source for a slot price or weight value.",
|
|
76
|
-
],
|
|
77
|
-
expectedBehaviour: "Only slots carrying an image appear in the collage — a slot without one is omitted rather than rendered as an empty tile, so a 200-slot lottery with six photographed prizes shows six tiles. The client-facing slot shape is an allow-list: number, name, booked state and image reach the browser, price and weight never do.",
|
|
78
|
-
expectedUiState: "The collage holds one tile per photographed prize and no blank tiles. The numbered grid below still shows EVERY slot, photographed or not. No slot price or weight appears anywhere in the page or its source.",
|
|
79
|
-
expectedData: { blankCollageTiles: 0 },
|
|
80
|
-
endResult: "Read-only; nothing persists. A collage with as many tiles as the grid has slots means unphotographed slots are being rendered as empties.",
|
|
81
|
-
},
|
|
82
|
-
"checklist-content-discovery-events-related-events-section": {
|
|
83
|
-
roles: ["guest"],
|
|
84
|
-
startPage: "/events",
|
|
85
|
-
steps: [
|
|
86
|
-
"Open /events in a private window and open any active event.",
|
|
87
|
-
"Stay on the Overview tab and scroll to the 'Related Events' carousel.",
|
|
88
|
-
"Read the cards and their titles.",
|
|
89
|
-
"Check whether the event currently open appears among them.",
|
|
90
|
-
"Click one card and confirm it opens that event.",
|
|
91
|
-
],
|
|
92
|
-
expectedBehaviour: "Related events are other ACTIVE events sharing at least one tag, with the current event excluded. Ended and cancelled events must not be suggested — a suggestion the visitor cannot act on is worse than no carousel.",
|
|
93
|
-
expectedUiState: "The carousel holds real event cards with titles and images. The current event is not among them. No card is an ended or cancelled event. An empty rail beneath a heading is a fail — the section should not render at all.",
|
|
94
|
-
expectedData: { selfLinkCount: 0 },
|
|
95
|
-
endResult: "Read-only; nothing persists.",
|
|
96
|
-
},
|
|
97
|
-
"checklist-content-discovery-events-poll-vote-inline": {
|
|
98
|
-
roles: ["buyer"],
|
|
99
|
-
startPage: "/events",
|
|
100
|
-
steps: [
|
|
101
|
-
"Sign in as rehan.sheikh@gmail.com / TempPass123!.",
|
|
102
|
-
"Open event-favourite-blader-poll and click the Participate tab.",
|
|
103
|
-
"Read the options offered.",
|
|
104
|
-
"Select the first option and submit the vote.",
|
|
105
|
-
"Read what the page shows immediately afterwards, without reloading.",
|
|
106
|
-
"Reload the page and read the Participate tab again.",
|
|
107
|
-
"Try to vote a second time.",
|
|
108
|
-
],
|
|
109
|
-
inputs: { eventId: "event-favourite-blader-poll" },
|
|
110
|
-
expectedBehaviour: "A vote is recorded as an entry against this user and the tally updates in place. One vote per user is enforced server-side, so a second attempt is refused rather than silently counted again.",
|
|
111
|
-
expectedUiState: "The vote registers without a full page reload and the tally moves. After reloading, the same option is still shown as this user's choice. The second attempt is refused with a message rather than accepted.",
|
|
112
|
-
expectedData: { votesPerUser: 1 },
|
|
113
|
-
endResult: "The vote survives the reload.",
|
|
114
|
-
},
|
|
115
|
-
"checklist-content-discovery-events-poll-leaderboard-shows-tally": {
|
|
116
|
-
roles: ["guest"],
|
|
117
|
-
startPage: "/events",
|
|
118
|
-
steps: [
|
|
119
|
-
"Open event-favourite-blader-poll in a private window.",
|
|
120
|
-
"Click the Leaderboard tab.",
|
|
121
|
-
"Read every row — what it names and what number it carries.",
|
|
122
|
-
"Check whether the rows are option labels or people's names.",
|
|
123
|
-
"Check whether the counts descend down the list.",
|
|
124
|
-
],
|
|
125
|
-
expectedBehaviour: "A poll's leaderboard ranks OPTIONS by votes, not participants by who voted first. Reusing the generic entries-ranked-by-time view produces a list of voters, which answers a question nobody asked and publishes who voted.",
|
|
126
|
-
expectedUiState: "Each row names a poll option with its vote count or percentage, ordered highest first. No row names a person. A list of voter names is the failure even when it renders neatly.",
|
|
127
|
-
expectedData: { rowsAreOptions: true },
|
|
128
|
-
endResult: "Read-only; nothing persists.",
|
|
129
|
-
},
|
|
130
|
-
"checklist-content-discovery-events-admin-event-entries-export": {
|
|
131
|
-
roles: ["admin"],
|
|
132
|
-
startPage: "/admin/events",
|
|
133
|
-
steps: [
|
|
134
|
-
"Sign in as admin@letitrip.in / TempPass123!.",
|
|
135
|
-
"Open /admin/events and open the entries page for event-favourite-blader-poll.",
|
|
136
|
-
"Read the entries listed and expand one to read its response inline.",
|
|
137
|
-
"Click 'Download Report'.",
|
|
138
|
-
"Open the downloaded file and read it.",
|
|
139
|
-
"Compare the entries in the file against the ones shown on screen.",
|
|
140
|
-
],
|
|
141
|
-
expectedBehaviour: "Responses are readable inline, without downloading anything, and the download is a Markdown report of all entries. Both are needed: acting on an entry you cannot read is the dead-end shape this whole page family exists to close.",
|
|
142
|
-
expectedUiState: "Each entry can be expanded to show its response. 'Download Report' produces a Markdown file listing every entry with its response. The file's entries match what the page shows rather than being a shorter or differently-filtered set.",
|
|
143
|
-
endResult: "A report file exists on disk. Read-only against the data; nothing in the app changes.",
|
|
144
|
-
},
|
|
145
|
-
"checklist-content-discovery-events-survey-feedback-submit": {
|
|
146
|
-
roles: ["buyer"],
|
|
147
|
-
startPage: "/events",
|
|
148
|
-
steps: [
|
|
149
|
-
"Sign in as rehan.sheikh@gmail.com / TempPass123!.",
|
|
150
|
-
"Open event-metal-fight-era-feedback and click the Participate tab.",
|
|
151
|
-
"Submit the form with every field empty and read where the errors appear.",
|
|
152
|
-
"Type 'QA Feedback survey-feedback-submit' into the free-text field and answer any other required fields.",
|
|
153
|
-
"Submit the form.",
|
|
154
|
-
"Reload the page and read the Participate tab.",
|
|
155
|
-
],
|
|
156
|
-
inputs: { response: "QA Feedback survey-feedback-submit" },
|
|
157
|
-
expectedBehaviour: "The form validates against its schema and reports each problem on the field that caused it, then records an entry against this user.",
|
|
158
|
-
expectedUiState: "The empty submit marks individual fields rather than showing one banner. The filled submit produces a confirmation. After reloading, the tab shows the response as already submitted rather than offering a blank form again.",
|
|
159
|
-
endResult: "The entry survives the reload.",
|
|
160
|
-
},
|
|
161
|
-
"checklist-content-discovery-events-offer-coupon-display-copy": {
|
|
162
|
-
roles: ["buyer"],
|
|
163
|
-
startPage: "/events",
|
|
164
|
-
steps: [
|
|
165
|
-
"Sign in as rehan.sheikh@gmail.com / TempPass123!.",
|
|
166
|
-
"Open event-buy-3-get-1-beyblades and read the coupon code displayed.",
|
|
167
|
-
"Click the copy control beside it.",
|
|
168
|
-
"Read any confirmation shown.",
|
|
169
|
-
"Open /checkout with an item in the cart and paste into the coupon field.",
|
|
170
|
-
"Read what was pasted and click 'Apply'.",
|
|
171
|
-
],
|
|
172
|
-
inputs: { eventId: "event-buy-3-get-1-beyblades" },
|
|
173
|
-
expectedBehaviour: "The code is shown in full and the copy control puts exactly that string on the clipboard. A copy control that copies a truncated or differently-cased value produces a rejection the buyer cannot explain.",
|
|
174
|
-
expectedUiState: "The code is legible in full on the page. Copying shows a confirmation. The pasted value matches the displayed code character for character, and applying it is accepted.",
|
|
175
|
-
endResult: "Remove the coupon afterwards so later checkout cases start from an empty coupon list.",
|
|
176
|
-
},
|
|
177
|
-
"checklist-content-discovery-events-raffle-entry": {
|
|
178
|
-
roles: ["buyer"],
|
|
179
|
-
startPage: "/events",
|
|
180
|
-
steps: [
|
|
181
|
-
"Sign in as rehan.sheikh@gmail.com / TempPass123!.",
|
|
182
|
-
"Open event-win-burst-regalia-genesis and click the Participate tab.",
|
|
183
|
-
"Read the entry conditions stated.",
|
|
184
|
-
"Enter the raffle.",
|
|
185
|
-
"Read what the page shows immediately, without reloading.",
|
|
186
|
-
"RELOAD and read the tab again BEFORE touching the form — note whether it already shows you as entered, or presents an empty form as though you had not.",
|
|
187
|
-
"Try to enter a second time.",
|
|
188
|
-
],
|
|
189
|
-
/*
|
|
190
|
-
* 🛑 The fixture changed, 2026-10-19 — it pointed at
|
|
191
|
-
* `event-won-original-set-raffle`, which is seeded `status: ENDED` with a
|
|
192
|
-
* winner ALREADY DRAWN. `enterEvent` refuses any event that is not active,
|
|
193
|
-
* so every step after "Enter the raffle" was unreachable: the case could
|
|
194
|
-
* only ever record the generic closed-entries refusal, which looks like a
|
|
195
|
-
* correct result and proves nothing about one-entry-per-user.
|
|
196
|
-
* `event-win-burst-regalia-genesis` is the active open_raffle.
|
|
197
|
-
*/
|
|
198
|
-
inputs: { eventId: "event-win-burst-regalia-genesis" },
|
|
199
|
-
expectedBehaviour: "An open raffle records one entry per user, enforced SERVER-side. The entry is what makes the user eligible for the draw, so a duplicate would literally double their odds against everyone else. A limit held in the browser is no limit: the form's counter starts at zero on every page load.",
|
|
200
|
-
expectedUiState: "The entry is confirmed in place. After reloading — before any interaction — the tab already shows the user as entered, not an inviting empty form. The second attempt is refused with a message naming the existing entry.",
|
|
201
|
-
expectedData: { entriesPerUser: 1, entriesAfterSecondAttempt: 1 },
|
|
202
|
-
endResult: "BEFORE: a reload reset the form's counter to zero and presented an empty form, and submitting it was ACCEPTED with the same 'You're entered in the raffle!' toast — two entries for one person, because only surveys and polls had a per-user check and raffle had none. AFTER: the reloaded page shows the entry, and a forced second submit is refused. Exactly one entry exists.",
|
|
203
|
-
},
|
|
204
|
-
/*
|
|
205
|
-
* 🛑 THESE TWO CASES CHANGED SHAPE, 2026-09-15.
|
|
206
|
-
*
|
|
207
|
-
* They used to open one fixture per raffleType — a `top_n_scorers` event and a
|
|
208
|
-
* `top_n_participants` one — and compare their leaderboards side by side. Both
|
|
209
|
-
* fixtures are gone and the permanent seed carries only `open_raffle`, so the
|
|
210
|
-
* comparison has no second half to make.
|
|
211
|
-
*
|
|
212
|
-
* Rather than delete the coverage, each case now AUTHORS the raffle type it is
|
|
213
|
-
* about, on a real event, and then reads the leaderboard back. That is a
|
|
214
|
-
* stronger test than the old one — it exercises the admin write path as well as
|
|
215
|
-
* the render — and it is the only form the current seed can express.
|
|
216
|
-
*/
|
|
217
|
-
"checklist-content-discovery-events-raffle-entry-top-n-scorers": {
|
|
218
|
-
roles: ["admin", "buyer"],
|
|
219
|
-
startPage: "/admin/events",
|
|
220
|
-
steps: [
|
|
221
|
-
"Sign in as admin@letitrip.in / TempPass123!.",
|
|
222
|
-
"Open /admin/events, open event-win-burst-regalia-genesis for editing, and write down its current raffle type.",
|
|
223
|
-
"Set the raffle type to 'Top N scorers', set the N to 3, and save.",
|
|
224
|
-
"Sign out and sign in as rehan.sheikh@gmail.com / TempPass123!.",
|
|
225
|
-
"Open /events/event-win-burst-regalia-genesis and read the Overview tab's description of how winners are chosen.",
|
|
226
|
-
"Click the Participate tab and enter.",
|
|
227
|
-
"Click the Leaderboard tab and read how entries are ranked.",
|
|
228
|
-
"Read whether the ranking is by score and whether the eligible cut-off of 3 is stated.",
|
|
229
|
-
"Sign back in as admin@letitrip.in and restore the raffle type written down in step 2.",
|
|
230
|
-
],
|
|
231
|
-
inputs: { eventId: "event-win-burst-regalia-genesis", raffleTopN: 3 },
|
|
232
|
-
expectedBehaviour: "A top-N-scorers raffle draws from the highest-scoring entries, so the leaderboard must rank by score and the page must say how many qualify. Ranking by entry time instead would silently change who can win. The saved raffle type must also reach the public page — an admin field that saves and never renders is the commonest shape of this bug.",
|
|
233
|
-
expectedUiState: "The Overview tab names the top-3-by-score rule after the save. The leaderboard is ordered by score, highest first, and the cut-off is stated. Entering is confirmed. A leaderboard still ordered by entry time is the failure.",
|
|
234
|
-
endResult: "The entry survives a reload. The raffle type is restored by the final step.",
|
|
235
|
-
},
|
|
236
|
-
"checklist-content-discovery-events-raffle-entry-top-n-participants": {
|
|
237
|
-
roles: ["admin", "buyer"],
|
|
238
|
-
startPage: "/admin/events",
|
|
239
|
-
steps: [
|
|
240
|
-
"Sign in as admin@letitrip.in / TempPass123!.",
|
|
241
|
-
"Open /admin/events, open event-win-burst-regalia-genesis for editing, and write down its current raffle type.",
|
|
242
|
-
"Set the raffle type to 'Top N earliest participants' — the dropdown carries the word 'earliest' and the stored value is top_n_participants — set the N to 3, and save.",
|
|
243
|
-
"Sign out and sign in as rehan.sheikh@gmail.com / TempPass123!.",
|
|
244
|
-
"Open /events/event-win-burst-regalia-genesis and read the Overview tab's description of how winners are chosen.",
|
|
245
|
-
"Click the Participate tab and enter.",
|
|
246
|
-
"Click the Leaderboard tab and read how entries are ranked.",
|
|
247
|
-
"Compare the stated rule with the top-N-scorers rule from the previous case.",
|
|
248
|
-
"Sign back in as admin@letitrip.in and restore the raffle type written down in step 2.",
|
|
249
|
-
],
|
|
250
|
-
inputs: { eventId: "event-win-burst-regalia-genesis", raffleTopN: 3 },
|
|
251
|
-
expectedBehaviour: "A top-N-participants raffle draws from the earliest or most active participants rather than the highest scorers — a different rule from the scorers variant. Running both against the same event is what makes the difference checkable now that there is no fixture per type.",
|
|
252
|
-
expectedUiState: "The Overview tab names a participation rule, not a score rule, and the leaderboard is ordered accordingly. Wording identical to the previous case means the raffle type is not reaching the leaderboard.",
|
|
253
|
-
endResult: "The entry survives a reload. The raffle type is restored by the final step.",
|
|
254
|
-
},
|
|
255
|
-
"checklist-content-discovery-events-spin-wheel": {
|
|
256
|
-
roles: ["buyer"],
|
|
257
|
-
startPage: "/events",
|
|
258
|
-
steps: [
|
|
259
|
-
"Sign in as rehan.sheikh@gmail.com / TempPass123!.",
|
|
260
|
-
"Navigate to the wheel BY CLICKING its card from /events — do not type the URL. The link uses the event's slug, which is the path a real visitor takes.",
|
|
261
|
-
"Click the Participate tab.",
|
|
262
|
-
"Click the spin control ONCE and watch the wheel.",
|
|
263
|
-
"Read the prize shown and how long it took to appear.",
|
|
264
|
-
"If anything is refused, open the network panel and record the spin request's STATUS CODE and the `code` field in its response body.",
|
|
265
|
-
"Reload the page and read the Participate tab.",
|
|
266
|
-
],
|
|
267
|
-
inputs: { eventId: "event-daily-beyblade-pull-wheel" },
|
|
268
|
-
expectedBehaviour: "The very first spin succeeds and names a prize. The spin is a plain POST to /api/events/{id}/spin and its response carries the prize — there is no realtime channel involved, so a failure is the request itself failing, not a subscription timing problem.",
|
|
269
|
-
expectedUiState: "The wheel spins and lands on a named prize within a few seconds. No 'Spin failed' error appears on the first attempt. After reloading, the result is still shown rather than the wheel offering another free spin.",
|
|
270
|
-
expectedData: { spinsUsed: 1, spinHttpStatus: 200 },
|
|
271
|
-
/*
|
|
272
|
-
* 🛑 Two recorded production failures, and the SLUG step above is what
|
|
273
|
-
* reaches the second one.
|
|
274
|
-
*
|
|
275
|
-
* The feature was gated on `FEATURE_PRIZE_DRAWS`, an env var belonging to a
|
|
276
|
-
* mechanism that had already been retired and was therefore set nowhere —
|
|
277
|
-
* so every spin returned 503 while the button rendered enabled. Underneath
|
|
278
|
-
* that, the spin core looked the event up by document id only, with no slug
|
|
279
|
-
* fallback, while every card links by slug. Fixing the gate alone turns the
|
|
280
|
-
* 503 into a 404.
|
|
281
|
-
*
|
|
282
|
-
* So "type the doc-id URL and spin" would have passed against the live bug.
|
|
283
|
-
* Arriving by click is the test.
|
|
284
|
-
*/
|
|
285
|
-
endResult: "BEFORE: the spin returned HTTP 503 with code `feature_disabled` on every attempt (and, once that was fixed, HTTP 404 `EVENT_NOT_FOUND` whenever the page was reached by its slug — i.e. from any card). Both rendered as 'Spin failed. Please try again.'. AFTER: the first click returns 200 and names a prize. The recorded spin and its prize survive the reload.",
|
|
286
|
-
},
|
|
287
|
-
"checklist-content-discovery-events-spin-wheel-max-per-user": {
|
|
288
|
-
roles: ["buyer"],
|
|
289
|
-
startPage: "/events",
|
|
290
|
-
steps: [
|
|
291
|
-
"Sign in as rehan.sheikh@gmail.com / TempPass123!.",
|
|
292
|
-
"Open event-daily-beyblade-pull-wheel and read the stated maximum spins per user.",
|
|
293
|
-
"Spin until that maximum is reached, reading the remaining count each time.",
|
|
294
|
-
"Attempt one more spin.",
|
|
295
|
-
"Read the refusal.",
|
|
296
|
-
"Reload the page and attempt another spin.",
|
|
297
|
-
],
|
|
298
|
-
expectedBehaviour: "The per-user spin cap is enforced server-side, so reloading does not restore a spin. A cap held only in the browser resets on refresh and the limit is no limit at all.",
|
|
299
|
-
expectedUiState: "The remaining count decreases with each spin. At zero the control is refused with a message naming the limit. After reloading it is still refused — a fresh spin available after a reload is the failure.",
|
|
300
|
-
expectedData: { spinsAfterReload: 0 },
|
|
301
|
-
endResult: "The exhausted state persists across reloads.",
|
|
302
|
-
},
|
|
303
|
-
/*
|
|
304
|
-
* 🛑 THE CLOSED WINDOW IS NOW AUTHORED, NOT WAITED FOR, 2026-09-15.
|
|
305
|
-
*
|
|
306
|
-
* This used to sit on a fixture whose spin window was a fraction of the run's
|
|
307
|
-
* testing window, so a tester could watch it close. That fixture is gone, and
|
|
308
|
-
* the permanent seed's wheel is open for another three weeks — a duration no
|
|
309
|
-
* session can outlast. Narrowing the window from the admin editor reaches the
|
|
310
|
-
* same refusal in a few seconds, and restoring it is one field.
|
|
311
|
-
*/
|
|
312
|
-
"checklist-content-discovery-events-spin-wheel-window-blocked": {
|
|
313
|
-
roles: ["admin", "buyer"],
|
|
314
|
-
startPage: "/admin/events",
|
|
315
|
-
steps: [
|
|
316
|
-
"Sign in as admin@letitrip.in / TempPass123!.",
|
|
317
|
-
"Open /admin/events, open event-daily-beyblade-pull-wheel for editing, and write down its current spin window start and end.",
|
|
318
|
-
"Set the spin window end to yesterday's date so the window is closed, and save.",
|
|
319
|
-
"Sign out and sign in as rehan.sheikh@gmail.com / TempPass123!.",
|
|
320
|
-
"Open /events/event-daily-beyblade-pull-wheel, read the stated spin window, and attempt a spin.",
|
|
321
|
-
"Read the refusal and check it names the window rather than a generic failure.",
|
|
322
|
-
"Sign back in as admin@letitrip.in and restore the two dates written down in step 2.",
|
|
323
|
-
],
|
|
324
|
-
inputs: { eventId: "event-daily-beyblade-pull-wheel" },
|
|
325
|
-
expectedBehaviour: "Spins outside the configured window are refused with a reason naming the window, and the check runs server-side — a window enforced only by hiding the button is no window at all.",
|
|
326
|
-
expectedUiState: "With the window closed the spin control is refused and the message names the window or its times. It is not a generic 'Spin failed', which would be indistinguishable from the realtime failure above.",
|
|
327
|
-
endResult: "No spin is recorded outside the window. The original window is restored by the final step; if the restore fails, say so rather than leaving the wheel closed for later cases.",
|
|
328
|
-
},
|
|
329
|
-
"checklist-content-discovery-events-spin-results-tab": {
|
|
330
|
-
roles: ["guest"],
|
|
331
|
-
startPage: "/events",
|
|
332
|
-
steps: [
|
|
333
|
-
"Open event-daily-beyblade-pull-wheel in a private window with no session.",
|
|
334
|
-
"Find the 'Last 10 Spin Results' tab and open it.",
|
|
335
|
-
"Read every row — the name shown and the prize.",
|
|
336
|
-
"Count the rows.",
|
|
337
|
-
"Check whether any row shows a full real name.",
|
|
338
|
-
],
|
|
339
|
-
expectedBehaviour: "The results tab lists recent winners, capped at ten, with anonymous spins shown as 'Guest'. Named entries are shown masked — a public results list is exactly the surface where an unmasked display name leaks, and a masking helper that returns its input unchanged looks correct from every layer except this one.",
|
|
340
|
-
expectedUiState: "At most ten rows, each naming a prize. Anonymous spins read 'Guest'. Named entries are masked rather than showing a full real name.",
|
|
341
|
-
expectedData: { maxRows: 10 },
|
|
342
|
-
endResult: "Read-only; nothing persists.",
|
|
343
|
-
},
|
|
344
|
-
"checklist-content-discovery-events-event-guest-participation-toggle": {
|
|
345
|
-
roles: ["admin", "guest"],
|
|
346
|
-
startPage: "/admin/events",
|
|
347
|
-
steps: [
|
|
348
|
-
"Sign in as admin@letitrip.in / TempPass123!.",
|
|
349
|
-
"Open /admin/events/new and create an event titled 'QA Event guest-participation' with guest participation ENABLED, starting today and ending in a week.",
|
|
350
|
-
"Open its public page in a private window with no session.",
|
|
351
|
-
"Enter the event as a guest and read the confirmation.",
|
|
352
|
-
"Attempt to enter a second time from the same private window.",
|
|
353
|
-
"Read the refusal.",
|
|
354
|
-
"As admin, edit the event to disable guest participation and save.",
|
|
355
|
-
"Reload the public page in the private window and attempt to enter.",
|
|
356
|
-
],
|
|
357
|
-
inputs: { eventTitle: "QA Event guest-participation", guestParticipation: true },
|
|
358
|
-
expectedBehaviour: "With guest participation enabled an anonymous visitor may enter once per device, and a second attempt from the same device is blocked. With it disabled the entry control asks for sign-in instead of accepting anonymous entries.",
|
|
359
|
-
expectedUiState: "The first guest entry is confirmed. The second is refused with a message rather than silently accepted. After the toggle is disabled, the public page prompts for sign-in rather than offering entry.",
|
|
360
|
-
expectedData: { guestEntriesPerDevice: 1 },
|
|
361
|
-
endResult: "Delete the event afterwards so it does not accumulate across runs.",
|
|
362
|
-
},
|
|
363
|
-
"checklist-content-discovery-events-leaderboard-live-refresh": {
|
|
364
|
-
roles: ["buyer"],
|
|
365
|
-
startPage: "/events",
|
|
366
|
-
steps: [
|
|
367
|
-
"In window A, open event-favourite-blader-poll's Leaderboard tab signed out, and read the tallies.",
|
|
368
|
-
"Leave window A on that tab without reloading it.",
|
|
369
|
-
"In window B, sign in as vivaan.kapoor@gmail.com / TempPass123!.",
|
|
370
|
-
"In window B, open the same event's Participate tab and vote for an option.",
|
|
371
|
-
"Return to window A and watch the tallies for up to 15 seconds without reloading.",
|
|
372
|
-
],
|
|
373
|
-
expectedBehaviour: "The leaderboard updates from the live feed rather than only on load, so a viewer watching a poll sees it move. A tally that only changes on refresh makes a live event feel dead.",
|
|
374
|
-
expectedUiState: "Window A's tally for the voted option increases within about 15 seconds, with no reload and no interaction. A figure that only changes when the tester refreshes is the failure.",
|
|
375
|
-
endResult: "The vote persists. This requires vivaan.kapoor@gmail.com not to have voted on this poll already — if they have, use another buyer persona.",
|
|
376
|
-
},
|
|
377
|
-
};
|
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* WHY: Authored six-part procedures for the content-discovery/faq-help 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
|
-
* @tag domain:tester
|
|
10
|
-
* @tag layer:seed
|
|
11
|
-
* @tag pattern:none
|
|
12
|
-
* @tag access:server-only
|
|
13
|
-
* @tag consumers:seed-data/authored/index.ts
|
|
14
|
-
* @tag sideEffects:none
|
|
15
|
-
*/
|
|
16
|
-
export const authored = {
|
|
17
|
-
"checklist-content-discovery-faq-help-faq-bottom-borders": {
|
|
18
|
-
roles: ["guest"],
|
|
19
|
-
startPage: "/faqs",
|
|
20
|
-
steps: [
|
|
21
|
-
"Open /faqs in a private window at a desktop width of 1280 pixels.",
|
|
22
|
-
"Look at the divider between each question row and the next.",
|
|
23
|
-
"Look specifically at the LAST row in a category, below its text.",
|
|
24
|
-
"Expand one question and look at the dividers again.",
|
|
25
|
-
"Switch the site to dark mode and look at every divider once more.",
|
|
26
|
-
],
|
|
27
|
-
inputs: { viewportWidth: 1280 },
|
|
28
|
-
expectedBehaviour: "Rows are separated by a divider between them, with none trailing after the last row — a stray border under the final item reads as a truncated list. Divider colour comes from a theme token that inverts, so it stays visible in both themes rather than being a fixed near-white line that vanishes on dark.",
|
|
29
|
-
expectedUiState: "A divider sits between consecutive rows and there is none below the last row of a category. Expanding a question does not double the divider or leave a hairline across the open panel. Every divider is visible in dark mode.",
|
|
30
|
-
endResult: "Read-only; nothing persists. Return the site to light mode afterwards.",
|
|
31
|
-
},
|
|
32
|
-
"checklist-content-discovery-faq-help-faq-mobile-count": {
|
|
33
|
-
roles: ["guest"],
|
|
34
|
-
startPage: "/faqs",
|
|
35
|
-
steps: [
|
|
36
|
-
"Resize the browser window to 390 pixels wide.",
|
|
37
|
-
"Open /faqs in a private window with no session.",
|
|
38
|
-
"WAIT for the page to settle before reading any number. This page has been measured showing zero questions at 2.5 seconds and 62 at 6 — a count taken early is confidently wrong, and this case is entirely about comparing counts.",
|
|
39
|
-
"Read the count shown against each category.",
|
|
40
|
-
"Open one category and count the questions it actually holds, waiting again before counting.",
|
|
41
|
-
"Compare the two numbers.",
|
|
42
|
-
"Try to scroll the page sideways.",
|
|
43
|
-
],
|
|
44
|
-
inputs: { viewportWidth: 390 },
|
|
45
|
-
expectedBehaviour: "The count beside a category matches what opening it reveals, at mobile width as at desktop. A count computed before an active-only filter is applied over-reports by every inactive entry.",
|
|
46
|
-
expectedUiState: "Each category's count matches its contents. Nothing is clipped at 390px and the page does not scroll sideways. Counts are not hidden entirely on mobile — they are the reason a visitor opens one category rather than another.",
|
|
47
|
-
expectedData: { mismatchedCountCount: 0 },
|
|
48
|
-
endResult: "Read-only; nothing persists. Restore the window width afterwards.",
|
|
49
|
-
},
|
|
50
|
-
"checklist-content-discovery-faq-help-tabs-mobile-dropdown": {
|
|
51
|
-
roles: ["guest"],
|
|
52
|
-
startPage: "/faqs",
|
|
53
|
-
steps: [
|
|
54
|
-
"Open /faqs at a desktop width of 1280 pixels and read how the categories are presented.",
|
|
55
|
-
"Resize the window to 390 pixels wide.",
|
|
56
|
-
"Read how the categories are presented now.",
|
|
57
|
-
"Open the mobile control and select a different category.",
|
|
58
|
-
"Read which category's questions are shown and check the control names the selected one.",
|
|
59
|
-
"Try to scroll the page sideways.",
|
|
60
|
-
],
|
|
61
|
-
inputs: { desktopWidth: 1280, mobileWidth: 390 },
|
|
62
|
-
expectedBehaviour: "A tab strip too wide for a phone becomes a dropdown rather than a sideways-scrolling row, so no category is hidden off the right edge where nobody looks for it.",
|
|
63
|
-
expectedUiState: "At 1280 the categories are a tab strip. At 390 they are a dropdown listing every category, and selecting one switches the questions AND updates the control's own label. The page does not scroll sideways at either width.",
|
|
64
|
-
endResult: "Read-only; nothing persists. Restore the window width afterwards.",
|
|
65
|
-
},
|
|
66
|
-
"checklist-content-discovery-faq-help-faq-search-filters-and-survives-reload": {
|
|
67
|
-
roles: ["guest"],
|
|
68
|
-
startPage: "/faqs",
|
|
69
|
-
steps: [
|
|
70
|
-
"Open /faqs in a private window with no session.",
|
|
71
|
-
"WAIT for the questions to appear before counting anything. 🛑 This page hydrates client-side and the difference is not subtle — it has been measured showing zero questions at 2.5 seconds and 62 at 6. A count taken early produces a confident, wrong answer, and that has already happened twice on this exact page.",
|
|
72
|
-
"Count the questions visible across all categories once the page has settled.",
|
|
73
|
-
"Type shipping into the search box and commit it.",
|
|
74
|
-
"Read the count and confirm it is SMALLER than the unfiltered count, and that the remaining questions are about shipping.",
|
|
75
|
-
"Read the address bar and check the term is in the URL as ?q=shipping.",
|
|
76
|
-
"RELOAD with that URL and confirm the same filtered set comes back, waiting again before judging.",
|
|
77
|
-
"Clear the box, type zzzznope, and commit.",
|
|
78
|
-
"Read the result — a named empty state and zero questions, not the full list.",
|
|
79
|
-
"Clear the search and confirm the original count returns.",
|
|
80
|
-
],
|
|
81
|
-
inputs: { realQuery: "shipping", nonsenseQuery: "zzzznope" },
|
|
82
|
-
expectedBehaviour: "The search box filters the questions and the term round-trips through the URL, so a filtered view is shareable and survives a reload. The nonsense control is the whole case: a real term returns plausible questions whether or not the filter ran at all, so only zzzznope separates filtering from returning everything. The seed ships 63 FAQs across seven categories, which is enough for a real term to narrow visibly rather than by one row.",
|
|
83
|
-
expectedUiState: "'shipping' shows fewer questions than the unfiltered list and they are about shipping. The URL carries ?q=shipping and reloading reproduces that view. 'zzzznope' shows a named empty state with zero questions — a blank panel with no message is a different failure and should be recorded as such. Clearing restores the original count.",
|
|
84
|
-
expectedData: { nonsenseResultCount: 0 },
|
|
85
|
-
endResult: "Read-only; nothing persists beyond the URL. A full list under zzzznope is the failure. So is an empty page under a real term, which on this page is far more likely to be a count taken before hydration than a broken filter — wait, then look again, before recording either.",
|
|
86
|
-
},
|
|
87
|
-
};
|
|
@@ -1,147 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* WHY: Authored six-part procedures for the content-discovery/notifications page.
|
|
3
|
-
* WHAT: 8 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 OPT-OUT CASE IS THE IMPORTANT ONE. The map from notification type to
|
|
10
|
-
* preference key must be COMPLETE: a missing entry left the key undefined, so the
|
|
11
|
-
* opt-out check never ran and the user's preference was silently ignored while the
|
|
12
|
-
* toggle sat there reading as honoured. Three types were missing.
|
|
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-content-discovery-notifications-receive-notification": {
|
|
23
|
-
roles: ["buyer"],
|
|
24
|
-
startPage: "/user/notifications",
|
|
25
|
-
steps: [
|
|
26
|
-
"Sign in as rehan.sheikh@gmail.com / TempPass123!.",
|
|
27
|
-
"Open /user/notifications and read the unread count on the header bell.",
|
|
28
|
-
"In a second window, sign in as vivaan.kapoor@gmail.com / TempPass123!.",
|
|
29
|
-
"As that second buyer, open /auctions/auction-beyblade-original-dragoon-storm and place a bid high enough to outbid the first buyer.",
|
|
30
|
-
"Return to the first window and open /user/notifications.",
|
|
31
|
-
"Read the newest entry and the bell's unread count.",
|
|
32
|
-
],
|
|
33
|
-
expectedBehaviour: "An event that concerns a user produces a notification addressed to them, carrying a title, a body and a destination. The destination is filled in from the record it relates to rather than hand-written per caller, which is why almost no call site used to set one.",
|
|
34
|
-
expectedUiState: "A new entry appears naming the auction, and the bell's unread count has increased. The entry has a readable title and body — not a raw type string like 'bid_outbid' shown as the whole message.",
|
|
35
|
-
endResult: "The notification survives a reload. This case requires the first buyer to hold the leading bid beforehand; place one first if they do not.",
|
|
36
|
-
},
|
|
37
|
-
"checklist-content-discovery-notifications-mark-read": {
|
|
38
|
-
roles: ["buyer"],
|
|
39
|
-
startPage: "/user/notifications",
|
|
40
|
-
steps: [
|
|
41
|
-
"Sign in as rehan.sheikh@gmail.com / TempPass123!.",
|
|
42
|
-
"Open /user/notifications and note the unread count on the bell.",
|
|
43
|
-
"Click one unread notification.",
|
|
44
|
-
"Read the bell's count and that row's unread styling.",
|
|
45
|
-
"Reload the page and read both again.",
|
|
46
|
-
"Use the mark-all-read control and read the count.",
|
|
47
|
-
"Reload once more.",
|
|
48
|
-
],
|
|
49
|
-
expectedBehaviour: "Read state is persisted per notification, so the count is the same before and after a reload. A count held only in component state resets to the original number on refresh and the user sees the same badge again.",
|
|
50
|
-
expectedUiState: "Opening one notification drops the count by exactly one and removes that row's unread styling. After the reload the count is still the reduced one. Mark-all-read takes it to zero and it is still zero after reloading.",
|
|
51
|
-
expectedData: { unreadCountAfterMarkAll: 0 },
|
|
52
|
-
endResult: "The count stays at zero across reloads.",
|
|
53
|
-
},
|
|
54
|
-
"checklist-content-discovery-notifications-notification-channel-prefs": {
|
|
55
|
-
roles: ["buyer"],
|
|
56
|
-
startPage: "/user/settings",
|
|
57
|
-
steps: [
|
|
58
|
-
"Sign in as rehan.sheikh@gmail.com / TempPass123!.",
|
|
59
|
-
"Open /user/settings and click the 'Notifications' tab.",
|
|
60
|
-
"Read every channel offered and every notification type listed.",
|
|
61
|
-
"Turn one channel off for one type and click 'Save preferences'.",
|
|
62
|
-
"Reload the page and open the tab again.",
|
|
63
|
-
"Read whether that one switch is still off and whether the others are unchanged.",
|
|
64
|
-
],
|
|
65
|
-
expectedBehaviour: "Preferences save per type and per channel, and saving one does not rewrite the others from a partly-populated form. The tab must also list every notification type — an incomplete list leaves whole categories with no way to opt out at all.",
|
|
66
|
-
expectedUiState: "The changed switch is off after the reload and every switch the tester did not touch holds its previous value. Types such as offer_received and payment_review are present in the list rather than missing.",
|
|
67
|
-
endResult: "Restore the switch afterwards, so later notification cases are not suppressed by a leftover opt-out.",
|
|
68
|
-
},
|
|
69
|
-
"checklist-content-discovery-notifications-notification-type-sample": {
|
|
70
|
-
roles: ["buyer"],
|
|
71
|
-
startPage: "/user/notifications",
|
|
72
|
-
steps: [
|
|
73
|
-
"Sign in as rehan.sheikh@gmail.com / TempPass123!.",
|
|
74
|
-
"Open /user/notifications.",
|
|
75
|
-
"Read every entry, noting its type icon or label, its title and its body.",
|
|
76
|
-
"Write down any entry whose body is empty, or reads as a raw type string, or repeats its own title verbatim.",
|
|
77
|
-
],
|
|
78
|
-
expectedBehaviour: "Each notification type renders its own title and body from a template keyed on the type. A type with no template falls back to something generic, which is visible as a body that simply restates the title or shows the type identifier.",
|
|
79
|
-
expectedUiState: "Every entry has a distinct, readable title and body. None shows a bare type identifier such as 'order_confirmed' as its message, and none has an empty body.",
|
|
80
|
-
expectedData: { untemplatedEntryCount: 0 },
|
|
81
|
-
endResult: "Read-only; nothing persists.",
|
|
82
|
-
},
|
|
83
|
-
"checklist-content-discovery-notifications-notification-tab-filters": {
|
|
84
|
-
roles: ["buyer"],
|
|
85
|
-
startPage: "/user/notifications",
|
|
86
|
-
steps: [
|
|
87
|
-
"Sign in as rehan.sheikh@gmail.com / TempPass123!.",
|
|
88
|
-
"Open /user/notifications and read every filter tab or chip offered.",
|
|
89
|
-
"Note the total number of entries with no filter applied.",
|
|
90
|
-
"Select each filter in turn and read the resulting count and rows.",
|
|
91
|
-
"Write down any filter that returns zero rows.",
|
|
92
|
-
"Clear the filter and check the original count returns.",
|
|
93
|
-
],
|
|
94
|
-
expectedBehaviour: "Every filter value offered corresponds to a type that notifications actually carry. A chip whose value is not a real stored type matches byte-exactly against nothing and stays empty forever, with no error to explain it.",
|
|
95
|
-
expectedUiState: "Each filter either returns rows or is genuinely empty for this account — and where it is empty, the same type is absent from the unfiltered list too. A chip that is empty while matching entries sit in the unfiltered list is the failure.",
|
|
96
|
-
endResult: "Read-only; nothing persists beyond the URL.",
|
|
97
|
-
},
|
|
98
|
-
"checklist-content-discovery-notifications-notification-email-actually-arrives": {
|
|
99
|
-
roles: ["buyer"],
|
|
100
|
-
startPage: "/user/settings",
|
|
101
|
-
steps: [
|
|
102
|
-
"Sign in as the harness mailbox account. 🛑 NO SEEDED PERSONA CAN RECEIVE TESTABLE EMAIL — both instruments key on TESTER_EMAIL_ID, and every seeded persona uses a real-looking address the harness does not own. Register a plus-addressed signup on that mailbox, or run this as whichever account already uses it.",
|
|
103
|
-
"Open /user/settings, click the 'Notifications' tab, and make sure Email is on for order updates. order_confirmed is one of the 18 email-eligible types, so it should send.",
|
|
104
|
-
"Place an order that will produce an order-confirmed notification.",
|
|
105
|
-
"Open /user/notifications and confirm the in-app entry is there.",
|
|
106
|
-
"Capture a timestamp BEFORE the order — node -e \"console.log(Date.now())\" — then ask the mailbox: node tester/scripts/check-inbox.mjs --since <that number> --subject \"order\". --since is the whole correctness argument: the mailbox is shared across every case in every run, so 'newest matching message' happily returns one an earlier case left behind.",
|
|
107
|
-
"Read the exit code. 0 means it arrived; 1 means it did not (a product defect); 2 means the mailbox could not be opened (a harness problem, answer null). Then read the email's From name and address, its subject and its body.",
|
|
108
|
-
"Click the button or link inside it.",
|
|
109
|
-
],
|
|
110
|
-
expectedBehaviour: "The dispatcher fans out to in-app first and then email, rendering a per-type template rather than wrapping the one-line message in a paragraph — for a long time not one caller supplied email HTML, so every type shipped the same bare body.",
|
|
111
|
-
expectedUiState: "The email arrives in the inbox. Its From display name is spelled 'LetItRip' exactly. Its body is a real templated message rather than a single unstyled sentence. Its link opens the right page on the live site.",
|
|
112
|
-
endResult: "The in-app notification and the email both exist. An in-app entry with no email, while email is enabled for that type, is the failure this case separates from a delivery problem.",
|
|
113
|
-
},
|
|
114
|
-
"checklist-content-discovery-notifications-notification-email-opt-out-respected": {
|
|
115
|
-
roles: ["buyer"],
|
|
116
|
-
startPage: "/user/settings",
|
|
117
|
-
steps: [
|
|
118
|
-
"Sign in as the harness mailbox account — see the arrival case above; no seeded persona can receive testable email.",
|
|
119
|
-
"Open /user/settings, click the 'Notifications' tab, and turn Email OFF for order updates.",
|
|
120
|
-
"Click 'Save preferences' and reload to confirm it stayed off.",
|
|
121
|
-
"Place an order that would produce an order-confirmed notification.",
|
|
122
|
-
"Open /user/notifications and read the entries.",
|
|
123
|
-
"Prove the SILENCE rather than waiting for it: node tester/scripts/check-inbox.mjs --since <timestamp captured before the order> --subject \"order\" --expect-none. Without --expect-none, 'nothing arrived' is unprovable — you wait and hope, and a slow inbox looks exactly like a working suppression. Exit 0 means the silence held.",
|
|
124
|
-
"Turn Email back on for order updates and save.",
|
|
125
|
-
],
|
|
126
|
-
expectedBehaviour: "Turning a channel off suppresses that channel and nothing else — the in-app notification still appears. The suppression depends on a complete type-to-preference-key map: a type missing from it leaves the key undefined, the opt-out check never runs, and mail keeps arriving while the toggle reads as honoured.",
|
|
127
|
-
expectedUiState: "The in-app entry is present. NO email arrives for it. An email arriving with the toggle off is the exact failure, and it is invisible from the settings page — the switch looks the same either way.",
|
|
128
|
-
expectedData: { emailsReceived: 0 },
|
|
129
|
-
endResult: "The preference is turned back on by the final step. Waiting the full five minutes matters: concluding after thirty seconds proves nothing about a queue.",
|
|
130
|
-
},
|
|
131
|
-
"checklist-content-discovery-notifications-notification-links-to-right-entity": {
|
|
132
|
-
roles: ["buyer"],
|
|
133
|
-
startPage: "/user/notifications",
|
|
134
|
-
steps: [
|
|
135
|
-
"Sign in as rehan.sheikh@gmail.com / TempPass123!.",
|
|
136
|
-
"Open /user/notifications.",
|
|
137
|
-
"Click an order notification and read the address bar and the record shown.",
|
|
138
|
-
"Go back and click a bid notification, reading the address bar and what is shown.",
|
|
139
|
-
"Go back and click an offer notification, reading the address bar and what is shown.",
|
|
140
|
-
"Note any that land on a 404.",
|
|
141
|
-
],
|
|
142
|
-
expectedBehaviour: "The destination is resolved from the related record's type and id, so a caller cannot forget it. Bids, offers and reviews have no per-record page in any role, so those correctly resolve to their LIST — a real destination. Fabricating a per-record URL for them would 404, which is worse than a list.",
|
|
143
|
-
expectedUiState: "An order notification opens that specific order. A bid notification opens the bids list. An offer notification opens the offers list. None lands on a 404 and none lands on the dashboard root with no relation to what was clicked.",
|
|
144
|
-
expectedData: { notFoundCount: 0 },
|
|
145
|
-
endResult: "Read-only; nothing persists. A list is a pass for bids and offers; a 404 is a fail for anything.",
|
|
146
|
-
},
|
|
147
|
-
};
|