@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.
Files changed (243) hide show
  1. package/dist/_internal/client/features/lottery/LotteryAdminEditView.js +32 -2
  2. package/dist/features/auth/actions/profile-actions.d.ts +14 -1
  3. package/dist/features/auth/actions/profile-actions.js +16 -2
  4. package/dist/features/tester/components/TesterChecklistStepRow.d.ts +9 -1
  5. package/dist/features/tester/components/TesterChecklistStepRow.js +31 -2
  6. package/dist/features/tester/components/TesterHubView.js +8 -0
  7. package/dist/features/tester/schemas/firestore.d.ts +109 -0
  8. package/dist/features/tester/schemas/firestore.js +14 -0
  9. package/dist/features/tester/seed-data/_money-flows.d.ts +23 -0
  10. package/dist/features/tester/seed-data/_money-flows.js +430 -0
  11. package/dist/features/tester/seed-data/authored/_types.d.ts +33 -0
  12. package/dist/features/tester/seed-data/authored/_types.js +35 -0
  13. package/dist/features/tester/seed-data/authored/account-auth__profile-settings.d.ts +2 -0
  14. package/dist/features/tester/seed-data/authored/account-auth__profile-settings.js +207 -0
  15. package/dist/features/tester/seed-data/authored/account-auth__signup-login.d.ts +2 -0
  16. package/dist/features/tester/seed-data/authored/account-auth__signup-login.js +298 -0
  17. package/dist/features/tester/seed-data/authored/account-auth__testing-program--admin.d.ts +2 -0
  18. package/dist/features/tester/seed-data/authored/account-auth__testing-program--admin.js +33 -0
  19. package/dist/features/tester/seed-data/authored/account-auth__testing-program.d.ts +2 -0
  20. package/dist/features/tester/seed-data/authored/account-auth__testing-program.js +138 -0
  21. package/dist/features/tester/seed-data/authored/addresses__address-filters.d.ts +2 -0
  22. package/dist/features/tester/seed-data/authored/addresses__address-filters.js +36 -0
  23. package/dist/features/tester/seed-data/authored/addresses__postal-lookup.d.ts +2 -0
  24. package/dist/features/tester/seed-data/authored/addresses__postal-lookup.js +75 -0
  25. package/dist/features/tester/seed-data/authored/addresses__postal-validation.d.ts +2 -0
  26. package/dist/features/tester/seed-data/authored/addresses__postal-validation.js +72 -0
  27. package/dist/features/tester/seed-data/authored/addresses__state-picker.d.ts +2 -0
  28. package/dist/features/tester/seed-data/authored/addresses__state-picker.js +54 -0
  29. package/dist/features/tester/seed-data/authored/addresses__unban-request.d.ts +2 -0
  30. package/dist/features/tester/seed-data/authored/addresses__unban-request.js +39 -0
  31. package/dist/features/tester/seed-data/authored/admin__bans-and-trust.d.ts +2 -0
  32. package/dist/features/tester/seed-data/authored/admin__bans-and-trust.js +226 -0
  33. package/dist/features/tester/seed-data/authored/admin__blog-faqs.d.ts +2 -0
  34. package/dist/features/tester/seed-data/authored/admin__blog-faqs.js +82 -0
  35. package/dist/features/tester/seed-data/authored/admin__bulk-actions.d.ts +2 -0
  36. package/dist/features/tester/seed-data/authored/admin__bulk-actions.js +177 -0
  37. package/dist/features/tester/seed-data/authored/admin__bundles.d.ts +2 -0
  38. package/dist/features/tester/seed-data/authored/admin__bundles.js +97 -0
  39. package/dist/features/tester/seed-data/authored/admin__buyer-data-admin.d.ts +2 -0
  40. package/dist/features/tester/seed-data/authored/admin__buyer-data-admin.js +232 -0
  41. package/dist/features/tester/seed-data/authored/admin__catalog-listings.d.ts +2 -0
  42. package/dist/features/tester/seed-data/authored/admin__catalog-listings.js +306 -0
  43. package/dist/features/tester/seed-data/authored/admin__category-brand-authoring.d.ts +2 -0
  44. package/dist/features/tester/seed-data/authored/admin__category-brand-authoring.js +158 -0
  45. package/dist/features/tester/seed-data/authored/admin__classifieds-digitalcodes-live.d.ts +2 -0
  46. package/dist/features/tester/seed-data/authored/admin__classifieds-digitalcodes-live.js +78 -0
  47. package/dist/features/tester/seed-data/authored/admin__content-deletes.d.ts +2 -0
  48. package/dist/features/tester/seed-data/authored/admin__content-deletes.js +261 -0
  49. package/dist/features/tester/seed-data/authored/admin__content-marketing.d.ts +2 -0
  50. package/dist/features/tester/seed-data/authored/admin__content-marketing.js +151 -0
  51. package/dist/features/tester/seed-data/authored/admin__coupons.d.ts +2 -0
  52. package/dist/features/tester/seed-data/authored/admin__coupons.js +214 -0
  53. package/dist/features/tester/seed-data/authored/admin__events-raffles-spin.d.ts +2 -0
  54. package/dist/features/tester/seed-data/authored/admin__events-raffles-spin.js +160 -0
  55. package/dist/features/tester/seed-data/authored/admin__media-watermark.d.ts +2 -0
  56. package/dist/features/tester/seed-data/authored/admin__media-watermark.js +104 -0
  57. package/dist/features/tester/seed-data/authored/admin__orders-fulfillment.d.ts +2 -0
  58. package/dist/features/tester/seed-data/authored/admin__orders-fulfillment.js +350 -0
  59. package/dist/features/tester/seed-data/authored/admin__prize-draws-lotteries.d.ts +2 -0
  60. package/dist/features/tester/seed-data/authored/admin__prize-draws-lotteries.js +105 -0
  61. package/dist/features/tester/seed-data/authored/admin__site-system.d.ts +2 -0
  62. package/dist/features/tester/seed-data/authored/admin__site-system.js +590 -0
  63. package/dist/features/tester/seed-data/authored/admin__uncovered-admin-pages.d.ts +2 -0
  64. package/dist/features/tester/seed-data/authored/admin__uncovered-admin-pages.js +235 -0
  65. package/dist/features/tester/seed-data/authored/admin__users-trust.d.ts +2 -0
  66. package/dist/features/tester/seed-data/authored/admin__users-trust.js +569 -0
  67. package/dist/features/tester/seed-data/authored/buying__bidding.d.ts +2 -0
  68. package/dist/features/tester/seed-data/authored/buying__bidding.js +417 -0
  69. package/dist/features/tester/seed-data/authored/buying__browsing-search.d.ts +2 -0
  70. package/dist/features/tester/seed-data/authored/buying__browsing-search.js +653 -0
  71. package/dist/features/tester/seed-data/authored/buying__buying-checkout.d.ts +2 -0
  72. package/dist/features/tester/seed-data/authored/buying__buying-checkout.js +533 -0
  73. package/dist/features/tester/seed-data/authored/buying__buying-coupons.d.ts +2 -0
  74. package/dist/features/tester/seed-data/authored/buying__buying-coupons.js +379 -0
  75. package/dist/features/tester/seed-data/authored/buying__cart.d.ts +2 -0
  76. package/dist/features/tester/seed-data/authored/buying__cart.js +1171 -0
  77. package/dist/features/tester/seed-data/authored/buying__image-tile-layout.d.ts +2 -0
  78. package/dist/features/tester/seed-data/authored/buying__image-tile-layout.js +140 -0
  79. package/dist/features/tester/seed-data/authored/buying__my-orders.d.ts +2 -0
  80. package/dist/features/tester/seed-data/authored/buying__my-orders.js +257 -0
  81. package/dist/features/tester/seed-data/authored/buying__offers.d.ts +2 -0
  82. package/dist/features/tester/seed-data/authored/buying__offers.js +1111 -0
  83. package/dist/features/tester/seed-data/authored/buying__order-status-lifecycle.d.ts +2 -0
  84. package/dist/features/tester/seed-data/authored/buying__order-status-lifecycle.js +252 -0
  85. package/dist/features/tester/seed-data/authored/buying__product-detail.d.ts +2 -0
  86. package/dist/features/tester/seed-data/authored/buying__product-detail.js +387 -0
  87. package/dist/features/tester/seed-data/authored/buying__return-request.d.ts +2 -0
  88. package/dist/features/tester/seed-data/authored/buying__return-request.js +152 -0
  89. package/dist/features/tester/seed-data/authored/buying__reviews-pagination.d.ts +2 -0
  90. package/dist/features/tester/seed-data/authored/buying__reviews-pagination.js +242 -0
  91. package/dist/features/tester/seed-data/authored/buying__reviews.d.ts +2 -0
  92. package/dist/features/tester/seed-data/authored/buying__reviews.js +113 -0
  93. package/dist/features/tester/seed-data/authored/buying__user-dashboard-extras.d.ts +2 -0
  94. package/dist/features/tester/seed-data/authored/buying__user-dashboard-extras.js +283 -0
  95. package/dist/features/tester/seed-data/authored/buying__user-dashboard-navigation.d.ts +2 -0
  96. package/dist/features/tester/seed-data/authored/buying__user-dashboard-navigation.js +167 -0
  97. package/dist/features/tester/seed-data/authored/buying__user-uncovered-pages.d.ts +2 -0
  98. package/dist/features/tester/seed-data/authored/buying__user-uncovered-pages.js +90 -0
  99. package/dist/features/tester/seed-data/authored/buying__wishlist-history.d.ts +2 -0
  100. package/dist/features/tester/seed-data/authored/buying__wishlist-history.js +344 -0
  101. package/dist/features/tester/seed-data/authored/community-support__public-profile.d.ts +2 -0
  102. package/dist/features/tester/seed-data/authored/community-support__public-profile.js +53 -0
  103. package/dist/features/tester/seed-data/authored/community-support__support-tickets.d.ts +2 -0
  104. package/dist/features/tester/seed-data/authored/community-support__support-tickets.js +76 -0
  105. package/dist/features/tester/seed-data/authored/content-discovery__blog.d.ts +2 -0
  106. package/dist/features/tester/seed-data/authored/content-discovery__blog.js +93 -0
  107. package/dist/features/tester/seed-data/authored/content-discovery__category-brand-relations.d.ts +2 -0
  108. package/dist/features/tester/seed-data/authored/content-discovery__category-brand-relations.js +149 -0
  109. package/dist/features/tester/seed-data/authored/content-discovery__coupons.d.ts +2 -0
  110. package/dist/features/tester/seed-data/authored/content-discovery__coupons.js +121 -0
  111. package/dist/features/tester/seed-data/authored/content-discovery__event-participation.d.ts +2 -0
  112. package/dist/features/tester/seed-data/authored/content-discovery__event-participation.js +207 -0
  113. package/dist/features/tester/seed-data/authored/content-discovery__events.d.ts +2 -0
  114. package/dist/features/tester/seed-data/authored/content-discovery__events.js +318 -0
  115. package/dist/features/tester/seed-data/authored/content-discovery__faq-help.d.ts +2 -0
  116. package/dist/features/tester/seed-data/authored/content-discovery__faq-help.js +65 -0
  117. package/dist/features/tester/seed-data/authored/content-discovery__notifications.d.ts +2 -0
  118. package/dist/features/tester/seed-data/authored/content-discovery__notifications.js +147 -0
  119. package/dist/features/tester/seed-data/authored/content-discovery__search.d.ts +2 -0
  120. package/dist/features/tester/seed-data/authored/content-discovery__search.js +332 -0
  121. package/dist/features/tester/seed-data/authored/cta-layout__checkout-bottom-bar.d.ts +2 -0
  122. package/dist/features/tester/seed-data/authored/cta-layout__checkout-bottom-bar.js +53 -0
  123. package/dist/features/tester/seed-data/authored/cta-layout__dialog-footers.d.ts +2 -0
  124. package/dist/features/tester/seed-data/authored/cta-layout__dialog-footers.js +52 -0
  125. package/dist/features/tester/seed-data/authored/cta-layout__editor-action-bar.d.ts +2 -0
  126. package/dist/features/tester/seed-data/authored/cta-layout__editor-action-bar.js +35 -0
  127. package/dist/features/tester/seed-data/authored/cta-layout__navbar-ctas.d.ts +2 -0
  128. package/dist/features/tester/seed-data/authored/cta-layout__navbar-ctas.js +141 -0
  129. package/dist/features/tester/seed-data/authored/cta-layout__product-bottom-bar.d.ts +2 -0
  130. package/dist/features/tester/seed-data/authored/cta-layout__product-bottom-bar.js +35 -0
  131. package/dist/features/tester/seed-data/authored/design-ux__back-to-top-button.d.ts +2 -0
  132. package/dist/features/tester/seed-data/authored/design-ux__back-to-top-button.js +95 -0
  133. package/dist/features/tester/seed-data/authored/design-ux__carousel-arrow-bounds.d.ts +2 -0
  134. package/dist/features/tester/seed-data/authored/design-ux__carousel-arrow-bounds.js +191 -0
  135. package/dist/features/tester/seed-data/authored/design-ux__dashboard-layout.d.ts +2 -0
  136. package/dist/features/tester/seed-data/authored/design-ux__dashboard-layout.js +158 -0
  137. package/dist/features/tester/seed-data/authored/design-ux__footer-theme.d.ts +2 -0
  138. package/dist/features/tester/seed-data/authored/design-ux__footer-theme.js +106 -0
  139. package/dist/features/tester/seed-data/authored/design-ux__form-validation-errors.d.ts +2 -0
  140. package/dist/features/tester/seed-data/authored/design-ux__form-validation-errors.js +88 -0
  141. package/dist/features/tester/seed-data/authored/design-ux__general-design.d.ts +2 -0
  142. package/dist/features/tester/seed-data/authored/design-ux__general-design.js +204 -0
  143. package/dist/features/tester/seed-data/authored/design-ux__hand-mode-layout.d.ts +2 -0
  144. package/dist/features/tester/seed-data/authored/design-ux__hand-mode-layout.js +301 -0
  145. package/dist/features/tester/seed-data/authored/design-ux__homepage-carousels.d.ts +2 -0
  146. package/dist/features/tester/seed-data/authored/design-ux__homepage-carousels.js +407 -0
  147. package/dist/features/tester/seed-data/authored/design-ux__status-badge-legibility.d.ts +2 -0
  148. package/dist/features/tester/seed-data/authored/design-ux__status-badge-legibility.js +214 -0
  149. package/dist/features/tester/seed-data/authored/design-ux__sticky-cta-bar.d.ts +2 -0
  150. package/dist/features/tester/seed-data/authored/design-ux__sticky-cta-bar.js +275 -0
  151. package/dist/features/tester/seed-data/authored/index.d.ts +2 -0
  152. package/dist/features/tester/seed-data/authored/index.js +237 -0
  153. package/dist/features/tester/seed-data/authored/page-wiring__data-loss.d.ts +2 -0
  154. package/dist/features/tester/seed-data/authored/page-wiring__data-loss.js +102 -0
  155. package/dist/features/tester/seed-data/authored/page-wiring__detail-pages.d.ts +2 -0
  156. package/dist/features/tester/seed-data/authored/page-wiring__detail-pages.js +50 -0
  157. package/dist/features/tester/seed-data/authored/page-wiring__drawer-pages.d.ts +2 -0
  158. package/dist/features/tester/seed-data/authored/page-wiring__drawer-pages.js +66 -0
  159. package/dist/features/tester/seed-data/authored/page-wiring__reachability.d.ts +2 -0
  160. package/dist/features/tester/seed-data/authored/page-wiring__reachability.js +115 -0
  161. package/dist/features/tester/seed-data/authored/public-pages__auth-error-pages.d.ts +2 -0
  162. package/dist/features/tester/seed-data/authored/public-pages__auth-error-pages.js +136 -0
  163. package/dist/features/tester/seed-data/authored/public-pages__bug-hunters.d.ts +2 -0
  164. package/dist/features/tester/seed-data/authored/public-pages__bug-hunters.js +69 -0
  165. package/dist/features/tester/seed-data/authored/public-pages__core-listing-pages.d.ts +2 -0
  166. package/dist/features/tester/seed-data/authored/public-pages__core-listing-pages.js +263 -0
  167. package/dist/features/tester/seed-data/authored/public-pages__help-how-it-works.d.ts +2 -0
  168. package/dist/features/tester/seed-data/authored/public-pages__help-how-it-works.js +102 -0
  169. package/dist/features/tester/seed-data/authored/public-pages__help-scams-guides-subpages.d.ts +2 -0
  170. package/dist/features/tester/seed-data/authored/public-pages__help-scams-guides-subpages.js +234 -0
  171. package/dist/features/tester/seed-data/authored/public-pages__legal-policy-pages.d.ts +2 -0
  172. package/dist/features/tester/seed-data/authored/public-pages__legal-policy-pages.js +126 -0
  173. package/dist/features/tester/seed-data/authored/public-pages__stores-sellers-directories.d.ts +2 -0
  174. package/dist/features/tester/seed-data/authored/public-pages__stores-sellers-directories.js +255 -0
  175. package/dist/features/tester/seed-data/authored/search-and-nav__employee-permissions.d.ts +2 -0
  176. package/dist/features/tester/seed-data/authored/search-and-nav__employee-permissions.js +59 -0
  177. package/dist/features/tester/seed-data/authored/search-and-nav__header-search.d.ts +2 -0
  178. package/dist/features/tester/seed-data/authored/search-and-nav__header-search.js +88 -0
  179. package/dist/features/tester/seed-data/authored/search-and-nav__settings-deep-links.d.ts +2 -0
  180. package/dist/features/tester/seed-data/authored/search-and-nav__settings-deep-links.js +51 -0
  181. package/dist/features/tester/seed-data/authored/search-and-nav__sidebar-search.d.ts +2 -0
  182. package/dist/features/tester/seed-data/authored/search-and-nav__sidebar-search.js +35 -0
  183. package/dist/features/tester/seed-data/authored/selling__become-seller.d.ts +2 -0
  184. package/dist/features/tester/seed-data/authored/selling__become-seller.js +94 -0
  185. package/dist/features/tester/seed-data/authored/selling__final-sale-authoring.d.ts +2 -0
  186. package/dist/features/tester/seed-data/authored/selling__final-sale-authoring.js +107 -0
  187. package/dist/features/tester/seed-data/authored/selling__listing-a-product.d.ts +2 -0
  188. package/dist/features/tester/seed-data/authored/selling__listing-a-product.js +285 -0
  189. package/dist/features/tester/seed-data/authored/selling__listing-lifecycle.d.ts +2 -0
  190. package/dist/features/tester/seed-data/authored/selling__listing-lifecycle.js +326 -0
  191. package/dist/features/tester/seed-data/authored/selling__listing-type-fields-roundtrip.d.ts +2 -0
  192. package/dist/features/tester/seed-data/authored/selling__listing-type-fields-roundtrip.js +136 -0
  193. package/dist/features/tester/seed-data/authored/selling__media-limits.d.ts +2 -0
  194. package/dist/features/tester/seed-data/authored/selling__media-limits.js +128 -0
  195. package/dist/features/tester/seed-data/authored/selling__sectionised-forms.d.ts +2 -0
  196. package/dist/features/tester/seed-data/authored/selling__sectionised-forms.js +167 -0
  197. package/dist/features/tester/seed-data/authored/selling__seller-analytics-payouts.d.ts +2 -0
  198. package/dist/features/tester/seed-data/authored/selling__seller-analytics-payouts.js +117 -0
  199. package/dist/features/tester/seed-data/authored/selling__seller-bids-bundles-filters.d.ts +2 -0
  200. package/dist/features/tester/seed-data/authored/selling__seller-bids-bundles-filters.js +88 -0
  201. package/dist/features/tester/seed-data/authored/selling__seller-catalog-org.d.ts +2 -0
  202. package/dist/features/tester/seed-data/authored/selling__seller-catalog-org.js +151 -0
  203. package/dist/features/tester/seed-data/authored/selling__seller-custom-brands.d.ts +2 -0
  204. package/dist/features/tester/seed-data/authored/selling__seller-custom-brands.js +105 -0
  205. package/dist/features/tester/seed-data/authored/selling__seller-guide.d.ts +2 -0
  206. package/dist/features/tester/seed-data/authored/selling__seller-guide.js +33 -0
  207. package/dist/features/tester/seed-data/authored/selling__seller-listing-types.d.ts +2 -0
  208. package/dist/features/tester/seed-data/authored/selling__seller-listing-types.js +347 -0
  209. package/dist/features/tester/seed-data/authored/selling__seller-marketing-extras.d.ts +2 -0
  210. package/dist/features/tester/seed-data/authored/selling__seller-marketing-extras.js +166 -0
  211. package/dist/features/tester/seed-data/authored/selling__seller-ops-comms.d.ts +2 -0
  212. package/dist/features/tester/seed-data/authored/selling__seller-ops-comms.js +89 -0
  213. package/dist/features/tester/seed-data/authored/selling__seller-orders.d.ts +2 -0
  214. package/dist/features/tester/seed-data/authored/selling__seller-orders.js +195 -0
  215. package/dist/features/tester/seed-data/authored/selling__seller-shipping-payouts-setup.d.ts +2 -0
  216. package/dist/features/tester/seed-data/authored/selling__seller-shipping-payouts-setup.js +180 -0
  217. package/dist/features/tester/seed-data/authored/selling__store-dashboard-navigation.d.ts +2 -0
  218. package/dist/features/tester/seed-data/authored/selling__store-dashboard-navigation.js +164 -0
  219. package/dist/features/tester/seed-data/authored/selling__store-uncovered-pages.d.ts +2 -0
  220. package/dist/features/tester/seed-data/authored/selling__store-uncovered-pages.js +116 -0
  221. package/dist/features/tester/seed-data/authored/seo__canonical-and-host.d.ts +2 -0
  222. package/dist/features/tester/seed-data/authored/seo__canonical-and-host.js +111 -0
  223. package/dist/features/tester/seed-data/authored/seo__og-images.d.ts +2 -0
  224. package/dist/features/tester/seed-data/authored/seo__og-images.js +91 -0
  225. package/dist/features/tester/seed-data/authored/seo__page-metadata.d.ts +2 -0
  226. package/dist/features/tester/seed-data/authored/seo__page-metadata.js +122 -0
  227. package/dist/features/tester/seed-data/authored/seo__sitemap-and-robots.d.ts +2 -0
  228. package/dist/features/tester/seed-data/authored/seo__sitemap-and-robots.js +105 -0
  229. package/dist/features/tester/seed-data/carts-tester-seed-data.d.ts +3 -0
  230. package/dist/features/tester/seed-data/carts-tester-seed-data.js +70 -0
  231. package/dist/features/tester/seed-data/index.d.ts +1 -0
  232. package/dist/features/tester/seed-data/index.js +1 -0
  233. package/dist/features/tester/seed-data/tester-checklist-seed-data.js +744 -1
  234. package/dist/seed/carousel-slides-seed-data.js +1 -1
  235. package/dist/seed/cart-seed-data.js +11 -0
  236. package/dist/seed/index.d.ts +1 -1
  237. package/dist/seed/index.js +1 -1
  238. package/dist/seed/manifest.js +2 -2
  239. package/dist/seed/notifications-seed-data.js +5 -1
  240. package/dist/seed/products-standard-seed-data.js +2 -2
  241. package/dist/seed/reviews-seed-data.js +6 -1
  242. package/package.json +1 -1
  243. package/scripts/seed-cli.mjs +752 -746
