@smess/networking 1.0.24 → 1.0.26

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 (90) hide show
  1. package/dist/index.d.ts +2 -0
  2. package/dist/index.js +2 -0
  3. package/dist/services/customer.service.d.ts +29 -1
  4. package/dist/services/customer.service.js +35 -0
  5. package/dist/services/customer.service.test.js +174 -0
  6. package/dist/{src/services → services}/employee.service.js +4 -3
  7. package/dist/{src/services → services}/employee.service.test.js +13 -6
  8. package/dist/services/utils/withAuthReset.d.ts +3 -0
  9. package/dist/services/utils/withAuthReset.js +8 -0
  10. package/package.json +1 -1
  11. package/dist/scripts/dev-test.d.ts +0 -1
  12. package/dist/scripts/dev-test.js +0 -803
  13. package/dist/scripts/real-test.d.ts +0 -1
  14. package/dist/scripts/real-test.js +0 -341
  15. package/dist/src/core/axios.d.ts +0 -51
  16. package/dist/src/core/axios.js +0 -65
  17. package/dist/src/core/axios.observable.d.ts +0 -11
  18. package/dist/src/core/axios.observable.js +0 -58
  19. package/dist/src/core/base.provider.advanced.test.d.ts +0 -1
  20. package/dist/src/core/base.provider.advanced.test.js +0 -29
  21. package/dist/src/core/base.provider.d.ts +0 -15
  22. package/dist/src/core/base.provider.js +0 -13
  23. package/dist/src/core/base.provider.test.d.ts +0 -1
  24. package/dist/src/core/base.provider.test.js +0 -36
  25. package/dist/src/core/base.service.wrapper.advanced.test.d.ts +0 -1
  26. package/dist/src/core/base.service.wrapper.advanced.test.js +0 -39
  27. package/dist/src/core/base.service.wrapper.d.ts +0 -7
  28. package/dist/src/core/base.service.wrapper.js +0 -11
  29. package/dist/src/core/base.service.wrapper.test.d.ts +0 -1
  30. package/dist/src/core/base.service.wrapper.test.js +0 -25
  31. package/dist/src/core/rx.http.service.d.ts +0 -51
  32. package/dist/src/core/rx.http.service.js +0 -65
  33. package/dist/src/index.d.ts +0 -17
  34. package/dist/src/index.js +0 -21
  35. package/dist/src/services/auth.service.d.ts +0 -65
  36. package/dist/src/services/auth.service.js +0 -197
  37. package/dist/src/services/auth.service.test.d.ts +0 -1
  38. package/dist/src/services/auth.service.test.js +0 -334
  39. package/dist/src/services/cache.service.d.ts +0 -31
  40. package/dist/src/services/cache.service.js +0 -77
  41. package/dist/src/services/cache.service.test.d.ts +0 -1
  42. package/dist/src/services/cache.service.test.js +0 -88
  43. package/dist/src/services/customer.service.d.ts +0 -71
  44. package/dist/src/services/customer.service.js +0 -114
  45. package/dist/src/services/customer.service.test.d.ts +0 -1
  46. package/dist/src/services/customer.service.test.js +0 -274
  47. package/dist/src/services/logger.service.d.ts +0 -31
  48. package/dist/src/services/logger.service.js +0 -93
  49. package/dist/src/services/logger.service.test.d.ts +0 -1
  50. package/dist/src/services/logger.service.test.js +0 -31
  51. package/dist/src/services/order.service.d.ts +0 -73
  52. package/dist/src/services/order.service.js +0 -97
  53. package/dist/src/services/order.service.test.d.ts +0 -1
  54. package/dist/src/services/order.service.test.js +0 -163
  55. package/dist/src/services/product.service.d.ts +0 -21
  56. package/dist/src/services/product.service.js +0 -42
  57. package/dist/src/services/product.service.test.d.ts +0 -1
  58. package/dist/src/services/product.service.test.js +0 -61
  59. package/dist/src/services/smess.service.d.ts +0 -36
  60. package/dist/src/services/smess.service.js +0 -128
  61. package/dist/src/services/smess.service.test.d.ts +0 -1
  62. package/dist/src/services/smess.service.test.js +0 -103
  63. package/dist/src/services/store.cart.service.d.ts +0 -158
  64. package/dist/src/services/store.cart.service.js +0 -177
  65. package/dist/src/services/store.cart.service.test.d.ts +0 -1
  66. package/dist/src/services/store.cart.service.test.js +0 -394
  67. package/dist/src/services/store.product.service.d.ts +0 -123
  68. package/dist/src/services/store.product.service.js +0 -102
  69. package/dist/src/services/store.product.service.test.d.ts +0 -1
  70. package/dist/src/services/store.product.service.test.js +0 -319
  71. package/dist/src/services/store.service.d.ts +0 -79
  72. package/dist/src/services/store.service.js +0 -235
  73. package/dist/src/services/store.service.test.d.ts +0 -1
  74. package/dist/src/services/store.service.test.js +0 -274
  75. package/dist/src/services/user.service.d.ts +0 -16
  76. package/dist/src/services/user.service.js +0 -37
  77. package/dist/src/services/user.service.test.d.ts +0 -1
  78. package/dist/src/services/user.service.test.js +0 -52
  79. package/dist/src/types/types.d.ts +0 -93
  80. package/dist/src/types/types.js +0 -82
  81. package/dist/src/types/types.test.d.ts +0 -1
  82. package/dist/src/types/types.test.js +0 -25
  83. package/dist/src/utils/cache-import.d.ts +0 -3
  84. package/dist/src/utils/cache-import.js +0 -2
  85. package/dist/src/utils/networking-import.d.ts +0 -4
  86. package/dist/src/utils/networking-import.js +0 -3
  87. package/dist/src/utils/rxjs-import.d.ts +0 -5
  88. package/dist/src/utils/rxjs-import.js +0 -5
  89. /package/dist/{src/services → services}/employee.service.d.ts +0 -0
  90. /package/dist/{src/services → services}/employee.service.test.d.ts +0 -0
