@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,326 @@
1
+ /*
2
+ * WHY: Authored six-part procedures for the selling/listing-lifecycle page.
3
+ * WHAT: 18 case(s), keyed by full checklist id.
4
+ *
5
+ * 🛑 EVERY OTHER PAGE TESTS A LISTING TYPE AT REST. THIS ONE WALKS IT.
6
+ * Detail pages, badges and filters are covered elsewhere; what was not covered
7
+ * anywhere is create → publish → sell → close, per type, which is where the
8
+ * type-specific fields either survive the round trip or quietly do not.
9
+ *
10
+ * Adding a listing type is a five-place change and TypeScript catches only three
11
+ * of them. The two it misses both fail SILENTLY and in the same shape — a query
12
+ * that returns everything, or a post-filter that strips the type from every
13
+ * unfiltered call — so a type can be fully built, fully rendered on its own page,
14
+ * and invisible in every grid. Several cases here exist for exactly that.
15
+ *
16
+ * @tag domain:tester
17
+ * @tag layer:seed
18
+ * @tag pattern:none
19
+ * @tag access:server-only
20
+ * @tag consumers:seed-data/authored/index.ts
21
+ * @tag sideEffects:none
22
+ */
23
+ const SIGN_IN_SELLER = "Sign in as tyson@beybladearena.in / TempPass123!.";
24
+ export const authored = {
25
+ "checklist-selling-listing-lifecycle-standard-create-publish-sell": {
26
+ roles: ["seller", "buyer"],
27
+ startPage: "/store/products",
28
+ steps: [
29
+ SIGN_IN_SELLER,
30
+ "Create a standard listing titled 'QA Lifecycle Standard' priced at 349 with stock 1, and publish it.",
31
+ "Open its public page and check it is buyable.",
32
+ "Sign in as rehan.sheikh@gmail.com / TempPass123! and buy it with Cash on Delivery.",
33
+ "Sign back in as the seller and read the listing's stock and availability.",
34
+ "Open /products and check the listing has left the Available scope.",
35
+ "Delete the listing afterwards.",
36
+ ],
37
+ inputs: { title: "QA Lifecycle Standard", price: 349, stock: 1 },
38
+ expectedBehaviour: "The full walk works: created, publicly buyable, bought, stock decremented, and out of the available scope once stock reaches zero. Availability is one shared rule rather than a per-surface check, so the listing must leave the scope everywhere at once.",
39
+ expectedUiState: "Stock reads 0 after the purchase and the listing is absent from Available while present in All. Still appearing as buyable is the finding.",
40
+ expectedData: { stockAfterSale: 0 },
41
+ endResult: "The QA listing is deleted; one order exists.",
42
+ },
43
+ "checklist-selling-listing-lifecycle-auction-create-publish-bid-close": {
44
+ roles: ["seller", "buyer"],
45
+ startPage: "/store/products",
46
+ steps: [
47
+ SIGN_IN_SELLER,
48
+ "Create an auction titled 'QA Lifecycle Auction' with a starting bid of 500, an increment of 50 and no reserve, ending within the current test window, and publish it.",
49
+ "Sign in as rehan.sheikh@gmail.com / TempPass123! and place a bid of 550.",
50
+ "Sign in as vivaan.kapoor@gmail.com / TempPass123! and place a bid of 600.",
51
+ "Wait for the auction to end.",
52
+ "Read the auction page for the outcome.",
53
+ "Sign in as the winning bidder and check the won line is in their cart.",
54
+ ],
55
+ inputs: { title: "QA Lifecycle Auction", startingBid: 500, increment: 50, bidA: 550, bidB: 600 },
56
+ expectedBehaviour: "The auction closes at its end time and the top bidder wins. A win reaches the buyer as a LOCKED cart line rather than as a ready-made order, because that is the only checkout that knows how to collect an address, charge a method and split per store — an order written directly by settlement had no payment method and no way to pay it at all.",
57
+ expectedUiState: "The auction shows as ended with the ₹600.00 bidder as the winner, and that bidder's cart holds a non-removable won line under the Won Auctions tab.",
58
+ expectedData: { winningBid: 600 },
59
+ endResult: "An auction is settled and a won line exists. Set the end time with the shared window helper so this is testable inside one run.",
60
+ },
61
+ "checklist-selling-listing-lifecycle-auction-reserve-respected-at-close": {
62
+ roles: ["seller", "buyer"],
63
+ startPage: "/store/products",
64
+ steps: [
65
+ SIGN_IN_SELLER,
66
+ "Create an auction titled 'QA Lifecycle Reserve' with a starting bid of 500 and a reserve of 2000, ending within the current test window, and publish it.",
67
+ "Sign in as rehan.sheikh@gmail.com / TempPass123! and bid 600.",
68
+ "Read whether the page says the reserve has not been met.",
69
+ "Wait for the auction to end.",
70
+ "Read the outcome on the auction page.",
71
+ "Check no winner was declared and no won line reached the bidder's cart.",
72
+ ],
73
+ inputs: { title: "QA Lifecycle Reserve", startingBid: 500, reserve: 2000, bid: 600 },
74
+ expectedBehaviour: "An auction closing below its reserve awards nobody. Settlement once awarded the highest bid unconditionally and never read the reserve at all — while the reserve was displayed on the page, editable by the seller and promised in the seller guide, so the whole feature existed everywhere except in the code that decides.",
75
+ expectedUiState: "The auction ends stating the reserve was not met, no winner is named, and the bidder's cart holds no won line.",
76
+ expectedData: { winnerDeclared: false },
77
+ endResult: "The auction ends unsold.",
78
+ },
79
+ "checklist-selling-listing-lifecycle-preorder-create-publish-deposit": {
80
+ roles: ["seller", "buyer"],
81
+ startPage: "/store/products",
82
+ steps: [
83
+ SIGN_IN_SELLER,
84
+ "Create a pre-order titled 'QA Lifecycle Preorder' with a full price of 2000, a deposit of 500 and a delivery date two months out, and publish it.",
85
+ "Open its public page and read the price shown.",
86
+ "Check the deposit and the full price are both stated and distinguishable.",
87
+ "Sign in as rehan.sheikh@gmail.com / TempPass123! and add it to the cart.",
88
+ "Read the amount charged at checkout.",
89
+ "Delete the listing afterwards.",
90
+ ],
91
+ inputs: { title: "QA Lifecycle Preorder", fullPrice: 2000, deposit: 500 },
92
+ expectedBehaviour: "A pre-order charges its deposit and states the remainder. Showing only one of the two numbers is the failure in both directions — the full price alone overstates what is due now, the deposit alone hides what is still owed.",
93
+ expectedUiState: "The page states ₹500.00 due now against a ₹2,000.00 total, and checkout charges ₹500.00.",
94
+ expectedData: { amountCharged: 500 },
95
+ endResult: "The QA listing is deleted.",
96
+ },
97
+ "checklist-selling-listing-lifecycle-preorder-production-status-visible": {
98
+ roles: ["seller", "guest"],
99
+ startPage: "/store/products",
100
+ steps: [
101
+ SIGN_IN_SELLER,
102
+ "Open an existing pre-order listing for edit and note its production status.",
103
+ "Change it to a different value and save.",
104
+ "Open its public page as a signed-out visitor.",
105
+ "Read the production status shown.",
106
+ "Change it once more and reload the public page.",
107
+ "Restore the original value.",
108
+ ],
109
+ expectedBehaviour: "Production status is the field a pre-order buyer checks, so a change reaches the public page. A field the editor accepts and no page renders is a promise to the seller that nothing keeps.",
110
+ expectedUiState: "The public page shows the current production status and follows each change. A status visible only in the editor is the finding.",
111
+ endResult: "The original production status is restored.",
112
+ },
113
+ "checklist-selling-listing-lifecycle-prizedraw-create-publish-close-reveal": {
114
+ roles: ["seller", "buyer"],
115
+ startPage: "/store/products",
116
+ steps: [
117
+ SIGN_IN_SELLER,
118
+ "Create a prize draw titled 'QA Lifecycle Draw' with 3 entries at 100 each and a reveal window inside the current test window, and publish it.",
119
+ "Sign in as rehan.sheikh@gmail.com / TempPass123! and buy two entries.",
120
+ "Sign in as vivaan.kapoor@gmail.com / TempPass123! and buy the last one.",
121
+ "Read the listing once the entries are gone.",
122
+ "Wait for the reveal and read the outcome.",
123
+ "Check a real entrant is named as the winner.",
124
+ ],
125
+ inputs: { title: "QA Lifecycle Draw", entries: 3, pricePerEntry: 100 },
126
+ expectedBehaviour: "A prize draw sells its entries, closes when they are gone and reveals a winner drawn from real entrants. A draw that closes without ever revealing leaves buyers holding paid entries with no outcome, which is indistinguishable from the site having forgotten them.",
127
+ expectedUiState: "The draw shows as closed once all three entries are sold, and after the reveal it names one of the two real entrants as the winner.",
128
+ expectedData: { entriesSold: 3 },
129
+ endResult: "The draw is revealed with a winner.",
130
+ },
131
+ "checklist-selling-listing-lifecycle-classified-create-publish-contact": {
132
+ roles: ["seller", "guest"],
133
+ startPage: "/store/products",
134
+ steps: [
135
+ SIGN_IN_SELLER,
136
+ "Create a classified titled 'QA Lifecycle Classified' priced at 750, with the city Bengaluru and a contact method, and publish it.",
137
+ "Open its public page as a signed-out visitor.",
138
+ "Read whether an Add to Cart control is offered.",
139
+ "Read what contact affordance is offered instead.",
140
+ "Check the city is shown.",
141
+ "Delete the listing afterwards.",
142
+ ],
143
+ inputs: { title: "QA Lifecycle Classified", price: 750, city: "Bengaluru" },
144
+ expectedBehaviour: "A classified cannot be carted at all — it is a contact-the-seller listing, and the cart is blocked for it by capability rather than by the page choosing not to draw the button. A cart control that appears and then fails is the failure this rules out.",
145
+ expectedUiState: "No cart control anywhere on the page, a working contact affordance, and Bengaluru shown as the location.",
146
+ expectedData: { cartControlPresent: false },
147
+ endResult: "The QA listing is deleted.",
148
+ },
149
+ "checklist-selling-listing-lifecycle-digitalcode-create-publish-claim": {
150
+ roles: ["seller", "buyer"],
151
+ startPage: "/store/products",
152
+ steps: [
153
+ SIGN_IN_SELLER,
154
+ "Create a digital-code listing titled 'QA Lifecycle Code' priced at 199 with a pool of two codes, set to auto-claim, and publish it.",
155
+ "Sign in as rehan.sheikh@gmail.com / TempPass123! and buy one.",
156
+ "Read where the code is delivered and whether it arrives immediately.",
157
+ "Open the order and check the code is retrievable from it.",
158
+ "Sign back in as the seller and read the remaining pool count.",
159
+ "Delete the listing afterwards.",
160
+ ],
161
+ inputs: { title: "QA Lifecycle Code", price: 199, poolSize: 2 },
162
+ expectedBehaviour: "A digital code fulfils from its pool at purchase and the pool shrinks. Fulfilment is immediate for this type, so a code that has to be chased by hand defeats the whole listing type.",
163
+ expectedUiState: "The buyer receives a code straight away and can find it again on the order; the pool reads one remaining.",
164
+ expectedData: { poolRemaining: 1 },
165
+ endResult: "The QA listing is deleted.",
166
+ },
167
+ "checklist-selling-listing-lifecycle-digitalcode-pool-depletes": {
168
+ roles: ["buyer"],
169
+ startPage: "/digital-codes",
170
+ steps: [
171
+ "Sign in as tester@letitrip.in / TempPass123! so sandbox fixtures are visible.",
172
+ "Open /digital-codes and find the seeded listing whose code pool is depleted.",
173
+ "Open it and read whether it can be bought.",
174
+ "Read its stock number.",
175
+ "Compare that stock number against the pool count.",
176
+ "Open /digital-codes on the Available scope and check the listing is not there.",
177
+ ],
178
+ expectedBehaviour: "Availability for this type is the NESTED codes-available count, not the stock field — and the two disagree on purpose in the seed, so a check reading stock alone passes while the listing is unbuyable. The branch that reads the pool once looked at a top-level field the record does not have, so it had never fired even once.",
179
+ expectedUiState: "The listing is not buyable and is absent from the Available scope, even though its stock number is above zero. Finding it buyable is the finding.",
180
+ endResult: "Read-only.",
181
+ },
182
+ "checklist-selling-listing-lifecycle-live-create-publish-jurisdiction": {
183
+ roles: ["seller", "buyer"],
184
+ startPage: "/store/products",
185
+ steps: [
186
+ SIGN_IN_SELLER,
187
+ "Create a live-item listing titled 'QA Lifecycle Live' priced at 5000, with a species and a restricted jurisdiction list, and publish it.",
188
+ "Open its public page and read the jurisdiction and vendor-verification notices.",
189
+ "Sign in as rehan.sheikh@gmail.com / TempPass123!.",
190
+ "Attempt to buy it with a delivery address outside the allowed jurisdiction.",
191
+ "Read what happens and where the refusal appears.",
192
+ "Delete the listing afterwards.",
193
+ ],
194
+ inputs: { title: "QA Lifecycle Live", price: 5000 },
195
+ expectedBehaviour: "A live item states its jurisdiction restriction and refuses a purchase outside it. A refusal that only appears after payment is the shape that matters — the buyer has paid for something that cannot legally be sent.",
196
+ expectedUiState: "The restriction is stated on the listing, and the purchase is refused before payment with a message naming the jurisdiction.",
197
+ endResult: "The QA listing is deleted; nothing is charged.",
198
+ },
199
+ "checklist-selling-listing-lifecycle-art-create-publish-sell": {
200
+ roles: ["seller", "buyer"],
201
+ startPage: "/store/products",
202
+ steps: [
203
+ SIGN_IN_SELLER,
204
+ "Create an art listing titled 'QA Lifecycle Art' priced at 1200, with a size, a material, a finish and an edition size, and publish it.",
205
+ "Open its public page and check all four fields render.",
206
+ "Open the listing for edit and check all four survived the round trip.",
207
+ "Sign in as rehan.sheikh@gmail.com / TempPass123! and add it to the cart.",
208
+ "Check checkout proceeds through the standard flow.",
209
+ "Delete the listing afterwards.",
210
+ ],
211
+ inputs: { title: "QA Lifecycle Art", price: 1200 },
212
+ expectedBehaviour: "Art carries its own print fields and otherwise checks out exactly like a standard listing — it deliberately has no dedicated detail route. The fields surviving the edit round trip is the real check; a field written on create and dropped on update is invisible until somebody edits.",
213
+ expectedUiState: "Size, material, finish and edition size all render publicly and are all still there after reopening the editor. Checkout is the ordinary flow.",
214
+ endResult: "The QA listing is deleted.",
215
+ },
216
+ "checklist-selling-listing-lifecycle-sticker-create-publish-sell": {
217
+ roles: ["seller", "buyer"],
218
+ startPage: "/store/products",
219
+ steps: [
220
+ SIGN_IN_SELLER,
221
+ "Create a sticker listing titled 'QA Lifecycle Sticker' priced at 149, with its print fields filled, and publish it.",
222
+ "Open its public page and check the print fields render.",
223
+ "Open the listing for edit and check they survived.",
224
+ "Sign in as rehan.sheikh@gmail.com / TempPass123! and add it to the cart.",
225
+ "Check checkout proceeds through the standard flow.",
226
+ "Delete the listing afterwards.",
227
+ ],
228
+ inputs: { title: "QA Lifecycle Sticker", price: 149 },
229
+ expectedBehaviour: "Stickers share the art type's shape and the standard checkout. Both types were added to the type union and the registry but not to the query layer's allowlist, so every query for them silently dropped its own type filter and returned nothing — which is why they are walked separately rather than assumed to follow art.",
230
+ expectedUiState: "The print fields render publicly and survive the editor round trip, and checkout is the ordinary flow.",
231
+ endResult: "The QA listing is deleted.",
232
+ },
233
+ "checklist-selling-listing-lifecycle-type-badge-correct-on-card": {
234
+ roles: ["guest"],
235
+ startPage: "/products",
236
+ steps: [
237
+ "Open /products and tick every listing-type chip in turn.",
238
+ "For each type, read the badge on its cards.",
239
+ "Write down the badge text and colour for all nine types.",
240
+ "Check no two types share a badge.",
241
+ "Check every badge is legible against its card, in light and in dark mode.",
242
+ ],
243
+ expectedBehaviour: "Each type carries its own badge. A badge map covering fewer types than the union renders an identical fallback for the rest, so several types become visually indistinguishable in a grid — which once affected five of nine at the same time.",
244
+ expectedUiState: "Nine distinct badges, each readable in both themes. Two types sharing a badge, or a type with none, are findings named by type.",
245
+ expectedData: { distinctBadges: 9 },
246
+ endResult: "Read-only.",
247
+ },
248
+ "checklist-selling-listing-lifecycle-type-detail-route-correct": {
249
+ roles: ["guest"],
250
+ startPage: "/products",
251
+ steps: [
252
+ "Open /products and select one listing type at a time.",
253
+ "Click a card of that type and read the URL it lands on.",
254
+ "Check the URL is that type's own route rather than the standard product path.",
255
+ "Repeat for all nine types.",
256
+ "Do the same from a related-items carousel on a product page.",
257
+ "Record any type that lands on the wrong route from either surface.",
258
+ ],
259
+ expectedBehaviour: "Every card resolves to its own type's page — from the grid AND from a carousel. Three types were pointed at the standard product page despite having working dedicated routes, and separately a shared card builder dropped the type field entirely, so a card could carry nine correct fields and still route wrong because of the tenth.",
260
+ expectedUiState: "All nine land on their own routes from both the grid and a carousel. A type landing on the standard product path is the finding, recorded with which surface produced it.",
261
+ expectedData: { wrongRoutes: 0 },
262
+ endResult: "Read-only.",
263
+ },
264
+ "checklist-selling-listing-lifecycle-type-survives-edit": {
265
+ roles: ["seller"],
266
+ startPage: "/store/products",
267
+ steps: [
268
+ SIGN_IN_SELLER,
269
+ "Open an existing auction listing for edit.",
270
+ "Change only its description and save.",
271
+ "Reload the editor and read the listing type.",
272
+ "Open the public listing and check it is still on the auction route with the auction badge.",
273
+ "Repeat with a pre-order and with a classified.",
274
+ ],
275
+ expectedBehaviour: "Editing an unrelated field does not change the type. A row builder collapsing several types into one on the way into a form, or a form defaulting the type when the field is absent from the payload, both convert a listing on save — and the seller has no reason to check.",
276
+ expectedUiState: "All three keep their type after an unrelated edit, on the editor and on the public page. A type that reverted to standard is the finding.",
277
+ endResult: "The descriptions are restored.",
278
+ },
279
+ "checklist-selling-listing-lifecycle-unpublish-removes-from-public": {
280
+ roles: ["seller", "guest"],
281
+ startPage: "/store/products",
282
+ steps: [
283
+ SIGN_IN_SELLER,
284
+ "Pick a published listing and note its public URL.",
285
+ "Unpublish it.",
286
+ "As a signed-out visitor, open /products and search for it.",
287
+ "Open its public URL directly and read what happens.",
288
+ "Sign back in as the seller and check the listing is still listed and editable.",
289
+ "Republish it and check it returns publicly.",
290
+ ],
291
+ expectedBehaviour: "Unpublishing removes a listing from public grids while keeping it in the seller's own list and editable. It is the reversible half of the pair whose irreversible half is delete, so keeping it fully editable is what makes it usable.",
292
+ expectedUiState: "The listing is absent from the public grid, its direct URL does not present it as buyable, it is still in the seller's list, and republishing restores it exactly.",
293
+ endResult: "The listing is republished.",
294
+ },
295
+ "checklist-selling-listing-lifecycle-sold-listing-leaves-available-tab": {
296
+ roles: ["guest"],
297
+ startPage: "/products",
298
+ steps: [
299
+ "Open /products on the Available scope and note the total count.",
300
+ "Switch to Sold & Ended and read the count.",
301
+ "Switch to All and read the count.",
302
+ "Check the first two sum to the third.",
303
+ "Pick a listing from Sold & Ended and check it is absent from Available and present in All.",
304
+ "Repeat on /auctions, where the middle tab should read Ended rather than Sold.",
305
+ ],
306
+ expectedBehaviour: "The three scopes partition the catalogue, and the middle tab's label follows the type — Ended for auctions, Sold for art, Sold & Ended where several types are mixed. A count that saturates the page limit is reported as a floor rather than as an exact figure, so a paginator does not claim a false last page.",
307
+ expectedUiState: "Available plus Sold & Ended equals All, a sold listing is in the second and third only, and the auctions page reads Ended. A count shown as an exact number when it is saturated is a smaller finding worth recording.",
308
+ endResult: "Read-only.",
309
+ },
310
+ "checklist-selling-listing-lifecycle-closed-listing-still-viewable": {
311
+ roles: ["guest"],
312
+ startPage: "/auctions",
313
+ steps: [
314
+ "Open /auctions on the Sold & Ended scope and open an ended auction.",
315
+ "Read whether the page loads and what it says about the outcome.",
316
+ "Open a closed prize draw and read the same.",
317
+ "Open a sold-out pre-order and read the same.",
318
+ "Open a depleted digital-code listing and read the same.",
319
+ "Check none of the four returns a not-found page.",
320
+ ],
321
+ expectedBehaviour: "A finished listing keeps its page and states how it finished. Buyers, bidders and entrants all hold links to these; turning them into not-found pages breaks every one of those links at the exact moment somebody wants to check what happened.",
322
+ expectedUiState: "All four load and each states its outcome — ended, closed, sold out, depleted — rather than a buy control or a 404.",
323
+ expectedData: { notFoundPages: 0 },
324
+ endResult: "Read-only.",
325
+ },
326
+ };
@@ -0,0 +1,2 @@
1
+ import type { AuthoredCase } from "./_types";
2
+ export declare const authored: Record<string, AuthoredCase>;
@@ -0,0 +1,136 @@
1
+ /*
2
+ * WHY: Authored six-part procedures for the selling/listing-type-fields-roundtrip 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 ROUND TRIP IS SAVE -> RELOAD -> READ, and the reload is the whole case.
10
+ * Every defect these five exist for returns a success and renders correctly
11
+ * until the page is refreshed: a field the form cannot name is sent as undefined
12
+ * and overwrites, a create-time transform the update path does not repeat writes
13
+ * the wrong shape, and an editor seeded from a stripped read saves the stripped
14
+ * values back.
15
+ *
16
+ * @tag domain:tester
17
+ * @tag layer:seed
18
+ * @tag pattern:none
19
+ * @tag access:server-only
20
+ * @tag consumers:seed-data/authored/index.ts
21
+ * @tag sideEffects:none
22
+ */
23
+ export const authored = {
24
+ "checklist-selling-listing-type-fields-roundtrip-roundtrip-classified-meetup": {
25
+ roles: ["seller"],
26
+ startPage: "/store/classified/new",
27
+ steps: [
28
+ "Sign in as tyson@beybladearena.in / TempPass123!.",
29
+ "Open the classified creation form and type 'QA Classified roundtrip-meetup' as the title.",
30
+ "Set the city to Mumbai, the contact method to chat, negotiable to on, and accepts-shipping to off.",
31
+ "Type 1500 as the price and fill every other required field.",
32
+ "Save.",
33
+ "RELOAD the editor for that listing and read all four type-specific values.",
34
+ "Open the listing's public page and read the same four.",
35
+ "Delete the listing.",
36
+ ],
37
+ inputs: {
38
+ title: "QA Classified roundtrip-meetup",
39
+ city: "Mumbai",
40
+ contactMethod: "chat",
41
+ negotiable: true,
42
+ acceptsShipping: false,
43
+ price: 1500,
44
+ },
45
+ expectedBehaviour: "Every classified-specific field survives the round trip and reaches the public page. These fields also back the store tab's own facets, so a value that fails to persist makes the corresponding filter permanently empty rather than visibly broken.",
46
+ expectedUiState: "After the reload the editor shows Mumbai, chat, negotiable on, shipping off. The public page shows the same, and the purchase panel offers the contact path rather than a cart control.",
47
+ expectedData: { city: "Mumbai", negotiable: true, acceptsShipping: false },
48
+ endResult: "The listing is deleted by the final step. A boolean that reads back as off when it was saved on is the classic undefined-overwrite.",
49
+ },
50
+ "checklist-selling-listing-type-fields-roundtrip-roundtrip-live-species-jurisdictions": {
51
+ roles: ["seller"],
52
+ startPage: "/store/live/new",
53
+ steps: [
54
+ "Sign in as tyson@beybladearena.in / TempPass123!.",
55
+ "Open /store/live/new and type 'QA Live Item roundtrip-species' as the title.",
56
+ "Set the species to Dog, the breed to Golden Retriever, the sex to male and the age to 6 months.",
57
+ "Set the allowed jurisdictions to Maharashtra and Karnataka only.",
58
+ "Upload public/test-media/sample-video.mp4 and type 2000 as the price.",
59
+ "Save.",
60
+ "RELOAD the editor and read every one of those values.",
61
+ "Open the public page and read the species line and the delivery restrictions.",
62
+ "Delete the listing.",
63
+ ],
64
+ inputs: {
65
+ title: "QA Live Item roundtrip-species",
66
+ species: "Dog",
67
+ breed: "Golden Retriever",
68
+ sex: "male",
69
+ ageMonths: 6,
70
+ jurisdictions: "Maharashtra, Karnataka",
71
+ price: 2000,
72
+ },
73
+ expectedBehaviour: "Species, breed, sex, age and the jurisdiction list all round-trip. The jurisdiction list is the one that matters most: it gates whether the item can be sold to a given buyer at all, so a list that saves empty silently removes the restriction rather than failing loudly.",
74
+ expectedUiState: "After the reload every value is present, with BOTH jurisdictions still selected. The public page shows the species line and states the delivery restriction rather than leaving it blank.",
75
+ expectedData: { species: "Dog", jurisdictionCount: 2 },
76
+ endResult: "The listing is deleted by the final step. An empty jurisdiction list after reload is a safety failure, not a formatting one.",
77
+ },
78
+ "checklist-selling-listing-type-fields-roundtrip-roundtrip-digital-code-delivery": {
79
+ roles: ["seller"],
80
+ startPage: "/store/digital-codes/new",
81
+ steps: [
82
+ "Sign in as tyson@beybladearena.in / TempPass123!.",
83
+ "Open the digital-code creation form and type 'QA Digital Code roundtrip-delivery' as the title.",
84
+ "Set the delivery mode to auto-claim and type 250 as the price.",
85
+ "Add three codes to the pool and save.",
86
+ "RELOAD the editor and read the delivery mode and the pool count.",
87
+ "Open the public page and read the availability shown.",
88
+ "Change the delivery mode to manual email, save, reload and read it again.",
89
+ "Delete the listing.",
90
+ ],
91
+ inputs: {
92
+ title: "QA Digital Code roundtrip-delivery",
93
+ deliveryMode: "auto-claim",
94
+ price: 250,
95
+ codeCount: 3,
96
+ },
97
+ expectedBehaviour: "The delivery mode and the code pool both round-trip, and the mode can be changed after creation. Availability for this type reads the NESTED pool count rather than the stock figure, so the public page's availability must follow the pool.",
98
+ expectedUiState: "After each reload the editor shows the mode last saved and a pool of three. The public page reports availability consistent with the pool rather than with a separate stock number.",
99
+ expectedData: { codesAvailable: 3 },
100
+ endResult: "The listing is deleted by the final step. A mode that reverts to its default on reload means the update path does not accept it.",
101
+ },
102
+ "checklist-selling-listing-type-fields-roundtrip-roundtrip-print-meta": {
103
+ roles: ["seller"],
104
+ startPage: "/store/products/new",
105
+ steps: [
106
+ "Sign in as tyson@beybladearena.in / TempPass123!.",
107
+ "Open the art or sticker creation form and type 'QA Art Print roundtrip-meta' as the title.",
108
+ "Set the size, the material, the finish and the edition size, noting each value.",
109
+ "Type 800 as the price and save.",
110
+ "RELOAD the editor and read all four print fields.",
111
+ "Open the public page and read the same four.",
112
+ "Delete the listing.",
113
+ ],
114
+ inputs: { title: "QA Art Print roundtrip-meta", price: 800 },
115
+ expectedBehaviour: "The print-specific fields round-trip and reach the public page. Art and stickers were added to the type union and the plugin registry without being added to the repository's filter-alias map, so their queries silently ran with no type filter — which makes any authoring case for these two worth running end to end rather than trusting the editor alone.",
116
+ expectedUiState: "After the reload all four print fields hold their typed values. The public page renders them in its specification panel rather than omitting the section.",
117
+ endResult: "The listing is deleted by the final step.",
118
+ },
119
+ "checklist-selling-listing-type-fields-roundtrip-roundtrip-edit-form-opens-populated": {
120
+ roles: ["seller"],
121
+ startPage: "/store/products",
122
+ steps: [
123
+ "Sign in as tyson@beybladearena.in / TempPass123!.",
124
+ "Open /store/products and open the editor for 'Beyblade Burst B-01 Valkyrie'.",
125
+ "Read every field the form offers and note which are empty.",
126
+ "Compare each against the public page for that product.",
127
+ "Change nothing and save.",
128
+ "RELOAD the public page and check nothing has changed — title, price, description, images, category, brand, stock.",
129
+ ],
130
+ inputs: { productId: "product-beyblade-burst-valkyrie" },
131
+ expectedBehaviour: "An edit form opens populated from a read that strips nothing, and a no-op save writes back exactly what was there. This is the single most valuable case on the page: a form seeded from a projection that drops fields will save those drops back, so opening and saving an untouched record quietly deletes data.",
132
+ expectedUiState: "Every field carrying a value on the public page carries the same value in the form. After the no-op save and reload, the public page is byte-for-byte what it was — same images in the same order, same category and brand links, same stock figure.",
133
+ expectedData: { fieldsChangedByNoOpSave: 0 },
134
+ endResult: "The product is unchanged. Any field that emptied itself through an untouched save is the finding, and it is the highest-severity kind on this page.",
135
+ },
136
+ };
@@ -0,0 +1,2 @@
1
+ import type { AuthoredCase } from "./_types";
2
+ export declare const authored: Record<string, AuthoredCase>;
@@ -0,0 +1,128 @@
1
+ /*
2
+ * WHY: Authored six-part procedures for the selling/media-limits page.
3
+ * WHAT: 6 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/, whose
10
+ * bytes are asserted against the same detector the finalize endpoint uses. "Any
11
+ * image" is not a test — two runs of it are two different tests, and the
12
+ * rejection fixtures in particular only reject because of what they contain.
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-media-limits-media-gallery-accepts-images-and-video": {
23
+ roles: ["seller"],
24
+ startPage: "/store/products/new",
25
+ steps: [
26
+ "Sign in as tyson@beybladearena.in / TempPass123!.",
27
+ "Open /store/products/new and type 'QA Product media-gallery' as the title.",
28
+ "Upload public/test-media/sample-image.png to the gallery.",
29
+ "Upload public/test-media/sample-image.jpg to the gallery.",
30
+ "Upload public/test-media/sample-image.webp to the gallery.",
31
+ "Upload public/test-media/sample-video.mp4 to the video field.",
32
+ "Read the previews for all four.",
33
+ ],
34
+ inputs: {
35
+ title: "QA Product media-gallery",
36
+ images: "sample-image.png, sample-image.jpg, sample-image.webp",
37
+ video: "public/test-media/sample-video.mp4",
38
+ },
39
+ expectedBehaviour: "All three image formats and the video are accepted, and each renders its own preview. Bytes go straight from the browser to storage through a signed URL and never through an API route, so the request payload cap never applies however large the file.",
40
+ expectedUiState: "Three image previews and one video poster frame, each showing its own content rather than a generic icon. No error toast on any of the four.",
41
+ endResult: "Leave the editor without saving so no draft product is created.",
42
+ },
43
+ "checklist-selling-media-limits-media-tenth-image-uploads": {
44
+ roles: ["seller"],
45
+ startPage: "/store/products/new",
46
+ steps: [
47
+ "Sign in as tyson@beybladearena.in / TempPass123!.",
48
+ "Open /store/products/new and type 'QA Product media-tenth' as the title.",
49
+ "Upload public/test-media/sample-image.png to the gallery nine times, counting the previews after each.",
50
+ "Upload it a tenth time.",
51
+ "Read the preview count and any message about the limit.",
52
+ ],
53
+ inputs: { title: "QA Product media-tenth", uploadCount: 10, cap: 10 },
54
+ expectedBehaviour: "The tenth image is accepted, because the cap is ten and a cap is inclusive of its own number. An off-by-one that refuses the tenth is the most likely error and the least likely to be noticed, since nine images look like plenty.",
55
+ expectedUiState: "Ten previews are present after the tenth upload. Any limit message reads as 'you have reached the limit' rather than as a rejection of the tenth file.",
56
+ expectedData: { imageCount: 10 },
57
+ endResult: "Leave the editor without saving.",
58
+ },
59
+ "checklist-selling-media-limits-media-eleventh-image-refused-client-side": {
60
+ roles: ["seller"],
61
+ startPage: "/store/products/new",
62
+ steps: [
63
+ "Sign in as tyson@beybladearena.in / TempPass123!.",
64
+ "Open /store/products/new and upload public/test-media/sample-image.png ten times.",
65
+ "Open the browser's Network panel.",
66
+ "Attempt an eleventh upload of the same file.",
67
+ "Read the message shown and count the previews.",
68
+ "Check the Network panel for any upload request made by that eleventh attempt.",
69
+ ],
70
+ inputs: { cap: 10, attemptCount: 11 },
71
+ expectedBehaviour: "The eleventh is refused in the browser, before any signed URL is requested. Refusing it only after the bytes have reached storage leaves an orphaned object behind and spends the seller's upload time on a file that was never going to be kept.",
72
+ expectedUiState: "A readable message names the ten-image limit, the preview count stays at ten, and the Network panel shows NO upload request for the eleventh attempt. A refusal that appears only after a round trip is the failure.",
73
+ expectedData: { imageCount: 10, uploadRequestsForEleventh: 0 },
74
+ endResult: "Leave the editor without saving.",
75
+ },
76
+ "checklist-selling-media-limits-media-second-video-refused-first-kept": {
77
+ roles: ["seller"],
78
+ startPage: "/store/products/new",
79
+ steps: [
80
+ "Sign in as tyson@beybladearena.in / TempPass123!.",
81
+ "Open /store/products/new and type 'QA Product media-second-video' as the title.",
82
+ "Upload public/test-media/sample-video.mp4 to the video field and wait for its poster frame.",
83
+ "Attempt to upload public/test-media/sample-video.mp4 a second time.",
84
+ "Read the message shown.",
85
+ "Read the video field and check the first video is still attached with its poster.",
86
+ ],
87
+ inputs: { title: "QA Product media-second-video", videoCap: 1 },
88
+ expectedBehaviour: "A listing carries one video. A second attempt is refused and the first is KEPT — refusing while also clearing the field loses work the seller had already done and looks like the upload broke.",
89
+ expectedUiState: "A readable message explains the one-video limit. The first video is still attached with its poster frame intact. An empty video field after the refusal is the failure.",
90
+ expectedData: { videoCount: 1 },
91
+ endResult: "Leave the editor without saving.",
92
+ },
93
+ "checklist-selling-media-limits-media-caps-flat-across-types": {
94
+ roles: ["seller"],
95
+ startPage: "/store/products/new",
96
+ steps: [
97
+ "Sign in as tyson@beybladearena.in / TempPass123!.",
98
+ "Open /store/products/new and read the stated image and video limits.",
99
+ "Open the auction creation form and read its stated limits.",
100
+ "Open the pre-order creation form and read its limits.",
101
+ "Open the classified, digital-code and live-item creation forms and read each.",
102
+ "Compare all six.",
103
+ ],
104
+ expectedBehaviour: "The caps come from one shared limits module, so every listing type states the same numbers. A type stating a different cap has a local copy, and a local copy is a number that will drift the first time the shared one changes.",
105
+ expectedUiState: "All six forms state the same image and video limits. Any form differing is the finding, named by type and by the number it states.",
106
+ endResult: "Leave every editor without saving. The live-item form additionally requires a video, which is the next case rather than a contradiction of this one.",
107
+ },
108
+ "checklist-selling-media-limits-media-live-listing-still-requires-video": {
109
+ roles: ["seller"],
110
+ startPage: "/store/live/new",
111
+ steps: [
112
+ "Sign in as tyson@beybladearena.in / TempPass123!.",
113
+ "Open /store/live/new and fill every required field except the video.",
114
+ "Type 'QA Live Item media-requires-video' as the title.",
115
+ "Submit the form and read where the error appears.",
116
+ "Upload public/test-media/sample-video.mp4 to the video field.",
117
+ "Submit again.",
118
+ "Delete the created listing.",
119
+ ],
120
+ inputs: {
121
+ title: "QA Live Item media-requires-video",
122
+ video: "public/test-media/sample-video.mp4",
123
+ },
124
+ expectedBehaviour: "A live listing requires a video where every other type treats it as optional — a buyer purchasing an animal or a plant needs to see it move. Shared caps and a per-type requirement are different rules and both hold at once.",
125
+ expectedUiState: "The first submit is refused with an inline error on or beside the video field, and the typed values are preserved. The second submit succeeds.",
126
+ endResult: "The listing is deleted by the final step so it does not accumulate across runs.",
127
+ },
128
+ };
@@ -0,0 +1,2 @@
1
+ import type { AuthoredCase } from "./_types";
2
+ export declare const authored: Record<string, AuthoredCase>;