@mohasinac/appkit 4.34.0 → 4.35.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (248) hide show
  1. package/dist/_internal/client/features/lottery/LotteryAdminEditView.js +32 -2
  2. package/dist/_internal/server/features/seo/sitemap.js +2 -2
  3. package/dist/_internal/server/functions/scheduled.d.ts +1 -2
  4. package/dist/_internal/server/functions/scheduled.js +8 -9
  5. package/dist/_internal/server/jobs/core/testerSandboxCleanup.d.ts +15 -0
  6. package/dist/_internal/server/jobs/core/testerSandboxCleanup.js +15 -6
  7. package/dist/_internal/server/jobs/handlers/index.d.ts +0 -1
  8. package/dist/_internal/server/jobs/handlers/index.js +0 -1
  9. package/dist/features/auth/schemas/firestore.d.ts +1 -0
  10. package/dist/features/tester/components/TesterChecklistStepRow.d.ts +9 -1
  11. package/dist/features/tester/components/TesterChecklistStepRow.js +31 -2
  12. package/dist/features/tester/components/TesterHubView.js +8 -0
  13. package/dist/features/tester/repository/tester-checklist-item.repository.d.ts +16 -1
  14. package/dist/features/tester/repository/tester-checklist-item.repository.js +32 -6
  15. package/dist/features/tester/schemas/firestore.d.ts +109 -0
  16. package/dist/features/tester/schemas/firestore.js +14 -0
  17. package/dist/features/tester/seed-data/_money-flows.d.ts +23 -0
  18. package/dist/features/tester/seed-data/_money-flows.js +430 -0
  19. package/dist/features/tester/seed-data/authored/_types.d.ts +33 -0
  20. package/dist/features/tester/seed-data/authored/_types.js +35 -0
  21. package/dist/features/tester/seed-data/authored/account-auth__profile-settings.d.ts +2 -0
  22. package/dist/features/tester/seed-data/authored/account-auth__profile-settings.js +207 -0
  23. package/dist/features/tester/seed-data/authored/account-auth__signup-login.d.ts +2 -0
  24. package/dist/features/tester/seed-data/authored/account-auth__signup-login.js +298 -0
  25. package/dist/features/tester/seed-data/authored/account-auth__testing-program--admin.d.ts +2 -0
  26. package/dist/features/tester/seed-data/authored/account-auth__testing-program--admin.js +33 -0
  27. package/dist/features/tester/seed-data/authored/account-auth__testing-program.d.ts +2 -0
  28. package/dist/features/tester/seed-data/authored/account-auth__testing-program.js +138 -0
  29. package/dist/features/tester/seed-data/authored/addresses__address-filters.d.ts +2 -0
  30. package/dist/features/tester/seed-data/authored/addresses__address-filters.js +36 -0
  31. package/dist/features/tester/seed-data/authored/addresses__postal-lookup.d.ts +2 -0
  32. package/dist/features/tester/seed-data/authored/addresses__postal-lookup.js +75 -0
  33. package/dist/features/tester/seed-data/authored/addresses__postal-validation.d.ts +2 -0
  34. package/dist/features/tester/seed-data/authored/addresses__postal-validation.js +72 -0
  35. package/dist/features/tester/seed-data/authored/addresses__state-picker.d.ts +2 -0
  36. package/dist/features/tester/seed-data/authored/addresses__state-picker.js +54 -0
  37. package/dist/features/tester/seed-data/authored/addresses__unban-request.d.ts +2 -0
  38. package/dist/features/tester/seed-data/authored/addresses__unban-request.js +39 -0
  39. package/dist/features/tester/seed-data/authored/admin__bans-and-trust.d.ts +2 -0
  40. package/dist/features/tester/seed-data/authored/admin__bans-and-trust.js +226 -0
  41. package/dist/features/tester/seed-data/authored/admin__blog-faqs.d.ts +2 -0
  42. package/dist/features/tester/seed-data/authored/admin__blog-faqs.js +82 -0
  43. package/dist/features/tester/seed-data/authored/admin__bulk-actions.d.ts +2 -0
  44. package/dist/features/tester/seed-data/authored/admin__bulk-actions.js +177 -0
  45. package/dist/features/tester/seed-data/authored/admin__bundles.d.ts +2 -0
  46. package/dist/features/tester/seed-data/authored/admin__bundles.js +97 -0
  47. package/dist/features/tester/seed-data/authored/admin__buyer-data-admin.d.ts +2 -0
  48. package/dist/features/tester/seed-data/authored/admin__buyer-data-admin.js +232 -0
  49. package/dist/features/tester/seed-data/authored/admin__catalog-listings.d.ts +2 -0
  50. package/dist/features/tester/seed-data/authored/admin__catalog-listings.js +306 -0
  51. package/dist/features/tester/seed-data/authored/admin__category-brand-authoring.d.ts +2 -0
  52. package/dist/features/tester/seed-data/authored/admin__category-brand-authoring.js +158 -0
  53. package/dist/features/tester/seed-data/authored/admin__classifieds-digitalcodes-live.d.ts +2 -0
  54. package/dist/features/tester/seed-data/authored/admin__classifieds-digitalcodes-live.js +78 -0
  55. package/dist/features/tester/seed-data/authored/admin__content-deletes.d.ts +2 -0
  56. package/dist/features/tester/seed-data/authored/admin__content-deletes.js +261 -0
  57. package/dist/features/tester/seed-data/authored/admin__content-marketing.d.ts +2 -0
  58. package/dist/features/tester/seed-data/authored/admin__content-marketing.js +151 -0
  59. package/dist/features/tester/seed-data/authored/admin__coupons.d.ts +2 -0
  60. package/dist/features/tester/seed-data/authored/admin__coupons.js +214 -0
  61. package/dist/features/tester/seed-data/authored/admin__events-raffles-spin.d.ts +2 -0
  62. package/dist/features/tester/seed-data/authored/admin__events-raffles-spin.js +160 -0
  63. package/dist/features/tester/seed-data/authored/admin__media-watermark.d.ts +2 -0
  64. package/dist/features/tester/seed-data/authored/admin__media-watermark.js +104 -0
  65. package/dist/features/tester/seed-data/authored/admin__orders-fulfillment.d.ts +2 -0
  66. package/dist/features/tester/seed-data/authored/admin__orders-fulfillment.js +350 -0
  67. package/dist/features/tester/seed-data/authored/admin__prize-draws-lotteries.d.ts +2 -0
  68. package/dist/features/tester/seed-data/authored/admin__prize-draws-lotteries.js +105 -0
  69. package/dist/features/tester/seed-data/authored/admin__site-system.d.ts +2 -0
  70. package/dist/features/tester/seed-data/authored/admin__site-system.js +590 -0
  71. package/dist/features/tester/seed-data/authored/admin__uncovered-admin-pages.d.ts +2 -0
  72. package/dist/features/tester/seed-data/authored/admin__uncovered-admin-pages.js +235 -0
  73. package/dist/features/tester/seed-data/authored/admin__users-trust.d.ts +2 -0
  74. package/dist/features/tester/seed-data/authored/admin__users-trust.js +569 -0
  75. package/dist/features/tester/seed-data/authored/buying__bidding.d.ts +2 -0
  76. package/dist/features/tester/seed-data/authored/buying__bidding.js +417 -0
  77. package/dist/features/tester/seed-data/authored/buying__browsing-search.d.ts +2 -0
  78. package/dist/features/tester/seed-data/authored/buying__browsing-search.js +653 -0
  79. package/dist/features/tester/seed-data/authored/buying__buying-checkout.d.ts +2 -0
  80. package/dist/features/tester/seed-data/authored/buying__buying-checkout.js +533 -0
  81. package/dist/features/tester/seed-data/authored/buying__buying-coupons.d.ts +2 -0
  82. package/dist/features/tester/seed-data/authored/buying__buying-coupons.js +379 -0
  83. package/dist/features/tester/seed-data/authored/buying__cart.d.ts +2 -0
  84. package/dist/features/tester/seed-data/authored/buying__cart.js +1171 -0
  85. package/dist/features/tester/seed-data/authored/buying__image-tile-layout.d.ts +2 -0
  86. package/dist/features/tester/seed-data/authored/buying__image-tile-layout.js +140 -0
  87. package/dist/features/tester/seed-data/authored/buying__my-orders.d.ts +2 -0
  88. package/dist/features/tester/seed-data/authored/buying__my-orders.js +257 -0
  89. package/dist/features/tester/seed-data/authored/buying__offers.d.ts +2 -0
  90. package/dist/features/tester/seed-data/authored/buying__offers.js +1111 -0
  91. package/dist/features/tester/seed-data/authored/buying__order-status-lifecycle.d.ts +2 -0
  92. package/dist/features/tester/seed-data/authored/buying__order-status-lifecycle.js +252 -0
  93. package/dist/features/tester/seed-data/authored/buying__product-detail.d.ts +2 -0
  94. package/dist/features/tester/seed-data/authored/buying__product-detail.js +387 -0
  95. package/dist/features/tester/seed-data/authored/buying__return-request.d.ts +2 -0
  96. package/dist/features/tester/seed-data/authored/buying__return-request.js +152 -0
  97. package/dist/features/tester/seed-data/authored/buying__reviews-pagination.d.ts +2 -0
  98. package/dist/features/tester/seed-data/authored/buying__reviews-pagination.js +242 -0
  99. package/dist/features/tester/seed-data/authored/buying__reviews.d.ts +2 -0
  100. package/dist/features/tester/seed-data/authored/buying__reviews.js +113 -0
  101. package/dist/features/tester/seed-data/authored/buying__user-dashboard-extras.d.ts +2 -0
  102. package/dist/features/tester/seed-data/authored/buying__user-dashboard-extras.js +283 -0
  103. package/dist/features/tester/seed-data/authored/buying__user-dashboard-navigation.d.ts +2 -0
  104. package/dist/features/tester/seed-data/authored/buying__user-dashboard-navigation.js +167 -0
  105. package/dist/features/tester/seed-data/authored/buying__user-uncovered-pages.d.ts +2 -0
  106. package/dist/features/tester/seed-data/authored/buying__user-uncovered-pages.js +90 -0
  107. package/dist/features/tester/seed-data/authored/buying__wishlist-history.d.ts +2 -0
  108. package/dist/features/tester/seed-data/authored/buying__wishlist-history.js +344 -0
  109. package/dist/features/tester/seed-data/authored/community-support__public-profile.d.ts +2 -0
  110. package/dist/features/tester/seed-data/authored/community-support__public-profile.js +53 -0
  111. package/dist/features/tester/seed-data/authored/community-support__support-tickets.d.ts +2 -0
  112. package/dist/features/tester/seed-data/authored/community-support__support-tickets.js +76 -0
  113. package/dist/features/tester/seed-data/authored/content-discovery__blog.d.ts +2 -0
  114. package/dist/features/tester/seed-data/authored/content-discovery__blog.js +93 -0
  115. package/dist/features/tester/seed-data/authored/content-discovery__category-brand-relations.d.ts +2 -0
  116. package/dist/features/tester/seed-data/authored/content-discovery__category-brand-relations.js +149 -0
  117. package/dist/features/tester/seed-data/authored/content-discovery__coupons.d.ts +2 -0
  118. package/dist/features/tester/seed-data/authored/content-discovery__coupons.js +121 -0
  119. package/dist/features/tester/seed-data/authored/content-discovery__event-participation.d.ts +2 -0
  120. package/dist/features/tester/seed-data/authored/content-discovery__event-participation.js +207 -0
  121. package/dist/features/tester/seed-data/authored/content-discovery__events.d.ts +2 -0
  122. package/dist/features/tester/seed-data/authored/content-discovery__events.js +318 -0
  123. package/dist/features/tester/seed-data/authored/content-discovery__faq-help.d.ts +2 -0
  124. package/dist/features/tester/seed-data/authored/content-discovery__faq-help.js +65 -0
  125. package/dist/features/tester/seed-data/authored/content-discovery__notifications.d.ts +2 -0
  126. package/dist/features/tester/seed-data/authored/content-discovery__notifications.js +147 -0
  127. package/dist/features/tester/seed-data/authored/content-discovery__search.d.ts +2 -0
  128. package/dist/features/tester/seed-data/authored/content-discovery__search.js +332 -0
  129. package/dist/features/tester/seed-data/authored/cta-layout__checkout-bottom-bar.d.ts +2 -0
  130. package/dist/features/tester/seed-data/authored/cta-layout__checkout-bottom-bar.js +53 -0
  131. package/dist/features/tester/seed-data/authored/cta-layout__dialog-footers.d.ts +2 -0
  132. package/dist/features/tester/seed-data/authored/cta-layout__dialog-footers.js +52 -0
  133. package/dist/features/tester/seed-data/authored/cta-layout__editor-action-bar.d.ts +2 -0
  134. package/dist/features/tester/seed-data/authored/cta-layout__editor-action-bar.js +35 -0
  135. package/dist/features/tester/seed-data/authored/cta-layout__navbar-ctas.d.ts +2 -0
  136. package/dist/features/tester/seed-data/authored/cta-layout__navbar-ctas.js +141 -0
  137. package/dist/features/tester/seed-data/authored/cta-layout__product-bottom-bar.d.ts +2 -0
  138. package/dist/features/tester/seed-data/authored/cta-layout__product-bottom-bar.js +35 -0
  139. package/dist/features/tester/seed-data/authored/design-ux__back-to-top-button.d.ts +2 -0
  140. package/dist/features/tester/seed-data/authored/design-ux__back-to-top-button.js +95 -0
  141. package/dist/features/tester/seed-data/authored/design-ux__carousel-arrow-bounds.d.ts +2 -0
  142. package/dist/features/tester/seed-data/authored/design-ux__carousel-arrow-bounds.js +191 -0
  143. package/dist/features/tester/seed-data/authored/design-ux__dashboard-layout.d.ts +2 -0
  144. package/dist/features/tester/seed-data/authored/design-ux__dashboard-layout.js +158 -0
  145. package/dist/features/tester/seed-data/authored/design-ux__footer-theme.d.ts +2 -0
  146. package/dist/features/tester/seed-data/authored/design-ux__footer-theme.js +106 -0
  147. package/dist/features/tester/seed-data/authored/design-ux__form-validation-errors.d.ts +2 -0
  148. package/dist/features/tester/seed-data/authored/design-ux__form-validation-errors.js +88 -0
  149. package/dist/features/tester/seed-data/authored/design-ux__general-design.d.ts +2 -0
  150. package/dist/features/tester/seed-data/authored/design-ux__general-design.js +204 -0
  151. package/dist/features/tester/seed-data/authored/design-ux__hand-mode-layout.d.ts +2 -0
  152. package/dist/features/tester/seed-data/authored/design-ux__hand-mode-layout.js +301 -0
  153. package/dist/features/tester/seed-data/authored/design-ux__homepage-carousels.d.ts +2 -0
  154. package/dist/features/tester/seed-data/authored/design-ux__homepage-carousels.js +407 -0
  155. package/dist/features/tester/seed-data/authored/design-ux__status-badge-legibility.d.ts +2 -0
  156. package/dist/features/tester/seed-data/authored/design-ux__status-badge-legibility.js +214 -0
  157. package/dist/features/tester/seed-data/authored/design-ux__sticky-cta-bar.d.ts +2 -0
  158. package/dist/features/tester/seed-data/authored/design-ux__sticky-cta-bar.js +275 -0
  159. package/dist/features/tester/seed-data/authored/index.d.ts +2 -0
  160. package/dist/features/tester/seed-data/authored/index.js +237 -0
  161. package/dist/features/tester/seed-data/authored/page-wiring__data-loss.d.ts +2 -0
  162. package/dist/features/tester/seed-data/authored/page-wiring__data-loss.js +102 -0
  163. package/dist/features/tester/seed-data/authored/page-wiring__detail-pages.d.ts +2 -0
  164. package/dist/features/tester/seed-data/authored/page-wiring__detail-pages.js +50 -0
  165. package/dist/features/tester/seed-data/authored/page-wiring__drawer-pages.d.ts +2 -0
  166. package/dist/features/tester/seed-data/authored/page-wiring__drawer-pages.js +66 -0
  167. package/dist/features/tester/seed-data/authored/page-wiring__reachability.d.ts +2 -0
  168. package/dist/features/tester/seed-data/authored/page-wiring__reachability.js +115 -0
  169. package/dist/features/tester/seed-data/authored/public-pages__auth-error-pages.d.ts +2 -0
  170. package/dist/features/tester/seed-data/authored/public-pages__auth-error-pages.js +136 -0
  171. package/dist/features/tester/seed-data/authored/public-pages__bug-hunters.d.ts +2 -0
  172. package/dist/features/tester/seed-data/authored/public-pages__bug-hunters.js +69 -0
  173. package/dist/features/tester/seed-data/authored/public-pages__core-listing-pages.d.ts +2 -0
  174. package/dist/features/tester/seed-data/authored/public-pages__core-listing-pages.js +263 -0
  175. package/dist/features/tester/seed-data/authored/public-pages__help-how-it-works.d.ts +2 -0
  176. package/dist/features/tester/seed-data/authored/public-pages__help-how-it-works.js +102 -0
  177. package/dist/features/tester/seed-data/authored/public-pages__help-scams-guides-subpages.d.ts +2 -0
  178. package/dist/features/tester/seed-data/authored/public-pages__help-scams-guides-subpages.js +234 -0
  179. package/dist/features/tester/seed-data/authored/public-pages__legal-policy-pages.d.ts +2 -0
  180. package/dist/features/tester/seed-data/authored/public-pages__legal-policy-pages.js +126 -0
  181. package/dist/features/tester/seed-data/authored/public-pages__stores-sellers-directories.d.ts +2 -0
  182. package/dist/features/tester/seed-data/authored/public-pages__stores-sellers-directories.js +255 -0
  183. package/dist/features/tester/seed-data/authored/search-and-nav__employee-permissions.d.ts +2 -0
  184. package/dist/features/tester/seed-data/authored/search-and-nav__employee-permissions.js +59 -0
  185. package/dist/features/tester/seed-data/authored/search-and-nav__header-search.d.ts +2 -0
  186. package/dist/features/tester/seed-data/authored/search-and-nav__header-search.js +88 -0
  187. package/dist/features/tester/seed-data/authored/search-and-nav__settings-deep-links.d.ts +2 -0
  188. package/dist/features/tester/seed-data/authored/search-and-nav__settings-deep-links.js +51 -0
  189. package/dist/features/tester/seed-data/authored/search-and-nav__sidebar-search.d.ts +2 -0
  190. package/dist/features/tester/seed-data/authored/search-and-nav__sidebar-search.js +35 -0
  191. package/dist/features/tester/seed-data/authored/selling__become-seller.d.ts +2 -0
  192. package/dist/features/tester/seed-data/authored/selling__become-seller.js +94 -0
  193. package/dist/features/tester/seed-data/authored/selling__final-sale-authoring.d.ts +2 -0
  194. package/dist/features/tester/seed-data/authored/selling__final-sale-authoring.js +107 -0
  195. package/dist/features/tester/seed-data/authored/selling__listing-a-product.d.ts +2 -0
  196. package/dist/features/tester/seed-data/authored/selling__listing-a-product.js +285 -0
  197. package/dist/features/tester/seed-data/authored/selling__listing-lifecycle.d.ts +2 -0
  198. package/dist/features/tester/seed-data/authored/selling__listing-lifecycle.js +326 -0
  199. package/dist/features/tester/seed-data/authored/selling__listing-type-fields-roundtrip.d.ts +2 -0
  200. package/dist/features/tester/seed-data/authored/selling__listing-type-fields-roundtrip.js +136 -0
  201. package/dist/features/tester/seed-data/authored/selling__media-limits.d.ts +2 -0
  202. package/dist/features/tester/seed-data/authored/selling__media-limits.js +128 -0
  203. package/dist/features/tester/seed-data/authored/selling__sectionised-forms.d.ts +2 -0
  204. package/dist/features/tester/seed-data/authored/selling__sectionised-forms.js +167 -0
  205. package/dist/features/tester/seed-data/authored/selling__seller-analytics-payouts.d.ts +2 -0
  206. package/dist/features/tester/seed-data/authored/selling__seller-analytics-payouts.js +117 -0
  207. package/dist/features/tester/seed-data/authored/selling__seller-bids-bundles-filters.d.ts +2 -0
  208. package/dist/features/tester/seed-data/authored/selling__seller-bids-bundles-filters.js +88 -0
  209. package/dist/features/tester/seed-data/authored/selling__seller-catalog-org.d.ts +2 -0
  210. package/dist/features/tester/seed-data/authored/selling__seller-catalog-org.js +151 -0
  211. package/dist/features/tester/seed-data/authored/selling__seller-custom-brands.d.ts +2 -0
  212. package/dist/features/tester/seed-data/authored/selling__seller-custom-brands.js +105 -0
  213. package/dist/features/tester/seed-data/authored/selling__seller-guide.d.ts +2 -0
  214. package/dist/features/tester/seed-data/authored/selling__seller-guide.js +33 -0
  215. package/dist/features/tester/seed-data/authored/selling__seller-listing-types.d.ts +2 -0
  216. package/dist/features/tester/seed-data/authored/selling__seller-listing-types.js +347 -0
  217. package/dist/features/tester/seed-data/authored/selling__seller-marketing-extras.d.ts +2 -0
  218. package/dist/features/tester/seed-data/authored/selling__seller-marketing-extras.js +166 -0
  219. package/dist/features/tester/seed-data/authored/selling__seller-ops-comms.d.ts +2 -0
  220. package/dist/features/tester/seed-data/authored/selling__seller-ops-comms.js +89 -0
  221. package/dist/features/tester/seed-data/authored/selling__seller-orders.d.ts +2 -0
  222. package/dist/features/tester/seed-data/authored/selling__seller-orders.js +195 -0
  223. package/dist/features/tester/seed-data/authored/selling__seller-shipping-payouts-setup.d.ts +2 -0
  224. package/dist/features/tester/seed-data/authored/selling__seller-shipping-payouts-setup.js +180 -0
  225. package/dist/features/tester/seed-data/authored/selling__store-dashboard-navigation.d.ts +2 -0
  226. package/dist/features/tester/seed-data/authored/selling__store-dashboard-navigation.js +164 -0
  227. package/dist/features/tester/seed-data/authored/selling__store-uncovered-pages.d.ts +2 -0
  228. package/dist/features/tester/seed-data/authored/selling__store-uncovered-pages.js +116 -0
  229. package/dist/features/tester/seed-data/authored/seo__canonical-and-host.d.ts +2 -0
  230. package/dist/features/tester/seed-data/authored/seo__canonical-and-host.js +111 -0
  231. package/dist/features/tester/seed-data/authored/seo__og-images.d.ts +2 -0
  232. package/dist/features/tester/seed-data/authored/seo__og-images.js +91 -0
  233. package/dist/features/tester/seed-data/authored/seo__page-metadata.d.ts +2 -0
  234. package/dist/features/tester/seed-data/authored/seo__page-metadata.js +122 -0
  235. package/dist/features/tester/seed-data/authored/seo__sitemap-and-robots.d.ts +2 -0
  236. package/dist/features/tester/seed-data/authored/seo__sitemap-and-robots.js +105 -0
  237. package/dist/features/tester/seed-data/events-tester-seed-data.js +77 -5
  238. package/dist/features/tester/seed-data/offers-tester-seed-data.js +23 -9
  239. package/dist/features/tester/seed-data/products-tester-seed-data.js +65 -49
  240. package/dist/features/tester/seed-data/tester-checklist-seed-data.js +744 -1
  241. package/dist/features/tester/seed-data/tester-window.d.ts +25 -0
  242. package/dist/features/tester/seed-data/tester-window.js +66 -0
  243. package/dist/seed/carousel-slides-seed-data.js +1 -1
  244. package/dist/seed/products-standard-seed-data.js +2 -2
  245. package/dist/seed/reviews-seed-data.js +6 -1
  246. package/dist/seed/users-seed-data.js +107 -4
  247. package/package.json +1 -1
  248. package/scripts/seed-cli.mjs +6 -0
