@smess/networking 1.0.23 → 1.0.25
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.
- package/dist/scripts/dev-test.d.ts +1 -0
- package/dist/scripts/dev-test.js +803 -0
- package/dist/scripts/real-test.d.ts +1 -0
- package/dist/scripts/real-test.js +341 -0
- package/dist/src/core/axios.d.ts +51 -0
- package/dist/src/core/axios.js +65 -0
- package/dist/src/core/axios.observable.d.ts +11 -0
- package/dist/src/core/axios.observable.js +58 -0
- package/dist/src/core/base.provider.advanced.test.d.ts +1 -0
- package/dist/src/core/base.provider.advanced.test.js +29 -0
- package/dist/src/core/base.provider.d.ts +15 -0
- package/dist/src/core/base.provider.js +13 -0
- package/dist/src/core/base.provider.test.d.ts +1 -0
- package/dist/src/core/base.provider.test.js +36 -0
- package/dist/src/core/base.service.wrapper.advanced.test.d.ts +1 -0
- package/dist/src/core/base.service.wrapper.advanced.test.js +39 -0
- package/dist/src/core/base.service.wrapper.d.ts +7 -0
- package/dist/src/core/base.service.wrapper.js +11 -0
- package/dist/src/core/base.service.wrapper.test.d.ts +1 -0
- package/dist/src/core/base.service.wrapper.test.js +25 -0
- package/dist/src/core/rx.http.service.d.ts +51 -0
- package/dist/src/core/rx.http.service.js +65 -0
- package/dist/src/index.d.ts +19 -0
- package/dist/src/index.js +23 -0
- package/dist/src/services/auth.service.d.ts +65 -0
- package/dist/src/services/auth.service.js +197 -0
- package/dist/src/services/auth.service.test.d.ts +1 -0
- package/dist/src/services/auth.service.test.js +334 -0
- package/dist/src/services/cache.service.d.ts +31 -0
- package/dist/src/services/cache.service.js +77 -0
- package/dist/src/services/cache.service.test.d.ts +1 -0
- package/dist/src/services/cache.service.test.js +88 -0
- package/dist/src/services/customer.service.d.ts +71 -0
- package/dist/src/services/customer.service.js +114 -0
- package/dist/src/services/customer.service.test.d.ts +1 -0
- package/dist/src/services/customer.service.test.js +274 -0
- package/dist/src/services/employee.service.d.ts +73 -0
- package/dist/src/services/employee.service.js +74 -0
- package/dist/src/services/employee.service.test.d.ts +1 -0
- package/dist/src/services/employee.service.test.js +127 -0
- package/dist/src/services/logger.service.d.ts +31 -0
- package/dist/src/services/logger.service.js +93 -0
- package/dist/src/services/logger.service.test.d.ts +1 -0
- package/dist/src/services/logger.service.test.js +31 -0
- package/dist/src/services/order.service.d.ts +73 -0
- package/dist/src/services/order.service.js +97 -0
- package/dist/src/services/order.service.test.d.ts +1 -0
- package/dist/src/services/order.service.test.js +163 -0
- package/dist/src/services/product.service.d.ts +21 -0
- package/dist/src/services/product.service.js +42 -0
- package/dist/src/services/product.service.test.d.ts +1 -0
- package/dist/src/services/product.service.test.js +61 -0
- package/dist/src/services/smess.service.d.ts +36 -0
- package/dist/src/services/smess.service.js +128 -0
- package/dist/src/services/smess.service.test.d.ts +1 -0
- package/dist/src/services/smess.service.test.js +103 -0
- package/dist/src/services/store.cart.service.d.ts +158 -0
- package/dist/src/services/store.cart.service.js +177 -0
- package/dist/src/services/store.cart.service.test.d.ts +1 -0
- package/dist/src/services/store.cart.service.test.js +394 -0
- package/dist/src/services/store.product.service.d.ts +123 -0
- package/dist/src/services/store.product.service.js +102 -0
- package/dist/src/services/store.product.service.test.d.ts +1 -0
- package/dist/src/services/store.product.service.test.js +319 -0
- package/dist/src/services/store.service.d.ts +79 -0
- package/dist/src/services/store.service.js +235 -0
- package/dist/src/services/store.service.test.d.ts +1 -0
- package/dist/src/services/store.service.test.js +274 -0
- package/dist/src/services/user.service.d.ts +16 -0
- package/dist/src/services/user.service.js +37 -0
- package/dist/src/services/user.service.test.d.ts +1 -0
- package/dist/src/services/user.service.test.js +52 -0
- package/dist/src/services/utils/withAuthReset.d.ts +3 -0
- package/dist/src/services/utils/withAuthReset.js +8 -0
- package/dist/src/types/types.d.ts +93 -0
- package/dist/src/types/types.js +82 -0
- package/dist/src/types/types.test.d.ts +1 -0
- package/dist/src/types/types.test.js +25 -0
- package/dist/src/utils/cache-import.d.ts +3 -0
- package/dist/src/utils/cache-import.js +2 -0
- package/dist/src/utils/networking-import.d.ts +4 -0
- package/dist/src/utils/networking-import.js +3 -0
- package/dist/src/utils/rxjs-import.d.ts +5 -0
- package/dist/src/utils/rxjs-import.js +5 -0
- package/package.json +1 -1
|
@@ -0,0 +1,803 @@
|
|
|
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
|
+
})();
|