@mohasinac/appkit 4.34.1 → 4.35.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_internal/client/features/lottery/LotteryAdminEditView.js +32 -2
- package/dist/features/auth/actions/profile-actions.d.ts +14 -1
- package/dist/features/auth/actions/profile-actions.js +16 -2
- package/dist/features/tester/components/TesterChecklistStepRow.d.ts +9 -1
- package/dist/features/tester/components/TesterChecklistStepRow.js +31 -2
- package/dist/features/tester/components/TesterHubView.js +8 -0
- package/dist/features/tester/schemas/firestore.d.ts +109 -0
- package/dist/features/tester/schemas/firestore.js +14 -0
- package/dist/features/tester/seed-data/_money-flows.d.ts +23 -0
- package/dist/features/tester/seed-data/_money-flows.js +430 -0
- package/dist/features/tester/seed-data/authored/_types.d.ts +33 -0
- package/dist/features/tester/seed-data/authored/_types.js +35 -0
- package/dist/features/tester/seed-data/authored/account-auth__profile-settings.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/account-auth__profile-settings.js +207 -0
- package/dist/features/tester/seed-data/authored/account-auth__signup-login.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/account-auth__signup-login.js +298 -0
- package/dist/features/tester/seed-data/authored/account-auth__testing-program--admin.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/account-auth__testing-program--admin.js +33 -0
- package/dist/features/tester/seed-data/authored/account-auth__testing-program.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/account-auth__testing-program.js +138 -0
- package/dist/features/tester/seed-data/authored/addresses__address-filters.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/addresses__address-filters.js +36 -0
- package/dist/features/tester/seed-data/authored/addresses__postal-lookup.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/addresses__postal-lookup.js +75 -0
- package/dist/features/tester/seed-data/authored/addresses__postal-validation.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/addresses__postal-validation.js +72 -0
- package/dist/features/tester/seed-data/authored/addresses__state-picker.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/addresses__state-picker.js +54 -0
- package/dist/features/tester/seed-data/authored/addresses__unban-request.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/addresses__unban-request.js +39 -0
- package/dist/features/tester/seed-data/authored/admin__bans-and-trust.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/admin__bans-and-trust.js +226 -0
- package/dist/features/tester/seed-data/authored/admin__blog-faqs.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/admin__blog-faqs.js +82 -0
- package/dist/features/tester/seed-data/authored/admin__bulk-actions.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/admin__bulk-actions.js +177 -0
- package/dist/features/tester/seed-data/authored/admin__bundles.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/admin__bundles.js +97 -0
- package/dist/features/tester/seed-data/authored/admin__buyer-data-admin.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/admin__buyer-data-admin.js +232 -0
- package/dist/features/tester/seed-data/authored/admin__catalog-listings.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/admin__catalog-listings.js +306 -0
- package/dist/features/tester/seed-data/authored/admin__category-brand-authoring.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/admin__category-brand-authoring.js +158 -0
- package/dist/features/tester/seed-data/authored/admin__classifieds-digitalcodes-live.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/admin__classifieds-digitalcodes-live.js +78 -0
- package/dist/features/tester/seed-data/authored/admin__content-deletes.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/admin__content-deletes.js +261 -0
- package/dist/features/tester/seed-data/authored/admin__content-marketing.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/admin__content-marketing.js +151 -0
- package/dist/features/tester/seed-data/authored/admin__coupons.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/admin__coupons.js +214 -0
- package/dist/features/tester/seed-data/authored/admin__events-raffles-spin.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/admin__events-raffles-spin.js +160 -0
- package/dist/features/tester/seed-data/authored/admin__media-watermark.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/admin__media-watermark.js +104 -0
- package/dist/features/tester/seed-data/authored/admin__orders-fulfillment.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/admin__orders-fulfillment.js +350 -0
- package/dist/features/tester/seed-data/authored/admin__prize-draws-lotteries.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/admin__prize-draws-lotteries.js +105 -0
- package/dist/features/tester/seed-data/authored/admin__site-system.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/admin__site-system.js +590 -0
- package/dist/features/tester/seed-data/authored/admin__uncovered-admin-pages.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/admin__uncovered-admin-pages.js +235 -0
- package/dist/features/tester/seed-data/authored/admin__users-trust.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/admin__users-trust.js +569 -0
- package/dist/features/tester/seed-data/authored/buying__bidding.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/buying__bidding.js +417 -0
- package/dist/features/tester/seed-data/authored/buying__browsing-search.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/buying__browsing-search.js +653 -0
- package/dist/features/tester/seed-data/authored/buying__buying-checkout.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/buying__buying-checkout.js +533 -0
- package/dist/features/tester/seed-data/authored/buying__buying-coupons.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/buying__buying-coupons.js +379 -0
- package/dist/features/tester/seed-data/authored/buying__cart.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/buying__cart.js +1171 -0
- package/dist/features/tester/seed-data/authored/buying__image-tile-layout.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/buying__image-tile-layout.js +140 -0
- package/dist/features/tester/seed-data/authored/buying__my-orders.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/buying__my-orders.js +257 -0
- package/dist/features/tester/seed-data/authored/buying__offers.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/buying__offers.js +1111 -0
- package/dist/features/tester/seed-data/authored/buying__order-status-lifecycle.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/buying__order-status-lifecycle.js +252 -0
- package/dist/features/tester/seed-data/authored/buying__product-detail.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/buying__product-detail.js +387 -0
- package/dist/features/tester/seed-data/authored/buying__return-request.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/buying__return-request.js +152 -0
- package/dist/features/tester/seed-data/authored/buying__reviews-pagination.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/buying__reviews-pagination.js +242 -0
- package/dist/features/tester/seed-data/authored/buying__reviews.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/buying__reviews.js +113 -0
- package/dist/features/tester/seed-data/authored/buying__user-dashboard-extras.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/buying__user-dashboard-extras.js +283 -0
- package/dist/features/tester/seed-data/authored/buying__user-dashboard-navigation.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/buying__user-dashboard-navigation.js +167 -0
- package/dist/features/tester/seed-data/authored/buying__user-uncovered-pages.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/buying__user-uncovered-pages.js +90 -0
- package/dist/features/tester/seed-data/authored/buying__wishlist-history.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/buying__wishlist-history.js +344 -0
- package/dist/features/tester/seed-data/authored/community-support__public-profile.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/community-support__public-profile.js +53 -0
- package/dist/features/tester/seed-data/authored/community-support__support-tickets.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/community-support__support-tickets.js +76 -0
- package/dist/features/tester/seed-data/authored/content-discovery__blog.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/content-discovery__blog.js +93 -0
- package/dist/features/tester/seed-data/authored/content-discovery__category-brand-relations.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/content-discovery__category-brand-relations.js +149 -0
- package/dist/features/tester/seed-data/authored/content-discovery__coupons.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/content-discovery__coupons.js +121 -0
- package/dist/features/tester/seed-data/authored/content-discovery__event-participation.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/content-discovery__event-participation.js +207 -0
- package/dist/features/tester/seed-data/authored/content-discovery__events.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/content-discovery__events.js +318 -0
- package/dist/features/tester/seed-data/authored/content-discovery__faq-help.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/content-discovery__faq-help.js +65 -0
- package/dist/features/tester/seed-data/authored/content-discovery__notifications.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/content-discovery__notifications.js +147 -0
- package/dist/features/tester/seed-data/authored/content-discovery__search.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/content-discovery__search.js +332 -0
- package/dist/features/tester/seed-data/authored/cta-layout__checkout-bottom-bar.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/cta-layout__checkout-bottom-bar.js +53 -0
- package/dist/features/tester/seed-data/authored/cta-layout__dialog-footers.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/cta-layout__dialog-footers.js +52 -0
- package/dist/features/tester/seed-data/authored/cta-layout__editor-action-bar.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/cta-layout__editor-action-bar.js +35 -0
- package/dist/features/tester/seed-data/authored/cta-layout__navbar-ctas.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/cta-layout__navbar-ctas.js +141 -0
- package/dist/features/tester/seed-data/authored/cta-layout__product-bottom-bar.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/cta-layout__product-bottom-bar.js +35 -0
- package/dist/features/tester/seed-data/authored/design-ux__back-to-top-button.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/design-ux__back-to-top-button.js +95 -0
- package/dist/features/tester/seed-data/authored/design-ux__carousel-arrow-bounds.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/design-ux__carousel-arrow-bounds.js +191 -0
- package/dist/features/tester/seed-data/authored/design-ux__dashboard-layout.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/design-ux__dashboard-layout.js +158 -0
- package/dist/features/tester/seed-data/authored/design-ux__footer-theme.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/design-ux__footer-theme.js +106 -0
- package/dist/features/tester/seed-data/authored/design-ux__form-validation-errors.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/design-ux__form-validation-errors.js +88 -0
- package/dist/features/tester/seed-data/authored/design-ux__general-design.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/design-ux__general-design.js +204 -0
- package/dist/features/tester/seed-data/authored/design-ux__hand-mode-layout.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/design-ux__hand-mode-layout.js +301 -0
- package/dist/features/tester/seed-data/authored/design-ux__homepage-carousels.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/design-ux__homepage-carousels.js +407 -0
- package/dist/features/tester/seed-data/authored/design-ux__status-badge-legibility.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/design-ux__status-badge-legibility.js +214 -0
- package/dist/features/tester/seed-data/authored/design-ux__sticky-cta-bar.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/design-ux__sticky-cta-bar.js +275 -0
- package/dist/features/tester/seed-data/authored/index.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/index.js +237 -0
- package/dist/features/tester/seed-data/authored/page-wiring__data-loss.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/page-wiring__data-loss.js +102 -0
- package/dist/features/tester/seed-data/authored/page-wiring__detail-pages.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/page-wiring__detail-pages.js +50 -0
- package/dist/features/tester/seed-data/authored/page-wiring__drawer-pages.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/page-wiring__drawer-pages.js +66 -0
- package/dist/features/tester/seed-data/authored/page-wiring__reachability.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/page-wiring__reachability.js +115 -0
- package/dist/features/tester/seed-data/authored/public-pages__auth-error-pages.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/public-pages__auth-error-pages.js +136 -0
- package/dist/features/tester/seed-data/authored/public-pages__bug-hunters.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/public-pages__bug-hunters.js +69 -0
- package/dist/features/tester/seed-data/authored/public-pages__core-listing-pages.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/public-pages__core-listing-pages.js +263 -0
- package/dist/features/tester/seed-data/authored/public-pages__help-how-it-works.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/public-pages__help-how-it-works.js +102 -0
- package/dist/features/tester/seed-data/authored/public-pages__help-scams-guides-subpages.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/public-pages__help-scams-guides-subpages.js +234 -0
- package/dist/features/tester/seed-data/authored/public-pages__legal-policy-pages.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/public-pages__legal-policy-pages.js +126 -0
- package/dist/features/tester/seed-data/authored/public-pages__stores-sellers-directories.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/public-pages__stores-sellers-directories.js +255 -0
- package/dist/features/tester/seed-data/authored/search-and-nav__employee-permissions.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/search-and-nav__employee-permissions.js +59 -0
- package/dist/features/tester/seed-data/authored/search-and-nav__header-search.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/search-and-nav__header-search.js +88 -0
- package/dist/features/tester/seed-data/authored/search-and-nav__settings-deep-links.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/search-and-nav__settings-deep-links.js +51 -0
- package/dist/features/tester/seed-data/authored/search-and-nav__sidebar-search.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/search-and-nav__sidebar-search.js +35 -0
- package/dist/features/tester/seed-data/authored/selling__become-seller.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/selling__become-seller.js +94 -0
- package/dist/features/tester/seed-data/authored/selling__final-sale-authoring.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/selling__final-sale-authoring.js +107 -0
- package/dist/features/tester/seed-data/authored/selling__listing-a-product.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/selling__listing-a-product.js +285 -0
- package/dist/features/tester/seed-data/authored/selling__listing-lifecycle.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/selling__listing-lifecycle.js +326 -0
- package/dist/features/tester/seed-data/authored/selling__listing-type-fields-roundtrip.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/selling__listing-type-fields-roundtrip.js +136 -0
- package/dist/features/tester/seed-data/authored/selling__media-limits.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/selling__media-limits.js +128 -0
- package/dist/features/tester/seed-data/authored/selling__sectionised-forms.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/selling__sectionised-forms.js +167 -0
- package/dist/features/tester/seed-data/authored/selling__seller-analytics-payouts.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/selling__seller-analytics-payouts.js +117 -0
- package/dist/features/tester/seed-data/authored/selling__seller-bids-bundles-filters.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/selling__seller-bids-bundles-filters.js +88 -0
- package/dist/features/tester/seed-data/authored/selling__seller-catalog-org.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/selling__seller-catalog-org.js +151 -0
- package/dist/features/tester/seed-data/authored/selling__seller-custom-brands.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/selling__seller-custom-brands.js +105 -0
- package/dist/features/tester/seed-data/authored/selling__seller-guide.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/selling__seller-guide.js +33 -0
- package/dist/features/tester/seed-data/authored/selling__seller-listing-types.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/selling__seller-listing-types.js +347 -0
- package/dist/features/tester/seed-data/authored/selling__seller-marketing-extras.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/selling__seller-marketing-extras.js +166 -0
- package/dist/features/tester/seed-data/authored/selling__seller-ops-comms.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/selling__seller-ops-comms.js +89 -0
- package/dist/features/tester/seed-data/authored/selling__seller-orders.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/selling__seller-orders.js +195 -0
- package/dist/features/tester/seed-data/authored/selling__seller-shipping-payouts-setup.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/selling__seller-shipping-payouts-setup.js +180 -0
- package/dist/features/tester/seed-data/authored/selling__store-dashboard-navigation.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/selling__store-dashboard-navigation.js +164 -0
- package/dist/features/tester/seed-data/authored/selling__store-uncovered-pages.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/selling__store-uncovered-pages.js +116 -0
- package/dist/features/tester/seed-data/authored/seo__canonical-and-host.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/seo__canonical-and-host.js +111 -0
- package/dist/features/tester/seed-data/authored/seo__og-images.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/seo__og-images.js +91 -0
- package/dist/features/tester/seed-data/authored/seo__page-metadata.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/seo__page-metadata.js +122 -0
- package/dist/features/tester/seed-data/authored/seo__sitemap-and-robots.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/seo__sitemap-and-robots.js +105 -0
- package/dist/features/tester/seed-data/carts-tester-seed-data.d.ts +3 -0
- package/dist/features/tester/seed-data/carts-tester-seed-data.js +70 -0
- package/dist/features/tester/seed-data/index.d.ts +1 -0
- package/dist/features/tester/seed-data/index.js +1 -0
- package/dist/features/tester/seed-data/tester-checklist-seed-data.js +744 -1
- package/dist/seed/carousel-slides-seed-data.js +1 -1
- package/dist/seed/cart-seed-data.js +11 -0
- package/dist/seed/index.d.ts +1 -1
- package/dist/seed/index.js +1 -1
- package/dist/seed/manifest.js +2 -2
- package/dist/seed/notifications-seed-data.js +5 -1
- package/dist/seed/products-standard-seed-data.js +2 -2
- package/dist/seed/reviews-seed-data.js +6 -1
- package/package.json +1 -1
- package/scripts/seed-cli.mjs +752 -746
|
@@ -0,0 +1,430 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* WHY: End-to-end money flows — offers, auction wins, payments and the refusals
|
|
3
|
+
* that guard them. This was the largest hole in the catalogue: offers had
|
|
4
|
+
* cases for MAKING one but none for the seller accepting it and the buyer
|
|
5
|
+
* then paying, and a won auction had no payment path tested at all — which
|
|
6
|
+
* is exactly where Root Cause #60 lived (settlement wrote an order nobody
|
|
7
|
+
* could pay for, and no case would have caught it).
|
|
8
|
+
*
|
|
9
|
+
* WHAT: Exports moneyFlowsPages — the page definitions consumed by group() in
|
|
10
|
+
* tester-checklist-seed-data.ts.
|
|
11
|
+
*
|
|
12
|
+
* 🛑 THIS FILE IS THE REFERENCE for the six-part case contract. Every other page
|
|
13
|
+
* is authored against it, so it must never be the odd one out: role, startPage,
|
|
14
|
+
* steps, expectedBehaviour, expectedUiState, endResult — all six, every case,
|
|
15
|
+
* with literal values and named fixtures.
|
|
16
|
+
*
|
|
17
|
+
* @tag domain:tester
|
|
18
|
+
* @tag layer:seed
|
|
19
|
+
* @tag access:server-only
|
|
20
|
+
* @tag consumers:tester-checklist-seed-data.ts
|
|
21
|
+
* @tag sideEffects:none
|
|
22
|
+
*/
|
|
23
|
+
/** Reused so the wording cannot drift between cases that mean the same thing. */
|
|
24
|
+
const STEP_SIGNIN_BUYER = "Sign in as the buyer ash@pokemonpalace.in.";
|
|
25
|
+
const STEP_PLACE_ORDER = "Click 'Place order'.";
|
|
26
|
+
const STEP_RELOAD_ORDERS = "Reload /user/orders.";
|
|
27
|
+
export const moneyFlowsPages = [
|
|
28
|
+
{
|
|
29
|
+
pageKey: "offer-to-purchase",
|
|
30
|
+
pageLabel: "Offer → accept → pay",
|
|
31
|
+
href: "/products/product-tester-offerable",
|
|
32
|
+
cases: [
|
|
33
|
+
{
|
|
34
|
+
key: "buyer-makes-offer",
|
|
35
|
+
label: "A buyer can make an offer on a seller's product and it appears in their own offers list",
|
|
36
|
+
roles: ["buyer"],
|
|
37
|
+
startPage: "/products/product-tester-offerable",
|
|
38
|
+
steps: [
|
|
39
|
+
STEP_SIGNIN_BUYER,
|
|
40
|
+
"Open /products/product-tester-offerable.",
|
|
41
|
+
"Click 'Make Offer'.",
|
|
42
|
+
"Enter 780 as the offer amount.",
|
|
43
|
+
"Enter the note 'QA offer offer-to-purchase-buyer-makes-offer'.",
|
|
44
|
+
"Click 'Submit offer'.",
|
|
45
|
+
"Open /user/offers.",
|
|
46
|
+
],
|
|
47
|
+
expectedBehaviour: "An offer is created for 780 against product-tester-offerable, owned by the signed-in buyer, and the owning seller receives an offer-received notification.",
|
|
48
|
+
expectedUiState: "The offer modal closes and a success confirmation appears. /user/offers lists a row for the product with amount ₹780 and status Pending. The page does NOT read 'No offers yet'.",
|
|
49
|
+
endResult: "After reloading /user/offers the row is still listed at ₹780 with status Pending.",
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
key: "duplicate-offer-refused",
|
|
53
|
+
label: "A second offer on the same listing while one is still pending is refused",
|
|
54
|
+
roles: ["buyer"],
|
|
55
|
+
startPage: "/products/product-tester-offerable",
|
|
56
|
+
steps: [
|
|
57
|
+
"Sign in as the buyer ash@pokemonpalace.in, holding the pending 780 offer from the previous case.",
|
|
58
|
+
"Open /products/product-tester-offerable.",
|
|
59
|
+
"Click 'Make Offer'.",
|
|
60
|
+
"Enter 800 as the offer amount.",
|
|
61
|
+
"Click 'Submit offer'.",
|
|
62
|
+
],
|
|
63
|
+
expectedBehaviour: "The second offer is rejected. No new offer document is created; the existing 780 offer is untouched.",
|
|
64
|
+
expectedUiState: "An error states that an active offer already exists on this listing. The amount field keeps the entered 800 rather than clearing silently.",
|
|
65
|
+
endResult: "After reloading /user/offers there is still exactly ONE pending row for this product, at ₹780 — not two, and not one at ₹800.",
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
key: "seller-sees-and-accepts",
|
|
69
|
+
label: "The owning seller sees the inbound offer and can accept it",
|
|
70
|
+
roles: ["seller"],
|
|
71
|
+
startPage: "/store/offers",
|
|
72
|
+
steps: [
|
|
73
|
+
"Sign in as tester@letitrip.in, who owns store-tester-qa-seller.",
|
|
74
|
+
"Open /store/offers.",
|
|
75
|
+
"Find the row for offer-tester-sandbox-inbound (product-tester-standard-1, offered ₹120 against a listed ₹150).",
|
|
76
|
+
"Open the row actions menu.",
|
|
77
|
+
"Click 'Accept'.",
|
|
78
|
+
"Confirm in the dialog.",
|
|
79
|
+
"Reload /store/offers.",
|
|
80
|
+
],
|
|
81
|
+
expectedBehaviour: "The offer moves to Accepted, a locked price of 120 is recorded, and the buyer receives an offer-responded notification.",
|
|
82
|
+
expectedUiState: "Before acting, the row menu offers Accept, Decline and Counter as enabled controls. After confirming, the row's status badge reads Accepted.",
|
|
83
|
+
endResult: "After reloading /store/offers the status still reads Accepted — not Pending.",
|
|
84
|
+
href: "/store/offers",
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
key: "accepted-offer-locks-price",
|
|
88
|
+
label: "🛑 Checkout bills the AGREED price, never the listing price",
|
|
89
|
+
roles: ["buyer"],
|
|
90
|
+
startPage: "/user/offers",
|
|
91
|
+
steps: [
|
|
92
|
+
"Sign in as tester@letitrip.in, who holds offer-tester-sandbox-accepted on product-beyblade-burst-valkyrie (listed ₹999, agreed ₹780).",
|
|
93
|
+
"Open /user/offers.",
|
|
94
|
+
"Click through to checkout from the accepted offer.",
|
|
95
|
+
"Read the line item price in the checkout summary.",
|
|
96
|
+
"Continue to the payment step.",
|
|
97
|
+
"Read the order total.",
|
|
98
|
+
],
|
|
99
|
+
expectedBehaviour: "Every price computed for this line uses the locked 780, not the product's current 999.",
|
|
100
|
+
expectedUiState: "The line item reads ₹780.00 and the order total reflects 780 plus fees. ₹999 appears nowhere on the checkout screen for this line.",
|
|
101
|
+
endResult: "Nothing is placed in this case — stop at the payment step. The check is that the two numbers never appear together for the same line.",
|
|
102
|
+
href: "/user/offers",
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
key: "owning-seller-cannot-offer",
|
|
106
|
+
label: "The owning seller sees no Make Offer control on their own listing",
|
|
107
|
+
roles: ["seller"],
|
|
108
|
+
startPage: "/products/product-tester-standard-1",
|
|
109
|
+
steps: [
|
|
110
|
+
"Sign in as tester@letitrip.in, who owns store-tester-qa-seller.",
|
|
111
|
+
"Open /products/product-tester-standard-1, a listing owned by that store.",
|
|
112
|
+
"Read the action controls on the listing.",
|
|
113
|
+
],
|
|
114
|
+
expectedBehaviour: "The seller is not offered any purchase path on their own listing — you cannot make an offer on, or buy, your own item.",
|
|
115
|
+
expectedUiState: "'Make Offer' is ABSENT, not merely disabled. A seller-facing control such as 'Edit listing' is shown instead.",
|
|
116
|
+
endResult: "Nothing is persisted; this is a read-only check of which controls render for the owner.",
|
|
117
|
+
href: "/products/product-tester-standard-1",
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
key: "offer-lane-blocks-other-items",
|
|
121
|
+
label: "An accepted offer in the cart blocks unrelated items from being checked out alongside it",
|
|
122
|
+
roles: ["buyer"],
|
|
123
|
+
startPage: "/cart",
|
|
124
|
+
steps: [
|
|
125
|
+
"Sign in as tester@letitrip.in with the accepted offer on product-beyblade-burst-valkyrie in the cart.",
|
|
126
|
+
"Open /products/product-tester-standard-2 and click 'Add to cart'.",
|
|
127
|
+
"Open /cart.",
|
|
128
|
+
"Read which lane or tab each line sits in.",
|
|
129
|
+
"Attempt to check out the standard item.",
|
|
130
|
+
],
|
|
131
|
+
expectedBehaviour: "The cart separates the offer line from the standard line, and only the higher-priority offer lane may be checked out while it is pending.",
|
|
132
|
+
expectedUiState: "The two lines appear under different lane labels, and the standard lane's checkout control is disabled with a stated reason — not silently inert.",
|
|
133
|
+
endResult: "After reloading /cart both lines are still present and still in separate lanes.",
|
|
134
|
+
href: "/cart",
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
key: "expired-offer-cannot-checkout",
|
|
138
|
+
label: "An accepted offer past its checkout deadline can no longer be paid",
|
|
139
|
+
roles: ["buyer"],
|
|
140
|
+
startPage: "/user/offers",
|
|
141
|
+
steps: [
|
|
142
|
+
"Sign in as tester@letitrip.in.",
|
|
143
|
+
"Open /user/offers and find offer-tester-sandbox-expiring, whose checkout window is a fraction of the run window.",
|
|
144
|
+
"Note the countdown shown on the row.",
|
|
145
|
+
"Reload the page until the countdown reaches zero.",
|
|
146
|
+
"Attempt to start checkout from that offer.",
|
|
147
|
+
],
|
|
148
|
+
expectedBehaviour: "Checkout is refused once the deadline has passed; the offer is treated as expired rather than payable.",
|
|
149
|
+
expectedUiState: "The row reads Expired and offers no checkout control. It must not silently proceed at ₹700.",
|
|
150
|
+
endResult: "After reloading /user/offers the row still reads Expired.",
|
|
151
|
+
href: "/user/offers",
|
|
152
|
+
},
|
|
153
|
+
],
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
pageKey: "auction-win-to-payment",
|
|
157
|
+
pageLabel: "Win an auction → get notified → pay",
|
|
158
|
+
href: "/auctions/auction-tester-sandbox-cycle-1",
|
|
159
|
+
cases: [
|
|
160
|
+
{
|
|
161
|
+
key: "winning-bid-recorded",
|
|
162
|
+
label: "Placing the highest bid on a closing auction records you as the winner",
|
|
163
|
+
roles: ["buyer"],
|
|
164
|
+
startPage: "/auctions/auction-tester-sandbox-cycle-1",
|
|
165
|
+
steps: [
|
|
166
|
+
STEP_SIGNIN_BUYER,
|
|
167
|
+
"Open /auctions/auction-tester-sandbox-cycle-1, which starts at ₹15,000 with a ₹1,000 increment.",
|
|
168
|
+
"Note the current bid and the end time.",
|
|
169
|
+
"Enter 16000 as the bid amount.",
|
|
170
|
+
"Click 'Place Bid'.",
|
|
171
|
+
"Wait past the auction end time, reloading the page.",
|
|
172
|
+
],
|
|
173
|
+
expectedBehaviour: "The bid is accepted at 16000, becomes the winning bid, and after the end time the auction settles with this buyer as winner.",
|
|
174
|
+
expectedUiState: "Immediately after bidding the page shows '1 bid' and ₹16,000.00 without a manual refresh. After the end time it shows the auction as ended and names you as the winning bidder.",
|
|
175
|
+
endResult: "After reloading, the auction still reads ended with your winning bid at ₹16,000.00, and Bid History lists it with other bidders' names masked.",
|
|
176
|
+
},
|
|
177
|
+
{
|
|
178
|
+
key: "win-notification-arrives",
|
|
179
|
+
label: "🛑 Winning an auction produces a notification that links somewhere payable",
|
|
180
|
+
roles: ["buyer"],
|
|
181
|
+
startPage: "/user/notifications",
|
|
182
|
+
steps: [
|
|
183
|
+
"Sign in as the buyer who won auction-tester-sandbox-cycle-1.",
|
|
184
|
+
"Open the notifications bell in the header.",
|
|
185
|
+
"Find the auction-won notification.",
|
|
186
|
+
"Read its text.",
|
|
187
|
+
"Click it.",
|
|
188
|
+
],
|
|
189
|
+
expectedBehaviour: "A notification exists for the win, names the item, and its action URL resolves to a page from which the win can be paid.",
|
|
190
|
+
expectedUiState: "The notification names the auction. Following it lands on a page showing the amount due and a payment control — not a generic listing page and not a 404.",
|
|
191
|
+
endResult: "The notification remains in the list after reload, marked read.",
|
|
192
|
+
href: "/user/notifications",
|
|
193
|
+
},
|
|
194
|
+
{
|
|
195
|
+
key: "won-auction-is-payable",
|
|
196
|
+
label: "🛑 A won auction can actually be paid for",
|
|
197
|
+
roles: ["buyer"],
|
|
198
|
+
startPage: "/user/orders",
|
|
199
|
+
steps: [
|
|
200
|
+
"Sign in as the buyer who won auction-tester-sandbox-cycle-1.",
|
|
201
|
+
"Open /user/orders.",
|
|
202
|
+
"Locate the won auction.",
|
|
203
|
+
"Click its payment call to action.",
|
|
204
|
+
"Read the amount due.",
|
|
205
|
+
"Proceed as far as the payment method selection.",
|
|
206
|
+
],
|
|
207
|
+
expectedBehaviour: "A reachable payment path exists and the amount due equals the winning bid of ₹16,000.",
|
|
208
|
+
expectedUiState: "The order shows ₹16,000.00 due and a payment control. Root Cause #60 is exactly this failing — settlement once wrote an order with no payment route, so 'the record exists' is NOT a pass; a payment step must be reachable.",
|
|
209
|
+
endResult: "Stop at the payment method step. After reloading /user/orders the order is still listed as awaiting payment.",
|
|
210
|
+
href: "/user/orders",
|
|
211
|
+
},
|
|
212
|
+
{
|
|
213
|
+
key: "won-auction-line-is-locked",
|
|
214
|
+
label: "A won-auction line cannot be removed from the cart or have its quantity changed",
|
|
215
|
+
roles: ["buyer"],
|
|
216
|
+
startPage: "/cart",
|
|
217
|
+
steps: [
|
|
218
|
+
"Sign in as the buyer holding the won auction line.",
|
|
219
|
+
"Open /cart.",
|
|
220
|
+
"Attempt to change the quantity on the won-auction line.",
|
|
221
|
+
"Attempt to remove that line.",
|
|
222
|
+
"Click 'Remove all'.",
|
|
223
|
+
],
|
|
224
|
+
expectedBehaviour: "Quantity is fixed at 1 and removal is refused for the won line. 'Remove all' clears other lines but keeps this one.",
|
|
225
|
+
expectedUiState: "The quantity stepper is absent or disabled on that line, and the remove control is refused with a stated reason. After 'Remove all', a message explicitly says the awaiting-payment line was kept.",
|
|
226
|
+
endResult: "After reloading /cart the won-auction line is still present.",
|
|
227
|
+
href: "/cart",
|
|
228
|
+
},
|
|
229
|
+
{
|
|
230
|
+
key: "unpaid-win-forfeits",
|
|
231
|
+
label: "An unpaid win past its deadline is forfeited and the buyer is told",
|
|
232
|
+
roles: ["buyer"],
|
|
233
|
+
startPage: "/user/orders",
|
|
234
|
+
steps: [
|
|
235
|
+
"Sign in as the buyer holding an unpaid won auction.",
|
|
236
|
+
"Leave it unpaid until its payment deadline passes.",
|
|
237
|
+
STEP_RELOAD_ORDERS,
|
|
238
|
+
"Open the notifications bell.",
|
|
239
|
+
],
|
|
240
|
+
expectedBehaviour: "The win is forfeited or cancelled rather than remaining payable, and the buyer is notified.",
|
|
241
|
+
expectedUiState: "The order reads Forfeited or Cancelled and offers no payment control. A notification explains the forfeit.",
|
|
242
|
+
endResult: "After reloading, the order still reads forfeited and the line is gone from /cart — it must not sit there payable forever.",
|
|
243
|
+
href: "/user/orders",
|
|
244
|
+
},
|
|
245
|
+
],
|
|
246
|
+
},
|
|
247
|
+
{
|
|
248
|
+
pageKey: "payment-methods",
|
|
249
|
+
pageLabel: "Making payments",
|
|
250
|
+
href: "/checkout",
|
|
251
|
+
cases: [
|
|
252
|
+
{
|
|
253
|
+
key: "cod-order-places",
|
|
254
|
+
label: "A cash-on-delivery order can be placed and shows the COD fee before confirming",
|
|
255
|
+
roles: ["buyer"],
|
|
256
|
+
startPage: "/products/product-tester-standard-1",
|
|
257
|
+
steps: [
|
|
258
|
+
STEP_SIGNIN_BUYER,
|
|
259
|
+
"Open /products/product-tester-standard-1 and click 'Add to cart'.",
|
|
260
|
+
"Open /checkout and complete the address step.",
|
|
261
|
+
"Continue to the add-ons and fees step.",
|
|
262
|
+
"Select 'Cash on Delivery'.",
|
|
263
|
+
"Read every fee line in the order summary and note the total.",
|
|
264
|
+
STEP_PLACE_ORDER,
|
|
265
|
+
STEP_RELOAD_ORDERS,
|
|
266
|
+
],
|
|
267
|
+
expectedBehaviour: "A COD order is created, and the COD handling fee and deposit are included in the recorded total.",
|
|
268
|
+
expectedUiState: "Before confirming, the summary lists the COD handling fee and any deposit as their own lines, and the total includes them.",
|
|
269
|
+
endResult: "After reloading /user/orders the order exists with a total exactly equal to the figure shown at checkout.",
|
|
270
|
+
},
|
|
271
|
+
{
|
|
272
|
+
key: "manual-payment-proof-upload",
|
|
273
|
+
label: "🛑 A manual (UPI) order reaches a page where proof can actually be uploaded",
|
|
274
|
+
roles: ["buyer"],
|
|
275
|
+
startPage: "/checkout",
|
|
276
|
+
steps: [
|
|
277
|
+
"Sign in as the buyer ash@pokemonpalace.in with product-tester-standard-2 in the cart.",
|
|
278
|
+
"Open /checkout and complete the address step.",
|
|
279
|
+
"Select UPI / manual payment.",
|
|
280
|
+
STEP_PLACE_ORDER,
|
|
281
|
+
"Follow the redirect that appears after placing it.",
|
|
282
|
+
"Read the UPI id and the countdown shown.",
|
|
283
|
+
"Upload public/test-media/sample-image.png as payment proof.",
|
|
284
|
+
"Reload the page.",
|
|
285
|
+
],
|
|
286
|
+
expectedBehaviour: "The order is created awaiting manual payment, and the uploaded proof is attached to it for admin review.",
|
|
287
|
+
expectedUiState: "The page shows a UPI id, a visible deadline countdown, and a working upload control. It must NOT read 'This order does not require manual payment upload' — that message on a manual order is the Root Cause #57 failure.",
|
|
288
|
+
endResult: "After reloading, the uploaded proof is still shown attached to the order.",
|
|
289
|
+
href: "/user/orders",
|
|
290
|
+
},
|
|
291
|
+
{
|
|
292
|
+
key: "payment-page-reachable-later",
|
|
293
|
+
label: "The payment page for an unpaid order is reachable again after navigating away",
|
|
294
|
+
roles: ["buyer"],
|
|
295
|
+
startPage: "/user/orders",
|
|
296
|
+
steps: [
|
|
297
|
+
"Sign in as the buyer holding an unpaid manual-payment order.",
|
|
298
|
+
"Open the homepage without paying.",
|
|
299
|
+
"Open /user/orders.",
|
|
300
|
+
"Open the unpaid order.",
|
|
301
|
+
],
|
|
302
|
+
expectedBehaviour: "The order detail exposes a route back to the payment and proof-upload page.",
|
|
303
|
+
expectedUiState: "A 'Complete payment' or 'Re-upload proof' control is visible on the order detail.",
|
|
304
|
+
endResult: "Following that control lands on the payment page for the same order, and it still shows the amount due after a reload.",
|
|
305
|
+
href: "/user/orders",
|
|
306
|
+
},
|
|
307
|
+
{
|
|
308
|
+
key: "fees-match-between-preview-and-order",
|
|
309
|
+
label: "🛑 The total shown at checkout equals the total recorded on the order",
|
|
310
|
+
roles: ["buyer"],
|
|
311
|
+
startPage: "/checkout",
|
|
312
|
+
steps: [
|
|
313
|
+
STEP_SIGNIN_BUYER,
|
|
314
|
+
"Add product-tester-standard-1 (store-tester-sandbox) to the cart.",
|
|
315
|
+
"Add product-beyblade-burst-valkyrie (store-beyblade-arena) to the cart.",
|
|
316
|
+
"Open /checkout and reach the payment step.",
|
|
317
|
+
"Write down the exact total and every fee line.",
|
|
318
|
+
STEP_PLACE_ORDER,
|
|
319
|
+
"Open /user/orders and add up the totals of the orders just produced.",
|
|
320
|
+
],
|
|
321
|
+
expectedBehaviour: "A two-seller cart splits into one order per seller, and the platform commission is charged ONCE for the checkout rather than once per seller.",
|
|
322
|
+
expectedUiState: "The checkout summary shows a single platform-fee line, qualified by the number of stores where relevant.",
|
|
323
|
+
endResult: "After reload, the sum of the recorded order totals equals the checkout figure to the rupee.",
|
|
324
|
+
},
|
|
325
|
+
{
|
|
326
|
+
key: "coupon-applies-and-persists",
|
|
327
|
+
label: "A coupon applied at checkout is reflected in the placed order",
|
|
328
|
+
roles: ["buyer"],
|
|
329
|
+
startPage: "/checkout",
|
|
330
|
+
steps: [
|
|
331
|
+
STEP_SIGNIN_BUYER,
|
|
332
|
+
"Add product-beyblade-burst-valkyrie to the cart.",
|
|
333
|
+
"Open /checkout and reach the payment step.",
|
|
334
|
+
"Enter the coupon code ARENA25 and apply it.",
|
|
335
|
+
"Note the discount line and the new total.",
|
|
336
|
+
STEP_PLACE_ORDER,
|
|
337
|
+
STEP_RELOAD_ORDERS,
|
|
338
|
+
],
|
|
339
|
+
expectedBehaviour: "The discount is applied to the order that is created, and the coupon's usage count increments.",
|
|
340
|
+
expectedUiState: "A discount line appears naming ARENA25, and the total drops accordingly before the order is placed.",
|
|
341
|
+
endResult: "After reloading the order, ARENA25 and the same discount amount are still recorded on it.",
|
|
342
|
+
},
|
|
343
|
+
],
|
|
344
|
+
},
|
|
345
|
+
{
|
|
346
|
+
pageKey: "blockers",
|
|
347
|
+
pageLabel: "Blockers and refusals",
|
|
348
|
+
href: "/cart",
|
|
349
|
+
cases: [
|
|
350
|
+
{
|
|
351
|
+
key: "out-of-stock-blocked",
|
|
352
|
+
label: "A sold-out item cannot be added to the cart or checked out",
|
|
353
|
+
roles: ["buyer"],
|
|
354
|
+
startPage: "/products/product-tester-standard-sold",
|
|
355
|
+
steps: [
|
|
356
|
+
STEP_SIGNIN_BUYER,
|
|
357
|
+
"Open /products/product-tester-standard-sold, a deliberately sold-out fixture.",
|
|
358
|
+
"Attempt to add it to the cart.",
|
|
359
|
+
],
|
|
360
|
+
expectedBehaviour: "The add is refused and no cart line is created for an unavailable item.",
|
|
361
|
+
expectedUiState: "The add control is disabled or replaced by a Sold Out state, with the reason stated on the page.",
|
|
362
|
+
endResult: "After reloading /cart the item is absent.",
|
|
363
|
+
href: "/products/product-tester-standard-sold",
|
|
364
|
+
},
|
|
365
|
+
{
|
|
366
|
+
key: "cross-store-group-refused",
|
|
367
|
+
label: "A group spanning two stores cannot be added as one cart line",
|
|
368
|
+
roles: ["buyer"],
|
|
369
|
+
startPage: "/products/product-tester-crossstore-a",
|
|
370
|
+
steps: [
|
|
371
|
+
STEP_SIGNIN_BUYER,
|
|
372
|
+
"Open /products/product-tester-crossstore-a.",
|
|
373
|
+
"Open the group picker ('Pick items').",
|
|
374
|
+
"Attempt to select members and add them to the cart.",
|
|
375
|
+
],
|
|
376
|
+
expectedBehaviour: "The picker refuses a cross-store selection; an order cannot span two sellers.",
|
|
377
|
+
expectedUiState: "The picker renders read-only — no quantity column and no 'Add selected to cart' control — and explains that the group spans two stores.",
|
|
378
|
+
endResult: "After reloading /cart no line was created.",
|
|
379
|
+
href: "/products/product-tester-crossstore-a",
|
|
380
|
+
},
|
|
381
|
+
{
|
|
382
|
+
key: "classified-has-no-cart",
|
|
383
|
+
label: "A classified listing offers contact, never Add to Cart",
|
|
384
|
+
roles: ["buyer"],
|
|
385
|
+
startPage: "/classified/classified-tester-sandbox-1",
|
|
386
|
+
steps: [
|
|
387
|
+
STEP_SIGNIN_BUYER,
|
|
388
|
+
"Open /classified/classified-tester-sandbox-1.",
|
|
389
|
+
"Read every action control on the listing.",
|
|
390
|
+
],
|
|
391
|
+
expectedBehaviour: "A classified is a contact-only listing type with no cart path at all.",
|
|
392
|
+
expectedUiState: "Exactly one of 'Make Offer', 'Request to Buy' or a contact-seller control is present. 'Add to Cart' and 'Buy Now' are ABSENT, not disabled.",
|
|
393
|
+
endResult: "Nothing is persisted; this is a read-only check of which controls render.",
|
|
394
|
+
href: "/classified/classified-tester-sandbox-1",
|
|
395
|
+
},
|
|
396
|
+
{
|
|
397
|
+
key: "guest-gated-action-prompts-signin",
|
|
398
|
+
label: "A gated action while signed out prompts sign-in and then completes the original action",
|
|
399
|
+
roles: ["guest"],
|
|
400
|
+
startPage: "/products/product-tester-standard-1",
|
|
401
|
+
steps: [
|
|
402
|
+
"Sign out completely.",
|
|
403
|
+
"Open /products/product-tester-standard-1.",
|
|
404
|
+
"Click the wishlist heart.",
|
|
405
|
+
"Sign in as ash@pokemonpalace.in through the prompt that appears.",
|
|
406
|
+
],
|
|
407
|
+
expectedBehaviour: "The click is held while signing in and then replayed, so the item ends up on the wishlist.",
|
|
408
|
+
expectedUiState: "A sign-in prompt appears rather than the click doing nothing. After signing in, the heart shows the saved state.",
|
|
409
|
+
endResult: "After reloading /wishlist the item is listed.",
|
|
410
|
+
href: "/products/product-tester-standard-1",
|
|
411
|
+
},
|
|
412
|
+
{
|
|
413
|
+
key: "banned-account-blocked",
|
|
414
|
+
label: "A disabled account cannot sign in and is told why",
|
|
415
|
+
roles: ["guest"],
|
|
416
|
+
startPage: "/auth/login",
|
|
417
|
+
steps: [
|
|
418
|
+
"Sign out completely.",
|
|
419
|
+
"Open /auth/login.",
|
|
420
|
+
"Enter the credentials of an account an admin has disabled.",
|
|
421
|
+
"Click 'Sign in'.",
|
|
422
|
+
],
|
|
423
|
+
expectedBehaviour: "Authentication is refused for a disabled account; no session cookie is issued.",
|
|
424
|
+
expectedUiState: "A clear message states the account is disabled. The form must not appear to succeed and then fail on the next page.",
|
|
425
|
+
endResult: "After reloading, the user is still signed out and /user/profile redirects to login.",
|
|
426
|
+
href: "/auth/login",
|
|
427
|
+
},
|
|
428
|
+
],
|
|
429
|
+
},
|
|
430
|
+
];
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { TesterCaseRole } from "../../schemas";
|
|
2
|
+
export interface AuthoredCase {
|
|
3
|
+
/**
|
|
4
|
+
* WHICH ROLES this case affects. `seller` always means the OWNER of the listing
|
|
5
|
+
* under test. A list, because the difference between roles is usually the point —
|
|
6
|
+
* per-role detail goes in the expectation fields as prose.
|
|
7
|
+
*/
|
|
8
|
+
roles: TesterCaseRole[];
|
|
9
|
+
/** WHERE the tester starts. One unprefixed path. */
|
|
10
|
+
startPage: string;
|
|
11
|
+
/** WHAT they do. One action each, no assertions. As many as the case needs. */
|
|
12
|
+
steps: string[];
|
|
13
|
+
/** The exact values entered or selected. Omitted when the case enters nothing. */
|
|
14
|
+
inputs?: Record<string, string | number | boolean>;
|
|
15
|
+
/** What the system must DO, including side effects no screen shows. */
|
|
16
|
+
expectedBehaviour: string;
|
|
17
|
+
/** What must be SEEN. Quotes the screen, so a screenshot can settle it. */
|
|
18
|
+
expectedUiState: string;
|
|
19
|
+
/** The values that must be correct afterwards. Omitted when nothing is checkable. */
|
|
20
|
+
expectedData?: Record<string, string | number | boolean>;
|
|
21
|
+
/** What survives a RELOAD. States explicitly when nothing persists. */
|
|
22
|
+
endResult: string;
|
|
23
|
+
/**
|
|
24
|
+
* The author wrote real steps but was unsure of the case's intent.
|
|
25
|
+
*
|
|
26
|
+
* Deliberately distinct from "has no steps": one is a case awaiting a second
|
|
27
|
+
* opinion, the other is an unwritten case. Collapsing them would let the
|
|
28
|
+
* second hide inside the first, which is the visible-gap-made-invisible
|
|
29
|
+
* failure the whole contract exists to prevent.
|
|
30
|
+
*/
|
|
31
|
+
needsReview?: boolean;
|
|
32
|
+
reviewNote?: string;
|
|
33
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* WHY: The shape an authoring session produces for one checklist case.
|
|
3
|
+
* WHAT: `AuthoredCase` — the six-part contract, all fields required, plus an
|
|
4
|
+
* optional review flag. Per-page maps in this directory are written by hand
|
|
5
|
+
* and merged into the catalogue by `group()` in
|
|
6
|
+
* ../tester-checklist-seed-data.ts.
|
|
7
|
+
*
|
|
8
|
+
* 🛑 WHY AN OVERLAY RATHER THAN EDITING THE CATALOGUE IN PLACE
|
|
9
|
+
*
|
|
10
|
+
* The catalogue is one ~10k-line TypeScript literal holding 990 cases. Rewriting
|
|
11
|
+
* it programmatically to insert six fields per case means brace-matching TS with
|
|
12
|
+
* a regex, on the file that defines the project's primary coverage mechanism —
|
|
13
|
+
* a bad merge silently corrupts cases nobody re-reads.
|
|
14
|
+
*
|
|
15
|
+
* An overlay keyed by full case id has one merge point, produces a per-page diff
|
|
16
|
+
* (which is exactly the granularity the definition-of-done gate reviews at), and
|
|
17
|
+
* cannot corrupt what it does not touch.
|
|
18
|
+
*
|
|
19
|
+
* It does NOT create the two-owners drift of Root Cause #42, because ownership is
|
|
20
|
+
* split by FIELD and never duplicated: the catalogue owns `label`/`description`/
|
|
21
|
+
* `href`, the overlay owns the six authored fields, and neither restates the
|
|
22
|
+
* other's. The one failure it can have — an overlay entry whose case id no longer
|
|
23
|
+
* exists — is detectable, and `audit-tester-plugin-wiring` fails on it.
|
|
24
|
+
*
|
|
25
|
+
* EXPORTS:
|
|
26
|
+
* AuthoredCase — the per-case authored payload
|
|
27
|
+
*
|
|
28
|
+
* @tag domain:tester
|
|
29
|
+
* @tag layer:seed
|
|
30
|
+
* @tag pattern:none
|
|
31
|
+
* @tag access:server-only
|
|
32
|
+
* @tag consumers:seed-data/tester-checklist-seed-data.ts
|
|
33
|
+
* @tag sideEffects:none
|
|
34
|
+
*/
|
|
35
|
+
export {};
|