@@ -0,0 +1,379 @@
1
+ /*
2
+ * WHY: Authored six-part procedures for the buying/buying-coupons checklist page.
3
+ * WHAT: 20 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 MULTI-STORE CART IS 2 × prizedraw-beyblade-original-vintage-vault (₹299
10
+ * each = ₹598, store-letitrip-official) ALONGSIDE A BEYBLADE ARENA ITEM. Earlier
11
+ * drafts said "a LetItRip Official item worth ≥₹500", which does not exist —
12
+ * every store-letitrip-official fixture is a prize draw and none reaches ₹500 on
13
+ * its own. A prize draw is cart-capable and its quantity is the entry count, so
14
+ * two entries clear OFFICIAL10's ₹500 minimum with real seeded data. Two
15
+ * fixture-request ledger entries asked for a new product for exactly this; they
16
+ * did not need one.
17
+ *
18
+ * @tag domain:tester
19
+ * @tag layer:seed
20
+ * @tag pattern:none
21
+ * @tag access:server-only
22
+ * @tag consumers:seed-data/authored/index.ts
23
+ * @tag sideEffects:none
24
+ */
25
+ export const authored = {
26
+ "checklist-buying-buying-coupons-coupon-all-codes-listed-on-order": {
27
+ roles: ["buyer"],
28
+ startPage: "/cart",
29
+ steps: [
30
+ "Sign in as vivaan.kapoor@gmail.com / TempPass123!.",
31
+ "Add product-beyblade-burst-regalia-genesis (₹1,399) and product-beyblade-metal-storm-pegasus (₹1,299) to the cart.",
32
+ "Open /checkout and complete the address and add-ons steps.",
33
+ "Type ARENA25 in the coupon field and click 'Apply'.",
34
+ "Type FREESHIP499 in the coupon field and click 'Apply'.",
35
+ "Choose Cash on Delivery and place the order.",
36
+ "Open /user/orders and open the order just created.",
37
+ "Open the invoice for the same order.",
38
+ ],
39
+ inputs: { coupon1: "ARENA25", coupon2: "FREESHIP499" },
40
+ expectedBehaviour: "The order records the full stack in its own discounts array, and both the receipt and the invoice render from that array. The two legacy single-coupon scalar fields still exist for older orders, and rendering from those instead is what silently drops every code after the first.",
41
+ expectedUiState: "The order page shows two separate discount lines, one naming ARENA25 with its amount and one naming FREESHIP499 with its own. The invoice shows the same two. Neither shows a single combined 'Discount' line, and neither shows ARENA25 alone.",
42
+ expectedData: { discountLineCount: 2 },
43
+ endResult: "Both lines are still there after a reload of each page. One line where two coupons were applied means the second code was never carried onto the order.",
44
+ },
45
+ "checklist-buying-buying-coupons-coupon-auction-offer-lane-no-coupon-field": {
46
+ roles: ["buyer"],
47
+ startPage: "/cart",
48
+ steps: [
49
+ "Sign in as tester@letitrip.in / TempPass123!.",
50
+ "Open /cart and click the 'Won Auctions' tab.",
51
+ "Click 'Proceed to checkout' from that tab.",
52
+ "Read the whole checkout page, looking for a coupon input and the 'How coupons work' panel.",
53
+ "Go back to /cart and click the 'Accepted Offers' tab.",
54
+ "Click 'Proceed to checkout' from that tab.",
55
+ "Read the whole checkout page the same way.",
56
+ ],
57
+ expectedBehaviour: "In the auction and offer lanes the price was already agreed — by a winning bid or an accepted offer — so a coupon has nothing to discount and the input is not rendered at all. Rendering it and rejecting whatever is typed would be worse: it invites the buyer to hunt for a code that can never work.",
58
+ expectedUiState: "Neither lane shows a coupon input or a 'How coupons work' panel. Each shows an explanatory banner in the shape of 'You're paying for your Auction wins. The price is already agreed, so coupons don't apply and the rest of your cart stays where it is.'",
59
+ endResult: "Display-only; nothing persists. Requires the tester account to hold a won auction and an accepted offer, both of which the sandbox seeds.",
60
+ },
61
+ "checklist-buying-buying-coupons-coupon-category-restriction-accepts-matching-cart": {
62
+ roles: ["buyer"],
63
+ startPage: "/cart",
64
+ steps: [
65
+ "Sign in as vivaan.kapoor@gmail.com / TempPass123!.",
66
+ "Add product-beyblade-metal-storm-pegasus (₹1,299, Metal Fight) to the cart.",
67
+ "Add product-beyblade-burst-regalia-genesis (₹1,399, Beyblade Burst) to the cart.",
68
+ "Open /checkout and complete the address and add-ons steps.",
69
+ "Type SEALED20 in the coupon field and click 'Apply'.",
70
+ "Read the discount amount shown beside SEALED20.",
71
+ ],
72
+ inputs: { coupon: "SEALED20", burstItemPrice: 1399, metalItemPrice: 1299 },
73
+ expectedBehaviour: "SEALED20 is restricted to the Burst and X categories, and the cart now holds a Burst item, so it applies — but only to that item. Products carry their full ancestor chain in categorySlugs, so the eligibility test is a set intersection, not a single-slug equality.",
74
+ expectedUiState: "SEALED20 appears in the applied list with no error. Its discount is 20% of ₹1,399 — about ₹279.80 — not 20% of the ₹2,698 combined subtotal. A discount near ₹539 means the restriction was ignored and the Metal item was discounted too.",
75
+ expectedData: { eligibleSubtotal: 1399 },
76
+ endResult: "Reloading /checkout shows SEALED20 still applied at the Burst-only amount.",
77
+ },
78
+ "checklist-buying-buying-coupons-coupon-category-restriction-rejects-non-matching-cart": {
79
+ roles: ["buyer"],
80
+ startPage: "/cart",
81
+ steps: [
82
+ "Sign in as vivaan.kapoor@gmail.com / TempPass123!.",
83
+ "Add product-beyblade-metal-storm-pegasus (₹1,299, Metal Fight) to the cart and nothing else.",
84
+ "Open /checkout and complete the address and add-ons steps.",
85
+ "Type SEALED20 in the coupon field and click 'Apply'.",
86
+ ],
87
+ inputs: { coupon: "SEALED20", itemPrice: 1299 },
88
+ expectedBehaviour: "With only Metal-generation items in the cart, nothing intersects SEALED20's Burst and X restriction, so it is refused. The category is resolved lazily — the cart snapshots no category, so the check fetches one only when a coupon actually carries a category restriction, and this is that case.",
89
+ expectedUiState: "An error explains that the coupon does not apply to the items in the cart. SEALED20 does not appear in the applied list. The error names the reason rather than reading simply 'Invalid coupon'.",
90
+ expectedData: { couponApplied: false },
91
+ endResult: "Reloading /checkout shows SEALED20 absent.",
92
+ },
93
+ "checklist-buying-buying-coupons-coupon-expired-in-cart-dropped-at-placement": {
94
+ roles: ["buyer", "admin"],
95
+ startPage: "/cart",
96
+ steps: [
97
+ "Sign in as vivaan.kapoor@gmail.com / TempPass123! in window A.",
98
+ "Add product-beyblade-burst-regalia-genesis (₹1,399) to the cart.",
99
+ "Open /checkout, complete the address and add-ons steps, type ARENA25 in the coupon field and click 'Apply'.",
100
+ "Read the ARENA25 discount amount and the order total, and leave the page open without reloading it.",
101
+ "In window B, sign in as admin@letitrip.in / TempPass123! and open /admin/coupons.",
102
+ "Open ARENA25 and set it to inactive, then save.",
103
+ "Return to window A without reloading and place the order with Cash on Delivery.",
104
+ "Open /user/orders and open the order just created.",
105
+ ],
106
+ inputs: { coupon: "ARENA25" },
107
+ expectedBehaviour: "Every applied coupon is re-checked against the items actually being ordered at placement time, not trusted from the amount frozen on the cart when it was applied. A coupon that lapsed while it sat there is dropped and reported — never allowed to silently discount the order, and never allowed to fail the whole checkout, since the buyer is on the payment step and cannot fix a lapsed coupon from there.",
108
+ expectedUiState: "The order is placed. A message at placement, or on the order, says ARENA25 was removed because it was no longer valid. The order page has no ARENA25 discount line and its total is the undiscounted one — not the total shown in window A before the coupon lapsed.",
109
+ expectedData: { arena25OnOrder: false },
110
+ endResult: "Reactivate ARENA25 in /admin/coupons afterwards; other cases apply it. An order that kept the discount means placement trusted the cart's frozen amount.",
111
+ },
112
+ "checklist-buying-buying-coupons-coupon-help-visible-cart": {
113
+ roles: ["buyer"],
114
+ startPage: "/cart",
115
+ steps: [
116
+ "Sign in as vivaan.kapoor@gmail.com / TempPass123!.",
117
+ "Add product-beyblade-burst-regalia-genesis (₹1,399) to the cart.",
118
+ "Open /cart and find the Order Summary panel.",
119
+ "Read the collapsed disclosure labelled 'How coupons work' with its 'Stacking rules' sub-label.",
120
+ "Click that disclosure header.",
121
+ "Look for a coupon input anywhere on the page.",
122
+ ],
123
+ expectedBehaviour: "The cart explains the stacking rules but takes no codes — codes are entered at checkout only. One place to type a coupon means one place for it to be wrong.",
124
+ expectedUiState: "The disclosure opens to three sections: 'You can use more than one coupon', 'Where each discount lands', and 'Why a coupon might not apply'. There is no coupon input and no Apply button anywhere on /cart.",
125
+ endResult: "The expanded state is UI-only and the disclosure is collapsed again after a reload.",
126
+ },
127
+ "checklist-buying-buying-coupons-coupon-help-visible-checkout": {
128
+ roles: ["buyer"],
129
+ startPage: "/cart",
130
+ steps: [
131
+ "Sign in as vivaan.kapoor@gmail.com / TempPass123!.",
132
+ "Add product-beyblade-burst-regalia-genesis (₹1,399) to the cart.",
133
+ "Open /checkout and complete the address and add-ons steps.",
134
+ "Find the coupon input and the 'How coupons work' panel beneath it.",
135
+ "Click the disclosure header.",
136
+ "Read every sentence and compare them with the cart version.",
137
+ ],
138
+ expectedBehaviour: "The checkout copy is the cart copy plus one sentence about revalidation, because revalidation is a checkout-time behaviour and stating it in the cart would describe something that has not happened yet.",
139
+ expectedUiState: "The same three sections as the cart, plus a sentence in the shape of 'Coupons are re-checked when you place the order. If one has expired or run out while it sat in your cart, it's removed and your total is recalculated before payment.' A coupon input with an 'Apply' button sits above the panel.",
140
+ endResult: "UI-only; the disclosure is collapsed again after a reload.",
141
+ },
142
+ "checklist-buying-buying-coupons-coupon-help-visible-listing": {
143
+ roles: ["guest"],
144
+ startPage: "/promotions",
145
+ steps: [
146
+ "Open /promotions and click the 'Coupons' tab.",
147
+ "Click the 'How coupons work' disclosure above the coupon grid.",
148
+ "Read all three sections and note their exact wording.",
149
+ "Open /stores/store-beyblade-arena and go to its coupons tab.",
150
+ "Click the 'How coupons work' disclosure there.",
151
+ "Read all three sections and compare them word for word with what was noted.",
152
+ ],
153
+ expectedBehaviour: "All four surfaces — promotions, store coupons, cart and checkout — render the same copy from one constant. Buyer-facing rules that drift between pages teach buyers to distrust the page they are on.",
154
+ expectedUiState: "Both disclosures read 'How coupons work' with the sub-label 'Stacking rules', and their three sections carry identical bullet text. Any wording difference between the two is the failure, however small.",
155
+ endResult: "UI-only; nothing persists.",
156
+ },
157
+ "checklist-buying-buying-coupons-coupon-min-purchase-uses-eligible-subtotal": {
158
+ roles: ["buyer"],
159
+ startPage: "/cart",
160
+ steps: [
161
+ "Sign in as vivaan.kapoor@gmail.com / TempPass123!.",
162
+ "Add product-beyblade-burst-valkyrie (₹999, Beyblade Arena) to the cart.",
163
+ "Add prizedraw-beyblade-original-vintage-vault (₹299, LetItRip Official) to the cart and set its quantity to 2, making ₹598 from that store.",
164
+ "Open /checkout and complete the address and add-ons steps.",
165
+ "Type ARENA25 in the coupon field and click 'Apply'.",
166
+ ],
167
+ inputs: { coupon: "ARENA25", arenaSubtotal: 999, otherStoreSubtotal: 598, cartTotal: 1597 },
168
+ expectedBehaviour: "The ₹1,000 minimum is measured against the items the coupon could actually discount — ₹999 of Beyblade Arena stock — not against the ₹1,597 cart total. Measuring the whole cart would let a buyer unlock a store's coupon by adding another store's items.",
169
+ expectedUiState: "ARENA25 is refused with a minimum-purchase message and does not appear in the applied list, even though the cart total is comfortably over ₹1,000.",
170
+ expectedData: { couponApplied: false },
171
+ endResult: "Reloading /checkout shows ARENA25 absent. Acceptance here means the minimum was tested against the cart total.",
172
+ },
173
+ "checklist-buying-buying-coupons-coupon-persists-across-reload": {
174
+ roles: ["buyer"],
175
+ startPage: "/cart",
176
+ steps: [
177
+ "Sign in as vivaan.kapoor@gmail.com / TempPass123!.",
178
+ "Add product-beyblade-burst-regalia-genesis (₹1,399) to the cart.",
179
+ "Open /checkout and complete the address and add-ons steps.",
180
+ "Type ARENA25 in the coupon field and click 'Apply'.",
181
+ "Type FREESHIP499 in the coupon field and click 'Apply'.",
182
+ "Read both discount amounts.",
183
+ "Reload /checkout and read them again.",
184
+ "Open /cart, then open /checkout again, and read them a third time.",
185
+ ],
186
+ inputs: { coupon1: "ARENA25", coupon2: "FREESHIP499" },
187
+ expectedBehaviour: "Applied coupons live on the cart document server-side, so they survive a reload and a navigation away and back. Holding them in component state would lose them on any of the three.",
188
+ expectedUiState: "Both codes are listed with the same amounts on all three readings. Losing one after the cart round-trip is as much a failure as losing it on reload.",
189
+ endResult: "Both coupons are still applied at the end with unchanged amounts.",
190
+ },
191
+ "checklist-buying-buying-coupons-coupon-remove-one-of-many": {
192
+ roles: ["buyer"],
193
+ startPage: "/cart",
194
+ steps: [
195
+ "Sign in as vivaan.kapoor@gmail.com / TempPass123!.",
196
+ "Add product-beyblade-burst-regalia-genesis (₹1,399) and product-beyblade-metal-storm-pegasus (₹1,299) to the cart.",
197
+ "Open /checkout and complete the address and add-ons steps.",
198
+ "Type ARENA25 in the coupon field and click 'Apply'.",
199
+ "Type FREESHIP499 in the coupon field and click 'Apply'.",
200
+ "Read the FREESHIP499 discount amount and the order total.",
201
+ "Click the remove control beside FREESHIP499.",
202
+ "Read the order total again.",
203
+ ],
204
+ inputs: { coupon1: "ARENA25", coupon2: "FREESHIP499" },
205
+ expectedBehaviour: "Removing one coupon leaves the other applied and recomputes the total by exactly the removed amount. A removal that clears the whole stack, or that removes the row without recomputing, are the two failures here.",
206
+ expectedUiState: "The applied list holds ARENA25 only. The total has risen by precisely the FREESHIP499 amount read before removal — not by a different figure, and not unchanged.",
207
+ expectedData: { remainingCouponCount: 1 },
208
+ endResult: "Reloading /checkout shows ARENA25 applied and FREESHIP499 gone.",
209
+ },
210
+ "checklist-buying-buying-coupons-coupon-split-across-per-store-orders": {
211
+ roles: ["buyer"],
212
+ startPage: "/cart",
213
+ steps: [
214
+ "Sign in as vivaan.kapoor@gmail.com / TempPass123!.",
215
+ "Add product-beyblade-burst-regalia-genesis (₹1,399, Beyblade Arena) to the cart.",
216
+ "Add prizedraw-beyblade-original-vintage-vault (₹299, LetItRip Official) and set its quantity to 2.",
217
+ "Open /checkout and complete the address and add-ons steps.",
218
+ "Type ARENA25 in the coupon field and click 'Apply'.",
219
+ "Type FREESHIP499 in the coupon field and click 'Apply'.",
220
+ "Read the FREESHIP499 discount total, then place the order with Cash on Delivery.",
221
+ "Open /user/orders and open the Beyblade Arena order.",
222
+ "Open the LetItRip Official order.",
223
+ "Add the FREESHIP499 amounts from both orders together and compare with the checkout figure.",
224
+ ],
225
+ inputs: { storeCoupon: "ARENA25", globalCoupon: "FREESHIP499" },
226
+ expectedBehaviour: "A cart splits into one order per store, so a store coupon lands only on its own store's order while a platform coupon is prorated across both by their share of the subtotal. The prorated parts must reconcile exactly to what the buyer was shown, or the platform absorbed or overcharged the difference.",
227
+ expectedUiState: "ARENA25 appears on the Beyblade Arena order and NOT on the LetItRip Official one. FREESHIP499 appears on both, and the two amounts sum to the single figure shown at checkout — not to more, and not to less.",
228
+ expectedData: { orderCount: 2 },
229
+ endResult: "Both orders keep their discount lines after a reload, and the reconciliation still holds.",
230
+ },
231
+ "checklist-buying-buying-coupons-coupon-stack-duplicate-code-rejected": {
232
+ roles: ["buyer"],
233
+ startPage: "/cart",
234
+ steps: [
235
+ "Sign in as vivaan.kapoor@gmail.com / TempPass123!.",
236
+ "Add product-beyblade-burst-regalia-genesis (₹1,399) to the cart.",
237
+ "Open /checkout and complete the address and add-ons steps.",
238
+ "Type ARENA25 in the coupon field and click 'Apply'.",
239
+ "Type ARENA25 in the coupon field again and click 'Apply'.",
240
+ "Read the applied list and the order total.",
241
+ ],
242
+ inputs: { coupon: "ARENA25" },
243
+ expectedBehaviour: "The same code cannot occupy its bucket twice. The dangerous failure is not the duplicate row but the doubled discount that would come with it.",
244
+ expectedUiState: "ARENA25 appears exactly once. An error says it is already applied. The total is unchanged from after the first application.",
245
+ expectedData: { arena25RowCount: 1 },
246
+ endResult: "Reloading /checkout shows a single ARENA25 entry.",
247
+ },
248
+ "checklist-buying-buying-coupons-coupon-stack-second-global-rejected": {
249
+ roles: ["buyer"],
250
+ startPage: "/cart",
251
+ steps: [
252
+ "Sign in as vivaan.kapoor@gmail.com / TempPass123!.",
253
+ "Add product-beyblade-burst-regalia-genesis (₹1,399) and product-beyblade-original-driger-v (₹1,799) to the cart.",
254
+ "Open /checkout and complete the address and add-ons steps.",
255
+ "Type FREESHIP499 in the coupon field and click 'Apply'.",
256
+ "Type BLADER50 in the coupon field and click 'Apply'.",
257
+ "Read the error and the applied list.",
258
+ "Click the remove control beside FREESHIP499.",
259
+ "Type BLADER50 in the coupon field and click 'Apply'.",
260
+ ],
261
+ inputs: { globalCoupon1: "FREESHIP499", globalCoupon2: "BLADER50" },
262
+ expectedBehaviour: "There is exactly one platform-wide slot. The second half of this case is the important half: freeing the slot must make the previously-refused code acceptable, proving the rejection was a slot conflict and not the code being invalid.",
263
+ expectedUiState: "The second apply is refused with a message naming FREESHIP499 as the coupon already holding the slot, in the shape of 'Only one platform-wide coupon can be applied at a time (FREESHIP499). Remove it first.' After removing it, BLADER50 is accepted and appears in the list with its discount.",
264
+ expectedData: { globalCouponCount: 1 },
265
+ endResult: "Reloading /checkout shows BLADER50 applied and FREESHIP499 gone.",
266
+ },
267
+ "checklist-buying-buying-coupons-coupon-stack-second-store-coupon-rejected": {
268
+ roles: ["buyer"],
269
+ startPage: "/cart",
270
+ steps: [
271
+ "Sign in as vivaan.kapoor@gmail.com / TempPass123!.",
272
+ "Add product-beyblade-burst-regalia-genesis (₹1,399, Beyblade Arena) to the cart.",
273
+ "Open /checkout and complete the address and add-ons steps.",
274
+ "Type ARENA25 in the coupon field and click 'Apply'.",
275
+ "Type SEALED20 in the coupon field and click 'Apply'.",
276
+ "Read the error and the applied list.",
277
+ ],
278
+ inputs: { storeCoupon1: "ARENA25", storeCoupon2: "SEALED20" },
279
+ expectedBehaviour: "One store coupon per store. The second is refused rather than swapped in — silently replacing the first would change the discount under a buyer who thought they were adding to it.",
280
+ expectedUiState: "ARENA25 is still applied and its amount is unchanged. The error names it, in the shape of 'A coupon for this store is already applied (ARENA25). Remove it first.' SEALED20 is not in the list.",
281
+ expectedData: { storeCouponCount: 1 },
282
+ endResult: "Reloading /checkout shows ARENA25 applied and SEALED20 absent.",
283
+ },
284
+ "checklist-buying-buying-coupons-coupon-stack-two-stores-plus-global": {
285
+ roles: ["buyer"],
286
+ startPage: "/cart",
287
+ steps: [
288
+ "Sign in as vivaan.kapoor@gmail.com / TempPass123!.",
289
+ "Add product-beyblade-burst-regalia-genesis (₹1,399, Beyblade Arena) to the cart.",
290
+ "Add prizedraw-beyblade-original-vintage-vault (₹299, LetItRip Official) and set its quantity to 2, making ₹598 from that store.",
291
+ "Open /checkout and complete the address and add-ons steps.",
292
+ "Type ARENA25 in the coupon field and click 'Apply'.",
293
+ "Type OFFICIAL10 in the coupon field and click 'Apply'.",
294
+ "Type FREESHIP499 in the coupon field and click 'Apply'.",
295
+ "Read the applied list and the order total.",
296
+ ],
297
+ inputs: {
298
+ arenaCoupon: "ARENA25",
299
+ officialCoupon: "OFFICIAL10",
300
+ globalCoupon: "FREESHIP499",
301
+ officialSubtotal: 598,
302
+ },
303
+ expectedBehaviour: "The buckets are one coupon per store plus one platform-wide, so a two-store cart legitimately carries three coupons at once. This is the positive case the two rejection cases above are the mirror of — without it, a rule that refused everything would also pass them.",
304
+ expectedUiState: "Three rows are listed, each with its own amount and its own remove control: ARENA25, OFFICIAL10 and FREESHIP499. No error appears. The total falls by the sum of the three.",
305
+ expectedData: { appliedCouponCount: 3 },
306
+ endResult: "All three survive a reload with the same amounts. The ₹598 from two prize-draw entries is what clears OFFICIAL10's ₹500 minimum — a single entry at ₹299 would be refused, and that refusal would look like a stacking failure.",
307
+ },
308
+ "checklist-buying-buying-coupons-coupon-store-scope-limited-to-its-own-items": {
309
+ roles: ["buyer"],
310
+ startPage: "/cart",
311
+ steps: [
312
+ "Sign in as vivaan.kapoor@gmail.com / TempPass123!.",
313
+ "Add product-beyblade-burst-regalia-genesis (₹1,399, Beyblade Arena) to the cart.",
314
+ "Add prizedraw-beyblade-original-vintage-vault (₹299, LetItRip Official) and set its quantity to 2.",
315
+ "Open /checkout and complete the address and add-ons steps.",
316
+ "Type ARENA25 in the coupon field and click 'Apply'.",
317
+ "Read the ARENA25 discount amount and the cart total.",
318
+ "Open /cart, remove the prize-draw line, and open /checkout again.",
319
+ "Read the ARENA25 discount amount and the cart total again.",
320
+ ],
321
+ inputs: { coupon: "ARENA25", arenaSubtotal: 1399 },
322
+ expectedBehaviour: "A store coupon discounts only its own store's items, so removing another store's items changes the cart total and leaves the discount untouched. A discount that moves with the whole-cart total is being applied across stores.",
323
+ expectedUiState: "The ARENA25 amount is identical in both readings. The cart total is lower in the second. A changed discount amount is the failure.",
324
+ expectedData: { discountBasis: 1399 },
325
+ endResult: "Reloading /checkout shows the same Arena-only discount amount.",
326
+ },
327
+ "checklist-buying-buying-coupons-coupon-summary-total-matches-sum": {
328
+ roles: ["buyer"],
329
+ startPage: "/cart",
330
+ steps: [
331
+ "Sign in as vivaan.kapoor@gmail.com / TempPass123!.",
332
+ "Add product-beyblade-burst-regalia-genesis (₹1,399) and product-beyblade-metal-storm-pegasus (₹1,299) to the cart.",
333
+ "Open /checkout and complete the address and add-ons steps.",
334
+ "Type ARENA25 in the coupon field and click 'Apply'.",
335
+ "Type FREESHIP499 in the coupon field and click 'Apply'.",
336
+ "Write down each coupon's own discount amount from the applied list.",
337
+ "Write down the Order Summary's discount line, subtotal, shipping, fees, GST and Total.",
338
+ "Add the two coupon amounts and compare with the discount line, then check the Total against the other figures.",
339
+ ],
340
+ inputs: { coupon1: "ARENA25", coupon2: "FREESHIP499" },
341
+ expectedBehaviour: "The per-coupon amounts and the summary line come from the same computation, so they reconcile exactly. A summary that is computed separately from the rows is how a buyer is shown one figure and charged another.",
342
+ expectedUiState: "The two per-coupon amounts add up to the summary discount line to the paisa. The Total equals subtotal minus that discount, plus shipping, fees and GST. Any rounding gap is a fail, not a rounding artefact.",
343
+ endResult: "Reloading /checkout reproduces every figure, confirming they are computed rather than left over in component state.",
344
+ },
345
+ "checklist-buying-buying-coupons-coupon-usage-limit-increments-after-order": {
346
+ roles: ["admin", "buyer"],
347
+ startPage: "/admin/coupons",
348
+ steps: [
349
+ "Sign in as claude-tester@letitrip.in / TempPass123!, which carries canTestAdmin.",
350
+ "Open /admin/coupons, find TESTERLIMITED, and write down its current usage count.",
351
+ "Add product-beyblade-burst-regalia-genesis (₹1,399) to the cart.",
352
+ "Open /checkout, complete the address and add-ons steps, type TESTERLIMITED in the coupon field, click 'Apply', and place the order with Cash on Delivery.",
353
+ "Open /admin/coupons and read TESTERLIMITED's usage count again.",
354
+ "Add product-beyblade-metal-storm-pegasus (₹1,299) to the cart.",
355
+ "Open /checkout, complete the address and add-ons steps, type TESTERLIMITED in the coupon field, and click 'Apply'.",
356
+ ],
357
+ inputs: { coupon: "TESTERLIMITED", perUserLimit: 1, discountPercent: 10, maxDiscount: 100 },
358
+ expectedBehaviour: "Redemption is counted per user as well as globally, and the per-user count is written at checkout as a side effect of applying the coupon. TESTERLIMITED is perUserLimit 1 with no total limit, so this case is about per-user exhaustion: the SAME buyer's second attempt is refused while the coupon itself stays live for everyone else.",
359
+ expectedUiState: "The usage count in /admin/coupons is exactly one higher after the order. The second apply, by the same account, is refused with a limit-reached message and TESTERLIMITED does not enter the applied list. The coupon still shows as active in the admin list — it is exhausted for this user, not withdrawn.",
360
+ expectedData: { perUserLimit: 1, usageIncrement: 1 },
361
+ endResult: "The incremented count persists in /admin/coupons after a reload. A count that does not move means the per-user usage write is fire-and-forget and failed silently.",
362
+ },
363
+ "checklist-buying-buying-coupons-coupon-wallet-apply-lands-on-checkout": {
364
+ roles: ["buyer"],
365
+ startPage: "/promotions",
366
+ steps: [
367
+ "Sign in as vivaan.kapoor@gmail.com / TempPass123!.",
368
+ "Open /promotions, click the 'Coupons' tab, and claim ARENA25.",
369
+ "Add product-beyblade-burst-regalia-genesis (₹1,399) to the cart.",
370
+ "Open /user/coupons.",
371
+ "Click 'Use' on the ARENA25 row.",
372
+ "Read where the browser lands and what the coupon section shows.",
373
+ ],
374
+ inputs: { coupon: "ARENA25" },
375
+ expectedBehaviour: "'Use' carries the code through to checkout and applies it, rather than dropping the buyer on a page where they must retype it. If it cannot apply to the current cart the reason is shown — a button that navigates and silently does nothing is worse than no button.",
376
+ expectedUiState: "The browser ends on /checkout with ARENA25 already in the applied list and its discount showing. With an empty or ineligible cart, an explanatory message names the reason instead.",
377
+ endResult: "The pre-applied coupon survives a reload of /checkout. The claim step at the start is required: /user/coupons is the wallet, and an unclaimed coupon has no row there to press 'Use' on.",
378
+ },
379
+ };
@@ -0,0 +1,2 @@
1
+ import type { AuthoredCase } from "./_types";
2
+ export declare const authored: Record<string, AuthoredCase>;