@mohasinac/appkit 4.34.1 → 4.35.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (243) hide show
  1. package/dist/_internal/client/features/lottery/LotteryAdminEditView.js +32 -2
  2. package/dist/features/auth/actions/profile-actions.d.ts +14 -1
  3. package/dist/features/auth/actions/profile-actions.js +16 -2
  4. package/dist/features/tester/components/TesterChecklistStepRow.d.ts +9 -1
  5. package/dist/features/tester/components/TesterChecklistStepRow.js +31 -2
  6. package/dist/features/tester/components/TesterHubView.js +8 -0
  7. package/dist/features/tester/schemas/firestore.d.ts +109 -0
  8. package/dist/features/tester/schemas/firestore.js +14 -0
  9. package/dist/features/tester/seed-data/_money-flows.d.ts +23 -0
  10. package/dist/features/tester/seed-data/_money-flows.js +430 -0
  11. package/dist/features/tester/seed-data/authored/_types.d.ts +33 -0
  12. package/dist/features/tester/seed-data/authored/_types.js +35 -0
  13. package/dist/features/tester/seed-data/authored/account-auth__profile-settings.d.ts +2 -0
  14. package/dist/features/tester/seed-data/authored/account-auth__profile-settings.js +207 -0
  15. package/dist/features/tester/seed-data/authored/account-auth__signup-login.d.ts +2 -0
  16. package/dist/features/tester/seed-data/authored/account-auth__signup-login.js +298 -0
  17. package/dist/features/tester/seed-data/authored/account-auth__testing-program--admin.d.ts +2 -0
  18. package/dist/features/tester/seed-data/authored/account-auth__testing-program--admin.js +33 -0
  19. package/dist/features/tester/seed-data/authored/account-auth__testing-program.d.ts +2 -0
  20. package/dist/features/tester/seed-data/authored/account-auth__testing-program.js +138 -0
  21. package/dist/features/tester/seed-data/authored/addresses__address-filters.d.ts +2 -0
  22. package/dist/features/tester/seed-data/authored/addresses__address-filters.js +36 -0
  23. package/dist/features/tester/seed-data/authored/addresses__postal-lookup.d.ts +2 -0
  24. package/dist/features/tester/seed-data/authored/addresses__postal-lookup.js +75 -0
  25. package/dist/features/tester/seed-data/authored/addresses__postal-validation.d.ts +2 -0
  26. package/dist/features/tester/seed-data/authored/addresses__postal-validation.js +72 -0
  27. package/dist/features/tester/seed-data/authored/addresses__state-picker.d.ts +2 -0
  28. package/dist/features/tester/seed-data/authored/addresses__state-picker.js +54 -0
  29. package/dist/features/tester/seed-data/authored/addresses__unban-request.d.ts +2 -0
  30. package/dist/features/tester/seed-data/authored/addresses__unban-request.js +39 -0
  31. package/dist/features/tester/seed-data/authored/admin__bans-and-trust.d.ts +2 -0
  32. package/dist/features/tester/seed-data/authored/admin__bans-and-trust.js +226 -0
  33. package/dist/features/tester/seed-data/authored/admin__blog-faqs.d.ts +2 -0
  34. package/dist/features/tester/seed-data/authored/admin__blog-faqs.js +82 -0
  35. package/dist/features/tester/seed-data/authored/admin__bulk-actions.d.ts +2 -0
  36. package/dist/features/tester/seed-data/authored/admin__bulk-actions.js +177 -0
  37. package/dist/features/tester/seed-data/authored/admin__bundles.d.ts +2 -0
  38. package/dist/features/tester/seed-data/authored/admin__bundles.js +97 -0
  39. package/dist/features/tester/seed-data/authored/admin__buyer-data-admin.d.ts +2 -0
  40. package/dist/features/tester/seed-data/authored/admin__buyer-data-admin.js +232 -0
  41. package/dist/features/tester/seed-data/authored/admin__catalog-listings.d.ts +2 -0
  42. package/dist/features/tester/seed-data/authored/admin__catalog-listings.js +306 -0
  43. package/dist/features/tester/seed-data/authored/admin__category-brand-authoring.d.ts +2 -0
  44. package/dist/features/tester/seed-data/authored/admin__category-brand-authoring.js +158 -0
  45. package/dist/features/tester/seed-data/authored/admin__classifieds-digitalcodes-live.d.ts +2 -0
  46. package/dist/features/tester/seed-data/authored/admin__classifieds-digitalcodes-live.js +78 -0
  47. package/dist/features/tester/seed-data/authored/admin__content-deletes.d.ts +2 -0
  48. package/dist/features/tester/seed-data/authored/admin__content-deletes.js +261 -0
  49. package/dist/features/tester/seed-data/authored/admin__content-marketing.d.ts +2 -0
  50. package/dist/features/tester/seed-data/authored/admin__content-marketing.js +151 -0
  51. package/dist/features/tester/seed-data/authored/admin__coupons.d.ts +2 -0
  52. package/dist/features/tester/seed-data/authored/admin__coupons.js +214 -0
  53. package/dist/features/tester/seed-data/authored/admin__events-raffles-spin.d.ts +2 -0
  54. package/dist/features/tester/seed-data/authored/admin__events-raffles-spin.js +160 -0
  55. package/dist/features/tester/seed-data/authored/admin__media-watermark.d.ts +2 -0
  56. package/dist/features/tester/seed-data/authored/admin__media-watermark.js +104 -0
  57. package/dist/features/tester/seed-data/authored/admin__orders-fulfillment.d.ts +2 -0
  58. package/dist/features/tester/seed-data/authored/admin__orders-fulfillment.js +350 -0
  59. package/dist/features/tester/seed-data/authored/admin__prize-draws-lotteries.d.ts +2 -0
  60. package/dist/features/tester/seed-data/authored/admin__prize-draws-lotteries.js +105 -0
  61. package/dist/features/tester/seed-data/authored/admin__site-system.d.ts +2 -0
  62. package/dist/features/tester/seed-data/authored/admin__site-system.js +590 -0
  63. package/dist/features/tester/seed-data/authored/admin__uncovered-admin-pages.d.ts +2 -0
  64. package/dist/features/tester/seed-data/authored/admin__uncovered-admin-pages.js +235 -0
  65. package/dist/features/tester/seed-data/authored/admin__users-trust.d.ts +2 -0
  66. package/dist/features/tester/seed-data/authored/admin__users-trust.js +569 -0
  67. package/dist/features/tester/seed-data/authored/buying__bidding.d.ts +2 -0
  68. package/dist/features/tester/seed-data/authored/buying__bidding.js +417 -0
  69. package/dist/features/tester/seed-data/authored/buying__browsing-search.d.ts +2 -0
  70. package/dist/features/tester/seed-data/authored/buying__browsing-search.js +653 -0
  71. package/dist/features/tester/seed-data/authored/buying__buying-checkout.d.ts +2 -0
  72. package/dist/features/tester/seed-data/authored/buying__buying-checkout.js +533 -0
  73. package/dist/features/tester/seed-data/authored/buying__buying-coupons.d.ts +2 -0
  74. package/dist/features/tester/seed-data/authored/buying__buying-coupons.js +379 -0
  75. package/dist/features/tester/seed-data/authored/buying__cart.d.ts +2 -0
  76. package/dist/features/tester/seed-data/authored/buying__cart.js +1171 -0
  77. package/dist/features/tester/seed-data/authored/buying__image-tile-layout.d.ts +2 -0
  78. package/dist/features/tester/seed-data/authored/buying__image-tile-layout.js +140 -0
  79. package/dist/features/tester/seed-data/authored/buying__my-orders.d.ts +2 -0
  80. package/dist/features/tester/seed-data/authored/buying__my-orders.js +257 -0
  81. package/dist/features/tester/seed-data/authored/buying__offers.d.ts +2 -0
  82. package/dist/features/tester/seed-data/authored/buying__offers.js +1111 -0
  83. package/dist/features/tester/seed-data/authored/buying__order-status-lifecycle.d.ts +2 -0
  84. package/dist/features/tester/seed-data/authored/buying__order-status-lifecycle.js +252 -0
  85. package/dist/features/tester/seed-data/authored/buying__product-detail.d.ts +2 -0
  86. package/dist/features/tester/seed-data/authored/buying__product-detail.js +387 -0
  87. package/dist/features/tester/seed-data/authored/buying__return-request.d.ts +2 -0
  88. package/dist/features/tester/seed-data/authored/buying__return-request.js +152 -0
  89. package/dist/features/tester/seed-data/authored/buying__reviews-pagination.d.ts +2 -0
  90. package/dist/features/tester/seed-data/authored/buying__reviews-pagination.js +242 -0
  91. package/dist/features/tester/seed-data/authored/buying__reviews.d.ts +2 -0
  92. package/dist/features/tester/seed-data/authored/buying__reviews.js +113 -0
  93. package/dist/features/tester/seed-data/authored/buying__user-dashboard-extras.d.ts +2 -0
  94. package/dist/features/tester/seed-data/authored/buying__user-dashboard-extras.js +283 -0
  95. package/dist/features/tester/seed-data/authored/buying__user-dashboard-navigation.d.ts +2 -0
  96. package/dist/features/tester/seed-data/authored/buying__user-dashboard-navigation.js +167 -0
  97. package/dist/features/tester/seed-data/authored/buying__user-uncovered-pages.d.ts +2 -0
  98. package/dist/features/tester/seed-data/authored/buying__user-uncovered-pages.js +90 -0
  99. package/dist/features/tester/seed-data/authored/buying__wishlist-history.d.ts +2 -0
  100. package/dist/features/tester/seed-data/authored/buying__wishlist-history.js +344 -0
  101. package/dist/features/tester/seed-data/authored/community-support__public-profile.d.ts +2 -0
  102. package/dist/features/tester/seed-data/authored/community-support__public-profile.js +53 -0
  103. package/dist/features/tester/seed-data/authored/community-support__support-tickets.d.ts +2 -0
  104. package/dist/features/tester/seed-data/authored/community-support__support-tickets.js +76 -0
  105. package/dist/features/tester/seed-data/authored/content-discovery__blog.d.ts +2 -0
  106. package/dist/features/tester/seed-data/authored/content-discovery__blog.js +93 -0
  107. package/dist/features/tester/seed-data/authored/content-discovery__category-brand-relations.d.ts +2 -0
  108. package/dist/features/tester/seed-data/authored/content-discovery__category-brand-relations.js +149 -0
  109. package/dist/features/tester/seed-data/authored/content-discovery__coupons.d.ts +2 -0
  110. package/dist/features/tester/seed-data/authored/content-discovery__coupons.js +121 -0
  111. package/dist/features/tester/seed-data/authored/content-discovery__event-participation.d.ts +2 -0
  112. package/dist/features/tester/seed-data/authored/content-discovery__event-participation.js +207 -0
  113. package/dist/features/tester/seed-data/authored/content-discovery__events.d.ts +2 -0
  114. package/dist/features/tester/seed-data/authored/content-discovery__events.js +318 -0
  115. package/dist/features/tester/seed-data/authored/content-discovery__faq-help.d.ts +2 -0
  116. package/dist/features/tester/seed-data/authored/content-discovery__faq-help.js +65 -0
  117. package/dist/features/tester/seed-data/authored/content-discovery__notifications.d.ts +2 -0
  118. package/dist/features/tester/seed-data/authored/content-discovery__notifications.js +147 -0
  119. package/dist/features/tester/seed-data/authored/content-discovery__search.d.ts +2 -0
  120. package/dist/features/tester/seed-data/authored/content-discovery__search.js +332 -0
  121. package/dist/features/tester/seed-data/authored/cta-layout__checkout-bottom-bar.d.ts +2 -0
  122. package/dist/features/tester/seed-data/authored/cta-layout__checkout-bottom-bar.js +53 -0
  123. package/dist/features/tester/seed-data/authored/cta-layout__dialog-footers.d.ts +2 -0
  124. package/dist/features/tester/seed-data/authored/cta-layout__dialog-footers.js +52 -0
  125. package/dist/features/tester/seed-data/authored/cta-layout__editor-action-bar.d.ts +2 -0
  126. package/dist/features/tester/seed-data/authored/cta-layout__editor-action-bar.js +35 -0
  127. package/dist/features/tester/seed-data/authored/cta-layout__navbar-ctas.d.ts +2 -0
  128. package/dist/features/tester/seed-data/authored/cta-layout__navbar-ctas.js +141 -0
  129. package/dist/features/tester/seed-data/authored/cta-layout__product-bottom-bar.d.ts +2 -0
  130. package/dist/features/tester/seed-data/authored/cta-layout__product-bottom-bar.js +35 -0
  131. package/dist/features/tester/seed-data/authored/design-ux__back-to-top-button.d.ts +2 -0
  132. package/dist/features/tester/seed-data/authored/design-ux__back-to-top-button.js +95 -0
  133. package/dist/features/tester/seed-data/authored/design-ux__carousel-arrow-bounds.d.ts +2 -0
  134. package/dist/features/tester/seed-data/authored/design-ux__carousel-arrow-bounds.js +191 -0
  135. package/dist/features/tester/seed-data/authored/design-ux__dashboard-layout.d.ts +2 -0
  136. package/dist/features/tester/seed-data/authored/design-ux__dashboard-layout.js +158 -0
  137. package/dist/features/tester/seed-data/authored/design-ux__footer-theme.d.ts +2 -0
  138. package/dist/features/tester/seed-data/authored/design-ux__footer-theme.js +106 -0
  139. package/dist/features/tester/seed-data/authored/design-ux__form-validation-errors.d.ts +2 -0
  140. package/dist/features/tester/seed-data/authored/design-ux__form-validation-errors.js +88 -0
  141. package/dist/features/tester/seed-data/authored/design-ux__general-design.d.ts +2 -0
  142. package/dist/features/tester/seed-data/authored/design-ux__general-design.js +204 -0
  143. package/dist/features/tester/seed-data/authored/design-ux__hand-mode-layout.d.ts +2 -0
  144. package/dist/features/tester/seed-data/authored/design-ux__hand-mode-layout.js +301 -0
  145. package/dist/features/tester/seed-data/authored/design-ux__homepage-carousels.d.ts +2 -0
  146. package/dist/features/tester/seed-data/authored/design-ux__homepage-carousels.js +407 -0
  147. package/dist/features/tester/seed-data/authored/design-ux__status-badge-legibility.d.ts +2 -0
  148. package/dist/features/tester/seed-data/authored/design-ux__status-badge-legibility.js +214 -0
  149. package/dist/features/tester/seed-data/authored/design-ux__sticky-cta-bar.d.ts +2 -0
  150. package/dist/features/tester/seed-data/authored/design-ux__sticky-cta-bar.js +275 -0
  151. package/dist/features/tester/seed-data/authored/index.d.ts +2 -0
  152. package/dist/features/tester/seed-data/authored/index.js +237 -0
  153. package/dist/features/tester/seed-data/authored/page-wiring__data-loss.d.ts +2 -0
  154. package/dist/features/tester/seed-data/authored/page-wiring__data-loss.js +102 -0
  155. package/dist/features/tester/seed-data/authored/page-wiring__detail-pages.d.ts +2 -0
  156. package/dist/features/tester/seed-data/authored/page-wiring__detail-pages.js +50 -0
  157. package/dist/features/tester/seed-data/authored/page-wiring__drawer-pages.d.ts +2 -0
  158. package/dist/features/tester/seed-data/authored/page-wiring__drawer-pages.js +66 -0
  159. package/dist/features/tester/seed-data/authored/page-wiring__reachability.d.ts +2 -0
  160. package/dist/features/tester/seed-data/authored/page-wiring__reachability.js +115 -0
  161. package/dist/features/tester/seed-data/authored/public-pages__auth-error-pages.d.ts +2 -0
  162. package/dist/features/tester/seed-data/authored/public-pages__auth-error-pages.js +136 -0
  163. package/dist/features/tester/seed-data/authored/public-pages__bug-hunters.d.ts +2 -0
  164. package/dist/features/tester/seed-data/authored/public-pages__bug-hunters.js +69 -0
  165. package/dist/features/tester/seed-data/authored/public-pages__core-listing-pages.d.ts +2 -0
  166. package/dist/features/tester/seed-data/authored/public-pages__core-listing-pages.js +263 -0
  167. package/dist/features/tester/seed-data/authored/public-pages__help-how-it-works.d.ts +2 -0
  168. package/dist/features/tester/seed-data/authored/public-pages__help-how-it-works.js +102 -0
  169. package/dist/features/tester/seed-data/authored/public-pages__help-scams-guides-subpages.d.ts +2 -0
  170. package/dist/features/tester/seed-data/authored/public-pages__help-scams-guides-subpages.js +234 -0
  171. package/dist/features/tester/seed-data/authored/public-pages__legal-policy-pages.d.ts +2 -0
  172. package/dist/features/tester/seed-data/authored/public-pages__legal-policy-pages.js +126 -0
  173. package/dist/features/tester/seed-data/authored/public-pages__stores-sellers-directories.d.ts +2 -0
  174. package/dist/features/tester/seed-data/authored/public-pages__stores-sellers-directories.js +255 -0
  175. package/dist/features/tester/seed-data/authored/search-and-nav__employee-permissions.d.ts +2 -0
  176. package/dist/features/tester/seed-data/authored/search-and-nav__employee-permissions.js +59 -0
  177. package/dist/features/tester/seed-data/authored/search-and-nav__header-search.d.ts +2 -0
  178. package/dist/features/tester/seed-data/authored/search-and-nav__header-search.js +88 -0
  179. package/dist/features/tester/seed-data/authored/search-and-nav__settings-deep-links.d.ts +2 -0
  180. package/dist/features/tester/seed-data/authored/search-and-nav__settings-deep-links.js +51 -0
  181. package/dist/features/tester/seed-data/authored/search-and-nav__sidebar-search.d.ts +2 -0
  182. package/dist/features/tester/seed-data/authored/search-and-nav__sidebar-search.js +35 -0
  183. package/dist/features/tester/seed-data/authored/selling__become-seller.d.ts +2 -0
  184. package/dist/features/tester/seed-data/authored/selling__become-seller.js +94 -0
  185. package/dist/features/tester/seed-data/authored/selling__final-sale-authoring.d.ts +2 -0
  186. package/dist/features/tester/seed-data/authored/selling__final-sale-authoring.js +107 -0
  187. package/dist/features/tester/seed-data/authored/selling__listing-a-product.d.ts +2 -0
  188. package/dist/features/tester/seed-data/authored/selling__listing-a-product.js +285 -0
  189. package/dist/features/tester/seed-data/authored/selling__listing-lifecycle.d.ts +2 -0
  190. package/dist/features/tester/seed-data/authored/selling__listing-lifecycle.js +326 -0
  191. package/dist/features/tester/seed-data/authored/selling__listing-type-fields-roundtrip.d.ts +2 -0
  192. package/dist/features/tester/seed-data/authored/selling__listing-type-fields-roundtrip.js +136 -0
  193. package/dist/features/tester/seed-data/authored/selling__media-limits.d.ts +2 -0
  194. package/dist/features/tester/seed-data/authored/selling__media-limits.js +128 -0
  195. package/dist/features/tester/seed-data/authored/selling__sectionised-forms.d.ts +2 -0
  196. package/dist/features/tester/seed-data/authored/selling__sectionised-forms.js +167 -0
  197. package/dist/features/tester/seed-data/authored/selling__seller-analytics-payouts.d.ts +2 -0
  198. package/dist/features/tester/seed-data/authored/selling__seller-analytics-payouts.js +117 -0
  199. package/dist/features/tester/seed-data/authored/selling__seller-bids-bundles-filters.d.ts +2 -0
  200. package/dist/features/tester/seed-data/authored/selling__seller-bids-bundles-filters.js +88 -0
  201. package/dist/features/tester/seed-data/authored/selling__seller-catalog-org.d.ts +2 -0
  202. package/dist/features/tester/seed-data/authored/selling__seller-catalog-org.js +151 -0
  203. package/dist/features/tester/seed-data/authored/selling__seller-custom-brands.d.ts +2 -0
  204. package/dist/features/tester/seed-data/authored/selling__seller-custom-brands.js +105 -0
  205. package/dist/features/tester/seed-data/authored/selling__seller-guide.d.ts +2 -0
  206. package/dist/features/tester/seed-data/authored/selling__seller-guide.js +33 -0
  207. package/dist/features/tester/seed-data/authored/selling__seller-listing-types.d.ts +2 -0
  208. package/dist/features/tester/seed-data/authored/selling__seller-listing-types.js +347 -0
  209. package/dist/features/tester/seed-data/authored/selling__seller-marketing-extras.d.ts +2 -0
  210. package/dist/features/tester/seed-data/authored/selling__seller-marketing-extras.js +166 -0
  211. package/dist/features/tester/seed-data/authored/selling__seller-ops-comms.d.ts +2 -0
  212. package/dist/features/tester/seed-data/authored/selling__seller-ops-comms.js +89 -0
  213. package/dist/features/tester/seed-data/authored/selling__seller-orders.d.ts +2 -0
  214. package/dist/features/tester/seed-data/authored/selling__seller-orders.js +195 -0
  215. package/dist/features/tester/seed-data/authored/selling__seller-shipping-payouts-setup.d.ts +2 -0
  216. package/dist/features/tester/seed-data/authored/selling__seller-shipping-payouts-setup.js +180 -0
  217. package/dist/features/tester/seed-data/authored/selling__store-dashboard-navigation.d.ts +2 -0
  218. package/dist/features/tester/seed-data/authored/selling__store-dashboard-navigation.js +164 -0
  219. package/dist/features/tester/seed-data/authored/selling__store-uncovered-pages.d.ts +2 -0
  220. package/dist/features/tester/seed-data/authored/selling__store-uncovered-pages.js +116 -0
  221. package/dist/features/tester/seed-data/authored/seo__canonical-and-host.d.ts +2 -0
  222. package/dist/features/tester/seed-data/authored/seo__canonical-and-host.js +111 -0
  223. package/dist/features/tester/seed-data/authored/seo__og-images.d.ts +2 -0
  224. package/dist/features/tester/seed-data/authored/seo__og-images.js +91 -0
  225. package/dist/features/tester/seed-data/authored/seo__page-metadata.d.ts +2 -0
  226. package/dist/features/tester/seed-data/authored/seo__page-metadata.js +122 -0
  227. package/dist/features/tester/seed-data/authored/seo__sitemap-and-robots.d.ts +2 -0
  228. package/dist/features/tester/seed-data/authored/seo__sitemap-and-robots.js +105 -0
  229. package/dist/features/tester/seed-data/carts-tester-seed-data.d.ts +3 -0
  230. package/dist/features/tester/seed-data/carts-tester-seed-data.js +70 -0
  231. package/dist/features/tester/seed-data/index.d.ts +1 -0
  232. package/dist/features/tester/seed-data/index.js +1 -0
  233. package/dist/features/tester/seed-data/tester-checklist-seed-data.js +744 -1
  234. package/dist/seed/carousel-slides-seed-data.js +1 -1
  235. package/dist/seed/cart-seed-data.js +11 -0
  236. package/dist/seed/index.d.ts +1 -1
  237. package/dist/seed/index.js +1 -1
  238. package/dist/seed/manifest.js +2 -2
  239. package/dist/seed/notifications-seed-data.js +5 -1
  240. package/dist/seed/products-standard-seed-data.js +2 -2
  241. package/dist/seed/reviews-seed-data.js +6 -1
  242. package/package.json +1 -1
  243. package/scripts/seed-cli.mjs +752 -746