@@ -0,0 +1,35 @@
1
+ /*
2
+ * WHY: Authored six-part procedures for the search-and-nav/sidebar-search page.
3
+ * WHAT: 1 case, keyed by full checklist id.
4
+ *
5
+ * Written by hand, case by case, against the label each one states. There is no
6
+ * generator: the authoring scripts were deleted once it was clear they were
7
+ * scaffolding around work that is simply writing.
8
+ *
9
+ * @tag domain:tester
10
+ * @tag layer:seed
11
+ * @tag pattern:none
12
+ * @tag access:server-only
13
+ * @tag consumers:seed-data/authored/index.ts
14
+ * @tag sideEffects:none
15
+ */
16
+ export const authored = {
17
+ "checklist-search-and-nav-sidebar-search-sidebar-search-matches-description": {
18
+ roles: ["admin"],
19
+ startPage: "/admin",
20
+ steps: [
21
+ "Sign in as admin@letitrip.in / TempPass123!.",
22
+ "Open /admin and read the sidebar's group headings in order.",
23
+ "Type fraud in the sidebar search box.",
24
+ "Read which entries remain and which groups they sit under.",
25
+ "Clear the box and type zzzznope.",
26
+ "Read the sidebar.",
27
+ "Clear the box and read the group order again.",
28
+ ],
29
+ inputs: { query: "fraud", nonsenseQuery: "zzzznope" },
30
+ expectedBehaviour: "The filter matches a screen's description and keywords, not only its label. Matching on the label alone means only a screen with 'fraud' in its name survives the query — and none is named that.",
31
+ expectedUiState: "'fraud' leaves Scam Registry, Address Clusters and Payment Clusters visible, each still under its own group heading. Groups keep their normal order; only their contents narrow. 'zzzznope' empties the sidebar rather than leaving it unfiltered. Clearing the box restores every group in the original order.",
32
+ expectedData: { nonsenseVisibleCount: 0 },
33
+ endResult: "Nothing persists; the filter is local to the sidebar and resets on reload.",
34
+ },
35
+ };
@@ -0,0 +1,2 @@
1
+ import type { AuthoredCase } from "./_types";
2
+ export declare const authored: Record<string, AuthoredCase>;
@@ -0,0 +1,94 @@
1
+ /*
2
+ * WHY: Authored six-part procedures for the selling/become-seller page.
3
+ * WHAT: 4 case(s), keyed by full checklist id.
4
+ *
5
+ * Written by hand, case by case, against the label each one states. There is no
6
+ * generator: the authoring scripts were deleted once it was clear they were
7
+ * scaffolding around work that is simply writing.
8
+ *
9
+ * 🛑 STORE APPROVAL IS TWO FIELDS ON TWO DOCUMENTS — a status on the user record
10
+ * and a status plus a public flag on the store. Flipping only the user's is the
11
+ * classic half-fix: the seller sees an approved dashboard while every public
12
+ * visibility check reads the store's, so the store never appears anywhere.
13
+ *
14
+ * @tag domain:tester
15
+ * @tag layer:seed
16
+ * @tag pattern:none
17
+ * @tag access:server-only
18
+ * @tag consumers:seed-data/authored/index.ts
19
+ * @tag sideEffects:none
20
+ */
21
+ export const authored = {
22
+ "checklist-selling-become-seller-sell-redirect": {
23
+ roles: ["guest", "buyer"],
24
+ startPage: "/sell",
25
+ steps: [
26
+ "Open /sell in a private window with no session and read where the browser lands.",
27
+ "Read the HTTP status if the browser's network panel is open, and note whether the page rendered before moving.",
28
+ "Sign in as karthik.new@gmail.com / TempPass123!, a buyer with no store.",
29
+ "Open /sell and read where it lands.",
30
+ "Sign out and sign in as tyson@beybladearena.in / TempPass123!, who already has a store.",
31
+ "Open /sell and read where it lands.",
32
+ ],
33
+ expectedBehaviour: "/sell is an entry point that routes by who is asking: a signed-out visitor to sign-in, a buyer without a store to the become-seller flow, an existing seller to their dashboard. It redirects rather than rendering, and a redirect fires before any document is produced — so a page that returns 200 with content here is not redirecting at all.",
34
+ expectedUiState: "Each of the three identities ends somewhere different and appropriate. None sees a 404, and none is left on /sell showing an error. A 200 carrying an error page rather than a redirect is the failure worth naming — it is exactly what no monitoring flags.",
35
+ endResult: "Read-only; nothing persists.",
36
+ },
37
+ "checklist-selling-become-seller-apply-seller": {
38
+ roles: ["buyer"],
39
+ startPage: "/user/become-seller",
40
+ steps: [
41
+ "Sign in as karthik.new@gmail.com / TempPass123!.",
42
+ "Open /user/become-seller and read the whole form before typing.",
43
+ "Submit it with every field empty and read where the errors appear.",
44
+ "Type 'QA Store apply-seller' as the store name and fill every other required field.",
45
+ "Submit the form.",
46
+ "Read what is shown immediately afterwards.",
47
+ "Reload the page and read it again.",
48
+ ],
49
+ inputs: { storeName: "QA Store apply-seller" },
50
+ expectedBehaviour: "The application creates a store and records the applicant's seller status. This view is a slot shell — rendering it with no render props gives a layout skeleton with no content at all, which is a page that looks built and does nothing.",
51
+ expectedUiState: "The form renders with real fields, not an empty shell. Empty submission marks the individual fields. After submitting, the page reports the application's state rather than returning to a blank form, and that state survives the reload.",
52
+ endResult: "A store exists for karthik.new@gmail.com. Note its status — it feeds the next two cases.",
53
+ },
54
+ "checklist-selling-become-seller-store-setup": {
55
+ roles: ["seller"],
56
+ startPage: "/store",
57
+ steps: [
58
+ "Sign in as tester@letitrip.in / TempPass123!, whose tester flag auto-approves their store.",
59
+ "Open /store and read the dashboard.",
60
+ "Open the store's own settings and read its name, description, logo and banner.",
61
+ "Change the description to 'QA Store store-setup description' and save.",
62
+ "RELOAD and read the description.",
63
+ "Open the store's public page and read the description there.",
64
+ "Restore the original description.",
65
+ ],
66
+ inputs: { description: "QA Store store-setup description" },
67
+ expectedBehaviour: "A tester's store is approved on both documents at once — the user record's status AND the store's own status and public flag. Flipping only the user's leaves the seller with a working dashboard and a store invisible to the public, because every visibility check reads the store's own status.",
68
+ expectedUiState: "The dashboard loads rather than showing a pending-approval gate. The edited description survives the reload AND appears on the public store page. A description that saves in the dashboard but never reaches the public page means the store is not actually public.",
69
+ endResult: "The description is restored by the final step. The public page rendering at all is the real assertion here.",
70
+ },
71
+ "checklist-selling-become-seller-store-address": {
72
+ roles: ["seller"],
73
+ startPage: "/store/addresses",
74
+ steps: [
75
+ "Sign in as tyson@beybladearena.in / TempPass123!.",
76
+ "Open /store/addresses and read the existing pickup addresses.",
77
+ "Add one: name 'QA Address store-address', street '10 Test Lane', city 'Indore', state 'Madhya Pradesh', pincode 452010, landmark 'Behind the arena'.",
78
+ "Mark it as a pickup location and save.",
79
+ "RELOAD the page and read every field of the new address, including the landmark.",
80
+ "Delete it.",
81
+ ],
82
+ inputs: {
83
+ name: "QA Address store-address",
84
+ street: "10 Test Lane",
85
+ city: "Indore",
86
+ state: "Madhya Pradesh",
87
+ pincode: "452010",
88
+ landmark: "Behind the arena",
89
+ },
90
+ expectedBehaviour: "A store address is written into the same top-level addresses collection as buyer addresses, discriminated by owner type rather than living in a subcollection of its own. Every field the form offers is stored, including the landmark — a form missing a field does not leave it alone, it sends undefined and overwrites.",
91
+ expectedUiState: "After the reload every typed value is present, landmark included, and the pickup flag is still set. A blank landmark after the reload is the failure this case shares with the store-address edit case in page-wiring.",
92
+ endResult: "The address is deleted by the final step so it does not accumulate across runs.",
93
+ },
94
+ };
@@ -0,0 +1,2 @@
1
+ import type { AuthoredCase } from "./_types";
2
+ export declare const authored: Record<string, AuthoredCase>;
@@ -0,0 +1,107 @@
1
+ /*
2
+ * WHY: Authored six-part procedures for the selling/final-sale-authoring page.
3
+ * WHAT: 5 case(s), keyed by full checklist id.
4
+ *
5
+ * Written by hand, case by case, against the label each one states. There is no
6
+ * generator: the authoring scripts were deleted once it was clear they were
7
+ * scaffolding around work that is simply writing.
8
+ *
9
+ * A default that is ON is the hardest kind to test, because a field that never
10
+ * saves reads back as its default and looks correct. Every case here therefore
11
+ * turns the flag OFF and reloads — the only direction in which a broken save is
12
+ * visible.
13
+ *
14
+ * @tag domain:tester
15
+ * @tag layer:seed
16
+ * @tag pattern:none
17
+ * @tag access:server-only
18
+ * @tag consumers:seed-data/authored/index.ts
19
+ * @tag sideEffects:none
20
+ */
21
+ export const authored = {
22
+ "checklist-selling-final-sale-authoring-final-sale-defaults-on": {
23
+ roles: ["seller"],
24
+ startPage: "/store/products/new",
25
+ steps: [
26
+ "Sign in as tyson@beybladearena.in / TempPass123!.",
27
+ "Open /store/products/new and find the final-sale control without touching it.",
28
+ "Read its state.",
29
+ "Open the auction creation form and read the same control's state.",
30
+ "Open the pre-order and classified creation forms and read it in each.",
31
+ ],
32
+ expectedBehaviour: "Final sale is on by default on every listing type, so a seller who never opens the setting is protected rather than silently exposed to returns they did not agree to.",
33
+ expectedUiState: "The control reads as on in every creation form checked, before any interaction. A type whose default differs is the finding, named by type.",
34
+ expectedData: { defaultFinalSale: true },
35
+ endResult: "Leave every editor without saving. This case cannot distinguish a real default from a field that fails to load — that is what the next case is for.",
36
+ },
37
+ "checklist-selling-final-sale-authoring-final-sale-opt-out-survives-reload": {
38
+ roles: ["seller"],
39
+ startPage: "/store/products",
40
+ steps: [
41
+ "Sign in as tyson@beybladearena.in / TempPass123!.",
42
+ "Open /store/products and open the editor for 'Beyblade Burst B-01 Valkyrie'.",
43
+ "Turn the final-sale control OFF.",
44
+ "Save and read the confirmation.",
45
+ "RELOAD the editor and read the control's state.",
46
+ "Open the product's public page and read whether a final-sale badge is shown.",
47
+ "Turn the control back on, save, and reload to confirm.",
48
+ ],
49
+ inputs: { productId: "product-beyblade-burst-valkyrie", finalSale: false },
50
+ expectedBehaviour: "Turning the flag off persists. Off is the only testable direction: a field that never saves reads back as its on default, so a case that only ever turns it ON passes against a completely broken save.",
51
+ expectedUiState: "After the reload the control is still off and the public page shows no final-sale badge. A control that has reverted to on is the failure, and the save will have reported success.",
52
+ expectedData: { finalSale: false },
53
+ endResult: "The flag is back on by the final step, so the seeded product is left as it was.",
54
+ },
55
+ "checklist-selling-final-sale-authoring-return-policy-authorable-by-seller": {
56
+ roles: ["seller", "guest"],
57
+ startPage: "/store/products",
58
+ steps: [
59
+ "Sign in as tyson@beybladearena.in / TempPass123!.",
60
+ "Open the editor for 'Beyblade Burst B-01 Valkyrie' and find the return-policy field.",
61
+ "Turn final sale off so returns are permitted.",
62
+ "Type 'QA Return Policy authorable — 7 days, unopened only.' into the policy field and save.",
63
+ "RELOAD the editor and read the field.",
64
+ "Open the product's public page in a private window and find the return policy.",
65
+ "Restore the original policy and turn final sale back on.",
66
+ ],
67
+ inputs: {
68
+ productId: "product-beyblade-burst-valkyrie",
69
+ returnPolicy: "QA Return Policy authorable — 7 days, unopened only.",
70
+ },
71
+ expectedBehaviour: "A seller can state their own return terms and those terms reach the buyer. A policy that saves in the dashboard but never renders publicly is worse than no field — the seller believes they have disclosed something the buyer never sees.",
72
+ expectedUiState: "After the reload the editor holds the typed policy, and the public page shows it to a signed-out visitor. The policy is visible before purchase, not only on the order afterwards.",
73
+ endResult: "The product is restored to its seeded policy and final-sale state by the final step.",
74
+ },
75
+ "checklist-selling-final-sale-authoring-final-sale-admin-override": {
76
+ roles: ["admin", "seller"],
77
+ startPage: "/admin/products",
78
+ steps: [
79
+ "Sign in as tyson@beybladearena.in / TempPass123! and set final sale ON for 'Beyblade Burst B-01 Valkyrie', then save.",
80
+ "Sign out and sign in as admin@letitrip.in / TempPass123!.",
81
+ "Open /admin/products, open the same product, and turn final sale OFF.",
82
+ "Save and reload the admin editor to confirm.",
83
+ "Sign out and sign in as tyson@beybladearena.in / TempPass123!.",
84
+ "Open the seller editor for the same product and read the control.",
85
+ "Open the public page and read whether the badge is shown.",
86
+ ],
87
+ inputs: { productId: "product-beyblade-burst-valkyrie" },
88
+ expectedBehaviour: "An admin override reaches the same stored field the seller edits, so both dashboards and the public page agree afterwards. An override held somewhere else would leave the seller's editor showing one answer and the buyer seeing another — and the buyer's is the one that binds.",
89
+ expectedUiState: "After the admin's change the seller's editor shows the flag off and the public page shows no final-sale badge. A seller editor still reading on is the failure.",
90
+ endResult: "Restore the seeded final-sale state as the last action, from whichever dashboard set it last.",
91
+ },
92
+ "checklist-selling-final-sale-authoring-final-sale-badges-render": {
93
+ roles: ["guest"],
94
+ startPage: "/products",
95
+ steps: [
96
+ "Open /products in a private window in light mode.",
97
+ "Find a card for a final-sale listing and read its badge.",
98
+ "Open that listing's detail page and find the badge there.",
99
+ "Read the badge against its background on both surfaces.",
100
+ "Switch to dark mode and read both again.",
101
+ "Open the checkout for that item and check the final-sale term is stated before payment.",
102
+ ],
103
+ expectedBehaviour: "The badge appears on the card, on the detail page, and in the checkout flow. It carries a term the buyer is agreeing to, so stating it only after purchase is too late — and a badge that is unreadable in one theme states nothing at all.",
104
+ expectedUiState: "The badge is present and readable on all three surfaces in both themes. It overlays a card image, so it takes the solid pairing rather than a pale tint — an invisible label on a visible badge shape is the specific failure.",
105
+ endResult: "Read-only apart from reaching checkout; do not place the order. Return the site to light mode afterwards.",
106
+ },
107
+ };
@@ -0,0 +1,2 @@
1
+ import type { AuthoredCase } from "./_types";
2
+ export declare const authored: Record<string, AuthoredCase>;
@@ -0,0 +1,285 @@
1
+ /*
2
+ * WHY: Authored six-part procedures for the selling/listing-a-product page.
3
+ * WHAT: 15 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
+ * 🛑 EVERY UPLOAD STEP NAMES A COMMITTED FIXTURE from public/test-media/. Their
10
+ * bytes are asserted against the same detector the finalize endpoint uses, so the
11
+ * rejection fixtures reject because of what they contain rather than by luck.
12
+ *
13
+ * @tag domain:tester
14
+ * @tag layer:seed
15
+ * @tag pattern:none
16
+ * @tag access:server-only
17
+ * @tag consumers:seed-data/authored/index.ts
18
+ * @tag sideEffects:none
19
+ */
20
+ export const authored = {
21
+ "checklist-selling-listing-a-product-list-standard": {
22
+ roles: ["seller"],
23
+ startPage: "/store/products/new",
24
+ steps: [
25
+ "Sign in as tyson@beybladearena.in / TempPass123!.",
26
+ "Open /store/products/new and publish with every field empty, reading where the errors land.",
27
+ "Type 'QA Product list-standard' as the title and 750 as the price.",
28
+ "Select a category and a brand, set the stock to 5, and write a description.",
29
+ "Upload public/test-media/sample-image.png as the main image.",
30
+ "Publish.",
31
+ "Open the product's public page and read its title, price, stock badge and images.",
32
+ ],
33
+ inputs: { title: "QA Product list-standard", price: 750, stock: 5, image: "public/test-media/sample-image.png" },
34
+ expectedBehaviour: "A standard listing is created and becomes publicly visible. The slug is derived from the title at creation and is then immutable — the update schema does not accept it, which is the deliberate convention across categories, brands and bundles and is what keeps existing links working.",
35
+ expectedUiState: "The empty publish marks individual fields rather than showing one banner. After publishing, the public page shows the title, ₹750.00, an in-stock badge naming 5, the description and the uploaded image. Its URL carries a slug derived from the title.",
36
+ endResult: "The listing exists and is the fixture the edit case reads. Delete it after that case.",
37
+ },
38
+ "checklist-selling-listing-a-product-list-auction": {
39
+ roles: ["seller"],
40
+ startPage: "/store/auctions/new",
41
+ steps: [
42
+ "Sign in as tyson@beybladearena.in / TempPass123!.",
43
+ "Open the auction creation form and type 'QA Auction list-auction' as the title.",
44
+ "Set the starting bid to 1000, the minimum increment to 100, and an end date two days out.",
45
+ "Upload public/test-media/sample-image.png and fill every other required field.",
46
+ "Publish.",
47
+ "Open the auction's public page and read the starting bid, increment, countdown and purchase controls.",
48
+ "Delete the auction.",
49
+ ],
50
+ inputs: {
51
+ title: "QA Auction list-auction",
52
+ startingBid: 1000,
53
+ minIncrement: 100,
54
+ image: "public/test-media/sample-image.png",
55
+ },
56
+ expectedBehaviour: "An auction is created with a bidding path and no cart path — the capability is per listing type, not a styling choice. A per-listing increment can only RAISE the platform's banded floor, never lower it, so the saved 100 is a floor that the band may still override upward.",
57
+ expectedUiState: "The public page shows a ticking countdown, the starting bid of ₹1,000.00, and a 'Place a bid' control. There is no 'Add to Cart' anywhere on the page.",
58
+ endResult: "The auction is deleted by the final step.",
59
+ },
60
+ "checklist-selling-listing-a-product-list-preorder": {
61
+ roles: ["seller"],
62
+ startPage: "/store/pre-orders/new",
63
+ steps: [
64
+ "Sign in as tyson@beybladearena.in / TempPass123!.",
65
+ "Open the pre-order creation form and type 'QA Pre-order list-preorder' as the title.",
66
+ "Set the price to 1200, the deposit percentage to 25, an estimated delivery date a month out, and the production status.",
67
+ "Upload public/test-media/sample-image.png and fill every other required field.",
68
+ "Publish.",
69
+ "Open the pre-order's public page and read the price, deposit note, delivery date and status badge.",
70
+ "Delete the pre-order.",
71
+ ],
72
+ inputs: {
73
+ title: "QA Pre-order list-preorder",
74
+ price: 1200,
75
+ depositPercent: 25,
76
+ image: "public/test-media/sample-image.png",
77
+ },
78
+ expectedBehaviour: "A pre-order takes a deposit rather than the full price and shows an estimated delivery date — the two things that distinguish it from a standard listing that happens to be out of stock. The deposit shown to the buyer is computed from the saved percentage rather than typed separately.",
79
+ expectedUiState: "The public page shows ₹1,200.00, a deposit note naming ₹300.00 (25% of 1,200), an estimated delivery label with a real date rather than 'undefined', and the production status badge.",
80
+ expectedData: { depositAmount: 300 },
81
+ endResult: "The pre-order is deleted by the final step.",
82
+ },
83
+ "checklist-selling-listing-a-product-edit-listing": {
84
+ roles: ["seller"],
85
+ startPage: "/store/products",
86
+ steps: [
87
+ "Sign in as tyson@beybladearena.in / TempPass123!.",
88
+ "Open /store/products and open the editor for 'QA Product list-standard'.",
89
+ "Write down every field's current value.",
90
+ "Change the price to 850 and nothing else.",
91
+ "Save, then RELOAD the editor and compare every field against what was written down.",
92
+ "Open the public page and read the price and everything else.",
93
+ "Delete the listing.",
94
+ ],
95
+ inputs: { priceBefore: 750, priceAfter: 850 },
96
+ expectedBehaviour: "An edit writes back only what changed. The URL slug stays as it was — that immutability is deliberate, and recomputing it from the new title would break every existing link to the listing.",
97
+ expectedUiState: "After the reload only the price differs; images, category, brand, stock and description are unchanged, and the slug in the URL is the original. The public page shows ₹850.00 with everything else intact.",
98
+ expectedData: { unintendedFieldChanges: 0 },
99
+ endResult: "The listing is deleted by the final step, so nothing accumulates across runs.",
100
+ },
101
+ "checklist-selling-listing-a-product-new-listing-belongs-to-store": {
102
+ roles: ["seller"],
103
+ startPage: "/store/products/new",
104
+ steps: [
105
+ "Sign in as tyson@beybladearena.in / TempPass123!.",
106
+ "Open /store/products/new and publish a listing titled 'QA Product belongs-to-store' at 300.",
107
+ "Open its public page and read the seller line at the bottom of the info panel.",
108
+ "Click the 'Visit Store' link and read where it lands.",
109
+ "Open /stores/store-beyblade-arena and find the listing in the Products tab.",
110
+ "Sign out and sign in as tester@letitrip.in / TempPass123!, a different seller.",
111
+ "Open that seller's own products list and check the listing is NOT there.",
112
+ "Sign back in as tyson and delete the listing.",
113
+ ],
114
+ inputs: { title: "QA Product belongs-to-store", price: 300 },
115
+ expectedBehaviour: "The listing is filed against the signed-in seller's store, taken from the session rather than from anything the form sends. The store id is the key orders split on, coupons scope to, and payouts hang off — so a listing attributed to the wrong store misroutes all four.",
116
+ expectedUiState: "The public page reads 'Sold by Beyblade Arena' and its Visit Store link opens that store. The listing appears in that store's Products tab and NOT in the other seller's list.",
117
+ endResult: "The listing is deleted by the final step.",
118
+ },
119
+ "checklist-selling-listing-a-product-store-rename-updates-cards": {
120
+ roles: ["seller", "guest"],
121
+ startPage: "/store",
122
+ steps: [
123
+ "Sign in as tyson@beybladearena.in / TempPass123!.",
124
+ "Open the store's settings and change the store name to 'QA Store rename-updates-cards'.",
125
+ "Save and reload to confirm.",
126
+ "Open /products in a private window and find a card from that store.",
127
+ "Read the seller name on the card and on the product's detail page.",
128
+ "Open /stores and read the store's name on its directory card.",
129
+ "Restore the original store name.",
130
+ ],
131
+ inputs: { newName: "QA Store rename-updates-cards" },
132
+ expectedBehaviour: "The new name reaches every surface that shows it. Where a name is denormalised onto other documents for display, a rename must update those copies too — otherwise cards keep showing the old name until each is written again, and the two disagree indefinitely.",
133
+ expectedUiState: "Product cards, the product detail page's seller line, and the store directory card all show the new name. Any surface still showing the old one is the finding, named specifically.",
134
+ endResult: "The original name is restored by the final step. Other cases read this store by name.",
135
+ },
136
+ "checklist-selling-listing-a-product-media-upload": {
137
+ roles: ["seller"],
138
+ startPage: "/store/products/new",
139
+ steps: [
140
+ "Sign in as tyson@beybladearena.in / TempPass123!.",
141
+ "Open /store/products/new and open the media upload field.",
142
+ "Upload public/test-media/sample-image.png and wait for it to finish.",
143
+ "Read the preview and the stored URL if it is shown.",
144
+ "Attempt to upload public/test-media/not-really-an-image.png and read the message.",
145
+ "Attempt to upload public/test-media/empty.png and read the message.",
146
+ ],
147
+ inputs: {
148
+ valid: "public/test-media/sample-image.png",
149
+ mismatched: "public/test-media/not-really-an-image.png",
150
+ empty: "public/test-media/empty.png",
151
+ },
152
+ expectedBehaviour: "Bytes go from the browser straight to storage through a signed URL and are then verified by their actual content, not their declared type. The mismatched fixture declares itself a PNG and is text; the empty one is zero length. Both are refused with a readable message rather than a stack trace.",
153
+ expectedUiState: "The valid file previews and its stored path is a /media/… proxy URL rather than a raw bucket URL. The mismatched file is refused with a message about the file's type. The empty one is refused with a readable message, not an unhandled error.",
154
+ endResult: "Leave the editor without saving.",
155
+ },
156
+ "checklist-selling-listing-a-product-media-upload-preview-no-white-box": {
157
+ roles: ["seller"],
158
+ startPage: "/store/products/new",
159
+ steps: [
160
+ "Sign in as tyson@beybladearena.in / TempPass123!.",
161
+ "Open /store/products/new and upload public/test-media/sample-image.png.",
162
+ "Look at the preview tile the moment it appears and again once it has settled.",
163
+ "Upload two more images and look at all three tiles.",
164
+ "Resize the window to 390 pixels and look at them again.",
165
+ ],
166
+ inputs: { image: "public/test-media/sample-image.png", mobileWidth: 390 },
167
+ expectedBehaviour: "A preview tile renders its image at its intended size. A fill-style image resolves its percentages against its parent, so a shrink-to-fit wrapper between the control and the image collapses both to nothing — the tile becomes an empty bordered box while the control still looks and behaves correctly.",
168
+ expectedUiState: "Every preview shows its picture at the same size as its neighbours, at both widths. An empty white or bordered box where a photo should be is the failure, and it hits every clickable image tile in the app at once.",
169
+ endResult: "Leave the editor without saving.",
170
+ },
171
+ "checklist-selling-listing-a-product-media-upload-images-capped-at-5": {
172
+ roles: ["seller"],
173
+ startPage: "/store/products/new",
174
+ steps: [
175
+ "Sign in as tyson@beybladearena.in / TempPass123!.",
176
+ "Open /store/products/new and read the stated image limit before uploading anything.",
177
+ "Upload public/test-media/sample-image.png repeatedly, counting the previews after each.",
178
+ "Continue until an upload is refused.",
179
+ "Read the message and the preview count at that point.",
180
+ "Compare the count against the limit the form stated.",
181
+ ],
182
+ inputs: { image: "public/test-media/sample-image.png" },
183
+ expectedBehaviour: "The number the form STATES is the number it enforces. This case exists to catch a disagreement between them: a label saying five against a limit of ten, or the reverse, is a promise the form does not keep — and the checklist label itself says five while the shared limits module is the authority.",
184
+ expectedUiState: "Uploads are accepted up to the stated limit and the next is refused with a readable message. The refusal count equals the stated limit exactly. If the two disagree, record BOTH numbers — which one is wrong is a judgement for the reader, not for the tester.",
185
+ endResult: "Leave the editor without saving.",
186
+ },
187
+ "checklist-selling-listing-a-product-media-upload-video-duration": {
188
+ roles: ["seller"],
189
+ startPage: "/store/products/new",
190
+ steps: [
191
+ "Sign in as tyson@beybladearena.in / TempPass123!.",
192
+ "Open /store/products/new and read any stated video duration or size limit.",
193
+ "Upload public/test-media/sample-video.mp4 to the video field.",
194
+ "Wait for it to finish and read the preview and any duration shown.",
195
+ "Read whether a poster frame was captured.",
196
+ "Attempt a second video upload and read the message.",
197
+ ],
198
+ inputs: { video: "public/test-media/sample-video.mp4" },
199
+ expectedBehaviour: "A video within the limits is accepted, its duration read, and a poster frame captured. The limits are stated before the upload rather than after it fails — a seller who waits out a long upload to be told the file was always too long has had their time taken.",
200
+ expectedUiState: "Any duration or size limit is stated up front. The fixture uploads, shows a poster frame rather than an empty box, and reports its duration. A second video is refused while the first is kept.",
201
+ endResult: "Leave the editor without saving.",
202
+ },
203
+ "checklist-selling-listing-a-product-media-upload-multiple-images": {
204
+ roles: ["seller"],
205
+ startPage: "/store/products/new",
206
+ steps: [
207
+ "Sign in as tyson@beybladearena.in / TempPass123!.",
208
+ "Open /store/products/new and select public/test-media/sample-image.png, sample-image.jpg and sample-image.webp together in one file dialog.",
209
+ "Watch the upload progress and read whether each file reports its own.",
210
+ "Read the previews once they finish and count them.",
211
+ "Check each preview shows its own file rather than three copies of one.",
212
+ ],
213
+ inputs: { images: "sample-image.png, sample-image.jpg, sample-image.webp" },
214
+ expectedBehaviour: "A multi-select uploads each file with its own progress, sequentially, and produces one preview per file. Three previews of the same picture means the loop is reusing one file reference.",
215
+ expectedUiState: "Three previews appear, each showing its own image. Progress is reported per file rather than as one indeterminate spinner for the batch.",
216
+ expectedData: { previewCount: 3 },
217
+ endResult: "Leave the editor without saving.",
218
+ },
219
+ "checklist-selling-listing-a-product-media-upload-remove-image": {
220
+ roles: ["seller"],
221
+ startPage: "/store/products/new",
222
+ steps: [
223
+ "Sign in as tyson@beybladearena.in / TempPass123!.",
224
+ "Open /store/products/new and upload sample-image.png, sample-image.jpg and sample-image.webp.",
225
+ "Note which image is in which position.",
226
+ "Remove the MIDDLE one and read the remaining previews.",
227
+ "Check the remaining two are the ones expected and are in their original relative order.",
228
+ "Remove another and check the same.",
229
+ ],
230
+ expectedBehaviour: "Removing an image removes that image. A remove keyed on array position rather than on the item itself deletes the wrong one whenever the list has shifted — the same index-versus-identity mistake that hands one buyer another's lottery slot.",
231
+ expectedUiState: "After removing the middle image the remaining two are the first and third, in that order. Removing by index would leave the wrong pair, and both survivors would still look like valid previews.",
232
+ expectedData: { remainingCount: 2 },
233
+ endResult: "Leave the editor without saving.",
234
+ },
235
+ "checklist-selling-listing-a-product-media-upload-main-image-crop": {
236
+ roles: ["seller"],
237
+ startPage: "/store/products/new",
238
+ steps: [
239
+ "Sign in as tyson@beybladearena.in / TempPass123!.",
240
+ "Open /store/products/new and upload public/test-media/sample-image.png as the main image.",
241
+ "Open the crop editor and read the aspect-ratio presets offered.",
242
+ "Choose a preset, rotate the image, zoom in, and apply.",
243
+ "Read the resulting preview.",
244
+ "Reopen the crop editor and check it opens on the cropped result rather than the original.",
245
+ ],
246
+ inputs: { image: "public/test-media/sample-image.png" },
247
+ expectedBehaviour: "Cropping produces a new stored image and the preview reflects it. Cropping runs a native image library, so it belongs in a background function rather than a request handler — a large source image processed inline is a real timeout risk in production even when it is fast locally.",
248
+ expectedUiState: "Aspect presets are offered, rotate and zoom respond, and applying updates the preview visibly. Reopening the editor shows the cropped image. A crop that appears to apply and reverts on reopen means the result was never stored.",
249
+ endResult: "Leave the editor without saving. If the crop hangs on a large image, that is the timeout risk rather than a UI fault — record how long it took.",
250
+ },
251
+ "checklist-selling-listing-a-product-media-upload-video-both-sources-render": {
252
+ roles: ["seller", "guest"],
253
+ startPage: "/store/products",
254
+ steps: [
255
+ "Sign in as tyson@beybladearena.in / TempPass123!.",
256
+ "Open a product editor, select the video field's Upload tab, and upload public/test-media/sample-video.mp4.",
257
+ "Read the editor's own preview panel.",
258
+ "Save, open the product's public page, and play the video from the gallery.",
259
+ "Return to the editor, switch the video field to its YouTube tab, and paste a YouTube watch URL.",
260
+ "Read the editor's preview panel again.",
261
+ "Save, open the public page, and play the video.",
262
+ "Remove the video and save so the product is left as it was.",
263
+ ],
264
+ expectedBehaviour: "Both sources render, in the editor preview AND on the public page. A YouTube URL must become a privacy-preserving embed rather than being handed to a native video element, which cannot play a watch-page URL and says so in the player's own words. The upload field has always offered the YouTube tab; for a long time nothing on the render side knew what to do with what it stored.",
265
+ expectedUiState: "The uploaded file plays in both the preview and the public gallery. The YouTube source shows an embedded player in both. Neither shows 'No video with supported format and MIME type found'.",
266
+ endResult: "The video is removed by the final step, so the product's gallery is left as seeded.",
267
+ },
268
+ "checklist-selling-listing-a-product-seller-quick-add-drawer-flips": {
269
+ roles: ["seller"],
270
+ startPage: "/store/products",
271
+ steps: [
272
+ "Sign in as tyson@beybladearena.in / TempPass123!.",
273
+ "Open /store/products and open the quick-add drawer.",
274
+ "Note which edge it slides in from and where its close control sits.",
275
+ "Close it, open /user/settings, and set 'Left-hand mode' to on.",
276
+ "Return to /store/products and open the quick-add drawer again.",
277
+ "Note the edge and the close control's corner.",
278
+ "Set 'Left-hand mode' back to off.",
279
+ ],
280
+ inputs: { leftHandMode: true },
281
+ expectedBehaviour: "The quick-add drawer is chrome placed for reach, so it mirrors with left-hand mode — edge, animation direction and close control together. A drawer that lands on the mirrored edge while still animating in from the original one reads as broken.",
282
+ expectedUiState: "With the mode on, the drawer enters from and rests on the mirrored edge and its close control is in the mirrored corner. With it off, both return to the default.",
283
+ endResult: "The mode is off again by the final step, and nothing is added. Later cases assume the default layout.",
284
+ },
285
+ };
@@ -0,0 +1,2 @@
1
+ import type { AuthoredCase } from "./_types";
2
+ export declare const authored: Record<string, AuthoredCase>;