@mohasinac/appkit 4.40.1 → 4.41.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 (58) hide show
  1. package/dist/features/categories/repository/categories.repository.js +2 -2
  2. package/dist/features/tester/seed-data/_money-flows.js +65 -49
  3. package/dist/features/tester/seed-data/authored/admin__admin-detail-round-trips.js +6 -4
  4. package/dist/features/tester/seed-data/authored/admin__coupons.js +14 -13
  5. package/dist/features/tester/seed-data/authored/buying__bidding.js +154 -140
  6. package/dist/features/tester/seed-data/authored/buying__browsing-search.js +4 -4
  7. package/dist/features/tester/seed-data/authored/buying__buying-checkout.js +59 -56
  8. package/dist/features/tester/seed-data/authored/buying__buying-coupons.js +18 -18
  9. package/dist/features/tester/seed-data/authored/buying__cart.js +105 -79
  10. package/dist/features/tester/seed-data/authored/buying__image-tile-layout.js +6 -8
  11. package/dist/features/tester/seed-data/authored/buying__my-orders.js +13 -13
  12. package/dist/features/tester/seed-data/authored/buying__offers.js +6 -6
  13. package/dist/features/tester/seed-data/authored/buying__order-detail-actions.js +8 -7
  14. package/dist/features/tester/seed-data/authored/buying__product-detail.js +62 -56
  15. package/dist/features/tester/seed-data/authored/buying__return-request.js +6 -6
  16. package/dist/features/tester/seed-data/authored/buying__reviews-pagination.js +4 -4
  17. package/dist/features/tester/seed-data/authored/buying__reviews.js +1 -1
  18. package/dist/features/tester/seed-data/authored/buying__user-dashboard-extras.js +8 -8
  19. package/dist/features/tester/seed-data/authored/content-discovery__category-counts-and-rollup.js +1 -1
  20. package/dist/features/tester/seed-data/authored/content-discovery__coupons.js +29 -16
  21. package/dist/features/tester/seed-data/authored/content-discovery__event-detail-subroutes.js +9 -9
  22. package/dist/features/tester/seed-data/authored/content-discovery__events.js +69 -36
  23. package/dist/features/tester/seed-data/authored/content-discovery__notifications.js +1 -1
  24. package/dist/features/tester/seed-data/authored/cta-layout__checkout-bottom-bar.js +2 -2
  25. package/dist/features/tester/seed-data/authored/design-ux__back-to-top-button.js +2 -2
  26. package/dist/features/tester/seed-data/authored/design-ux__general-design.js +1 -1
  27. package/dist/features/tester/seed-data/authored/design-ux__status-badge-legibility.js +1 -1
  28. package/dist/features/tester/seed-data/authored/design-ux__sticky-cta-bar.js +3 -3
  29. package/dist/features/tester/seed-data/authored/index.js +0 -2
  30. package/dist/features/tester/seed-data/authored/page-wiring__data-loss.js +2 -2
  31. package/dist/features/tester/seed-data/authored/page-wiring__reachability.js +6 -4
  32. package/dist/features/tester/seed-data/authored/public-pages__auth-error-pages.js +2 -2
  33. package/dist/features/tester/seed-data/authored/public-pages__core-listing-pages.js +1 -1
  34. package/dist/features/tester/seed-data/authored/public-pages__stores-sellers-directories.js +8 -10
  35. package/dist/features/tester/seed-data/authored/selling__become-seller.js +2 -2
  36. package/dist/features/tester/seed-data/authored/selling__digital-content-delivery.js +2 -2
  37. package/dist/features/tester/seed-data/authored/selling__listing-a-product.js +2 -2
  38. package/dist/features/tester/seed-data/authored/selling__listing-edit-roundtrip.js +2 -2
  39. package/dist/features/tester/seed-data/authored/selling__listing-lifecycle.js +2 -2
  40. package/dist/features/tester/seed-data/authored/selling__seller-listing-types.js +2 -2
  41. package/dist/features/tester/seed-data/authored/seo__og-images.js +3 -4
  42. package/dist/features/tester/seed-data/authored/seo__page-metadata.js +6 -8
  43. package/dist/features/tester/seed-data/authored/seo__sitemap-and-robots.js +5 -5
  44. package/dist/features/tester/seed-data/index.d.ts +0 -10
  45. package/dist/features/tester/seed-data/index.js +0 -10
  46. package/dist/features/tester/seed-data/tester-checklist-seed-data.js +75 -89
  47. package/dist/features/tester/seed-data/tester-responses-seed-data.js +5 -5
  48. package/dist/index.d.ts +0 -8
  49. package/dist/index.js +0 -21
  50. package/dist/seed/addresses-seed-data.js +0 -34
  51. package/dist/seed/index.d.ts +1 -1
  52. package/dist/seed/index.js +4 -3
  53. package/dist/seed/manifest.js +11 -12
  54. package/dist/seed/notifications-seed-data.js +4 -4
  55. package/dist/seed/stores-seed-data.js +7 -52
  56. package/dist/seed/users-seed-data.js +3 -83
  57. package/package.json +1 -1
  58. package/scripts/seed-cli.mjs +15 -20
