@mohasinac/appkit 4.34.1 → 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 (232) hide show
  1. package/dist/_internal/client/features/lottery/LotteryAdminEditView.js +32 -2
  2. package/dist/features/tester/components/TesterChecklistStepRow.d.ts +9 -1
  3. package/dist/features/tester/components/TesterChecklistStepRow.js +31 -2
  4. package/dist/features/tester/components/TesterHubView.js +8 -0
  5. package/dist/features/tester/schemas/firestore.d.ts +109 -0
  6. package/dist/features/tester/schemas/firestore.js +14 -0
  7. package/dist/features/tester/seed-data/_money-flows.d.ts +23 -0
  8. package/dist/features/tester/seed-data/_money-flows.js +430 -0
  9. package/dist/features/tester/seed-data/authored/_types.d.ts +33 -0
  10. package/dist/features/tester/seed-data/authored/_types.js +35 -0
  11. package/dist/features/tester/seed-data/authored/account-auth__profile-settings.d.ts +2 -0
  12. package/dist/features/tester/seed-data/authored/account-auth__profile-settings.js +207 -0
  13. package/dist/features/tester/seed-data/authored/account-auth__signup-login.d.ts +2 -0
  14. package/dist/features/tester/seed-data/authored/account-auth__signup-login.js +298 -0
  15. package/dist/features/tester/seed-data/authored/account-auth__testing-program--admin.d.ts +2 -0
  16. package/dist/features/tester/seed-data/authored/account-auth__testing-program--admin.js +33 -0
  17. package/dist/features/tester/seed-data/authored/account-auth__testing-program.d.ts +2 -0
  18. package/dist/features/tester/seed-data/authored/account-auth__testing-program.js +138 -0
  19. package/dist/features/tester/seed-data/authored/addresses__address-filters.d.ts +2 -0
  20. package/dist/features/tester/seed-data/authored/addresses__address-filters.js +36 -0
  21. package/dist/features/tester/seed-data/authored/addresses__postal-lookup.d.ts +2 -0
  22. package/dist/features/tester/seed-data/authored/addresses__postal-lookup.js +75 -0
  23. package/dist/features/tester/seed-data/authored/addresses__postal-validation.d.ts +2 -0
  24. package/dist/features/tester/seed-data/authored/addresses__postal-validation.js +72 -0
  25. package/dist/features/tester/seed-data/authored/addresses__state-picker.d.ts +2 -0
  26. package/dist/features/tester/seed-data/authored/addresses__state-picker.js +54 -0
  27. package/dist/features/tester/seed-data/authored/addresses__unban-request.d.ts +2 -0
  28. package/dist/features/tester/seed-data/authored/addresses__unban-request.js +39 -0
  29. package/dist/features/tester/seed-data/authored/admin__bans-and-trust.d.ts +2 -0
  30. package/dist/features/tester/seed-data/authored/admin__bans-and-trust.js +226 -0
  31. package/dist/features/tester/seed-data/authored/admin__blog-faqs.d.ts +2 -0
  32. package/dist/features/tester/seed-data/authored/admin__blog-faqs.js +82 -0
  33. package/dist/features/tester/seed-data/authored/admin__bulk-actions.d.ts +2 -0
  34. package/dist/features/tester/seed-data/authored/admin__bulk-actions.js +177 -0
  35. package/dist/features/tester/seed-data/authored/admin__bundles.d.ts +2 -0
  36. package/dist/features/tester/seed-data/authored/admin__bundles.js +97 -0
  37. package/dist/features/tester/seed-data/authored/admin__buyer-data-admin.d.ts +2 -0
  38. package/dist/features/tester/seed-data/authored/admin__buyer-data-admin.js +232 -0
  39. package/dist/features/tester/seed-data/authored/admin__catalog-listings.d.ts +2 -0
  40. package/dist/features/tester/seed-data/authored/admin__catalog-listings.js +306 -0
  41. package/dist/features/tester/seed-data/authored/admin__category-brand-authoring.d.ts +2 -0
  42. package/dist/features/tester/seed-data/authored/admin__category-brand-authoring.js +158 -0
  43. package/dist/features/tester/seed-data/authored/admin__classifieds-digitalcodes-live.d.ts +2 -0
  44. package/dist/features/tester/seed-data/authored/admin__classifieds-digitalcodes-live.js +78 -0
  45. package/dist/features/tester/seed-data/authored/admin__content-deletes.d.ts +2 -0
  46. package/dist/features/tester/seed-data/authored/admin__content-deletes.js +261 -0
  47. package/dist/features/tester/seed-data/authored/admin__content-marketing.d.ts +2 -0
  48. package/dist/features/tester/seed-data/authored/admin__content-marketing.js +151 -0
  49. package/dist/features/tester/seed-data/authored/admin__coupons.d.ts +2 -0
  50. package/dist/features/tester/seed-data/authored/admin__coupons.js +214 -0
  51. package/dist/features/tester/seed-data/authored/admin__events-raffles-spin.d.ts +2 -0
  52. package/dist/features/tester/seed-data/authored/admin__events-raffles-spin.js +160 -0
  53. package/dist/features/tester/seed-data/authored/admin__media-watermark.d.ts +2 -0
  54. package/dist/features/tester/seed-data/authored/admin__media-watermark.js +104 -0
  55. package/dist/features/tester/seed-data/authored/admin__orders-fulfillment.d.ts +2 -0
  56. package/dist/features/tester/seed-data/authored/admin__orders-fulfillment.js +350 -0
  57. package/dist/features/tester/seed-data/authored/admin__prize-draws-lotteries.d.ts +2 -0
  58. package/dist/features/tester/seed-data/authored/admin__prize-draws-lotteries.js +105 -0
  59. package/dist/features/tester/seed-data/authored/admin__site-system.d.ts +2 -0
  60. package/dist/features/tester/seed-data/authored/admin__site-system.js +590 -0
  61. package/dist/features/tester/seed-data/authored/admin__uncovered-admin-pages.d.ts +2 -0
  62. package/dist/features/tester/seed-data/authored/admin__uncovered-admin-pages.js +235 -0
  63. package/dist/features/tester/seed-data/authored/admin__users-trust.d.ts +2 -0
  64. package/dist/features/tester/seed-data/authored/admin__users-trust.js +569 -0
  65. package/dist/features/tester/seed-data/authored/buying__bidding.d.ts +2 -0
  66. package/dist/features/tester/seed-data/authored/buying__bidding.js +417 -0
  67. package/dist/features/tester/seed-data/authored/buying__browsing-search.d.ts +2 -0
  68. package/dist/features/tester/seed-data/authored/buying__browsing-search.js +653 -0
  69. package/dist/features/tester/seed-data/authored/buying__buying-checkout.d.ts +2 -0
  70. package/dist/features/tester/seed-data/authored/buying__buying-checkout.js +533 -0
  71. package/dist/features/tester/seed-data/authored/buying__buying-coupons.d.ts +2 -0
  72. package/dist/features/tester/seed-data/authored/buying__buying-coupons.js +379 -0
  73. package/dist/features/tester/seed-data/authored/buying__cart.d.ts +2 -0
  74. package/dist/features/tester/seed-data/authored/buying__cart.js +1171 -0
  75. package/dist/features/tester/seed-data/authored/buying__image-tile-layout.d.ts +2 -0
  76. package/dist/features/tester/seed-data/authored/buying__image-tile-layout.js +140 -0
  77. package/dist/features/tester/seed-data/authored/buying__my-orders.d.ts +2 -0
  78. package/dist/features/tester/seed-data/authored/buying__my-orders.js +257 -0
  79. package/dist/features/tester/seed-data/authored/buying__offers.d.ts +2 -0
  80. package/dist/features/tester/seed-data/authored/buying__offers.js +1111 -0
  81. package/dist/features/tester/seed-data/authored/buying__order-status-lifecycle.d.ts +2 -0
  82. package/dist/features/tester/seed-data/authored/buying__order-status-lifecycle.js +252 -0
  83. package/dist/features/tester/seed-data/authored/buying__product-detail.d.ts +2 -0
  84. package/dist/features/tester/seed-data/authored/buying__product-detail.js +387 -0
  85. package/dist/features/tester/seed-data/authored/buying__return-request.d.ts +2 -0
  86. package/dist/features/tester/seed-data/authored/buying__return-request.js +152 -0
  87. package/dist/features/tester/seed-data/authored/buying__reviews-pagination.d.ts +2 -0
  88. package/dist/features/tester/seed-data/authored/buying__reviews-pagination.js +242 -0
  89. package/dist/features/tester/seed-data/authored/buying__reviews.d.ts +2 -0
  90. package/dist/features/tester/seed-data/authored/buying__reviews.js +113 -0
  91. package/dist/features/tester/seed-data/authored/buying__user-dashboard-extras.d.ts +2 -0
  92. package/dist/features/tester/seed-data/authored/buying__user-dashboard-extras.js +283 -0
  93. package/dist/features/tester/seed-data/authored/buying__user-dashboard-navigation.d.ts +2 -0
  94. package/dist/features/tester/seed-data/authored/buying__user-dashboard-navigation.js +167 -0
  95. package/dist/features/tester/seed-data/authored/buying__user-uncovered-pages.d.ts +2 -0
  96. package/dist/features/tester/seed-data/authored/buying__user-uncovered-pages.js +90 -0
  97. package/dist/features/tester/seed-data/authored/buying__wishlist-history.d.ts +2 -0
  98. package/dist/features/tester/seed-data/authored/buying__wishlist-history.js +344 -0
  99. package/dist/features/tester/seed-data/authored/community-support__public-profile.d.ts +2 -0
  100. package/dist/features/tester/seed-data/authored/community-support__public-profile.js +53 -0
  101. package/dist/features/tester/seed-data/authored/community-support__support-tickets.d.ts +2 -0
  102. package/dist/features/tester/seed-data/authored/community-support__support-tickets.js +76 -0
  103. package/dist/features/tester/seed-data/authored/content-discovery__blog.d.ts +2 -0
  104. package/dist/features/tester/seed-data/authored/content-discovery__blog.js +93 -0
  105. package/dist/features/tester/seed-data/authored/content-discovery__category-brand-relations.d.ts +2 -0
  106. package/dist/features/tester/seed-data/authored/content-discovery__category-brand-relations.js +149 -0
  107. package/dist/features/tester/seed-data/authored/content-discovery__coupons.d.ts +2 -0
  108. package/dist/features/tester/seed-data/authored/content-discovery__coupons.js +121 -0
  109. package/dist/features/tester/seed-data/authored/content-discovery__event-participation.d.ts +2 -0
  110. package/dist/features/tester/seed-data/authored/content-discovery__event-participation.js +207 -0
  111. package/dist/features/tester/seed-data/authored/content-discovery__events.d.ts +2 -0
  112. package/dist/features/tester/seed-data/authored/content-discovery__events.js +318 -0
  113. package/dist/features/tester/seed-data/authored/content-discovery__faq-help.d.ts +2 -0
  114. package/dist/features/tester/seed-data/authored/content-discovery__faq-help.js +65 -0
  115. package/dist/features/tester/seed-data/authored/content-discovery__notifications.d.ts +2 -0
  116. package/dist/features/tester/seed-data/authored/content-discovery__notifications.js +147 -0
  117. package/dist/features/tester/seed-data/authored/content-discovery__search.d.ts +2 -0
  118. package/dist/features/tester/seed-data/authored/content-discovery__search.js +332 -0
  119. package/dist/features/tester/seed-data/authored/cta-layout__checkout-bottom-bar.d.ts +2 -0
  120. package/dist/features/tester/seed-data/authored/cta-layout__checkout-bottom-bar.js +53 -0
  121. package/dist/features/tester/seed-data/authored/cta-layout__dialog-footers.d.ts +2 -0
  122. package/dist/features/tester/seed-data/authored/cta-layout__dialog-footers.js +52 -0
  123. package/dist/features/tester/seed-data/authored/cta-layout__editor-action-bar.d.ts +2 -0
  124. package/dist/features/tester/seed-data/authored/cta-layout__editor-action-bar.js +35 -0
  125. package/dist/features/tester/seed-data/authored/cta-layout__navbar-ctas.d.ts +2 -0
  126. package/dist/features/tester/seed-data/authored/cta-layout__navbar-ctas.js +141 -0
  127. package/dist/features/tester/seed-data/authored/cta-layout__product-bottom-bar.d.ts +2 -0
  128. package/dist/features/tester/seed-data/authored/cta-layout__product-bottom-bar.js +35 -0
  129. package/dist/features/tester/seed-data/authored/design-ux__back-to-top-button.d.ts +2 -0
  130. package/dist/features/tester/seed-data/authored/design-ux__back-to-top-button.js +95 -0
  131. package/dist/features/tester/seed-data/authored/design-ux__carousel-arrow-bounds.d.ts +2 -0
  132. package/dist/features/tester/seed-data/authored/design-ux__carousel-arrow-bounds.js +191 -0
  133. package/dist/features/tester/seed-data/authored/design-ux__dashboard-layout.d.ts +2 -0
  134. package/dist/features/tester/seed-data/authored/design-ux__dashboard-layout.js +158 -0
  135. package/dist/features/tester/seed-data/authored/design-ux__footer-theme.d.ts +2 -0
  136. package/dist/features/tester/seed-data/authored/design-ux__footer-theme.js +106 -0
  137. package/dist/features/tester/seed-data/authored/design-ux__form-validation-errors.d.ts +2 -0
  138. package/dist/features/tester/seed-data/authored/design-ux__form-validation-errors.js +88 -0
  139. package/dist/features/tester/seed-data/authored/design-ux__general-design.d.ts +2 -0
  140. package/dist/features/tester/seed-data/authored/design-ux__general-design.js +204 -0
  141. package/dist/features/tester/seed-data/authored/design-ux__hand-mode-layout.d.ts +2 -0
  142. package/dist/features/tester/seed-data/authored/design-ux__hand-mode-layout.js +301 -0
  143. package/dist/features/tester/seed-data/authored/design-ux__homepage-carousels.d.ts +2 -0
  144. package/dist/features/tester/seed-data/authored/design-ux__homepage-carousels.js +407 -0
  145. package/dist/features/tester/seed-data/authored/design-ux__status-badge-legibility.d.ts +2 -0
  146. package/dist/features/tester/seed-data/authored/design-ux__status-badge-legibility.js +214 -0
  147. package/dist/features/tester/seed-data/authored/design-ux__sticky-cta-bar.d.ts +2 -0
  148. package/dist/features/tester/seed-data/authored/design-ux__sticky-cta-bar.js +275 -0
  149. package/dist/features/tester/seed-data/authored/index.d.ts +2 -0
  150. package/dist/features/tester/seed-data/authored/index.js +237 -0
  151. package/dist/features/tester/seed-data/authored/page-wiring__data-loss.d.ts +2 -0
  152. package/dist/features/tester/seed-data/authored/page-wiring__data-loss.js +102 -0
  153. package/dist/features/tester/seed-data/authored/page-wiring__detail-pages.d.ts +2 -0
  154. package/dist/features/tester/seed-data/authored/page-wiring__detail-pages.js +50 -0
  155. package/dist/features/tester/seed-data/authored/page-wiring__drawer-pages.d.ts +2 -0
  156. package/dist/features/tester/seed-data/authored/page-wiring__drawer-pages.js +66 -0
  157. package/dist/features/tester/seed-data/authored/page-wiring__reachability.d.ts +2 -0
  158. package/dist/features/tester/seed-data/authored/page-wiring__reachability.js +115 -0
  159. package/dist/features/tester/seed-data/authored/public-pages__auth-error-pages.d.ts +2 -0
  160. package/dist/features/tester/seed-data/authored/public-pages__auth-error-pages.js +136 -0
  161. package/dist/features/tester/seed-data/authored/public-pages__bug-hunters.d.ts +2 -0
  162. package/dist/features/tester/seed-data/authored/public-pages__bug-hunters.js +69 -0
  163. package/dist/features/tester/seed-data/authored/public-pages__core-listing-pages.d.ts +2 -0
  164. package/dist/features/tester/seed-data/authored/public-pages__core-listing-pages.js +263 -0
  165. package/dist/features/tester/seed-data/authored/public-pages__help-how-it-works.d.ts +2 -0
  166. package/dist/features/tester/seed-data/authored/public-pages__help-how-it-works.js +102 -0
  167. package/dist/features/tester/seed-data/authored/public-pages__help-scams-guides-subpages.d.ts +2 -0
  168. package/dist/features/tester/seed-data/authored/public-pages__help-scams-guides-subpages.js +234 -0
  169. package/dist/features/tester/seed-data/authored/public-pages__legal-policy-pages.d.ts +2 -0
  170. package/dist/features/tester/seed-data/authored/public-pages__legal-policy-pages.js +126 -0
  171. package/dist/features/tester/seed-data/authored/public-pages__stores-sellers-directories.d.ts +2 -0
  172. package/dist/features/tester/seed-data/authored/public-pages__stores-sellers-directories.js +255 -0
  173. package/dist/features/tester/seed-data/authored/search-and-nav__employee-permissions.d.ts +2 -0
  174. package/dist/features/tester/seed-data/authored/search-and-nav__employee-permissions.js +59 -0
  175. package/dist/features/tester/seed-data/authored/search-and-nav__header-search.d.ts +2 -0
  176. package/dist/features/tester/seed-data/authored/search-and-nav__header-search.js +88 -0
  177. package/dist/features/tester/seed-data/authored/search-and-nav__settings-deep-links.d.ts +2 -0
  178. package/dist/features/tester/seed-data/authored/search-and-nav__settings-deep-links.js +51 -0
  179. package/dist/features/tester/seed-data/authored/search-and-nav__sidebar-search.d.ts +2 -0
  180. package/dist/features/tester/seed-data/authored/search-and-nav__sidebar-search.js +35 -0
  181. package/dist/features/tester/seed-data/authored/selling__become-seller.d.ts +2 -0
  182. package/dist/features/tester/seed-data/authored/selling__become-seller.js +94 -0
  183. package/dist/features/tester/seed-data/authored/selling__final-sale-authoring.d.ts +2 -0
  184. package/dist/features/tester/seed-data/authored/selling__final-sale-authoring.js +107 -0
  185. package/dist/features/tester/seed-data/authored/selling__listing-a-product.d.ts +2 -0
  186. package/dist/features/tester/seed-data/authored/selling__listing-a-product.js +285 -0
  187. package/dist/features/tester/seed-data/authored/selling__listing-lifecycle.d.ts +2 -0
  188. package/dist/features/tester/seed-data/authored/selling__listing-lifecycle.js +326 -0
  189. package/dist/features/tester/seed-data/authored/selling__listing-type-fields-roundtrip.d.ts +2 -0
  190. package/dist/features/tester/seed-data/authored/selling__listing-type-fields-roundtrip.js +136 -0
  191. package/dist/features/tester/seed-data/authored/selling__media-limits.d.ts +2 -0
  192. package/dist/features/tester/seed-data/authored/selling__media-limits.js +128 -0
  193. package/dist/features/tester/seed-data/authored/selling__sectionised-forms.d.ts +2 -0
  194. package/dist/features/tester/seed-data/authored/selling__sectionised-forms.js +167 -0
  195. package/dist/features/tester/seed-data/authored/selling__seller-analytics-payouts.d.ts +2 -0
  196. package/dist/features/tester/seed-data/authored/selling__seller-analytics-payouts.js +117 -0
  197. package/dist/features/tester/seed-data/authored/selling__seller-bids-bundles-filters.d.ts +2 -0
  198. package/dist/features/tester/seed-data/authored/selling__seller-bids-bundles-filters.js +88 -0
  199. package/dist/features/tester/seed-data/authored/selling__seller-catalog-org.d.ts +2 -0
  200. package/dist/features/tester/seed-data/authored/selling__seller-catalog-org.js +151 -0
  201. package/dist/features/tester/seed-data/authored/selling__seller-custom-brands.d.ts +2 -0
  202. package/dist/features/tester/seed-data/authored/selling__seller-custom-brands.js +105 -0
  203. package/dist/features/tester/seed-data/authored/selling__seller-guide.d.ts +2 -0
  204. package/dist/features/tester/seed-data/authored/selling__seller-guide.js +33 -0
  205. package/dist/features/tester/seed-data/authored/selling__seller-listing-types.d.ts +2 -0
  206. package/dist/features/tester/seed-data/authored/selling__seller-listing-types.js +347 -0
  207. package/dist/features/tester/seed-data/authored/selling__seller-marketing-extras.d.ts +2 -0
  208. package/dist/features/tester/seed-data/authored/selling__seller-marketing-extras.js +166 -0
  209. package/dist/features/tester/seed-data/authored/selling__seller-ops-comms.d.ts +2 -0
  210. package/dist/features/tester/seed-data/authored/selling__seller-ops-comms.js +89 -0
  211. package/dist/features/tester/seed-data/authored/selling__seller-orders.d.ts +2 -0
  212. package/dist/features/tester/seed-data/authored/selling__seller-orders.js +195 -0
  213. package/dist/features/tester/seed-data/authored/selling__seller-shipping-payouts-setup.d.ts +2 -0
  214. package/dist/features/tester/seed-data/authored/selling__seller-shipping-payouts-setup.js +180 -0
  215. package/dist/features/tester/seed-data/authored/selling__store-dashboard-navigation.d.ts +2 -0
  216. package/dist/features/tester/seed-data/authored/selling__store-dashboard-navigation.js +164 -0
  217. package/dist/features/tester/seed-data/authored/selling__store-uncovered-pages.d.ts +2 -0
  218. package/dist/features/tester/seed-data/authored/selling__store-uncovered-pages.js +116 -0
  219. package/dist/features/tester/seed-data/authored/seo__canonical-and-host.d.ts +2 -0
  220. package/dist/features/tester/seed-data/authored/seo__canonical-and-host.js +111 -0
  221. package/dist/features/tester/seed-data/authored/seo__og-images.d.ts +2 -0
  222. package/dist/features/tester/seed-data/authored/seo__og-images.js +91 -0
  223. package/dist/features/tester/seed-data/authored/seo__page-metadata.d.ts +2 -0
  224. package/dist/features/tester/seed-data/authored/seo__page-metadata.js +122 -0
  225. package/dist/features/tester/seed-data/authored/seo__sitemap-and-robots.d.ts +2 -0
  226. package/dist/features/tester/seed-data/authored/seo__sitemap-and-robots.js +105 -0
  227. package/dist/features/tester/seed-data/tester-checklist-seed-data.js +744 -1
  228. package/dist/seed/carousel-slides-seed-data.js +1 -1
  229. package/dist/seed/products-standard-seed-data.js +2 -2
  230. package/dist/seed/reviews-seed-data.js +6 -1
  231. package/package.json +1 -1
  232. package/scripts/seed-cli.mjs +6 -0