@@ -1,803 +0,0 @@
1
- import "fake-indexeddb/auto";
2
- import { timeout, catchError, of } from "rxjs";
3
- import { AuthService } from "../src/services/auth.service";
4
- import { StoreService } from "../src/services/store.service";
5
- import { $logger } from "../src/services/logger.service";
6
- import { StoreCartService } from "../src/services/store.cart.service";
7
- import { StoreProductService } from "../src/services/store.product.service";
8
- function isNetworkingUIEventWrapped(val) {
9
- return (typeof val === "object" &&
10
- val !== null &&
11
- "hasSuccess" in val &&
12
- "hasFailed" in val &&
13
- "response" in val);
14
- }
15
- async function testE2EStoreFlow() {
16
- $logger.info("🚀 Starting E2E Store Flow Test", undefined, "dev-test");
17
- const config = {
18
- baseUrl: "http://server-dev.localhost",
19
- version: "api/v1",
20
- isProd: false,
21
- clientId: "0338bd6b-9e8b-11ef-bd86-5d6b03cdf979",
22
- };
23
- const authService = new AuthService(config);
24
- const storeService = new StoreService(config);
25
- const productService = new StoreProductService(config);
26
- // Step 1: Get all stores
27
- $logger.info("📋 Step 1: Getting all stores...", undefined, "dev-test");
28
- let storeId = null;
29
- try {
30
- const storeListObs$ = storeService.list().pipe(timeout({ first: 10000 }), catchError((err) => {
31
- $logger.error("❌ Get store list error", err, "dev-test");
32
- return of(undefined);
33
- }));
34
- await new Promise((resolve, reject) => {
35
- let emitted = false;
36
- storeListObs$.subscribe({
37
- next: (val) => {
38
- emitted = true;
39
- if (isNetworkingUIEventWrapped(val) &&
40
- val.hasSuccess &&
41
- val.response) {
42
- $logger.info("✅ Step 1: Store list retrieved successfully", val.response, "dev-test");
43
- // Use the provided store ID for next steps
44
- storeId = "60e23399-be11-11ef-807e-0242ac120004";
45
- resolve(undefined);
46
- }
47
- else if (isNetworkingUIEventWrapped(val) && val.hasFailed) {
48
- $logger.error("❌ Step 1: Failed to get store list", val.alertModel || val, "dev-test");
49
- reject(new Error("Get store list failed"));
50
- }
51
- },
52
- error: (err) => {
53
- $logger.error("❌ Step 1: Observable error", err, "dev-test");
54
- reject(err);
55
- },
56
- complete: () => {
57
- if (!emitted) {
58
- reject(new Error("No emission"));
59
- }
60
- },
61
- });
62
- });
63
- }
64
- catch (err) {
65
- $logger.error("❌ Step 1 failed", err, "dev-test");
66
- throw err;
67
- }
68
- if (!storeId) {
69
- $logger.error("❌ No store ID available", undefined, "dev-test");
70
- throw new Error("No store ID");
71
- }
72
- // Step 1.5: Get product categories
73
- $logger.info("📋 Step 1.5: Getting product categories...", undefined, "dev-test");
74
- try {
75
- const productCategoriesObs$ = productService.getProductCategoryList().pipe(timeout({ first: 10000 }), catchError((err) => {
76
- $logger.error("❌ Get product categories error", err, "dev-test");
77
- return of(undefined);
78
- }));
79
- await new Promise((resolve, reject) => {
80
- let emitted = false;
81
- productCategoriesObs$.subscribe({
82
- next: (val) => {
83
- emitted = true;
84
- if (isNetworkingUIEventWrapped(val) &&
85
- val.hasSuccess &&
86
- val.response) {
87
- const response = val.response;
88
- const categories = response?.data || response;
89
- $logger.info("✅ Step 1.5: Product categories retrieved successfully", undefined, "dev-test");
90
- $logger.info(`📊 Categories found: ${Array.isArray(categories) ? categories.length : 0}`, { categories: Array.isArray(categories) ? categories.slice(0, 5) : [] }, "dev-test");
91
- resolve(undefined);
92
- }
93
- else if (isNetworkingUIEventWrapped(val) && val.hasFailed) {
94
- $logger.error("❌ Step 1.5: Failed to get product categories", val.alertModel || val, "dev-test");
95
- reject(new Error("Get product categories failed"));
96
- }
97
- },
98
- error: (err) => {
99
- $logger.error("❌ Step 1.5: Observable error", err, "dev-test");
100
- reject(err);
101
- },
102
- complete: () => {
103
- if (!emitted) {
104
- reject(new Error("No emission"));
105
- }
106
- },
107
- });
108
- });
109
- }
110
- catch (err) {
111
- $logger.error("❌ Step 1.5 failed", err, "dev-test");
112
- throw err;
113
- }
114
- // Step 2: Get product collection
115
- $logger.info(`📋 Step 2: Getting product collection for store ${storeId}...`, undefined, "dev-test");
116
- let productIds = [];
117
- try {
118
- const productCollectionPayload = {
119
- page: 1,
120
- per_page: 10,
121
- };
122
- const productCollectionObs$ = productService
123
- .getProductCollectionByStore(storeId, productCollectionPayload)
124
- .pipe(timeout({ first: 10000 }), catchError((err) => {
125
- $logger.error("❌ Get product collection error", err, "dev-test");
126
- return of(undefined);
127
- }));
128
- await new Promise((resolve, reject) => {
129
- let emitted = false;
130
- productCollectionObs$.subscribe({
131
- next: (val) => {
132
- emitted = true;
133
- if (isNetworkingUIEventWrapped(val) &&
134
- val.hasSuccess &&
135
- val.response) {
136
- $logger.info("✅ Step 2: Product collection retrieved successfully", undefined, "dev-test");
137
- // Extract product IDs from the response
138
- let response = val.response;
139
- // Handle string response - parse it as JSON
140
- if (typeof response === 'string') {
141
- try {
142
- // Find the first complete JSON object by looking for balanced braces
143
- let jsonStart = response.indexOf('{');
144
- if (jsonStart === -1) {
145
- throw new Error("No JSON object found in response");
146
- }
147
- let braceCount = 0;
148
- let jsonEnd = -1;
149
- for (let i = jsonStart; i < response.length; i++) {
150
- if (response[i] === '{') {
151
- braceCount++;
152
- }
153
- else if (response[i] === '}') {
154
- braceCount--;
155
- if (braceCount === 0) {
156
- jsonEnd = i + 1;
157
- break;
158
- }
159
- }
160
- }
161
- if (jsonEnd === -1) {
162
- throw new Error("Incomplete JSON object in response");
163
- }
164
- const jsonString = response.substring(jsonStart, jsonEnd);
165
- response = JSON.parse(jsonString);
166
- $logger.info("✅ Parsed string response as JSON", undefined, "dev-test");
167
- }
168
- catch (e) {
169
- $logger.error("❌ Failed to parse string response as JSON", e, "dev-test");
170
- resolve(undefined);
171
- return;
172
- }
173
- }
174
- // Log the response structure for debugging
175
- $logger.info("📊 Response structure:", {
176
- hasData: !!response?.data,
177
- hasItems: !!response?.items,
178
- dataItemsLength: response?.data?.items?.length,
179
- itemsLength: response?.items?.length,
180
- responseType: typeof response,
181
- responseKeys: response ? Object.keys(response) : [],
182
- }, "dev-test");
183
- // Try different response structures
184
- let items = null;
185
- if (response?.data?.items && Array.isArray(response.data.items)) {
186
- items = response.data.items;
187
- $logger.info("✅ Using response.data.items", undefined, "dev-test");
188
- }
189
- else if (response?.items && Array.isArray(response.items)) {
190
- items = response.items;
191
- $logger.info("✅ Using response.items", undefined, "dev-test");
192
- }
193
- else {
194
- $logger.warn("❌ No items found in response", {
195
- responseType: typeof response,
196
- responseKeys: response ? Object.keys(response) : [],
197
- dataKeys: response?.data ? Object.keys(response.data) : [],
198
- }, "dev-test");
199
- }
200
- if (items && items.length > 0) {
201
- // Extract all product IDs
202
- productIds = items.map((item) => item.id);
203
- $logger.info(`📦 Product IDs extracted: ${productIds.length} products`, { productIds: productIds.slice(0, 5) }, // Show first 5
204
- "dev-test");
205
- }
206
- else {
207
- $logger.warn("⚠️ No products found in collection", {
208
- responseType: typeof response,
209
- responseKeys: response ? Object.keys(response) : [],
210
- dataKeys: response?.data ? Object.keys(response.data) : [],
211
- itemsType: typeof items,
212
- itemsLength: items?.length
213
- }, "dev-test");
214
- }
215
- resolve(undefined);
216
- }
217
- else if (isNetworkingUIEventWrapped(val) && val.hasFailed) {
218
- $logger.error("❌ Step 2: Failed to get product collection", val.alertModel || val, "dev-test");
219
- reject(new Error("Get product collection failed"));
220
- }
221
- },
222
- error: (err) => {
223
- $logger.error("❌ Step 2: Observable error", err, "dev-test");
224
- reject(err);
225
- },
226
- complete: () => {
227
- if (!emitted) {
228
- reject(new Error("No emission"));
229
- }
230
- },
231
- });
232
- });
233
- }
234
- catch (err) {
235
- $logger.error("❌ Step 2 failed", err, "dev-test");
236
- throw err;
237
- }
238
- if (productIds.length === 0) {
239
- $logger.warn("⚠️ No product IDs available, skipping remaining steps", undefined, "dev-test");
240
- return;
241
- }
242
- // Step 3: Get product details using StoreProductService
243
- const productId = productIds[0]; // Use first product
244
- $logger.info(`📋 Step 3: Getting product details for ${productId}...`, undefined, "dev-test");
245
- try {
246
- const productDetailsObs$ = productService.getProductById(productId).pipe(timeout({ first: 10000 }), catchError((err) => {
247
- $logger.error("❌ Get product details error", err, "dev-test");
248
- return of(undefined);
249
- }));
250
- await new Promise((resolve, reject) => {
251
- let emitted = false;
252
- productDetailsObs$.subscribe({
253
- next: (val) => {
254
- emitted = true;
255
- if (isNetworkingUIEventWrapped(val) &&
256
- val.hasSuccess &&
257
- val.response) {
258
- $logger.info("✅ Step 3: Product details retrieved successfully", val.response, "dev-test");
259
- resolve(undefined);
260
- }
261
- else if (isNetworkingUIEventWrapped(val) && val.hasFailed) {
262
- $logger.error("❌ Step 3: Failed to get product details", val.alertModel || val, "dev-test");
263
- reject(new Error("Get product details failed"));
264
- }
265
- },
266
- error: (err) => {
267
- $logger.error("❌ Step 3: Observable error", err, "dev-test");
268
- reject(err);
269
- },
270
- complete: () => {
271
- if (!emitted) {
272
- reject(new Error("No emission"));
273
- }
274
- },
275
- });
276
- });
277
- }
278
- catch (err) {
279
- $logger.error("❌ Step 3 failed", err, "dev-test");
280
- throw err;
281
- }
282
- // Step 4: Get cart using StoreCartService
283
- $logger.info(`📋 Step 4: Getting cart for store ${storeId}...`, undefined, "dev-test");
284
- // Set the selected store ID in StoreService
285
- storeService.setSelectedStoreId(storeId);
286
- // Create cart service with the shared storeId observable from StoreService
287
- const cartService = new StoreCartService(config, storeService.$selectedStoreId);
288
- try {
289
- const cartObs$ = cartService.getCart().pipe(timeout({ first: 10000 }), catchError((err) => {
290
- $logger.error("❌ Get cart error", err, "dev-test");
291
- return of(undefined);
292
- }));
293
- await new Promise((resolve, reject) => {
294
- let emitted = false;
295
- cartObs$.subscribe({
296
- next: (val) => {
297
- emitted = true;
298
- if (isNetworkingUIEventWrapped(val) &&
299
- val.hasSuccess &&
300
- val.response) {
301
- $logger.info("✅ Step 4: Cart retrieved successfully", undefined, "dev-test");
302
- // Extract actual cart data
303
- const cartResponse = val.response;
304
- const actualCart = cartResponse?.data || cartResponse;
305
- $logger.info("📊 Cart Response Structure:", {
306
- hasData: !!cartResponse?.data,
307
- hasCartItems: !!actualCart?.cartItems,
308
- hasCartHash: !!actualCart?.cartHash,
309
- }, "dev-test");
310
- if (actualCart?.cartHash) {
311
- $logger.info(`🔐 Cart Hash: ${actualCart.cartHash}`, undefined, "dev-test");
312
- }
313
- resolve(undefined);
314
- }
315
- else if (isNetworkingUIEventWrapped(val) && val.hasFailed) {
316
- $logger.error("❌ Step 4: Failed to get cart", val.alertModel || val, "dev-test");
317
- reject(new Error("Get cart failed"));
318
- }
319
- },
320
- error: (err) => {
321
- $logger.error("❌ Step 4: Observable error", err, "dev-test");
322
- reject(err);
323
- },
324
- complete: () => {
325
- if (!emitted) {
326
- reject(new Error("No emission"));
327
- }
328
- },
329
- });
330
- });
331
- }
332
- catch (err) {
333
- $logger.error("❌ Step 4 failed", err, "dev-test");
334
- throw err;
335
- }
336
- // Step 5: Add item to cart
337
- let cartItemId = null;
338
- $logger.info(`📋 Step 5: Adding product ${productId} to cart...`, undefined, "dev-test");
339
- try {
340
- const addItemPayload = {
341
- product_id: productId,
342
- quantity: 2,
343
- };
344
- const addItemObs$ = cartService.addItem(addItemPayload).pipe(timeout({ first: 10000 }), catchError((err) => {
345
- $logger.error("❌ Add item to cart error", err, "dev-test");
346
- return of(undefined);
347
- }));
348
- await new Promise((resolve, reject) => {
349
- let emitted = false;
350
- addItemObs$.subscribe({
351
- next: (val) => {
352
- emitted = true;
353
- if (isNetworkingUIEventWrapped(val) &&
354
- val.hasSuccess &&
355
- val.response) {
356
- $logger.info("✅ Step 5: Item added to cart successfully", undefined, "dev-test");
357
- // Log updated cart details
358
- const cartResponse = val.response;
359
- // Check if response has data wrapper
360
- const actualCart = cartResponse?.data || cartResponse;
361
- $logger.info("📊 Cart Response Structure:", {
362
- hasData: !!cartResponse?.data,
363
- hasCartItems: !!actualCart?.cartItems,
364
- hasCartHash: !!actualCart?.cartHash,
365
- }, "dev-test");
366
- $logger.info(`🛒 Cart updated:`, {
367
- totalItems: actualCart?.cartItems?.length || 0,
368
- total: actualCart?.total || 0,
369
- cartHash: actualCart?.cartHash,
370
- }, "dev-test");
371
- // Extract cart item ID for next step
372
- if (actualCart?.cartItems && actualCart.cartItems.length > 0) {
373
- cartItemId = actualCart.cartItems[0].id;
374
- $logger.info(`🔖 Cart Item ID: ${cartItemId}`, undefined, "dev-test");
375
- }
376
- resolve(undefined);
377
- }
378
- else if (isNetworkingUIEventWrapped(val) && val.hasFailed) {
379
- $logger.error("❌ Step 5: Failed to add item to cart", val.alertModel || val, "dev-test");
380
- reject(new Error("Add item to cart failed"));
381
- }
382
- },
383
- error: (err) => {
384
- $logger.error("❌ Step 5: Observable error", err, "dev-test");
385
- reject(err);
386
- },
387
- complete: () => {
388
- if (!emitted) {
389
- reject(new Error("No emission"));
390
- }
391
- },
392
- });
393
- });
394
- }
395
- catch (err) {
396
- $logger.error("❌ Step 5 failed", err, "dev-test");
397
- throw err;
398
- }
399
- // Step 6: Update item quantity
400
- if (!cartItemId) {
401
- $logger.warn("⚠️ No cart item ID available, skipping update quantity step", undefined, "dev-test");
402
- }
403
- else {
404
- $logger.info(`📋 Step 6: Updating quantity for cart item ${cartItemId}...`, undefined, "dev-test");
405
- try {
406
- const updateQuantityPayload = {
407
- quantity: 5,
408
- };
409
- const updateQuantityObs$ = cartService
410
- .updateItemQuantity(cartItemId, updateQuantityPayload)
411
- .pipe(timeout({ first: 10000 }), catchError((err) => {
412
- $logger.error("❌ Update item quantity error", err, "dev-test");
413
- return of(undefined);
414
- }));
415
- await new Promise((resolve, reject) => {
416
- let emitted = false;
417
- updateQuantityObs$.subscribe({
418
- next: (val) => {
419
- emitted = true;
420
- if (isNetworkingUIEventWrapped(val) &&
421
- val.hasSuccess &&
422
- val.response) {
423
- $logger.info("✅ Step 6: Item quantity updated successfully", undefined, "dev-test");
424
- // Log updated cart details
425
- const cartResponse = val.response;
426
- const actualCart = cartResponse?.data || cartResponse;
427
- $logger.info(`🛒 Cart after quantity update:`, {
428
- totalItems: actualCart?.cartItems?.length || 0,
429
- total: actualCart?.total || 0,
430
- cartHash: actualCart?.cartHash,
431
- }, "dev-test");
432
- resolve(undefined);
433
- }
434
- else if (isNetworkingUIEventWrapped(val) && val.hasFailed) {
435
- $logger.error("❌ Step 6: Failed to update item quantity", val.alertModel || val, "dev-test");
436
- reject(new Error("Update item quantity failed"));
437
- }
438
- },
439
- error: (err) => {
440
- $logger.error("❌ Step 6: Observable error", err, "dev-test");
441
- reject(err);
442
- },
443
- complete: () => {
444
- if (!emitted) {
445
- reject(new Error("No emission"));
446
- }
447
- },
448
- });
449
- });
450
- }
451
- catch (err) {
452
- $logger.error("❌ Step 6 failed", err, "dev-test");
453
- throw err;
454
- }
455
- }
456
- // Step 7: Add 2 more items from product IDs
457
- let cartItem2Id = null;
458
- $logger.info("📋 Step 7: Adding 2 more items to cart...", undefined, "dev-test");
459
- if (productIds.length < 3) {
460
- $logger.warn(`⚠️ Not enough products (need 3, have ${productIds.length}), skipping step 7`, undefined, "dev-test");
461
- }
462
- else {
463
- try {
464
- // Use 2nd and 3rd products from our product IDs array
465
- const product2Id = productIds[1];
466
- const product3Id = productIds[2];
467
- $logger.info(`➕ Adding product 2: ${product2Id}`, undefined, "dev-test");
468
- // Add second product
469
- try {
470
- const addItem2Obs$ = cartService.addItem({
471
- product_id: product2Id,
472
- quantity: 1,
473
- }).pipe(timeout({ first: 10000 }), catchError((err) => {
474
- $logger.error("❌ Add item 2 error", err, "dev-test");
475
- return of(undefined);
476
- }));
477
- await new Promise((resolve2, reject2) => {
478
- addItem2Obs$.subscribe({
479
- next: (val2) => {
480
- if (isNetworkingUIEventWrapped(val2) &&
481
- val2.hasSuccess &&
482
- val2.response) {
483
- // Extract cart item 2 ID for later removal
484
- const cartResponse = val2.response;
485
- const actualCart = cartResponse?.data || cartResponse;
486
- $logger.info("✅ Product 2 added successfully", {
487
- totalItems: actualCart?.cartItems?.length || 0,
488
- cartHash: actualCart?.cartHash,
489
- }, "dev-test");
490
- // Find the item we just added (should be the second item in the cart)
491
- if (actualCart?.cartItems && actualCart.cartItems.length >= 2) {
492
- // The second item (index 1) should be the one we just added
493
- cartItem2Id = actualCart.cartItems[1].id;
494
- $logger.info(`🔖 Cart Item 2 ID: ${cartItem2Id}`, undefined, "dev-test");
495
- }
496
- else if (actualCart?.cartItems && actualCart.cartItems.length === 1) {
497
- // If there's only 1 item, it means this is the first item added
498
- // This shouldn't happen in our flow, but handle it
499
- cartItem2Id = actualCart.cartItems[0].id;
500
- $logger.warn(`⚠️ Only 1 item in cart, using item ID: ${cartItem2Id}`, undefined, "dev-test");
501
- }
502
- else {
503
- $logger.error("❌ No items in cart after adding product 2", { actualCart }, "dev-test");
504
- }
505
- resolve2();
506
- }
507
- else if (isNetworkingUIEventWrapped(val2) && val2.hasFailed) {
508
- reject2(new Error("Add product 2 failed"));
509
- }
510
- },
511
- error: reject2,
512
- complete: () => { },
513
- });
514
- });
515
- }
516
- catch (err) {
517
- $logger.error("❌ Failed to add product 2", err, "dev-test");
518
- }
519
- $logger.info(`➕ Adding product 3: ${product3Id}`, undefined, "dev-test");
520
- // Add third product
521
- try {
522
- const addItem3Obs$ = cartService.addItem({
523
- product_id: product3Id,
524
- quantity: 3,
525
- }).pipe(timeout({ first: 10000 }), catchError((err) => {
526
- $logger.error("❌ Add item 3 error", err, "dev-test");
527
- return of(undefined);
528
- }));
529
- await new Promise((resolve3, reject3) => {
530
- addItem3Obs$.subscribe({
531
- next: (val3) => {
532
- if (isNetworkingUIEventWrapped(val3) &&
533
- val3.hasSuccess &&
534
- val3.response) {
535
- const cartResponse = val3.response;
536
- $logger.info("✅ Product 3 added successfully", undefined, "dev-test");
537
- // Log the full response structure to debug
538
- $logger.info("📊 Cart Response Structure:", {
539
- hasData: !!cartResponse?.data,
540
- hasCartItems: !!cartResponse?.cartItems,
541
- hasDataCartItems: !!cartResponse?.data?.cartItems,
542
- dataCartItemsLength: cartResponse?.data?.cartItems?.length,
543
- cartItemsLength: cartResponse?.cartItems?.length,
544
- hasCartHash: !!cartResponse?.cartHash,
545
- hasDataCartHash: !!cartResponse?.data?.cartHash,
546
- }, "dev-test");
547
- // Try to extract from different possible structures
548
- let finalCartItems = null;
549
- let finalTotal = 0;
550
- let finalCartHash = null;
551
- if (cartResponse?.data) {
552
- finalCartItems = cartResponse.data.cartItems || [];
553
- finalTotal = cartResponse.data.total || 0;
554
- finalCartHash = cartResponse.data.cartHash;
555
- }
556
- else {
557
- finalCartItems = cartResponse?.cartItems || [];
558
- finalTotal = cartResponse?.total || 0;
559
- finalCartHash = cartResponse?.cartHash;
560
- }
561
- $logger.info(`🛒 Final cart status:`, {
562
- totalItems: finalCartItems?.length || 0,
563
- total: finalTotal,
564
- cartHash: finalCartHash,
565
- }, "dev-test");
566
- resolve3();
567
- }
568
- else if (isNetworkingUIEventWrapped(val3) && val3.hasFailed) {
569
- reject3(new Error("Add product 3 failed"));
570
- }
571
- },
572
- error: reject3,
573
- complete: () => { },
574
- });
575
- });
576
- }
577
- catch (err) {
578
- $logger.error("❌ Failed to add product 3", err, "dev-test");
579
- }
580
- $logger.info("✅ Step 7: All items added successfully", undefined, "dev-test");
581
- }
582
- catch (err) {
583
- $logger.error("❌ Step 7 failed", err, "dev-test");
584
- throw err;
585
- }
586
- }
587
- // Step 8: Remove item 2 from cart
588
- // Step 7.5: Batch add/update items using new endpoint
589
- $logger.info("📋 Step 7.5: Batch add/update items...", undefined, "dev-test");
590
- try {
591
- // Build a dynamic payload based on available product IDs
592
- const createPayload = [];
593
- const updatePayload = [];
594
- // Use additional product IDs for 'create' if available
595
- if (productIds.length >= 4) {
596
- createPayload.push({ product_id: productIds[3], quantity: 2 });
597
- }
598
- if (productIds.length >= 5) {
599
- createPayload.push({ product_id: productIds[4], quantity: 1 });
600
- }
601
- // Update the first product quantity if present
602
- if (productIds.length >= 1) {
603
- updatePayload.push({ product_id: productIds[0], quantity: 5 });
604
- }
605
- if (createPayload.length === 0 && updatePayload.length === 0) {
606
- $logger.warn("⚠️ Not enough products to perform batch operation, skipping step 7.5", undefined, "dev-test");
607
- }
608
- else {
609
- const batchPayload = {};
610
- if (createPayload.length > 0)
611
- batchPayload.create = createPayload;
612
- if (updatePayload.length > 0)
613
- batchPayload.update = updatePayload;
614
- const batchObs$ = (new StoreCartService(config, storeService.$selectedStoreId))
615
- .batchItems(batchPayload)
616
- .pipe(timeout({ first: 10000 }), catchError((err) => {
617
- $logger.error("❌ Batch add/update items error", err, "dev-test");
618
- return of(undefined);
619
- }));
620
- await new Promise((resolve, reject) => {
621
- let emitted = false;
622
- batchObs$.subscribe({
623
- next: (val) => {
624
- emitted = true;
625
- if (isNetworkingUIEventWrapped(val) &&
626
- val.hasSuccess &&
627
- val.response) {
628
- const cartResponse = val.response;
629
- const actualCart = cartResponse?.data || cartResponse;
630
- $logger.info("✅ Step 7.5: Batch operation succeeded", undefined, "dev-test");
631
- $logger.info("🛒 Cart after batch operation:", {
632
- totalItems: actualCart?.cartItems?.length || 0,
633
- total: actualCart?.total || 0,
634
- cartHash: actualCart?.cartHash,
635
- }, "dev-test");
636
- resolve(undefined);
637
- }
638
- else if (isNetworkingUIEventWrapped(val) && val.hasFailed) {
639
- $logger.error("❌ Step 7.5: Batch operation failed", val.alertModel || val, "dev-test");
640
- reject(new Error("Batch items failed"));
641
- }
642
- },
643
- error: (err) => {
644
- $logger.error("❌ Step 7.5: Observable error", err, "dev-test");
645
- reject(err);
646
- },
647
- complete: () => {
648
- if (!emitted) {
649
- reject(new Error("No emission"));
650
- }
651
- },
652
- });
653
- });
654
- }
655
- }
656
- catch (err) {
657
- $logger.error("❌ Step 7.5 failed", err, "dev-test");
658
- throw err;
659
- }
660
- // Step 8: Remove item 2 from cart
661
- if (!cartItem2Id) {
662
- $logger.warn("⚠️ No cart item 2 ID available, skipping remove item step", undefined, "dev-test");
663
- }
664
- else {
665
- $logger.info(`📋 Step 8: Removing item 2 (${cartItem2Id}) from cart...`, undefined, "dev-test");
666
- try {
667
- const deleteItemObs$ = cartService.deleteItem(cartItem2Id).pipe(timeout({ first: 10000 }), catchError((err) => {
668
- $logger.error("❌ Delete item error", err, "dev-test");
669
- return of(undefined);
670
- }));
671
- await new Promise((resolve, reject) => {
672
- let emitted = false;
673
- deleteItemObs$.subscribe({
674
- next: (val) => {
675
- emitted = true;
676
- if (isNetworkingUIEventWrapped(val) &&
677
- val.hasSuccess) {
678
- $logger.info("✅ Step 8: Item 2 removed successfully", undefined, "dev-test");
679
- // Get cart to see updated state
680
- cartService.getCart().pipe(timeout({ first: 10000 }), catchError((err) => {
681
- $logger.error("❌ Get cart after delete error", err, "dev-test");
682
- return of(undefined);
683
- })).subscribe({
684
- next: (cartVal) => {
685
- if (isNetworkingUIEventWrapped(cartVal) &&
686
- cartVal.hasSuccess &&
687
- cartVal.response) {
688
- const cartResponse = cartVal.response;
689
- const actualCart = cartResponse?.data || cartResponse;
690
- $logger.info(`🛒 Cart after removing item 2:`, {
691
- totalItems: actualCart?.cartItems?.length || 0,
692
- total: actualCart?.total || 0,
693
- cartHash: actualCart?.cartHash,
694
- }, "dev-test");
695
- }
696
- },
697
- });
698
- resolve(undefined);
699
- }
700
- else if (isNetworkingUIEventWrapped(val) && val.hasFailed) {
701
- $logger.error("❌ Step 8: Failed to remove item 2", val.alertModel || val, "dev-test");
702
- reject(new Error("Delete item failed"));
703
- }
704
- },
705
- error: (err) => {
706
- $logger.error("❌ Step 8: Observable error", err, "dev-test");
707
- reject(err);
708
- },
709
- complete: () => {
710
- if (!emitted) {
711
- reject(new Error("No emission"));
712
- }
713
- },
714
- });
715
- });
716
- }
717
- catch (err) {
718
- $logger.error("❌ Step 8 failed", err, "dev-test");
719
- throw err;
720
- }
721
- }
722
- // Step 9: Update cart with customer information
723
- $logger.info("📋 Step 9: Updating cart with customer information...", undefined, "dev-test");
724
- try {
725
- const updateCartPayload = {
726
- status: "submitted",
727
- customer_note: "Customer Note Example",
728
- customer_id: "f1df6e9a-0160-11f0-82c2-6cac1a7e2953",
729
- payment_method: "bank_transfer",
730
- delivery_type: "delivery",
731
- billing_information: {
732
- email: "billing@example.com",
733
- phone_number: "+1-555-111-2222",
734
- street: "456 Market Street",
735
- city: "san_francisco",
736
- postal_code: "94103",
737
- state: "ca",
738
- country: "us",
739
- },
740
- shipping_information: {
741
- email: "john.doe@example.com",
742
- phone_number: "+1-555-123-4567",
743
- street: "123 Main Street",
744
- city: "san_francisco",
745
- postal_code: "94105",
746
- state: "ca",
747
- country: "us",
748
- },
749
- };
750
- const updateCartObs$ = cartService.updateCart(updateCartPayload).pipe(timeout({ first: 10000 }), catchError((err) => {
751
- $logger.error("❌ Update cart error", err, "dev-test");
752
- return of(undefined);
753
- }));
754
- await new Promise((resolve, reject) => {
755
- let emitted = false;
756
- updateCartObs$.subscribe({
757
- next: (val) => {
758
- emitted = true;
759
- if (isNetworkingUIEventWrapped(val) &&
760
- val.hasSuccess &&
761
- val.response) {
762
- $logger.info("✅ Step 9: Cart updated successfully", undefined, "dev-test");
763
- const cartResponse = val.response;
764
- const actualCart = cartResponse?.data || cartResponse;
765
- $logger.info(`🛒 Complete Final Cart Information:`, actualCart, "dev-test");
766
- resolve(undefined);
767
- }
768
- else if (isNetworkingUIEventWrapped(val) && val.hasFailed) {
769
- $logger.error("❌ Step 9: Failed to update cart", val.alertModel || val, "dev-test");
770
- reject(new Error("Update cart failed"));
771
- }
772
- },
773
- error: (err) => {
774
- $logger.error("❌ Step 9: Observable error", err, "dev-test");
775
- reject(err);
776
- },
777
- complete: () => {
778
- if (!emitted) {
779
- reject(new Error("No emission"));
780
- }
781
- },
782
- });
783
- });
784
- }
785
- catch (err) {
786
- $logger.error("❌ Step 9 failed", err, "dev-test");
787
- throw err;
788
- }
789
- $logger.info("🎉 E2E Store Flow completed successfully!", undefined, "dev-test");
790
- }
791
- (async () => {
792
- try {
793
- // E2E Store Flow Test
794
- await testE2EStoreFlow();
795
- $logger.info("✅ E2E Store Flow test passed!", undefined, "dev-test");
796
- $logger.info("🎉 All dev API tests passed!", undefined, "dev-test");
797
- process.exit(0);
798
- }
799
- catch (err) {
800
- $logger.error("❌ E2E Store Flow test failed", err, "dev-test");
801
- process.exit(1);
802
- }
803
- })();