@@ -144,7 +144,7 @@ export const authored = {
144
144
  roles: ["buyer"],
145
145
  startPage: "/user/offers",
146
146
  steps: [
147
- "Sign in as tester@letitrip.in / TempPass123!.",
147
+ "Sign in as vivaan.kapoor@gmail.com / TempPass123!, who holds the seeded accepted offer offer-kaiba-dranzer-s-accepted and the seeded expired one offer-kaiba-x-wizard-arrow-expired.",
148
148
  "Open /user/offers and find an accepted offer past its checkout deadline.",
149
149
  "Read its status and any deadline shown.",
150
150
  "Open /cart and check the Accepted Offers tab for that line.",
@@ -552,7 +552,7 @@ export const authored = {
552
552
  roles: ["buyer"],
553
553
  startPage: "/user/bids",
554
554
  steps: [
555
- "Sign in as tester@letitrip.in / TempPass123!.",
555
+ "Sign in as vivaan.kapoor@gmail.com / TempPass123!, the buyer who holds seeded bids.",
556
556
  "Open /user/bids and find a forfeited bid.",
557
557
  "Open its detail and read its history.",
558
558
  "Check an entry explains WHY it was forfeited rather than only that it was.",
@@ -777,7 +777,7 @@ export const authored = {
777
777
  roles: ["buyer", "seller", "admin"],
778
778
  startPage: "/user/bids",
779
779
  steps: [
780
- "Sign in as tester@letitrip.in / TempPass123! and open /user/bids.",
780
+ "Sign in as vivaan.kapoor@gmail.com / TempPass123!, who holds the seeded winning bid on auction-beyblade-burst-spriggan-requiem-bought-out, and open /user/bids.",
781
781
  "Click a bid row and read what opens.",
782
782
  "Sign out and sign in as tyson@beybladearena.in / TempPass123!.",
783
783
  "Open the store's bids listing and click a row, reading what opens.",
@@ -793,7 +793,7 @@ export const authored = {
793
793
  roles: ["buyer", "seller", "admin"],
794
794
  startPage: "/user/bids",
795
795
  steps: [
796
- "Sign in as tester@letitrip.in / TempPass123! and open a bid detail from /user/bids.",
796
+ "Sign in as vivaan.kapoor@gmail.com / TempPass123! and open a bid detail from /user/bids.",
797
797
  "Read every name and identifier shown, and search the page source for a bidder name.",
798
798
  "Sign in as tyson@beybladearena.in / TempPass123! and open the same bid from the store's listing.",
799
799
  "Read what identities are shown there.",
@@ -826,7 +826,7 @@ export const authored = {
826
826
  roles: ["buyer", "guest"],
827
827
  startPage: "/user/bids",
828
828
  steps: [
829
- "Sign in as tester@letitrip.in / TempPass123! and open /user/bids.",
829
+ "Sign in as vivaan.kapoor@gmail.com / TempPass123! and open /user/bids.",
830
830
  "Press Tab repeatedly and check each bid row receives focus with a visible ring.",
831
831
  "Press Enter on a focused row and check it opens.",
832
832
  "Open a public auction's bid history in a private window.",
@@ -858,7 +858,7 @@ export const authored = {
858
858
  startPage: "/store/listing-templates",
859
859
  steps: [
860
860
  "Sign in as tyson@beybladearena.in / TempPass123! and create a template, copying its edit URL.",
861
- "Sign out and sign in as tester@letitrip.in / TempPass123!, a different store's owner.",
861
+ "Sign out and sign in as meera.blader@gmail.com / TempPass123!, who owns store-blader-bazaar — a different store.",
862
862
  "Paste that edit URL and read what happens.",
863
863
  "Check whether the template's contents are shown at any point.",
864
864
  "Attempt to save from that page.",
@@ -6,9 +6,10 @@
6
6
  * subroutes — cancel, return, track, invoice, payment — and before 2026-09-14
7
7
  * exactly ONE case in the entire 1,188-case catalogue touched any of them.
8
8
  *
9
- * 🛑 NO SEEDED ORDER BELONGS TO THE BOT. Measured on production: 0 of 64. So a
10
- * case that says "open one of your orders" while signed in as the bot has no
11
- * order to open, and answers `null` forever. The positive cases below BUY first;
9
+ * 🛑 NO SEEDED ORDER BELONGS TO karthik.new@gmail.com. Every seeded order belongs
10
+ * to user-yugi-muto, user-seto-kaiba or user-admin-letitrip. So a case that says
11
+ * "open one of your orders" while signed in as karthik has no order to open, and
12
+ * answers `null` forever. The positive cases below BUY first;
12
13
  * the seeded ids belonging to other personas are used only as the ownership
13
14
  * negatives — which is the dimension nothing tested at all, and the one where a
14
15
  * mistake is an IDOR rather than a cosmetic bug.
@@ -25,7 +26,7 @@ export const authored = {
25
26
  roles: ["buyer"],
26
27
  startPage: "/products",
27
28
  steps: [
28
- "Sign in as the bot buyer claude-tester@letitrip.in / TempPass123!.",
29
+ "Sign in as karthik.new@gmail.com / TempPass123!, a seeded buyer who owns no seeded orders.",
29
30
  "Open /products, add any in-stock item to the cart, and complete checkout.",
30
31
  "Open /user/orders and find the order you just placed. Write down its id from the row.",
31
32
  "Open the order and use its Invoice action.",
@@ -40,7 +41,7 @@ export const authored = {
40
41
  roles: ["buyer"],
41
42
  startPage: "/user/orders",
42
43
  steps: [
43
- "Sign in as the bot buyer claude-tester@letitrip.in / TempPass123!.",
44
+ "Sign in as karthik.new@gmail.com / TempPass123!, a seeded buyer who owns no seeded orders.",
44
45
  "Navigate directly to /api/user/orders/order-1-20260721-11joon/invoice — a seeded order belonging to a different persona.",
45
46
  "Read the response.",
46
47
  "Now navigate to /user/orders/order-1-20260721-11joon.",
@@ -56,7 +57,7 @@ export const authored = {
56
57
  roles: ["buyer"],
57
58
  startPage: "/user/orders",
58
59
  steps: [
59
- "Sign in as the bot buyer claude-tester@letitrip.in / TempPass123!.",
60
+ "Sign in as karthik.new@gmail.com / TempPass123!, a seeded buyer who owns no seeded orders.",
60
61
  "Place an order, then open /user/orders and open that order.",
61
62
  "Use the Cancel action and read what the page offers.",
62
63
  "Complete the cancellation.",
@@ -106,7 +107,7 @@ export const authored = {
106
107
  roles: ["buyer"],
107
108
  startPage: "/user/orders",
108
109
  steps: [
109
- "Sign in as the bot buyer claude-tester@letitrip.in / TempPass123!, which owns no seeded orders.",
110
+ "Sign in as karthik.new@gmail.com / TempPass123!, a seeded buyer who owns no seeded orders.",
110
111
  "Navigate to /user/orders/order-1-20260721-11joon/track.",
111
112
  "Navigate to /user/orders/order-1-20260721-11joon/invoice.",
112
113
  "Navigate to /user/orders/order-1-20260721-11joon/return.",
@@ -20,23 +20,23 @@
20
20
  export const authored = {
21
21
  "checklist-buying-product-detail-auction-detail": {
22
22
  roles: ["guest"],
23
- startPage: "/auctions/auction-tester-sandbox-cycle-1",
23
+ startPage: "/auctions/auction-beyblade-original-dragoon-storm",
24
24
  steps: [
25
- "Open /auctions/auction-tester-sandbox-cycle-1.",
25
+ "Open /auctions/auction-beyblade-original-dragoon-storm.",
26
26
  "Read the countdown beside the 'Place a bid' button.",
27
27
  "Wait 3 seconds without touching anything.",
28
28
  "Read the countdown again.",
29
29
  ],
30
30
  expectedBehaviour: "The page renders a live auction whose countdown ticks client-side against the stored end date. Auction listings offer bidding, never Add to Cart — the capability is per listing type, not a styling choice. A signed-out visitor sees no bid figures at all: a current bid is a money amount like any other, and the bid panel is replaced rather than shown with the numbers blanked.",
31
- expectedUiState: "BEFORE: 'Current bid ₹15,000.00' and 'minimum increment ₹1,000.00' were shown to anyone. AFTER: the current-bid line reads 'Sign in to see the current bid', the minimum-increment line is absent, and the bid panel reads 'Bidding is for members' with a 'Sign in to bid' link. The digits 15,000 and 1,000 appear nowhere on the page. The heading names the sandbox auction. A countdown in the shape '47m 06s' or 'Xd Xh Xm Xs' sits next to 'Place a bid', and its seconds figure is lower after the 3-second wait — a frozen countdown is a fail even though the number looks plausible. There is no 'Add to Cart' button anywhere on the page.",
31
+ expectedUiState: "BEFORE: 'Current bid ₹3,499.00' and 'minimum increment ₹200.00' were shown to anyone. AFTER: the current-bid line reads 'Sign in to see the current bid', the minimum-increment line is absent, and the bid panel reads 'Bidding is for members' with a 'Sign in to bid' link. The digits 3,499 and 200 appear nowhere on the page. The heading reads 'Beyblade Original — Dragoon Storm (Rare Sealed)'. A countdown in the shape '47m 06s' or 'Xd Xh Xm Xs' sits next to 'Place a bid', and its seconds figure is lower after the 3-second wait — a frozen countdown is a fail even though the number looks plausible. There is no 'Add to Cart' button anywhere on the page.",
32
32
  endResult: "Nothing persists — bid state and end time are read from the server on each load. The seconds figure moving is the whole check.",
33
33
  },
34
34
  "checklist-buying-product-detail-auction-detail-bid-signed-in": {
35
35
  roles: ["buyer"],
36
- startPage: "/auctions/auction-tester-sandbox-cycle-1",
36
+ startPage: "/auctions/auction-beyblade-original-dragoon-storm",
37
37
  steps: [
38
38
  "Sign in as a buyer.",
39
- "Open /auctions/auction-tester-sandbox-cycle-1.",
39
+ "Open /auctions/auction-beyblade-original-dragoon-storm.",
40
40
  "Read the current bid, the minimum increment and the bid panel.",
41
41
  ],
42
42
  expectedBehaviour: "The twin of the guest case above — the bid figures and the working bid form are exactly what the gate must not cost a signed-in buyer.",
@@ -46,21 +46,21 @@ export const authored = {
46
46
  },
47
47
  "checklist-buying-product-detail-bundle-purchase": {
48
48
  roles: ["buyer"],
49
- startPage: "/bundles/bundle-tester-sandbox",
49
+ startPage: "/bundles/bundle-original-collectors-set",
50
50
  steps: [
51
51
  "Sign in as rehan.sheikh@gmail.com / TempPass123!.",
52
- "Open /bundles/bundle-tester-sandbox.",
52
+ "Open /bundles/bundle-original-collectors-set.",
53
53
  "Click 'Buy now'.",
54
54
  "On the checkout address step, select the first saved address, or add one named 'QA Address bundle-purchase' if none exists.",
55
55
  "Continue to the payment step and choose Cash on Delivery.",
56
56
  "Place the order.",
57
57
  "Open /user/orders and open the order just created.",
58
58
  ],
59
- inputs: { bundleId: "bundle-tester-sandbox", bundlePrice: 199, paymentMethod: "Cash on Delivery" },
60
- expectedBehaviour: "The bundle is charged at its own locked price of ₹199, not the ₹348 sum of its two members, and the receipt collapses the members back into one line. A bundle is all-or-nothing: the buyer never chose which parts to include, so presenting them as separate purchasable lines would misrepresent what was bought.",
61
- expectedUiState: "The order detail page shows ONE line reading 'Test Bundle' at ₹199.00. It does not show 'Test Gadget — Standard Listing #1' and 'Test Collectible — Standard Listing #2' as two rows, and the total is not ₹348. A 'What's included' expander beneath the line is fine — that is detail, not a second line.",
62
- expectedData: { orderLineCount: 1, lineTotal: 199 },
63
- endResult: "Reloading the order still shows the single 'Test Bundle' line at ₹199.00. A total of ₹348 means the bundle discount was thrown away at checkout.",
59
+ inputs: { bundleId: "bundle-original-collectors-set", bundlePrice: 2999, memberTotal: 4597, paymentMethod: "Cash on Delivery" },
60
+ expectedBehaviour: "The bundle is charged at its own locked price of ₹2,999, not the ₹4,597 sum of its three members, and the receipt collapses the members back into one line. A bundle is all-or-nothing: the buyer never chose which parts to include, so presenting them as separate purchasable lines would misrepresent what was bought.",
61
+ expectedUiState: "The order detail page shows ONE line reading 'Original Collector's Set' at ₹2,999.00. It does not show 'Beyblade Original — Dranzer S', 'Beyblade Original — Driger V' and 'Beyblade Metal Storm Pegasus' as three rows, and the total is not ₹4,597. A 'What's included' expander beneath the line is fine — that is detail, not a second line.",
62
+ expectedData: { orderLineCount: 1, lineTotal: 2999 },
63
+ endResult: "Reloading the order still shows the single 'Original Collector's Set' line at ₹2,999.00. A total of ₹4,597 means the bundle discount was thrown away at checkout.",
64
64
  },
65
65
  "checklist-buying-product-detail-classified-buy-request-pinned-to-price": {
66
66
  roles: ["buyer"],
@@ -113,10 +113,10 @@ export const authored = {
113
113
  },
114
114
  "checklist-buying-product-detail-digitalcode-delivery": {
115
115
  roles: ["buyer"],
116
- startPage: "/digital-codes/digitalcode-tester-sandbox-1",
116
+ startPage: "/digital-codes/digitalcode-beyblade-x-app-starter-pack",
117
117
  steps: [
118
118
  "Sign in as rehan.sheikh@gmail.com / TempPass123!.",
119
- "Open /digital-codes/digitalcode-tester-sandbox-1.",
119
+ "Open /digital-codes/digitalcode-beyblade-x-app-starter-pack.",
120
120
  "Click 'Buy Now'.",
121
121
  "On the checkout address step, select the first saved address.",
122
122
  "Continue to the payment step and choose Cash on Delivery.",
@@ -124,30 +124,30 @@ export const authored = {
124
124
  "Open /user/orders and open the order just created.",
125
125
  "Reload the order page.",
126
126
  ],
127
- inputs: { productId: "digitalcode-tester-sandbox-1", price: 99, paymentMethod: "Cash on Delivery" },
128
- expectedBehaviour: "This fixture is auto-claim, so the code is allocated and delivered as soon as the order is confirmed, with no seller action in between. The pool's remaining count drops by one.",
127
+ inputs: { productId: "digitalcode-beyblade-x-app-starter-pack", price: 199, codesAvailable: 25, paymentMethod: "Cash on Delivery" },
128
+ expectedBehaviour: "This fixture is auto-claim, so the code is allocated and delivered as soon as the order is confirmed, with no seller action in between. The pool's remaining count drops by one. The listing advertises 25 codes on the product document, but the codes themselves live in a subcollection the seed does not write — so the pool must be stocked first from the seller's Digital Content pool manager on /store/products, or the purchase completes and delivers nothing, which is the exact defect this case exists to catch.",
129
129
  expectedUiState: "The order page shows a digital-code panel containing an actual code string that can be selected and copied. It does not read 'Pending delivery' or 'Waiting for seller' — for an auto-claim listing those states mean the delivery never fired.",
130
130
  expectedData: { codeDelivered: true },
131
131
  endResult: "Reloading the order still shows the same delivered code. A code that appears once and is blank after reload was never persisted against the order.",
132
132
  },
133
133
  "checklist-buying-product-detail-grouped-listings-carousel-on-detail": {
134
134
  roles: ["guest"],
135
- startPage: "/products/product-tester-standard-1",
135
+ startPage: "/products/product-beyblade-burst-valkyrie",
136
136
  steps: [
137
- "Open /products/product-tester-standard-1.",
137
+ "Open /products/product-beyblade-burst-valkyrie.",
138
138
  "Scroll past the description tab and past the 'More in this category' and 'More by' carousels.",
139
139
  "Read the heading of the themed carousel below them.",
140
140
  "Click the first card in that carousel.",
141
141
  ],
142
142
  expectedBehaviour: "The grouped-listings carousel is a distinct section from the four related-items carousels — it is fed by the groupedListings collection, not by category/brand/tag/store similarity — and each card links to its own detail page.",
143
- expectedUiState: "A carousel with a theme heading (the group's own name, e.g. 'From the same set') sits below the related-items sections. Every card shows a real title and a rendered image tile, not a placeholder or a spinner. Clicking the first card lands on that product's detail page — /products/product-tester-standard-2 or similar — not back on the current page.",
143
+ expectedUiState: "A carousel with a theme heading — the group's own name, such as 'Burst & X Attackers You Might Like' — sits below the related-items sections. Every card shows a real title and a rendered image tile, not a placeholder or a spinner. Clicking the first card lands on another member's detail page — /products/product-beyblade-burst-regalia-genesis, /products/product-beyblade-x-wizard-arrow or /products/product-beyblade-x-knife-shinobi — not back on the current page.",
144
144
  endResult: "Nothing persists — read-only navigation.",
145
145
  },
146
146
  "checklist-buying-product-detail-image-gallery": {
147
147
  roles: ["guest"],
148
- startPage: "/auctions/auction-tester-sandbox-cycle-1",
148
+ startPage: "/auctions/auction-beyblade-original-dragoon-storm",
149
149
  steps: [
150
- "Open /auctions/auction-tester-sandbox-cycle-1.",
150
+ "Open /auctions/auction-beyblade-original-dragoon-storm.",
151
151
  "Look at every thumbnail in the strip below the main image.",
152
152
  "Hard-reload with Ctrl+Shift+R and look at the strip again.",
153
153
  "Hard-reload twice more, looking at the strip each time.",
@@ -176,9 +176,9 @@ export const authored = {
176
176
  },
177
177
  "checklist-buying-product-detail-live-item-detail": {
178
178
  roles: ["guest"],
179
- startPage: "/live/live-tester-sandbox-1",
179
+ startPage: "/live/live-golden-retriever-puppy",
180
180
  steps: [
181
- "Open /live/live-tester-sandbox-1.",
181
+ "Open /live/live-golden-retriever-puppy.",
182
182
  "Read the heading, the species line, the price area and the delivery restrictions.",
183
183
  "Look at the gallery thumbnail strip.",
184
184
  ],
@@ -214,9 +214,9 @@ export const authored = {
214
214
  },
215
215
  "checklist-buying-product-detail-preorder-detail": {
216
216
  roles: ["guest"],
217
- startPage: "/pre-orders/preorder-tester-sandbox-1",
217
+ startPage: "/pre-orders/preorder-beyblade-x-bx-08-wave",
218
218
  steps: [
219
- "Open /pre-orders/preorder-tester-sandbox-1.",
219
+ "Open /pre-orders/preorder-beyblade-x-bx-08-wave.",
220
220
  "Read the heading, the price area, the status badge and the delivery line.",
221
221
  "Read the note beside the 'Reserve Now' button.",
222
222
  ],
@@ -226,10 +226,10 @@ export const authored = {
226
226
  },
227
227
  "checklist-buying-product-detail-prizedraw-buy-reveal": {
228
228
  roles: ["buyer"],
229
- startPage: "/prize-draws/prizedraw-tester-sandbox-1",
229
+ startPage: "/prize-draws/prizedraw-beyblade-mystery-box",
230
230
  steps: [
231
231
  "Sign in as rehan.sheikh@gmail.com / TempPass123!.",
232
- "Open /prize-draws/prizedraw-tester-sandbox-1.",
232
+ "Open /prize-draws/prizedraw-beyblade-mystery-box.",
233
233
  "Click 'Buy now'.",
234
234
  "On the checkout address step, select the first saved address.",
235
235
  "Continue to the payment step and choose Cash on Delivery.",
@@ -237,28 +237,33 @@ export const authored = {
237
237
  "Open /user/orders and open the order just created.",
238
238
  "Reload the page.",
239
239
  ],
240
- inputs: { productId: "prizedraw-tester-sandbox-1", entries: 1, pricePerEntry: 50 },
240
+ inputs: { productId: "prizedraw-beyblade-mystery-box", entries: 1, pricePerEntry: 99, slotsRemaining: 4 },
241
241
  expectedBehaviour: "This fixture is instant-reveal, so the prize is drawn and assigned at confirmation rather than held until a scheduled close. The draw's remaining entry count drops by one.",
242
242
  expectedUiState: "The order page names the prize assigned to this entry. It does not show a pending spinner or a 'draw not yet closed' message — those belong to prizedraw-beyblade-scheduled-demo, not to this fixture, and seeing them here means the mode was ignored.",
243
243
  expectedData: { entriesPurchased: 1, revealed: true },
244
244
  endResult: "Reloading the order shows the same prize. A prize that changes on reload was never persisted and was being drawn per render.",
245
245
  },
246
246
  "checklist-buying-product-detail-product-group-set-widget": {
247
- roles: ["guest"],
248
- startPage: "/products/product-tester-standard-1",
247
+ roles: ["seller", "guest"],
248
+ startPage: "/store/products",
249
249
  steps: [
250
- "Open /products/product-tester-standard-1.",
251
- "Scroll to the 'Part of / Parts in this group' panel.",
252
- "Click its expand control.",
253
- "Read the member list.",
250
+ "Sign in as tyson@beybladearena.in / TempPass123!, the owner of store-beyblade-arena.",
251
+ "Open /store/products and edit product-beyblade-burst-valkyrie.",
252
+ "In the group settings panel, make it a group parent titled 'QA Set valkyrie-lineage' and add product-beyblade-burst-regalia-genesis as a member, then save.",
253
+ "Open /products/product-beyblade-burst-valkyrie and scroll to the 'Part of / Parts in this group' panel.",
254
+ "Click its expand control and read the member list.",
254
255
  "Click 'View whole group'.",
255
- "Close what opens, then open /products/product-tester-standard-2 and expand the same panel.",
256
- "Open /products/group-tester-sandbox-bundle and expand the same panel.",
256
+ "Close what opens, then open /products/product-beyblade-burst-regalia-genesis and expand the same panel.",
257
257
  ],
258
- expectedBehaviour: "The group panel appears on the parent and on both children, because membership is symmetric — a child knows its groupId and the parent knows its child slugs. A panel that renders only on the parent means the children's side of the link was never written.",
259
- expectedUiState: "The panel is present on all three pages. Its expand control renders as a real triangle or chevron glyph, not a literal character like '▸' rendered at font-fallback size and not a missing box. Expanded, it lists 'Test Gadget — Standard Listing #1' and 'Test Collectible — Standard Listing #2' with image tiles. 'View whole group' opens a modal or drawer showing both members.",
258
+ inputs: {
259
+ parent: "product-beyblade-burst-valkyrie",
260
+ child: "product-beyblade-burst-regalia-genesis",
261
+ groupTitle: "QA Set valkyrie-lineage",
262
+ },
263
+ expectedBehaviour: "The group panel appears on the parent and on the child, because membership is symmetric — a child knows its groupId and the parent knows its child slugs. A panel that renders only on the parent means the children's side of the link was never written. The group is BUILT by this case rather than read from the seed: no seeded product carries groupId, isGroupParent or groupChildSlugs, so there is no fixture to read.",
264
+ expectedUiState: "The panel is present on both pages. Its expand control renders as a real triangle or chevron glyph, not a literal character like '▸' rendered at font-fallback size and not a missing box. Expanded, it lists 'Beyblade Burst B-01 Valkyrie' and 'Beyblade Burst B-135 Regalia Genesis' with image tiles. 'View whole group' opens a modal or drawer showing both members.",
260
265
  expectedData: { groupMemberCount: 2 },
261
- endResult: "Nothing persists — read-only panel.",
266
+ endResult: "Clear the group settings on both listings afterwards so the seeded catalogue is left as it was. A panel that survives on the parent but never appeared on the child is the failure.",
262
267
  },
263
268
  "checklist-buying-product-detail-related-listings-sections": {
264
269
  roles: ["guest"],
@@ -287,59 +292,60 @@ export const authored = {
287
292
  },
288
293
  "checklist-buying-product-detail-standard-detail": {
289
294
  roles: ["guest"],
290
- startPage: "/products/product-tester-standard-1",
295
+ startPage: "/products/product-beyblade-burst-valkyrie",
291
296
  steps: [
292
- "Open /products/product-tester-standard-1 in a private window with no session.",
297
+ "Open /products/product-beyblade-burst-valkyrie in a private window with no session.",
293
298
  "Read the heading, the price area, the stock badge and the description.",
294
299
  "Read the category and brand links below the heading.",
295
300
  "Read the seller line at the bottom of the info panel.",
296
301
  ],
297
302
  expectedBehaviour: "A standard listing renders every panel a buyer needs to decide, and the purchase actions are present but inert for a signed-out visitor rather than absent — a missing button reads as a broken page, a disabled one reads as a prompt to sign in. The PRICE is not shown to a signed-out visitor at all: the catalogue must not be readable at scale without an account.",
298
- expectedUiState: "BEFORE: the price area read '₹199.00'. AFTER: it reads 'Sign in to see price' and is a link to /auth/login; the digits 199 appear nowhere on the page. Heading 'Test Gadget — Standard Listing #1'. Stock badge in the shape '✓ In Stock — only 10 left' (stock is not an amount and is still shown). 'Buy Now', 'Add to Cart' and 'Add to Wishlist' are visible and disabled. Category links 'Test Gadgets' and 'Tester Sandbox' and brand link 'TestBrand' appear below the heading. A description paragraph is present. 'Sold by Tester Sandbox Store' with a 'Visit Store →' link is shown.",
303
+ expectedUiState: "BEFORE: the price area read '₹999.00'. AFTER: it reads 'Sign in to see price' and is a link to /auth/login; the digits 999 appear nowhere on the page. Heading 'Beyblade Burst B-01 Valkyrie'. Stock badge in the shape '✓ In Stock — only 10 left' (stock is not an amount and is still shown). 'Buy Now', 'Add to Cart' and 'Add to Wishlist' are visible and disabled. Category link 'Superking' and brand link 'Beyblade' appear below the heading. A description paragraph is present. 'Sold by Beyblade Arena' with a 'Visit Store →' link is shown.",
299
304
  expectedData: { stockQuantity: 10 },
300
305
  endResult: "Nothing persists — read-only for a guest.",
301
306
  },
302
307
  "checklist-buying-product-detail-price-does-not-flash-sign-in-prompt-on-hard-reload": {
303
308
  roles: ["buyer"],
304
- startPage: "/products/product-tester-standard-1",
309
+ startPage: "/products/product-beyblade-burst-valkyrie",
305
310
  steps: [
306
311
  "Sign in as a buyer.",
307
- "Open /products/product-tester-standard-1 and confirm the price reads ₹199.00.",
312
+ "Open /products/product-beyblade-burst-valkyrie and confirm the price reads ₹999.00.",
308
313
  "Press Ctrl+Shift+R (hard reload) and watch the price area continuously from the moment the page starts painting.",
309
314
  "Repeat the hard reload twice more, watching the same area.",
310
315
  "Throttle the network to 'Slow 3G' in the browser's network panel and hard-reload once more, watching the price area throughout.",
311
316
  ],
312
317
  expectedBehaviour: "While the session is still resolving the price area shows a neutral placeholder, never the sign-in prompt. The prompt means 'you are signed out', and the session provider starts every hard load with no user and resolves asynchronously — so a two-state gate tells a signed-in buyer they are signed out on every single page load. The throttled reload is the real test: at full speed the window can be too short to see.",
313
- expectedUiState: "Across all four reloads the price area goes from blank-or-placeholder straight to '₹199.00'. The text 'Sign in to see price' NEVER appears, not even for one frame, and most visibly not on the throttled load. A flash of the prompt before the price settles is the failure — the end state being correct does not pass this case.",
318
+ expectedUiState: "Across all four reloads the price area goes from blank-or-placeholder straight to '₹999.00'. The text 'Sign in to see price' NEVER appears, not even for one frame, and most visibly not on the throttled load. A flash of the prompt before the price settles is the failure — the end state being correct does not pass this case.",
314
319
  expectedData: { promptFlashes: 0 },
315
320
  endResult: "Read-only; restore the network throttle to 'No throttling' afterwards.",
316
321
  },
317
322
  "checklist-buying-product-detail-standard-detail-price-signed-in": {
318
323
  roles: ["buyer"],
319
- startPage: "/products/product-tester-standard-1",
324
+ startPage: "/products/product-beyblade-burst-valkyrie",
320
325
  steps: [
321
326
  "Sign in as a buyer.",
322
- "Open /products/product-tester-standard-1.",
327
+ "Open /products/product-beyblade-burst-valkyrie.",
323
328
  "Read the price area.",
324
329
  ],
325
330
  expectedBehaviour: "The twin of the guest case above. Gating the price must not lose coverage of the price itself — a signed-in buyer sees the real amount, formatted as currency, with no sign-in prompt anywhere on the page.",
326
- expectedUiState: "The price area reads '₹199.00'. The text 'Sign in to see price' appears nowhere on the page.",
327
- expectedData: { price: 199 },
331
+ expectedUiState: "The price area reads '₹999.00'. The text 'Sign in to see price' appears nowhere on the page.",
332
+ expectedData: { price: 999 },
328
333
  endResult: "Nothing persists — read-only.",
329
334
  },
330
335
  "checklist-buying-product-detail-tester-fixtures-hidden-from-the-public": {
331
- roles: ["guest", "buyer"],
336
+ roles: ["guest", "admin"],
332
337
  startPage: "/products",
333
338
  steps: [
334
339
  "Open a private/incognito window with no session and open /products.",
335
- "Read every card title on the grid and every card's URL slug, looking for the word 'Tester' or 'tester'.",
340
+ "Read every card title on the grid and every card's URL slug, looking for the word 'Probe', 'probe', 'Tester' or 'tester'.",
336
341
  "Page through the grid to the end, reading titles the same way.",
337
- "In a normal window, sign in as tester@letitrip.in / TempPass123!.",
338
- "Open /products and read the card titles again.",
342
+ "Do the same on /auctions, paging to the end.",
343
+ "In a normal window, sign in as admin@letitrip.in / TempPass123!.",
344
+ "Open /admin/products, filter by title for 'Probe', and read how many rows come back.",
339
345
  ],
340
- expectedBehaviour: "Sandbox rows are filtered out of every public read in the application layer, not by a Firestore query — an inequality on isTestData would exclude every document that lacks the field, which is all the real content, and the page would show ONLY test data. Signed in as a tester, the same page includes them.",
341
- expectedUiState: "Private window: not one card title contains 'Tester' and not one slug contains 'tester', on any page of the grid. Signed in as the tester: sandbox items such as 'Test Gadget — Standard Listing #1' are present.",
342
- endResult: "Nothing persists — the rule is applied per request. Reading only the first page is not enough; a leak on page three is still a leak.",
346
+ expectedBehaviour: "Rows carrying isTestData are filtered out of every public read in the application layer, not by a Firestore query — an inequality on isTestData would exclude every document that lacks the field, which is all the real content, and the page would show ONLY test data. The admin half is the control: it proves such rows EXIST while the run is in progress, so their absence from the public grid is a filter doing work rather than an empty collection.",
347
+ expectedUiState: "Private window: not one card title or slug on any page of /products or /auctions carries 'Probe' or 'Tester'. Signed in as admin on /admin/products: the per-batch probe rows seeded for this run ARE listed. A zero count on both sides proves nothing and must be answered null.",
348
+ endResult: "Nothing persists — the rule is applied per request. Reading only the first page is not enough; a leak on page three is still a leak. The permanent sandbox catalogue was removed, so the only isTestData rows are the per-batch fixtures a run creates while it is running.",
343
349
  },
344
350
  "checklist-buying-product-detail-unreachable-image-degrades-to-placeholder": {
345
351
  roles: ["guest"],
@@ -29,7 +29,7 @@ export const authored = {
29
29
  roles: ["buyer"],
30
30
  startPage: "/user/orders",
31
31
  steps: [
32
- "Sign in as tester@letitrip.in / TempPass123!.",
32
+ "Sign in as rehan.sheikh@gmail.com / TempPass123!.",
33
33
  "Open /user/orders and open a DELIVERED order and read whether a return control is offered.",
34
34
  "Open a PENDING order and read whether one is offered.",
35
35
  "Open a SHIPPED order and read the same.",
@@ -46,7 +46,7 @@ export const authored = {
46
46
  roles: ["buyer"],
47
47
  startPage: "/user/orders",
48
48
  steps: [
49
- "Sign in as tester@letitrip.in / TempPass123!.",
49
+ "Sign in as rehan.sheikh@gmail.com / TempPass123!.",
50
50
  "Open /user/orders and find a delivered order whose item was marked final sale.",
51
51
  "Confirm the order or its item shows the final-sale term.",
52
52
  "Open the return control and read every reason it offers.",
@@ -64,7 +64,7 @@ export const authored = {
64
64
  roles: ["buyer"],
65
65
  startPage: "/user/orders",
66
66
  steps: [
67
- "Sign in as tester@letitrip.in / TempPass123!.",
67
+ "Sign in as rehan.sheikh@gmail.com / TempPass123!.",
68
68
  "Open /user/orders and find a different delivered final-sale order.",
69
69
  "Open the return control and read every reason offered.",
70
70
  "Select the change-of-mind reason.",
@@ -81,7 +81,7 @@ export const authored = {
81
81
  roles: ["buyer", "admin"],
82
82
  startPage: "/user/orders",
83
83
  steps: [
84
- "Sign in as tester@letitrip.in / TempPass123!.",
84
+ "Sign in as rehan.sheikh@gmail.com / TempPass123!.",
85
85
  "Open a delivered order and open the return control.",
86
86
  "Select a reason and type 'QA Return reason-persisted — item arrived damaged in transit.' as the note.",
87
87
  "Submit and RELOAD the order.",
@@ -99,7 +99,7 @@ export const authored = {
99
99
  roles: ["buyer"],
100
100
  startPage: "/user/orders",
101
101
  steps: [
102
- "Sign in as tester@letitrip.in / TempPass123!.",
102
+ "Sign in as rehan.sheikh@gmail.com / TempPass123!.",
103
103
  "Open /user/orders and open a delivered order containing several items.",
104
104
  "Open the return control and read whether individual lines can be selected.",
105
105
  "Select ONE line and leave the others unselected.",
@@ -116,7 +116,7 @@ export const authored = {
116
116
  roles: ["buyer"],
117
117
  startPage: "/user/orders",
118
118
  steps: [
119
- "Sign in as tester@letitrip.in / TempPass123!.",
119
+ "Sign in as rehan.sheikh@gmail.com / TempPass123!.",
120
120
  "Open /user/orders and open a delivered prize-draw order.",
121
121
  "Read whether a return control is offered at all.",
122
122
  "If one is offered, open it and read every reason available.",
@@ -226,14 +226,14 @@ export const authored = {
226
226
  },
227
227
  "checklist-buying-reviews-pagination-empty-state": {
228
228
  roles: ["guest"],
229
- startPage: "/products/product-tester-standard-3",
229
+ startPage: "/products/product-beyblade-burst-spryzen-video-demo",
230
230
  steps: [
231
- "Sign in as tester@letitrip.in / TempPass123! so sandbox content is visible.",
232
- "Open a product that has no reviews and open its reviews tab.",
231
+ "Open /products/product-beyblade-burst-spryzen-video-demo in a private window with no session — this listing carries no seeded reviews.",
232
+ "Open its reviews tab.",
233
233
  "Read what is shown.",
234
234
  "Check whether a pager, filters or a sort control are rendered over the empty list.",
235
235
  "Read the rating summary and check it reads as no reviews rather than zero out of five.",
236
- "Apply a filter that matches nothing on a product that DOES have reviews and compare the two empty states.",
236
+ "Open /products/product-beyblade-original-dranzer-s, which carries 14 seeded reviews, apply a rating filter that matches nothing, and compare the two empty states.",
237
237
  ],
238
238
  expectedBehaviour: "A product with no reviews shows a named empty state, and controls that cannot act on anything are not rendered over it. The two empty states are different facts — 'no reviews yet' invites the buyer to write one, 'no reviews match this filter' invites them to clear it — and one message cannot say both.",
239
239
  expectedUiState: "The no-reviews product shows a message inviting a review, with no pager. The filtered-to-nothing case shows a message about the filter. A rating summary reading '0 out of 5' where there are no reviews is the failure — that is a rating, and no rating exists.",
@@ -24,7 +24,7 @@ export const authored = {
24
24
  roles: ["buyer"],
25
25
  startPage: "/user/orders",
26
26
  steps: [
27
- "Sign in as tester@letitrip.in / TempPass123!.",
27
+ "Sign in as rehan.sheikh@gmail.com / TempPass123!.",
28
28
  "Open /user/orders and open a delivered order.",
29
29
  "Use the control that leaves a review on one of its items.",
30
30
  "Submit with no rating and no text, and read where the errors appear.",
@@ -92,7 +92,7 @@ export const authored = {
92
92
  roles: ["buyer"],
93
93
  startPage: "/user/prize-draws",
94
94
  steps: [
95
- "Sign in as tester@letitrip.in / TempPass123!.",
95
+ "Sign in as rehan.sheikh@gmail.com / TempPass123!.",
96
96
  "Open the buyer's prize-draws surface and read every row.",
97
97
  "Check each names the draw, the number of entries bought and the outcome.",
98
98
  "Find an entry in a REVEALED draw and read the prize it names.",
@@ -108,7 +108,7 @@ export const authored = {
108
108
  roles: ["buyer"],
109
109
  startPage: "/user/digital-codes",
110
110
  steps: [
111
- "Sign in as tester@letitrip.in / TempPass123!.",
111
+ "Sign in as rehan.sheikh@gmail.com / TempPass123!.",
112
112
  "Open the buyer's digital-codes surface and read every row.",
113
113
  "Check each names the listing it came from and shows its code or its delivery state.",
114
114
  "Find an auto-claim purchase and read whether its code is present.",
@@ -140,7 +140,7 @@ export const authored = {
140
140
  roles: ["buyer"],
141
141
  startPage: "/user/orders",
142
142
  steps: [
143
- "Sign in as tester@letitrip.in / TempPass123!.",
143
+ "Sign in as rehan.sheikh@gmail.com / TempPass123!.",
144
144
  "Open /user/orders and open an order that has moved through several statuses.",
145
145
  "Open its timeline and read every step in order.",
146
146
  "Read the date and time against each step.",
@@ -156,7 +156,7 @@ export const authored = {
156
156
  roles: ["buyer"],
157
157
  startPage: "/user/orders",
158
158
  steps: [
159
- "Sign in as tester@letitrip.in / TempPass123!.",
159
+ "Sign in as rehan.sheikh@gmail.com / TempPass123!.",
160
160
  "Open /user/orders and find an order that received a partial refund.",
161
161
  "Open its timeline and look for an entry describing the refund.",
162
162
  "Read whether the entry states the amount refunded.",
@@ -171,7 +171,7 @@ export const authored = {
171
171
  roles: ["buyer"],
172
172
  startPage: "/user/orders",
173
173
  steps: [
174
- "Sign in as tester@letitrip.in / TempPass123!.",
174
+ "Sign in as rehan.sheikh@gmail.com / TempPass123!.",
175
175
  "Open /user/orders and switch to the Auction wins tab.",
176
176
  "Open an order that came from a WON auction and read what it says about how it was won.",
177
177
  "Read whether it shows the winning bid and the number of competing bids.",
@@ -202,7 +202,7 @@ export const authored = {
202
202
  roles: ["buyer"],
203
203
  startPage: "/user/orders",
204
204
  steps: [
205
- "Sign in as tester@letitrip.in / TempPass123!.",
205
+ "Sign in as rehan.sheikh@gmail.com / TempPass123!.",
206
206
  "Open an order that had coupons applied and add-ons selected.",
207
207
  "Open its timeline and read every entry.",
208
208
  "Look for entries describing coupons being applied or removed, or add-on fees changing.",
@@ -218,7 +218,7 @@ export const authored = {
218
218
  roles: ["buyer"],
219
219
  startPage: "/user/orders",
220
220
  steps: [
221
- "Sign in as tester@letitrip.in / TempPass123!.",
221
+ "Sign in as rehan.sheikh@gmail.com / TempPass123!.",
222
222
  "Open an order and open its timeline.",
223
223
  "Read every entry for a name, an email address or a phone number.",
224
224
  "Read how the actor of each change is identified.",
@@ -234,7 +234,7 @@ export const authored = {
234
234
  roles: ["buyer"],
235
235
  startPage: "/user/returns",
236
236
  steps: [
237
- "Sign in as tester@letitrip.in / TempPass123!.",
237
+ "Sign in as rehan.sheikh@gmail.com / TempPass123!.",
238
238
  "Open the buyer's returns surface and read every row.",
239
239
  "Check each names the item, the order and the reason given.",
240
240
  "Read every status filter offered and select each.",
@@ -120,7 +120,7 @@ export const authored = {
120
120
  steps: [
121
121
  "Open /categories in a private window with no session.",
122
122
  "Write down the counts on the first four category tiles.",
123
- "Sign in as the bot buyer claude-tester@letitrip.in / TempPass123!.",
123
+ "Sign in as the buyer rehan.sheikh@gmail.com / TempPass123!.",
124
124
  "Open /categories again and read the same four tiles.",
125
125
  ],
126
126
  expectedBehaviour: "A category count is a fact about the catalogue, not about the viewer. If the two differ, something viewer-scoped is leaking into a shared number — the likeliest candidate being a filter that hides test fixtures from one audience but is counted for the other.",