@@ -0,0 +1,283 @@
1
+ /*
2
+ * WHY: Authored six-part procedures for the buying/user-dashboard-extras page.
3
+ * WHAT: 15 case(s), keyed by full checklist id.
4
+ *
5
+ * Written by hand, case by case, against the label each one states. There is no
6
+ * generator: the authoring scripts were deleted once it was clear they were
7
+ * scaffolding around work that is simply writing.
8
+ *
9
+ * 🛑 SIX CASES HERE ARE ABOUT THE ORDER TIMELINE, and they turn on two rules that
10
+ * are easy to get backwards.
11
+ *
12
+ * A step with no recorded date renders an em-dash. Not the current time, and not
13
+ * a proxy field — the record's last-updated value means "last write of any kind"
14
+ * and an expiry date is a deadline, not an event. A fabricated timestamp cannot be
15
+ * told from a real one afterwards, which makes it worse than a missing one.
16
+ *
17
+ * And money churn is deliberately NOT in the timeline. Only the final coupon and
18
+ * add-on state is kept, on the order itself. A coupon that lapsed before the order
19
+ * existed is not that order's history, and pricing noise would exhaust the
20
+ * fifty-entry cap within days and bury the handful of transitions anyone reads.
21
+ *
22
+ * @tag domain:tester
23
+ * @tag layer:seed
24
+ * @tag pattern:none
25
+ * @tag access:server-only
26
+ * @tag consumers:seed-data/authored/index.ts
27
+ * @tag sideEffects:none
28
+ */
29
+ export const authored = {
30
+ "checklist-buying-user-dashboard-extras-addresses-crud": {
31
+ roles: ["buyer"],
32
+ startPage: "/user/addresses",
33
+ steps: [
34
+ "Sign in as rehan.sheikh@gmail.com / TempPass123!.",
35
+ "Open /user/addresses and read the existing addresses.",
36
+ "Create one: 'QA Address dashboard-extras', '15 Test Lane', Indore, Madhya Pradesh, 452010, landmark 'Opposite the arena'.",
37
+ "Save, RELOAD, and read every field including the landmark.",
38
+ "Edit ONLY the street to '16 Test Lane', save, RELOAD, and read every field again.",
39
+ "Set it as the default, save, RELOAD, and check exactly one address is default.",
40
+ "Delete it and RELOAD to confirm.",
41
+ ],
42
+ inputs: {
43
+ name: "QA Address dashboard-extras",
44
+ streetBefore: "15 Test Lane",
45
+ streetAfter: "16 Test Lane",
46
+ landmark: "Opposite the arena",
47
+ },
48
+ expectedBehaviour: "Create, edit, default-set and delete all persist, and an edit to one field leaves the rest alone. Setting a default must unset the previous one — two defaults is a state nothing downstream can resolve. The landmark is the field to watch: a form that cannot name it sends undefined, and undefined overwrites.",
49
+ expectedUiState: "After each reload the address holds exactly what was typed, landmark included, and after the street edit the landmark is still there. Exactly one address is marked default.",
50
+ expectedData: { defaultAddressCount: 1 },
51
+ endResult: "The address is deleted by the final step.",
52
+ },
53
+ "checklist-buying-user-dashboard-extras-catalogue-crud": {
54
+ roles: ["buyer"],
55
+ startPage: "/user",
56
+ steps: [
57
+ "Sign in as rehan.sheikh@gmail.com / TempPass123!.",
58
+ "Open the personal catalogue surface and read the existing items.",
59
+ "Create one titled 'QA Catalogue dashboard-extras' with a description and public/test-media/sample-image.png attached.",
60
+ "Save, RELOAD, and read every field including the photo.",
61
+ "Set it to public, save, and open /profile/user-yugi-muto in a private window.",
62
+ "Find it under the Catalogue tab and open its own public page.",
63
+ "Set it back to private and check it disappears from the public profile.",
64
+ "Delete the item.",
65
+ ],
66
+ inputs: {
67
+ title: "QA Catalogue dashboard-extras",
68
+ image: "public/test-media/sample-image.png",
69
+ },
70
+ expectedBehaviour: "A personal catalogue item is a private photo record of something the buyer owns, optionally published. It is NOT a listing type — it lives in its own feature with its own id prefix, and its public visibility is a per-item choice rather than a consequence of creating it.",
71
+ expectedUiState: "After the reload every field holds and the photo renders. Set public, the item appears on the owner's public profile Catalogue tab and has its own page. Set private, it disappears from the public profile.",
72
+ endResult: "The item is deleted by the final step.",
73
+ },
74
+ "checklist-buying-user-dashboard-extras-settings-page": {
75
+ roles: ["buyer"],
76
+ startPage: "/user/settings",
77
+ steps: [
78
+ "Sign in as rehan.sheikh@gmail.com / TempPass123!.",
79
+ "Open /user/settings and read every tab in the strip.",
80
+ "Open each tab and check it renders its fields rather than an empty panel.",
81
+ "Note one distinctive value from each tab.",
82
+ "Change one field on one tab and save.",
83
+ "RELOAD and walk every tab, comparing each noted value.",
84
+ "Restore the changed field.",
85
+ ],
86
+ expectedBehaviour: "Every tab renders, and saving one tab leaves the others untouched. A form that submits its whole object from state populated only by the tabs the user opened blanks the rest — and the save reports success either way, so only the reload shows it.",
87
+ expectedUiState: "All tabs render fields. After the reload only the edited field differs and every other noted value is unchanged. A tab that opens empty, or a value silently reset, are both findings.",
88
+ expectedData: { unintendedFieldChanges: 0 },
89
+ endResult: "The changed field is restored.",
90
+ },
91
+ "checklist-buying-user-dashboard-extras-my-prize-draws": {
92
+ roles: ["buyer"],
93
+ startPage: "/user",
94
+ steps: [
95
+ "Sign in as tester@letitrip.in / TempPass123!.",
96
+ "Open the buyer's prize-draws surface and read every row.",
97
+ "Check each names the draw, the number of entries bought and the outcome.",
98
+ "Find an entry in a REVEALED draw and read the prize it names.",
99
+ "Find an entry in a draw that has not yet been drawn and read what it shows.",
100
+ "Open one entry and check it reaches the draw or the order behind it.",
101
+ "Compare a revealed prize against the same prize on the order page.",
102
+ ],
103
+ expectedBehaviour: "The list shows what was entered and what came of it. A pending draw and a revealed one are different states and must read differently — a pending entry shown as though it lost, or a revealed one shown as pending, are both wrong and neither errors.",
104
+ expectedUiState: "Rows name the draw, the entry count and either the assigned prize or a pending state. The prize matches what the order page shows. Rows open something rather than being inert.",
105
+ endResult: "Read-only; nothing persists.",
106
+ },
107
+ "checklist-buying-user-dashboard-extras-my-digital-codes": {
108
+ roles: ["buyer"],
109
+ startPage: "/user",
110
+ steps: [
111
+ "Sign in as tester@letitrip.in / TempPass123!.",
112
+ "Open the buyer's digital-codes surface and read every row.",
113
+ "Check each names the listing it came from and shows its code or its delivery state.",
114
+ "Find an auto-claim purchase and read whether its code is present.",
115
+ "Find a manual-delivery purchase and read what it shows instead.",
116
+ "Use any copy control and paste the result somewhere to compare it against what is displayed.",
117
+ "Reload and check the codes are still there.",
118
+ ],
119
+ expectedBehaviour: "An auto-claim purchase shows its delivered code immediately; a manual-delivery one shows a pending state until the seller sends it. Any copy control must place exactly the displayed string on the clipboard — a truncated or differently-cased copy produces a redemption failure the buyer cannot explain.",
120
+ expectedUiState: "Auto-claim rows show a real code that survives a reload. Manual rows show a pending state rather than an empty cell. The copied value matches the displayed one character for character.",
121
+ endResult: "Read-only; nothing persists.",
122
+ },
123
+ "checklist-buying-user-dashboard-extras-my-offers": {
124
+ roles: ["buyer"],
125
+ startPage: "/user/offers",
126
+ steps: [
127
+ "Sign in as vivaan.kapoor@gmail.com / TempPass123!.",
128
+ "Open /user/offers and read every row — product, offered amount, listed price, status and round.",
129
+ "Read every status filter offered and select each, noting any that returns nothing.",
130
+ "For each empty filter, check the unfiltered list for rows of that status.",
131
+ "Find an offer that was countered and read how its round is shown.",
132
+ "Open one offer and read its detail.",
133
+ "Check at least one row action is a view rather than only a mutation.",
134
+ ],
135
+ expectedBehaviour: "The list shows the negotiation state with enough context to act — the offered amount against the listed price is the whole point. A counter creates a NEW offer document per round, linked forwards and backwards and denormalised to the chain's root, so a row can say which round it is without extra reads.",
136
+ expectedUiState: "Rows show product, amounts, status and round. Every status filter returns its own rows or is empty with none unfiltered either — the real statuses include countered and withdrawn, and a chip reading 'Rejected' against a stored 'Declined' matches nothing forever. A view affordance exists.",
137
+ endResult: "Read-only; nothing persists beyond the URL.",
138
+ },
139
+ "checklist-buying-user-dashboard-extras-order-timeline-shows-real-events": {
140
+ roles: ["buyer"],
141
+ startPage: "/user/orders",
142
+ steps: [
143
+ "Sign in as tester@letitrip.in / TempPass123!.",
144
+ "Open /user/orders and open an order that has moved through several statuses.",
145
+ "Open its timeline and read every step in order.",
146
+ "Read the date and time against each step.",
147
+ "Check the steps the order has NOT reached are shown as upcoming rather than complete.",
148
+ "Check any step with no recorded date shows an em-dash rather than a date.",
149
+ "Compare one step's date against when that transition actually happened.",
150
+ ],
151
+ expectedBehaviour: "The timeline is built from the order's own recorded per-status dates. A step with no date renders an em-dash — never the current time, and never a proxy such as the record's last-updated value, which means 'last write of any kind' rather than when the step happened.",
152
+ expectedUiState: "Reached steps carry real dates, unreached steps read as upcoming, and any missing date is an em-dash. Every step carrying a plausible date on a recently-placed order is the fabrication failure, and it is indistinguishable from correct data afterwards.",
153
+ endResult: "Read-only; nothing persists.",
154
+ },
155
+ "checklist-buying-user-dashboard-extras-order-partial-refund-in-timeline": {
156
+ roles: ["buyer"],
157
+ startPage: "/user/orders",
158
+ steps: [
159
+ "Sign in as tester@letitrip.in / TempPass123!.",
160
+ "Open /user/orders and find an order that received a partial refund.",
161
+ "Open its timeline and look for an entry describing the refund.",
162
+ "Read whether the entry states the amount refunded.",
163
+ "Check the entry is not phrased as an array or a count changing.",
164
+ "Compare the refunded amount against the order's own refund total.",
165
+ ],
166
+ expectedBehaviour: "A partial refund changes no tracked status field, so a plain field-diff would leave no trace of it at all — the entry is contributed explicitly. Diffing the refunds collection instead was rejected because it renders as 'an array of one became an array of two', which is true and useless.",
167
+ expectedUiState: "The timeline holds an entry naming the refund and its amount, in readable language. An entry describing a list growing, or no entry at all for a refund that demonstrably happened, are both failures.",
168
+ endResult: "Read-only. If no partially-refunded order exists, answer null rather than creating one.",
169
+ },
170
+ "checklist-buying-user-dashboard-extras-order-auction-won-vs-bought-out": {
171
+ roles: ["buyer"],
172
+ startPage: "/user/orders",
173
+ steps: [
174
+ "Sign in as tester@letitrip.in / TempPass123!.",
175
+ "Open /user/orders and switch to the Auction wins tab.",
176
+ "Open an order that came from a WON auction and read what it says about how it was won.",
177
+ "Read whether it shows the winning bid and the number of competing bids.",
178
+ "Open an order that came from a BUY-NOW purchase on an auction and read the same.",
179
+ "Compare the two — check they are described differently.",
180
+ "Check the buy-now order's bid count is not assumed to be zero.",
181
+ ],
182
+ expectedBehaviour: "A settled win and a buyout are both auction orders but different provenance, and the order records which. A buyout is a REAL bid: it is placed as a bid, leaves the auction live, and the count it records is the competitive bids it beat — so a buyout order asserting zero bids by definition is wrong.",
183
+ expectedUiState: "The won order names the winning bid and the competing bid count. The buy-now order is described as a buyout rather than as a win, and its bid count reflects the bids that existed rather than being fixed at zero.",
184
+ endResult: "Read-only; nothing persists.",
185
+ },
186
+ "checklist-buying-user-dashboard-extras-order-offer-shows-what-was-saved": {
187
+ roles: ["buyer"],
188
+ startPage: "/user/orders",
189
+ steps: [
190
+ "Sign in as vivaan.kapoor@gmail.com / TempPass123!.",
191
+ "Open /user/orders and switch to the Offer wins tab.",
192
+ "Open an order that came from an accepted offer.",
193
+ "Read the price charged and the listing's original price.",
194
+ "Check the order states what was saved rather than only the amount paid.",
195
+ "Compare the charged price against the offer's agreed amount.",
196
+ ],
197
+ expectedBehaviour: "An offer order records the agreed price and the listed price it was negotiated down from. The charged figure must be the AGREED one — the rule that decides a line's price knows about locked prices, and three hand-written copies of that rule elsewhere omitted that branch, so the gateway captured the list price while the cart showed the agreed one.",
198
+ expectedUiState: "The order shows the agreed price as charged, the original listed price, and the difference. A charged amount equal to the listing price is the copied-rule failure, and the two figures never appear on the same screen anywhere else.",
199
+ endResult: "Read-only; nothing persists.",
200
+ },
201
+ "checklist-buying-user-dashboard-extras-order-history-no-money-churn": {
202
+ roles: ["buyer"],
203
+ startPage: "/user/orders",
204
+ steps: [
205
+ "Sign in as tester@letitrip.in / TempPass123!.",
206
+ "Open an order that had coupons applied and add-ons selected.",
207
+ "Open its timeline and read every entry.",
208
+ "Look for entries describing coupons being applied or removed, or add-on fees changing.",
209
+ "Count the entries in total.",
210
+ "Read the order's own summary and check the final coupon and add-on state is shown there instead.",
211
+ ],
212
+ expectedBehaviour: "Pricing churn is deliberately absent from the timeline. Only the FINAL coupon and add-on state is kept, and it lives on the order itself — a coupon that lapsed before the order existed is not that order's history, and pricing noise would exhaust the fifty-entry cap within days and bury the handful of transitions anyone actually reads.",
213
+ expectedUiState: "The timeline holds status transitions and refunds, and no entries about coupons being applied or removed. The order's summary shows the final applied discounts and add-ons. A timeline full of pricing entries is the failure.",
214
+ expectedData: { pricingEntriesInTimeline: 0 },
215
+ endResult: "Read-only; nothing persists.",
216
+ },
217
+ "checklist-buying-user-dashboard-extras-order-history-carries-no-personal-data": {
218
+ roles: ["buyer"],
219
+ startPage: "/user/orders",
220
+ steps: [
221
+ "Sign in as tester@letitrip.in / TempPass123!.",
222
+ "Open an order and open its timeline.",
223
+ "Read every entry for a name, an email address or a phone number.",
224
+ "Read how the actor of each change is identified.",
225
+ "Open the browser's View Source and search the page for an email address.",
226
+ "Check any actor shown is an identifier rather than a person's name.",
227
+ ],
228
+ expectedBehaviour: "History entries carry no personal data, and this is enforced where the entry is built rather than by convention. The encryption pass is a flat top-level loop that never descends into arrays — so a name or email nested inside a history entry would be stored in PLAINTEXT and never decrypted on the way out, which is why the primitive scrubs those fields itself.",
229
+ expectedUiState: "No entry contains a name, email or phone. Actors are identifiers. Neither the rendered timeline nor the page source contains an email address.",
230
+ expectedData: { piiInTimeline: 0 },
231
+ endResult: "Read-only. A convention saying 'do not put PII in history' is one forgetful writer away from a plaintext leak, which is why this is checked rather than assumed.",
232
+ },
233
+ "checklist-buying-user-dashboard-extras-my-returns": {
234
+ roles: ["buyer"],
235
+ startPage: "/user",
236
+ steps: [
237
+ "Sign in as tester@letitrip.in / TempPass123!.",
238
+ "Open the buyer's returns surface and read every row.",
239
+ "Check each names the item, the order and the reason given.",
240
+ "Read every status filter offered and select each.",
241
+ "Open one return and read the full reason and any admin response.",
242
+ "Check the returned order also appears under the ACTIVE scope on /user/orders.",
243
+ ],
244
+ expectedBehaviour: "Returns are a view over orders rather than a separate entity — a return is an order status. That is why a return-requested order sits under Active on the orders list: it is an open item awaiting action, and filing it under Closed removes it from the list the buyer checks.",
245
+ expectedUiState: "Rows name the item, the order and the reason, and open to the full text. The same order appears under Active on /user/orders. A return-requested order under Closed is the finding.",
246
+ endResult: "Read-only; nothing persists beyond the URL.",
247
+ },
248
+ "checklist-buying-user-dashboard-extras-my-reviews": {
249
+ roles: ["buyer"],
250
+ startPage: "/user",
251
+ steps: [
252
+ "Sign in as rehan.sheikh@gmail.com / TempPass123!.",
253
+ "Open the buyer's reviews surface and read every row.",
254
+ "Check each names the product, the rating and the date.",
255
+ "Check any review photos render rather than showing placeholder icons.",
256
+ "Open one and check it can be edited.",
257
+ "Read whether any seller response is shown alongside.",
258
+ "Click a row and confirm it reaches the product or the review.",
259
+ ],
260
+ expectedBehaviour: "The buyer's own reviews are listed with their photos and any seller response. Review images are plain URL strings — a renderer expecting objects reads undefined off every one and falls back to a placeholder, which makes all the photos vanish at once rather than one being broken.",
261
+ expectedUiState: "Rows name the product, rating and date, photos render, and any seller response is visible. Rows reach the product or the review. Placeholder icons in place of every photo is the string-versus-object failure.",
262
+ expectedData: { placeholderPhotos: 0 },
263
+ endResult: "Read-only; nothing persists.",
264
+ },
265
+ "checklist-buying-user-dashboard-extras-user-personal-listings-search-sort": {
266
+ roles: ["buyer"],
267
+ startPage: "/user",
268
+ steps: [
269
+ "Sign in as rehan.sheikh@gmail.com / TempPass123!.",
270
+ "Open the personal catalogue surface and note the unfiltered item count.",
271
+ "Type a word from one item's title into the search box and read the results.",
272
+ "Clear it, type zzzznope, and read the count.",
273
+ "Read the sort dropdown's options and its default selection.",
274
+ "Check the default is one of the offered options.",
275
+ "Select each other option and check the order changes each time.",
276
+ ],
277
+ inputs: { nonsenseQuery: "zzzznope" },
278
+ expectedBehaviour: "Search narrows and every sort option reorders. The nonsense query is the control that separates a filtering search from a decorative one — a real term returns plausible rows either way. A default sort that is not among the offered options opens the dropdown blank, which this listing family has done before.",
279
+ expectedUiState: "The real term narrows the list; 'zzzznope' returns zero and an empty state rather than everything. The sort dropdown opens with one of its own options selected, and each option visibly reorders the items.",
280
+ expectedData: { nonsenseResultCount: 0, inertSortOptions: 0 },
281
+ endResult: "Read-only; nothing persists beyond the URL.",
282
+ },
283
+ };
@@ -0,0 +1,2 @@
1
+ import type { AuthoredCase } from "./_types";
2
+ export declare const authored: Record<string, AuthoredCase>;
@@ -0,0 +1,167 @@
1
+ /*
2
+ * WHY: Authored six-part procedures for the buying/user-dashboard-navigation 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 /user SUBTREE IS DIFFERENT FROM /admin AND /store. Its layout reads no
10
+ * session server-side — the guard is a client component — so these routes are
11
+ * PRERENDERED to a signed-out shell and the session hydrates in the browser. That
12
+ * shell is the same bytes for every visitor, which is what makes it safe, and it
13
+ * is also why the signed-out case watches for a flash rather than expecting an
14
+ * immediate server redirect.
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-buying-user-dashboard-navigation-sidebar-all-links-work": {
25
+ roles: ["buyer"],
26
+ startPage: "/user",
27
+ steps: [
28
+ "Sign in as rehan.sheikh@gmail.com / TempPass123!.",
29
+ "Open /user and expand every group in the sidebar.",
30
+ "Click each link in turn, reading where it lands and going back each time.",
31
+ "Write down any link that 404s, renders an empty shell, or lands somewhere unrelated.",
32
+ "Count the links against the pages that exist under /user.",
33
+ "Read whether a Testing group is present for this non-tester account.",
34
+ ],
35
+ expectedBehaviour: "Every sidebar link opens a real page with content. The inverse — a built page with no sidebar entry — is the same defect from the other side, and it is not mechanically blocked: around seventeen pages across the portals were once reachable only by typing their exact URL. The Testing group is injected at runtime for tester accounts and must be absent entirely for others rather than rendering as an empty heading.",
36
+ expectedUiState: "Every link resolves to a page with content, not a 404 and not chrome with an empty body. No Testing group appears for this account. Note any page you know exists that has no link — that half has to be spotted by eye.",
37
+ expectedData: { brokenLinks: 0 },
38
+ endResult: "Read-only; nothing persists.",
39
+ },
40
+ "checklist-buying-user-dashboard-navigation-sidebar-active-highlight": {
41
+ roles: ["buyer"],
42
+ startPage: "/user",
43
+ steps: [
44
+ "Sign in as rehan.sheikh@gmail.com / TempPass123!.",
45
+ "Open /user and note which sidebar entry is highlighted.",
46
+ "Navigate to /user/orders and read which entry is highlighted.",
47
+ "Open a specific order's detail and read the highlight again.",
48
+ "Navigate to /user/addresses and read it again.",
49
+ "Press the browser back button and read the highlight.",
50
+ ],
51
+ expectedBehaviour: "The highlight is derived from the current path, so it follows nested routes where the sidebar has no entry of its own — an order detail still highlights Orders — and it follows a back navigation, which a highlight set from the click cannot.",
52
+ expectedUiState: "Exactly one entry is highlighted at a time and it matches the current section, including on the order detail. After the back navigation it matches wherever the browser landed.",
53
+ endResult: "Read-only; nothing persists.",
54
+ },
55
+ "checklist-buying-user-dashboard-navigation-sidebar-mobile-collapse": {
56
+ roles: ["buyer"],
57
+ startPage: "/user",
58
+ steps: [
59
+ "Sign in as rehan.sheikh@gmail.com / TempPass123!.",
60
+ "Resize the browser window to 390 pixels wide and open /user.",
61
+ "Read how the sidebar is presented.",
62
+ "Open it, read its entries, and navigate somewhere.",
63
+ "Check whether it closed on navigation.",
64
+ "Count the fixed bars at the bottom of the screen.",
65
+ "Try to scroll the page sideways.",
66
+ ],
67
+ inputs: { mobileWidth: 390 },
68
+ expectedBehaviour: "On a phone the sidebar collapses behind a control and closes after navigating. The dashboard renders its own bottom tab bar and the public one is suppressed on these routes, so exactly one is mounted — two would be two bars on the same pixels with a height nobody owns, and everything above them would be positioned against the wrong one.",
69
+ expectedUiState: "The sidebar is collapsed by default, opens on demand and closes after navigation. Exactly one bottom bar is present, carrying dashboard destinations rather than the public ones. The page does not scroll sideways.",
70
+ expectedData: { bottomNavCount: 1 },
71
+ endResult: "Read-only; restore the window width afterwards.",
72
+ },
73
+ "checklist-buying-user-dashboard-navigation-deep-link-direct-load": {
74
+ roles: ["buyer"],
75
+ startPage: "/user/orders",
76
+ steps: [
77
+ "Sign in as rehan.sheikh@gmail.com / TempPass123!.",
78
+ "Open /user/orders, apply a filter and a sort, and copy the URL.",
79
+ "Open a new tab and paste that URL.",
80
+ "Read whether the same filter and sort are applied on first paint.",
81
+ "Open a specific order's detail, copy that URL, and open it in a new tab.",
82
+ "Read whether it opens on the same order.",
83
+ "Reload that tab and read it again.",
84
+ ],
85
+ expectedBehaviour: "Listing state lives in the URL, so a filtered view is shareable and reproduces on first paint. These routes are prerendered and hydrate their session client-side, so a deep link renders its shell immediately and fills in — what must not happen is the filters arriving and then being replaced by the defaults.",
86
+ expectedUiState: "The pasted listing URL shows the same rows, filter and sort as the tab it came from. The order URL opens that order and survives a reload. A filtered link that lands on the unfiltered default is the failure.",
87
+ endResult: "Read-only; nothing persists beyond the URL.",
88
+ },
89
+ "checklist-buying-user-dashboard-navigation-become-seller-crossnav": {
90
+ roles: ["buyer"],
91
+ startPage: "/user",
92
+ steps: [
93
+ "Sign in as karthik.new@gmail.com / TempPass123!, a buyer with no store.",
94
+ "Open /user and find the route into selling.",
95
+ "Click it and read where it lands.",
96
+ "Go back and open /sell directly, reading where that lands.",
97
+ "Sign out and sign in as tyson@beybladearena.in / TempPass123!, who has a store.",
98
+ "Open /user and read what the same area of the sidebar offers now.",
99
+ "Follow it and read where it lands.",
100
+ ],
101
+ expectedBehaviour: "The cross-navigation resolves by whether the account already has a store: a buyer is routed into the become-seller flow, an existing seller into their store dashboard. Offering a seller the become-seller flow, or a buyer a dashboard they cannot use, are the two ways this reads wrong.",
102
+ expectedUiState: "The buyer's link opens the become-seller flow with real content. The seller's opens /store. Neither lands on a 404 and neither offers the wrong destination for its account.",
103
+ endResult: "Read-only; apply for nothing.",
104
+ },
105
+ "checklist-buying-user-dashboard-navigation-browser-back-forward": {
106
+ roles: ["buyer"],
107
+ startPage: "/user",
108
+ steps: [
109
+ "Sign in as rehan.sheikh@gmail.com / TempPass123!.",
110
+ "Open /user, then /user/orders, then apply a filter, then open an order's detail.",
111
+ "Press the browser back button once and read where it lands.",
112
+ "Press back again and read where it lands, including whether the filter is still applied.",
113
+ "Press back once more.",
114
+ "Press forward three times, reading each landing.",
115
+ ],
116
+ expectedBehaviour: "Each state change that alters the URL is one history entry, so back walks them in reverse one press at a time. A filter change that writes the URL twice — once for the filter and once to reset the page number — produces two entries for one action, and back appears not to work.",
117
+ expectedUiState: "Back and forward move one step per press, and the filtered listing returns with its filter applied. Two presses needed to undo a single filter change is the double-navigation failure.",
118
+ endResult: "Read-only; nothing persists beyond the URL.",
119
+ },
120
+ "checklist-buying-user-dashboard-navigation-logged-out-redirect": {
121
+ roles: ["guest"],
122
+ startPage: "/user",
123
+ steps: [
124
+ "Open a private window with no session.",
125
+ "Open /user and watch the page for 5 seconds.",
126
+ "Open /user/orders and watch for 5 seconds.",
127
+ "Open /user/addresses and watch for 5 seconds.",
128
+ "Read each for any name, email, order or address at any point.",
129
+ "Open the browser's View Source on one of them and search for an email address and for a uid.",
130
+ "Read where each navigation ends up.",
131
+ ],
132
+ expectedBehaviour: "These routes are prerendered to a signed-out shell and the session hydrates client-side, so the served HTML is identical for every visitor and cannot contain anyone's data. The redirect therefore happens after hydration — a brief flash of chrome is expected and is the tradeoff being evaluated, while a spinner that never resolves is not.",
133
+ expectedUiState: "Each URL shows chrome and a loading state, then lands on the sign-in page. No name, email, order or address appears at any point, and none is present in the page source. Nothing is still spinning after 5 seconds. Record whether the flash feels acceptable.",
134
+ expectedData: { userDataInSource: 0 },
135
+ endResult: "All three end signed out. Any trace of a real account fails the case outright, separately from the flash question.",
136
+ },
137
+ "checklist-buying-user-dashboard-navigation-breadcrumbs-accurate": {
138
+ roles: ["buyer"],
139
+ startPage: "/user",
140
+ steps: [
141
+ "Sign in as rehan.sheikh@gmail.com / TempPass123!.",
142
+ "Open /user and read any breadcrumb trail shown.",
143
+ "Navigate to /user/orders and read the trail.",
144
+ "Open a specific order's detail and read the trail.",
145
+ "Click each breadcrumb ancestor in turn and check it lands where it says.",
146
+ "Check the current page is shown as the last crumb and is not itself a link.",
147
+ ],
148
+ expectedBehaviour: "The trail reflects the real route hierarchy and every ancestor is a working link. The last crumb is the current page and is not clickable — a self-link reads as a working link and goes nowhere new, the same defect the policy pages' related-links list had.",
149
+ expectedUiState: "The trail deepens as the route deepens, every ancestor navigates correctly, and the final crumb is plain text rather than a link.",
150
+ endResult: "Read-only; nothing persists.",
151
+ },
152
+ "checklist-buying-user-dashboard-navigation-sidebar-logout-button": {
153
+ roles: ["buyer"],
154
+ startPage: "/user",
155
+ steps: [
156
+ "Sign in as rehan.sheikh@gmail.com / TempPass123!.",
157
+ "Open /user and find the log-out control in the sidebar.",
158
+ "Click it and read where the browser lands.",
159
+ "Open /user again and read what happens.",
160
+ "Press the browser back button and read what is shown.",
161
+ "Open /user/orders directly and read what happens.",
162
+ ],
163
+ expectedBehaviour: "Log out clears both the server session cookie and the client auth session. Clearing only one leaves the browser able to re-mint a session on the next request, which is why the second navigation rather than the redirect is the real check — and a dashboard restored from the back-forward cache after log-out is a real exposure on a shared machine.",
164
+ expectedUiState: "The browser leaves the dashboard. Opening /user or /user/orders afterwards redirects to sign-in rather than rendering, even briefly with real data. The back button does not restore the dashboard from cache.",
165
+ endResult: "The session is ended.",
166
+ },
167
+ };
@@ -0,0 +1,2 @@
1
+ import type { AuthoredCase } from "./_types";
2
+ export declare const authored: Record<string, AuthoredCase>;
@@ -0,0 +1,90 @@
1
+ /*
2
+ * WHY: Authored six-part procedures for the buying/user-uncovered-pages page.
3
+ * WHAT: 4 case(s), keyed by full checklist id.
4
+ *
5
+ * Four buyer routes the sweep found with no case naming them anywhere. Three are
6
+ * "editors that are also pages" — opened by URL, they must render with the form
7
+ * ALREADY open, because a page whose only content is a closed drawer is a blank
8
+ * screen with a working URL.
9
+ *
10
+ * @tag domain:tester
11
+ * @tag layer:seed
12
+ * @tag pattern:none
13
+ * @tag access:server-only
14
+ * @tag consumers:seed-data/authored/index.ts
15
+ * @tag sideEffects:none
16
+ */
17
+ const SIGN_IN_BUYER = "Sign in as rehan.sheikh@gmail.com / TempPass123!.";
18
+ export const authored = {
19
+ "checklist-buying-user-uncovered-pages-user-preorders-renders": {
20
+ roles: ["buyer"],
21
+ startPage: "/user/pre-orders",
22
+ steps: [
23
+ SIGN_IN_BUYER,
24
+ "Open /user/pre-orders.",
25
+ "Read the pre-orders listed, or the empty state.",
26
+ "For each, read its production status and its expected delivery date.",
27
+ "Open one and check it links back to the listing it was placed against.",
28
+ "Check the deposit paid is distinguished from the full price.",
29
+ ],
30
+ expectedBehaviour: "A buyer's pre-orders are listed with the two things that make them different from an ordinary order — production status and expected delivery. A pre-order is bought at a deposit, so showing only the full price misstates what was charged and what is still owed.",
31
+ expectedUiState: "Each pre-order shows its production status, its expected delivery date and its deposit against the full price, and links to its listing. An empty state is acceptable only if the account has none.",
32
+ endResult: "Read-only.",
33
+ },
34
+ "checklist-buying-user-uncovered-pages-user-support-new-renders": {
35
+ roles: ["buyer"],
36
+ startPage: "/user/support/new",
37
+ steps: [
38
+ SIGN_IN_BUYER,
39
+ "Open /user/support/new directly by URL.",
40
+ "Read whether the ticket form is already open or whether the page is blank.",
41
+ "Close or cancel the form.",
42
+ "Read where the browser lands.",
43
+ "Check it is the ticket list rather than a dead route.",
44
+ ],
45
+ expectedBehaviour: "An editor that is also a page opens with its form already showing, and cancelling lands on the list it belongs to. A page whose content is a closed drawer is blank with a working URL — nothing errors, and there is nothing to click.",
46
+ expectedUiState: "The form is open on arrival, and cancelling lands on /user/support. A blank page, or a cancel that leaves the browser nowhere, are both findings.",
47
+ endResult: "No ticket is created.",
48
+ },
49
+ "checklist-buying-user-uncovered-pages-user-catalogue-new-renders": {
50
+ roles: ["buyer"],
51
+ startPage: "/user/catalogue/new",
52
+ steps: [
53
+ SIGN_IN_BUYER,
54
+ "Open /user/catalogue/new directly by URL.",
55
+ "Check the form is already open.",
56
+ "Fill it with the title 'QA Catalogue Probe' and upload /test-media/sample-image.png.",
57
+ "Save it.",
58
+ "Read where the browser lands and check the item is in the catalogue list.",
59
+ "Reload and check it is still there, then delete it.",
60
+ ],
61
+ inputs: { title: "QA Catalogue Probe", imagePath: "/test-media/sample-image.png" },
62
+ expectedBehaviour: "The form opens on arrival, saves, and the saved item appears in the list. Reloading is the whole check — an item that never reached storage looks identical until then, and an image that was never finalised renders once and breaks later.",
63
+ expectedUiState: "The item is listed with its photo after the save and still after the reload. A broken image on the second load is the finalise failure.",
64
+ endResult: "The QA catalogue item is deleted.",
65
+ },
66
+ "checklist-buying-user-uncovered-pages-user-addresses-add-renders": {
67
+ roles: ["buyer"],
68
+ startPage: "/user/addresses/add",
69
+ steps: [
70
+ SIGN_IN_BUYER,
71
+ "Open /user/addresses/add directly by URL.",
72
+ "Check the form is already open.",
73
+ "Fill it with the name 'QA Address Probe', phone 9876543210, line 1 '221B Test Street', landmark 'Opposite the QA park', postal code 560001.",
74
+ "Save it.",
75
+ "Read the address list and find the new entry.",
76
+ "Open it for edit and check the landmark survived.",
77
+ "Delete the address afterwards.",
78
+ ],
79
+ inputs: {
80
+ fullName: "QA Address Probe",
81
+ phone: "9876543210",
82
+ addressLine1: "221B Test Street",
83
+ landmark: "Opposite the QA park",
84
+ postalCode: "560001",
85
+ },
86
+ expectedBehaviour: "Every field the form collects is written and read back — the landmark specifically, because a form missing a field the server accepts sends nothing for it on every edit and quietly drops whatever was there. Reopening the saved address for edit is the only way to see it.",
87
+ expectedUiState: "The address appears in the list, and reopening it for edit shows all five values including the landmark. A landmark that is blank on reopen is the finding.",
88
+ endResult: "The QA address is deleted.",
89
+ },
90
+ };
@@ -0,0 +1,2 @@
1
+ import type { AuthoredCase } from "./_types";
2
+ export declare const authored: Record<string, AuthoredCase>;