@@ -0,0 +1,166 @@
1
+ /*
2
+ * WHY: Authored six-part procedures for the selling/seller-marketing-extras page.
3
+ * WHAT: 9 case(s), keyed by full checklist id.
4
+ *
5
+ * Written by hand, case by case, against the label each one states. There is no
6
+ * generator: the authoring scripts were deleted once it was clear they were
7
+ * scaffolding around work that is simply writing.
8
+ *
9
+ * 🛑 THE WHATSAPP ACCESS TOKEN IS DOUBLE-ENCRYPTED and decrypted on EVERY read of
10
+ * the store document, so any code path that forgets to project is handling
11
+ * plaintext. Four pages once passed the raw document into a client component and
12
+ * published that token in the page HTML. The token case therefore reads the page
13
+ * source rather than trusting the masked field.
14
+ *
15
+ * @tag domain:tester
16
+ * @tag layer:seed
17
+ * @tag pattern:none
18
+ * @tag access:server-only
19
+ * @tag consumers:seed-data/authored/index.ts
20
+ * @tag sideEffects:none
21
+ */
22
+ export const authored = {
23
+ "checklist-selling-seller-marketing-extras-seller-offers-list": {
24
+ roles: ["seller"],
25
+ startPage: "/store/offers",
26
+ steps: [
27
+ "Sign in as tyson@beybladearena.in / TempPass123!.",
28
+ "Open the store's offers list and read every row — product, offered amount, listed price, status and round.",
29
+ "Read every status filter offered and select each in turn, noting any that returns nothing.",
30
+ "For each empty filter, check the unfiltered list for rows carrying that status.",
31
+ "Open one offer and read its detail, including any earlier rounds.",
32
+ "Read the row actions offered and check at least one lets you VIEW rather than only act.",
33
+ ],
34
+ expectedBehaviour: "The list shows offers against this store with enough context to decide — the offered amount against the listed price is the entire negotiation. A chain of counters is one story: each round is its own document, linked forwards and backwards and denormalised to the chain's root so a row can say 'Round 2' with no extra reads.",
35
+ expectedUiState: "Rows show product, offered amount, listed price and round number. Every status filter either returns its own rows or is empty with none unfiltered either — the real statuses include countered and withdrawn, and a chip naming 'Rejected' when the stored value is 'Declined' matches nothing forever. A view affordance exists; a menu of pure mutations lets a seller act on an offer they never read.",
36
+ endResult: "Read-only; nothing persists beyond the URL.",
37
+ },
38
+ "checklist-selling-seller-marketing-extras-seller-features-crud": {
39
+ roles: ["seller"],
40
+ startPage: "/store/features",
41
+ steps: [
42
+ "Sign in as tyson@beybladearena.in / TempPass123!.",
43
+ "Open the store's product-features page and read the existing features.",
44
+ "Create one named 'QA Feature marketing-extras' with an icon and a description, and save.",
45
+ "RELOAD and read every field.",
46
+ "Open a product editor and attach that feature to 'Beyblade Burst B-01 Valkyrie', then save.",
47
+ "Open the product's public page and read whether the feature is shown.",
48
+ "Detach it, then delete the feature.",
49
+ ],
50
+ inputs: { name: "QA Feature marketing-extras", productId: "product-beyblade-burst-valkyrie" },
51
+ expectedBehaviour: "A feature is created once and attached to many listings, and it reaches the public page. A feature that saves in its own list but never renders on a product is a field with no reader — the seller believes they have said something the buyer never sees.",
52
+ expectedUiState: "After the reload the feature holds its name, icon and description. The product's public page shows it. A public page with no trace of the attached feature is the failure.",
53
+ endResult: "The feature is detached and deleted by the final step, so the seeded product is left as it was.",
54
+ },
55
+ "checklist-selling-seller-marketing-extras-seller-google-reviews-sync": {
56
+ roles: ["seller"],
57
+ startPage: "/store",
58
+ steps: [
59
+ "Sign in as tyson@beybladearena.in / TempPass123!.",
60
+ "Open the store's Google reviews sync surface and read what it asks for.",
61
+ "Read whether it states that credentials are required and which ones.",
62
+ "Trigger a sync without credentials configured and read the message.",
63
+ "Read whether any error mentions a provider, a key, or a raw response.",
64
+ "Read the store's public page for any Google reviews section.",
65
+ ],
66
+ expectedBehaviour: "With no Google credentials configured the sync declines cleanly and says so. The Places credentials are seeded as EMPTY strings rather than placeholders precisely so an unconfigured consumer skips instead of making a billed call that fails — a placeholder would be treated as a usable key.",
67
+ expectedUiState: "The message names the missing configuration in plain English. It does not surface a provider error code, an API key, or a raw response body. The public store page shows no empty Google reviews section.",
68
+ endResult: "Nothing is synced. If credentials ARE configured on this environment, record that and read what the sync actually imported instead.",
69
+ },
70
+ "checklist-selling-seller-marketing-extras-seller-whatsapp-catalog": {
71
+ roles: ["seller"],
72
+ startPage: "/store",
73
+ steps: [
74
+ "Sign in as tyson@beybladearena.in / TempPass123!.",
75
+ "Open the store's WhatsApp catalog surface and read every control.",
76
+ "Read what it says about the connection state.",
77
+ "Read whether it names the business account and catalog it would sync with.",
78
+ "Trigger a catalog action without a token configured and read the message.",
79
+ ],
80
+ expectedBehaviour: "The catalog surface reports its connection state honestly and declines cleanly when unconfigured. It is the reader of the store's WhatsApp configuration, which is stored encrypted and decrypted on every store read — so what this page shows is the one place the configuration is legitimately visible to its owner.",
81
+ expectedUiState: "The connection state is stated rather than implied. An unconfigured action produces a readable message naming what is missing, not a provider error. The business account and catalog identifiers are shown to the owner but partially masked.",
82
+ endResult: "Nothing is synced.",
83
+ },
84
+ "checklist-selling-seller-marketing-extras-seller-whatsapp-token-save": {
85
+ roles: ["seller", "guest"],
86
+ startPage: "/store",
87
+ steps: [
88
+ "Sign in as tyson@beybladearena.in / TempPass123!.",
89
+ "Open the store's WhatsApp settings and type QA-WHATSAPP-TOKEN-118427 into the access-token field.",
90
+ "Save and RELOAD, then read how the token is displayed.",
91
+ "Open the browser's View Source on that settings page and search for QA-WHATSAPP-TOKEN-118427.",
92
+ "Open /stores/store-beyblade-arena in a private window with no session.",
93
+ "Open View Source there and search for QA-WHATSAPP-TOKEN-118427 and for accessToken.",
94
+ "Clear the token field, save, and reload to confirm it is gone.",
95
+ ],
96
+ inputs: { token: "QA-WHATSAPP-TOKEN-118427" },
97
+ expectedBehaviour: "The token is stored double-encrypted and shown masked to its owner. Because it is decrypted on every read of the store document, the real risk is a page that passes that document to a client component — which serialises it into the public page HTML. The PUBLIC page source is therefore the assertion, not the masked field.",
98
+ expectedUiState: "After the reload the owner sees a masked value rather than the full token. The public store page's source contains neither the token nor the word accessToken anywhere, including inside the embedded data payload.",
99
+ expectedData: { tokenInPublicSource: 0 },
100
+ endResult: "The token is cleared by the final step. A hit on the public page is a credential leak and fails the case outright, however the settings page renders.",
101
+ },
102
+ "checklist-selling-seller-marketing-extras-seller-whatsapp-import-runs-in-background": {
103
+ roles: ["seller"],
104
+ startPage: "/store",
105
+ steps: [
106
+ "Sign in as tyson@beybladearena.in / TempPass123!.",
107
+ "Open the store's WhatsApp catalog surface and start an import.",
108
+ "Read what the page shows immediately — whether it blocks or returns.",
109
+ "Navigate to another store page and back.",
110
+ "Read whether the import's progress is still reported.",
111
+ "Wait for it to finish and read the summary.",
112
+ ],
113
+ expectedBehaviour: "An import of unknown size is enqueued as a job rather than run inside the request — a route that fans out over a whole catalogue is exactly the shape the ten-second function ceiling kills in production while local runs pass. The page subscribes to the job's progress instead of waiting on a response.",
114
+ expectedUiState: "The page returns immediately with a job accepted rather than freezing. Progress survives navigating away and back. A completion summary states what was imported. A request that hangs and then times out is the failure this case exists for.",
115
+ endResult: "Whatever was imported persists. With no credentials configured the import will decline instead — record that rather than failing the case.",
116
+ },
117
+ "checklist-selling-seller-marketing-extras-seller-whatsapp-import-skips-already-synced": {
118
+ roles: ["seller"],
119
+ startPage: "/store",
120
+ steps: [
121
+ "Sign in as tyson@beybladearena.in / TempPass123!.",
122
+ "Open the store's WhatsApp catalog surface and run an import, noting the summary and the store's product count.",
123
+ "Run the SAME import a second time without changing anything.",
124
+ "Read the second summary and compare it against the first.",
125
+ "Open /store/products and read the product count again.",
126
+ "Search the products list for any duplicated title.",
127
+ ],
128
+ expectedBehaviour: "A second import skips what is already synced rather than creating duplicates. This is the same idempotency the seed data needs: an import keyed on a stable external identifier upserts, while one keyed on anything regenerated per run creates a fresh copy every time and reports success.",
129
+ expectedUiState: "The second summary reports items skipped rather than a second full import. The product count is unchanged and no title appears twice.",
130
+ expectedData: { duplicateTitles: 0 },
131
+ endResult: "No duplicates exist. A doubled product count after a repeated import is the failure, and the summary will still have read as successful.",
132
+ },
133
+ "checklist-selling-seller-marketing-extras-seller-whatsapp-push-product-link-opens": {
134
+ roles: ["seller"],
135
+ startPage: "/store/products",
136
+ steps: [
137
+ "Sign in as tyson@beybladearena.in / TempPass123!.",
138
+ "Open /store/products and use the WhatsApp push or share control on 'Beyblade Burst B-01 Valkyrie'.",
139
+ "Read the message it composes before sending anything.",
140
+ "Read the product link inside it and note its host and path.",
141
+ "Open that link in a private window with no session.",
142
+ "Read the page it opens.",
143
+ ],
144
+ inputs: { productId: "product-beyblade-burst-valkyrie" },
145
+ expectedBehaviour: "The shared link is a public, canonical URL a stranger can open. There is one definition of the site host and everything derives from it — two owners drifted once and every sitemap URL pointed at a host that redirected, which is what took the site out of search.",
146
+ expectedUiState: "The message contains a link on the canonical host with an unprefixed path. Opening it signed out renders the product page directly rather than redirecting, and does not 404.",
147
+ endResult: "Nothing is sent. A link that redirects before landing is worth recording — every redirect is a hop a shared link pays on every open.",
148
+ },
149
+ "checklist-selling-seller-marketing-extras-seller-reviews-response": {
150
+ roles: ["seller", "guest"],
151
+ startPage: "/store/reviews",
152
+ steps: [
153
+ "Sign in as tyson@beybladearena.in / TempPass123!.",
154
+ "Open the store's reviews list and open a review with no seller response.",
155
+ "Type 'QA Response seller-reviews-response — thanks for the feedback.' as the response and save.",
156
+ "RELOAD and read the response.",
157
+ "Open that review on the product's public page in a private window.",
158
+ "Read whether the response is shown and how it is attributed.",
159
+ "Edit the response, save, reload, and read it again.",
160
+ ],
161
+ inputs: { response: "QA Response seller-reviews-response — thanks for the feedback." },
162
+ expectedBehaviour: "A seller response is stored on the review and rendered publicly, attributed to the store rather than to a person. It can be edited afterwards — a response that can only be written once leaves a typo permanent on a public page.",
163
+ expectedUiState: "After the reload the response is on the review in the dashboard AND on the public product page, attributed to the store. The edit persists too. The reviewer's own name stays masked; a response does not unmask it.",
164
+ endResult: "Delete the response afterwards so the seeded review is left as it was.",
165
+ },
166
+ };
@@ -0,0 +1,2 @@
1
+ import type { AuthoredCase } from "./_types";
2
+ export declare const authored: Record<string, AuthoredCase>;
@@ -0,0 +1,89 @@
1
+ /*
2
+ * WHY: Authored six-part procedures for the selling/seller-ops-comms 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
+ * 🛑 THE LAST TWO CASES OVERLAP ON PURPOSE. One print surface is the real one and
10
+ * the other is a degraded duplicate of it rendered with no store — two features
11
+ * that look alike is exactly how one of them ships broken and unnoticed, so both
12
+ * are opened and compared rather than either being trusted.
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-seller-ops-comms-seller-addresses-crud": {
23
+ roles: ["seller"],
24
+ startPage: "/store/addresses",
25
+ steps: [
26
+ "Sign in as tyson@beybladearena.in / TempPass123!.",
27
+ "Open /store/addresses and read the existing addresses.",
28
+ "Create one: 'QA Address ops-comms', '11 Test Lane', Indore, Madhya Pradesh, 452010, landmark 'Next to the arena'.",
29
+ "Save, RELOAD, and read every field including the landmark.",
30
+ "Edit only the street to '12 Test Lane', save, RELOAD, and read every field again.",
31
+ "Mark it as the default pickup location, save and RELOAD.",
32
+ "Delete it and RELOAD to confirm.",
33
+ ],
34
+ inputs: {
35
+ name: "QA Address ops-comms",
36
+ streetBefore: "11 Test Lane",
37
+ streetAfter: "12 Test Lane",
38
+ landmark: "Next to the arena",
39
+ },
40
+ expectedBehaviour: "Create, edit, default-set and delete all persist, and an edit touching one field leaves the others alone. The edit step is the important one: a form that cannot name a field sends undefined for it, and undefined overwrites — which is how the landmark disappeared on every edit.",
41
+ expectedUiState: "After each reload the address holds exactly what was typed. Following the street edit, the landmark still reads 'Next to the arena'. A blank landmark after an unrelated edit is the failure.",
42
+ endResult: "The address is deleted by the final step.",
43
+ },
44
+ "checklist-selling-seller-ops-comms-seller-fulfillment-queue": {
45
+ roles: ["seller"],
46
+ startPage: "/store/orders",
47
+ steps: [
48
+ "Sign in as tyson@beybladearena.in / TempPass123!.",
49
+ "Open the store's fulfillment queue and read the rows.",
50
+ "Read each row's primary label and check it names the ITEM rather than only an order id.",
51
+ "Read every filter offered and select each in turn, reading the rows.",
52
+ "Open one row and read the order it opens.",
53
+ "Check the queue's ordering — whether the oldest unfulfilled order is first.",
54
+ ],
55
+ expectedBehaviour: "The queue lists orders needing action, keyed on what the seller has to pack rather than on an identifier they cannot act on. Order documents denormalise the item title and image precisely so a list row needs no extra fetch — a row reading only 'Order {id}' is a row-mapper that never read them.",
56
+ expectedUiState: "Each row names the product and shows its thumbnail, with the order id de-emphasised rather than being the whole label. Every filter returns rows or a named empty state. Rows open the order.",
57
+ endResult: "Read-only; nothing persists beyond the URL.",
58
+ },
59
+ "checklist-selling-seller-ops-comms-seller-print-center": {
60
+ roles: ["seller"],
61
+ startPage: "/store/print-center",
62
+ steps: [
63
+ "Sign in as tyson@beybladearena.in / TempPass123!.",
64
+ "Open /store/print-center and read what it offers.",
65
+ "Select one or more items or orders to print.",
66
+ "Read the preview and check the store's own name, logo and address appear on it.",
67
+ "Generate the printable output and read it.",
68
+ "Check the barcode or code shown resolves to the right product.",
69
+ ],
70
+ expectedBehaviour: "The print centre renders with the seller's own store context — name, logo, pickup address — because that context is what makes a label usable. A barcode is derived deterministically from the product id, so the same product always produces the same code.",
71
+ expectedUiState: "The preview carries the store's name, logo and address rather than blanks or placeholders. The output includes the selected items. The barcode matches the product it is printed for.",
72
+ endResult: "Nothing is persisted by previewing. Do not send anything to a physical printer.",
73
+ },
74
+ "checklist-selling-seller-ops-comms-seller-inventory-print": {
75
+ roles: ["seller"],
76
+ startPage: "/store/print-center",
77
+ steps: [
78
+ "Sign in as tyson@beybladearena.in / TempPass123!.",
79
+ "Open /store/print-center and write down what it offers and whether the store context is present.",
80
+ "Open the store's inventory print page.",
81
+ "Write down what IT offers and whether the store context is present.",
82
+ "Compare the two side by side.",
83
+ "Check the sidebar for which of the two is linked.",
84
+ ],
85
+ expectedBehaviour: "Only one of these is the real surface. The other renders the same component with no store attached, so it produces a preview with no name, no logo and no address — a page that looks built and yields an unusable label. Two features that look alike is how one ships broken and unnoticed.",
86
+ expectedUiState: "One surface carries the full store context and the other does not, or the second no longer exists. Record which is which, and which one the sidebar links to — a sidebar pointing at the degraded copy is the finding.",
87
+ endResult: "Read-only; nothing persists. If both render identically and correctly, say so — that is a valid outcome and means the duplicate was resolved.",
88
+ },
89
+ };
@@ -0,0 +1,2 @@
1
+ import type { AuthoredCase } from "./_types";
2
+ export declare const authored: Record<string, AuthoredCase>;
@@ -0,0 +1,195 @@
1
+ /*
2
+ * WHY: Authored six-part procedures for the selling/seller-orders page.
3
+ * WHAT: 11 case(s), keyed by full checklist id.
4
+ *
5
+ * Written by hand, case by case, against the label each one states. There is no
6
+ * generator: the authoring scripts were deleted once it was clear they were
7
+ * scaffolding around work that is simply writing.
8
+ *
9
+ * 🛑 THE SELLER SEES LESS OF A MANUAL PAYMENT THAN THE ADMIN DOES, on purpose. The
10
+ * proof screenshot is a bank or UPI capture and stays admin-only; the seller gets
11
+ * a status badge and the reference. Three cases here check the seller CANNOT do
12
+ * what only an admin may — verify, request a re-upload, or reject as fraud.
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-seller-orders-view-orders": {
23
+ roles: ["seller"],
24
+ startPage: "/store/orders",
25
+ steps: [
26
+ "Sign in as tyson@beybladearena.in / TempPass123!.",
27
+ "Open /store/orders and read every row's primary label.",
28
+ "Check each names the ITEM and shows its thumbnail rather than only an order id.",
29
+ "Read the availability or scope tabs offered and select each in turn.",
30
+ "Read every status filter and select each, noting any that returns nothing.",
31
+ "Open one order and read its detail.",
32
+ ],
33
+ expectedBehaviour: "Every order carries its item title and image denormalised onto the document precisely so a list row needs no extra fetch. A row reading 'Order {id}' is a row-mapper that threw that away, leaving the seller to open each order to find out what it is.",
34
+ expectedUiState: "Rows name the product with a thumbnail, and a multi-item order shows a '+N more' style suffix rather than only the first item. The order id is present but de-emphasised. Scope tabs read Active / Closed / All. Every status filter returns rows or is genuinely empty.",
35
+ endResult: "Read-only; nothing persists beyond the URL.",
36
+ },
37
+ "checklist-selling-seller-orders-seller-order-manual-payment-badge": {
38
+ roles: ["seller"],
39
+ startPage: "/store/orders",
40
+ steps: [
41
+ "Sign in as tyson@beybladearena.in / TempPass123!.",
42
+ "Open /store/orders and find an order paid by cash or UPI.",
43
+ "Read its manual-payment badge in the list and note the state it reports.",
44
+ "Open the order and read the badge and the payment reference there.",
45
+ "Look for the buyer's uploaded proof screenshot anywhere on the page.",
46
+ "Look for any control to verify, request a re-upload, or reject the payment.",
47
+ ],
48
+ expectedBehaviour: "The state is DERIVED from two fields rather than stored, so every surface computes the same four states — awaiting payment, awaiting verification, re-upload requested, resolved. A stored mirror would drift the first time a write path forgot it.",
49
+ expectedUiState: "The badge states which of the four the order is in, in both the list and the detail. The reference is shown. The proof SCREENSHOT is not — it is a bank or UPI capture and is admin-only. No verify, re-upload or reject control is offered to the seller.",
50
+ expectedData: { proofScreenshotVisibleToSeller: false },
51
+ endResult: "Read-only. A visible screenshot or an actionable verify control here is a permissions finding, not a UI one.",
52
+ },
53
+ "checklist-selling-seller-orders-confirm-payment": {
54
+ roles: ["seller"],
55
+ startPage: "/store/orders",
56
+ steps: [
57
+ "Sign in as tyson@beybladearena.in / TempPass123!.",
58
+ "Open /store/orders and open an order awaiting payment verification.",
59
+ "Read every control the page offers.",
60
+ "Look specifically for a control that would mark the payment verified.",
61
+ "Sign out and sign in as admin@letitrip.in / TempPass123!.",
62
+ "Open the same order in /admin/orders and read the controls offered there.",
63
+ ],
64
+ expectedBehaviour: "Verifying a manual payment is an admin and moderator action. The seller is the beneficiary of the payment, so letting them confirm it is the party with the incentive marking their own money received — the split is deliberate and the admin view is where the control lives.",
65
+ expectedUiState: "The seller's view offers no verify control. The admin's view offers Verify alongside Request re-upload and Reject as fraud, with the proof screenshot visible. A verify control on the seller's page is the failure.",
66
+ endResult: "Do not verify anything. Read-only on both sides.",
67
+ },
68
+ "checklist-selling-seller-orders-request-reupload": {
69
+ roles: ["seller", "admin"],
70
+ startPage: "/store/orders",
71
+ steps: [
72
+ "Sign in as tyson@beybladearena.in / TempPass123! and open an order whose proof has been submitted.",
73
+ "Confirm no re-upload control is offered to the seller.",
74
+ "Sign out and sign in as admin@letitrip.in / TempPass123!.",
75
+ "Open the same order in /admin/orders and use Request re-upload, typing a note.",
76
+ "Sign in as the buyer who placed that order and open the order's payment page.",
77
+ "Read whether the upload form is active again and what the deadline shows.",
78
+ ],
79
+ expectedBehaviour: "Only an admin may request a re-upload, and doing so reopens the buyer's window. The note is required — a re-upload request with no reason leaves the buyer resubmitting the same thing.",
80
+ expectedUiState: "The seller has no such control. The admin's request requires a note before it will submit. The buyer's payment page becomes active again with an extended deadline rather than staying locked.",
81
+ endResult: "The order is left in the re-upload-requested state. Note that a corrected re-upload must clear that state — an order stuck in it is invisible to both the auto-approve sweep and the admin queue, and stalls forever.",
82
+ },
83
+ "checklist-selling-seller-orders-reject-fraud": {
84
+ roles: ["seller", "admin"],
85
+ startPage: "/store/orders",
86
+ steps: [
87
+ "Sign in as tyson@beybladearena.in / TempPass123! and open an order awaiting verification.",
88
+ "Confirm no reject-as-fraud control is offered.",
89
+ "Sign out and sign in as admin@letitrip.in / TempPass123!.",
90
+ "Open the same order in /admin/orders and read the reject-as-fraud control and what it requires.",
91
+ "Read any confirmation dialog it opens, without confirming it.",
92
+ "Cancel out of the dialog.",
93
+ ],
94
+ expectedBehaviour: "Rejecting as fraud is admin-only and requires a note, because it cancels the order, restores stock and enqueues a seven-day ban cascade against the buyer. A destructive action of that reach must carry a confirmation naming what it will do — one without it executes immediately with no warning.",
95
+ expectedUiState: "The seller has no such control. The admin's version requires a note and opens a confirmation that names the consequences rather than asking a generic 'Are you sure?'. Cancelling leaves the order untouched.",
96
+ endResult: "Nothing is rejected. Cancel rather than confirm — this action bans a real account for seven days.",
97
+ },
98
+ "checklist-selling-seller-orders-mark-shipped": {
99
+ roles: ["seller"],
100
+ startPage: "/store/orders",
101
+ steps: [
102
+ "Sign in as tyson@beybladearena.in / TempPass123!.",
103
+ "Open /store/orders and open an order that is ready to ship.",
104
+ "Use the mark-shipped control and read what it asks for.",
105
+ "Type 'QA Carrier mark-shipped' as the carrier and 'QATRACK118427' as the tracking number, then submit.",
106
+ "RELOAD the order and read its status, carrier and tracking number.",
107
+ "Open /store/orders and check the row's status has moved too.",
108
+ "Check the scope tabs — the order should still be under Active, not Closed.",
109
+ ],
110
+ inputs: { carrier: "QA Carrier mark-shipped", trackingNumber: "QATRACK118427" },
111
+ expectedBehaviour: "Marking shipped records the carrier and tracking number alongside the status. Shipping is manual here — there is no carrier integration — so the seller's typed values ARE the tracking data, and a status change that discards them leaves the buyer with nothing to follow.",
112
+ expectedUiState: "After the reload the order reads as shipped and holds both the carrier and the tracking number. The list row reflects the new status. The order stays in the Active scope, since shipped is not a closed state.",
113
+ expectedData: { trackingNumber: "QATRACK118427" },
114
+ endResult: "The order is shipped and carries its tracking data. A status that moved while the carrier and tracking are blank is the failure.",
115
+ },
116
+ "checklist-selling-seller-orders-tracking-visible": {
117
+ roles: ["seller", "buyer"],
118
+ startPage: "/store/orders",
119
+ steps: [
120
+ "Sign in as tyson@beybladearena.in / TempPass123! and open the order marked shipped in the previous case.",
121
+ "Read the carrier and tracking number shown.",
122
+ "Sign out and sign in as the buyer who placed that order.",
123
+ "Open /user/orders and open the same order.",
124
+ "Read the carrier and tracking number there.",
125
+ "Open the order's tracking page and read what it shows.",
126
+ ],
127
+ inputs: { trackingNumber: "QATRACK118427" },
128
+ expectedBehaviour: "What the seller entered reaches the buyer. The buyer's tracking page renders a timeline from the order's real per-status dates — a status with no recorded date shows no timestamp rather than a guessed one, because a fabricated date is worse than a missing one.",
129
+ expectedUiState: "Both sides show the same carrier and tracking number. The buyer's tracking page renders a timeline with real dates against the statuses that have them, and an em-dash against those that do not.",
130
+ endResult: "Read-only on the buyer side. A tracking page that is blank, or that shows invented dates for every status, are both failures.",
131
+ },
132
+ "checklist-selling-seller-orders-whatsapp-admin-share": {
133
+ roles: ["seller"],
134
+ startPage: "/store/orders",
135
+ steps: [
136
+ "Sign in as tyson@beybladearena.in / TempPass123!.",
137
+ "Open /store/orders and open an order.",
138
+ "Find the WhatsApp share control and read what it offers.",
139
+ "Trigger it and read the message it composes before sending anything.",
140
+ "Check the message for the buyer's full phone number, full address and any payment identifier.",
141
+ "Close without sending.",
142
+ ],
143
+ expectedBehaviour: "The share composes a message about the order. What it must not do is put more of the buyer's data into a third-party app than the seller needs to fulfil — a share that pastes a full address and phone into an outbound message has moved PII somewhere no policy here covers.",
144
+ expectedUiState: "The composed message identifies the order and what it contains. Read exactly what buyer data it includes and record it. A full payment identifier in the message is a finding regardless of anything else.",
145
+ endResult: "Nothing is sent. Report precisely which buyer fields the message carries — that is the substance of this case.",
146
+ },
147
+ "checklist-selling-seller-orders-seller-auction-forfeit-notification": {
148
+ roles: ["seller"],
149
+ startPage: "/store",
150
+ steps: [
151
+ "Sign in as tyson@beybladearena.in / TempPass123!.",
152
+ "Open /store and open the notification list.",
153
+ "Look for any notification about an auction win that lapsed unpaid.",
154
+ "Read its title, body and destination if one exists.",
155
+ "Open the store's auctions list and find an auction whose win was forfeited.",
156
+ "Read what state that auction is now in.",
157
+ ],
158
+ expectedBehaviour: "When a win lapses unpaid the bid is forfeited and the buyer is notified. Whether the SELLER is notified is the question this case answers rather than assumes — for an unpaid buyout the seller is deliberately not told, because nothing was ever sold, and the same reasoning may or may not apply here.",
159
+ expectedUiState: "Record what the seller actually receives. If a notification exists it has a readable title, a body and a destination that resolves. If none exists, record that as the observed behaviour rather than as a failure.",
160
+ endResult: "Read-only. This case documents behaviour; report what happened rather than forcing a yes or no.",
161
+ },
162
+ "checklist-selling-seller-orders-seller-order-detail-full-page": {
163
+ roles: ["seller"],
164
+ startPage: "/store/orders",
165
+ steps: [
166
+ "Sign in as tyson@beybladearena.in / TempPass123!.",
167
+ "Open /store/orders and open an order's detail panel from the list.",
168
+ "Write down every field label and section it shows.",
169
+ "Note the order id and close the panel.",
170
+ "Open that order's standalone detail page directly by URL.",
171
+ "Write down every field and section, and compare the two lists.",
172
+ "Reload the standalone page and confirm it still loads the same order.",
173
+ ],
174
+ expectedBehaviour: "The panel and the page render from one shared content component, so their fields match by construction. The standalone page exists because a panel cannot be bookmarked or sent to someone — and an order is exactly the record a seller needs to share.",
175
+ expectedUiState: "Both surfaces show the same fields and sections with the same values. The standalone page survives a reload on the same order. A field in one and not the other means a second copy of the content component has appeared and the two will drift.",
176
+ endResult: "Read-only; nothing persists.",
177
+ },
178
+ "checklist-selling-seller-orders-seller-new-order-notification-reaches-seller": {
179
+ roles: ["buyer", "seller"],
180
+ startPage: "/products/product-beyblade-burst-valkyrie",
181
+ steps: [
182
+ "Sign in as rehan.sheikh@gmail.com / TempPass123!.",
183
+ "Add product-beyblade-burst-valkyrie (₹999, Beyblade Arena) to the cart.",
184
+ "Open /checkout, select the first saved address, choose Cash on Delivery, and place the order.",
185
+ "Sign out and sign in as tyson@beybladearena.in / TempPass123!, who owns that store.",
186
+ "Open /store and read the notification bell.",
187
+ "Open the notification list, read the newest entry's title and body, and click it.",
188
+ "Read where it lands.",
189
+ ],
190
+ inputs: { productId: "product-beyblade-burst-valkyrie", paymentMethod: "Cash on Delivery" },
191
+ expectedBehaviour: "A new order notifies the store that received it. The audience is a property of the EVENT, not of the person — the same account is a buyer elsewhere, so the notification has to be addressed to the store portal rather than to whichever dashboard the user happens to open.",
192
+ expectedUiState: "The bell shows an unread count and the newest entry names the new order with a readable body. Clicking it opens that order in the STORE portal, not the buyer's own order page.",
193
+ endResult: "The order exists and the notification survives a reload. No notification at all means the hook did not fire; one landing in the buyer portal means the audience was resolved from the person rather than the event.",
194
+ },
195
+ };
@@ -0,0 +1,2 @@
1
+ import type { AuthoredCase } from "./_types";
2
+ export declare const authored: Record<string, AuthoredCase>;