@congminh1254/shopee-sdk 1.6.2 → 1.8.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 (158) hide show
  1. package/README.md +9 -3
  2. package/lib/__tests__/errors.test.d.ts +1 -0
  3. package/lib/__tests__/errors.test.js +49 -0
  4. package/lib/__tests__/errors.test.js.map +1 -0
  5. package/lib/__tests__/fetch.test.d.ts +1 -0
  6. package/lib/__tests__/fetch.test.js +494 -0
  7. package/lib/__tests__/fetch.test.js.map +1 -0
  8. package/lib/__tests__/integration.test.d.ts +1 -0
  9. package/lib/__tests__/integration.test.js +201 -0
  10. package/lib/__tests__/integration.test.js.map +1 -0
  11. package/lib/__tests__/managers/account-health.manager.test.d.ts +1 -0
  12. package/lib/__tests__/managers/account-health.manager.test.js +446 -0
  13. package/lib/__tests__/managers/account-health.manager.test.js.map +1 -0
  14. package/lib/__tests__/managers/add-on-deal.manager.test.d.ts +1 -0
  15. package/lib/__tests__/managers/add-on-deal.manager.test.js +636 -0
  16. package/lib/__tests__/managers/add-on-deal.manager.test.js.map +1 -0
  17. package/lib/__tests__/managers/ads.manager.test.d.ts +1 -0
  18. package/lib/__tests__/managers/ads.manager.test.js +1016 -0
  19. package/lib/__tests__/managers/ads.manager.test.js.map +1 -0
  20. package/lib/__tests__/managers/ams.manager.test.d.ts +1 -0
  21. package/lib/__tests__/managers/ams.manager.test.js +1170 -0
  22. package/lib/__tests__/managers/ams.manager.test.js.map +1 -0
  23. package/lib/__tests__/managers/auth.manager.test.d.ts +1 -0
  24. package/lib/__tests__/managers/auth.manager.test.js +193 -0
  25. package/lib/__tests__/managers/auth.manager.test.js.map +1 -0
  26. package/lib/__tests__/managers/bundle-deal.manager.test.d.ts +1 -0
  27. package/lib/__tests__/managers/bundle-deal.manager.test.js +465 -0
  28. package/lib/__tests__/managers/bundle-deal.manager.test.js.map +1 -0
  29. package/lib/__tests__/managers/discount.manager.test.d.ts +1 -0
  30. package/lib/__tests__/managers/discount.manager.test.js +615 -0
  31. package/lib/__tests__/managers/discount.manager.test.js.map +1 -0
  32. package/lib/__tests__/managers/fbs.manager.test.d.ts +1 -0
  33. package/lib/__tests__/managers/fbs.manager.test.js +349 -0
  34. package/lib/__tests__/managers/fbs.manager.test.js.map +1 -0
  35. package/lib/__tests__/managers/first-mile.manager.test.d.ts +1 -0
  36. package/lib/__tests__/managers/first-mile.manager.test.js +629 -0
  37. package/lib/__tests__/managers/first-mile.manager.test.js.map +1 -0
  38. package/lib/__tests__/managers/follow-prize.manager.test.d.ts +1 -0
  39. package/lib/__tests__/managers/follow-prize.manager.test.js +408 -0
  40. package/lib/__tests__/managers/follow-prize.manager.test.js.map +1 -0
  41. package/lib/__tests__/managers/global-product.manager.test.d.ts +1 -0
  42. package/lib/__tests__/managers/global-product.manager.test.js +1253 -0
  43. package/lib/__tests__/managers/global-product.manager.test.js.map +1 -0
  44. package/lib/__tests__/managers/livestream.manager.test.d.ts +1 -0
  45. package/lib/__tests__/managers/livestream.manager.test.js +877 -0
  46. package/lib/__tests__/managers/livestream.manager.test.js.map +1 -0
  47. package/lib/__tests__/managers/logistics.manager.test.d.ts +1 -0
  48. package/lib/__tests__/managers/logistics.manager.test.js +1125 -0
  49. package/lib/__tests__/managers/logistics.manager.test.js.map +1 -0
  50. package/lib/__tests__/managers/media-space.manager.test.d.ts +1 -0
  51. package/lib/__tests__/managers/media-space.manager.test.js +556 -0
  52. package/lib/__tests__/managers/media-space.manager.test.js.map +1 -0
  53. package/lib/__tests__/managers/media.manager.test.d.ts +1 -0
  54. package/lib/__tests__/managers/media.manager.test.js +681 -0
  55. package/lib/__tests__/managers/media.manager.test.js.map +1 -0
  56. package/lib/__tests__/managers/merchant.manager.test.d.ts +1 -0
  57. package/lib/__tests__/managers/merchant.manager.test.js +328 -0
  58. package/lib/__tests__/managers/merchant.manager.test.js.map +1 -0
  59. package/lib/__tests__/managers/order.manager.test.d.ts +1 -0
  60. package/lib/__tests__/managers/order.manager.test.js +937 -0
  61. package/lib/__tests__/managers/order.manager.test.js.map +1 -0
  62. package/lib/__tests__/managers/payment.manager.test.d.ts +1 -0
  63. package/lib/__tests__/managers/payment.manager.test.js +1167 -0
  64. package/lib/__tests__/managers/payment.manager.test.js.map +1 -0
  65. package/lib/__tests__/managers/product.manager.test.d.ts +1 -0
  66. package/lib/__tests__/managers/product.manager.test.js +2247 -0
  67. package/lib/__tests__/managers/product.manager.test.js.map +1 -0
  68. package/lib/__tests__/managers/public.manager.test.d.ts +1 -0
  69. package/lib/__tests__/managers/public.manager.test.js +209 -0
  70. package/lib/__tests__/managers/public.manager.test.js.map +1 -0
  71. package/lib/__tests__/managers/push.manager.test.d.ts +1 -0
  72. package/lib/__tests__/managers/push.manager.test.js +244 -0
  73. package/lib/__tests__/managers/push.manager.test.js.map +1 -0
  74. package/lib/__tests__/managers/returns.manager.test.d.ts +1 -0
  75. package/lib/__tests__/managers/returns.manager.test.js +783 -0
  76. package/lib/__tests__/managers/returns.manager.test.js.map +1 -0
  77. package/lib/__tests__/managers/sbs.manager.test.d.ts +1 -0
  78. package/lib/__tests__/managers/sbs.manager.test.js +492 -0
  79. package/lib/__tests__/managers/sbs.manager.test.js.map +1 -0
  80. package/lib/__tests__/managers/shop-category.manager.test.d.ts +1 -0
  81. package/lib/__tests__/managers/shop-category.manager.test.js +425 -0
  82. package/lib/__tests__/managers/shop-category.manager.test.js.map +1 -0
  83. package/lib/__tests__/managers/shop-flash-sale.manager.test.d.ts +1 -0
  84. package/lib/__tests__/managers/shop-flash-sale.manager.test.js +492 -0
  85. package/lib/__tests__/managers/shop-flash-sale.manager.test.js.map +1 -0
  86. package/lib/__tests__/managers/shop.manager.test.d.ts +1 -0
  87. package/lib/__tests__/managers/shop.manager.test.js +637 -0
  88. package/lib/__tests__/managers/shop.manager.test.js.map +1 -0
  89. package/lib/__tests__/managers/top-picks.manager.test.d.ts +1 -0
  90. package/lib/__tests__/managers/top-picks.manager.test.js +324 -0
  91. package/lib/__tests__/managers/top-picks.manager.test.js.map +1 -0
  92. package/lib/__tests__/managers/video.manager.test.d.ts +1 -0
  93. package/lib/__tests__/managers/video.manager.test.js +1039 -0
  94. package/lib/__tests__/managers/video.manager.test.js.map +1 -0
  95. package/lib/__tests__/managers/voucher.manager.test.d.ts +1 -0
  96. package/lib/__tests__/managers/voucher.manager.test.js +442 -0
  97. package/lib/__tests__/managers/voucher.manager.test.js.map +1 -0
  98. package/lib/__tests__/sdk.test.d.ts +1 -0
  99. package/lib/__tests__/sdk.test.js +316 -0
  100. package/lib/__tests__/sdk.test.js.map +1 -0
  101. package/lib/__tests__/storage/custom-token-storage.test.d.ts +1 -0
  102. package/lib/__tests__/storage/custom-token-storage.test.js +337 -0
  103. package/lib/__tests__/storage/custom-token-storage.test.js.map +1 -0
  104. package/lib/__tests__/utils/signature.test.d.ts +1 -0
  105. package/lib/__tests__/utils/signature.test.js +38 -0
  106. package/lib/__tests__/utils/signature.test.js.map +1 -0
  107. package/lib/__tests__/utils/spec-audit.test.d.ts +1 -0
  108. package/lib/__tests__/utils/spec-audit.test.js +176 -0
  109. package/lib/__tests__/utils/spec-audit.test.js.map +1 -0
  110. package/lib/errors.js +2 -0
  111. package/lib/errors.js.map +1 -1
  112. package/lib/fetch.js +1 -1
  113. package/lib/fetch.js.map +1 -1
  114. package/lib/managers/ads.manager.d.ts +1 -41
  115. package/lib/managers/ads.manager.js +0 -54
  116. package/lib/managers/ads.manager.js.map +1 -1
  117. package/lib/managers/auth.manager.d.ts +2 -1
  118. package/lib/managers/auth.manager.js +2 -5
  119. package/lib/managers/auth.manager.js.map +1 -1
  120. package/lib/managers/base.manager.js +1 -0
  121. package/lib/managers/base.manager.js.map +1 -1
  122. package/lib/managers/media.manager.d.ts +36 -1
  123. package/lib/managers/media.manager.js +68 -0
  124. package/lib/managers/media.manager.js.map +1 -1
  125. package/lib/managers/order.manager.js +1 -0
  126. package/lib/managers/order.manager.js.map +1 -1
  127. package/lib/managers/payment.manager.d.ts +13 -1
  128. package/lib/managers/payment.manager.js +26 -0
  129. package/lib/managers/payment.manager.js.map +1 -1
  130. package/lib/managers/product.manager.js +1 -1
  131. package/lib/managers/product.manager.js.map +1 -1
  132. package/lib/schemas/ads.d.ts +2 -56
  133. package/lib/schemas/ams.d.ts +92 -0
  134. package/lib/schemas/base.d.ts +2 -0
  135. package/lib/schemas/discount.d.ts +4 -0
  136. package/lib/schemas/fetch.d.ts +1 -1
  137. package/lib/schemas/livestream.d.ts +14 -0
  138. package/lib/schemas/media.d.ts +107 -0
  139. package/lib/schemas/merchant.d.ts +2 -0
  140. package/lib/schemas/order.d.ts +22 -0
  141. package/lib/schemas/payment.d.ts +96 -0
  142. package/lib/schemas/product.d.ts +253 -15
  143. package/lib/schemas/public.d.ts +3 -0
  144. package/lib/schemas/region.d.ts +9 -2
  145. package/lib/schemas/region.js +9 -2
  146. package/lib/schemas/region.js.map +1 -1
  147. package/lib/schemas/returns.d.ts +38 -1
  148. package/lib/schemas/shop.d.ts +16 -0
  149. package/lib/schemas/video.d.ts +83 -37
  150. package/lib/schemas/voucher.d.ts +2 -0
  151. package/lib/sdk.d.ts +6 -1
  152. package/lib/sdk.js +53 -6
  153. package/lib/sdk.js.map +1 -1
  154. package/lib/storage/custom-token-storage.js +2 -0
  155. package/lib/storage/custom-token-storage.js.map +1 -1
  156. package/lib/version.d.ts +1 -1
  157. package/lib/version.js +1 -1
  158. package/package.json +3 -3
@@ -0,0 +1,1125 @@
1
+ import { jest } from "@jest/globals";
2
+ import { LogisticsManager } from "../../managers/logistics.manager.js";
3
+ import { ShopeeRegion } from "../../schemas/region.js";
4
+ import { ShopeeFetch } from "../../fetch.js";
5
+ import { LogisticsStatus, TrackingLogisticsStatus, } from "../../schemas/logistics.js";
6
+ // Mock ShopeeFetch.fetch static method
7
+ const mockFetch = jest.fn();
8
+ ShopeeFetch.fetch = mockFetch;
9
+ describe("LogisticsManager", () => {
10
+ let logisticsManager;
11
+ let mockConfig;
12
+ const mockShopeeFetch = mockFetch;
13
+ beforeEach(() => {
14
+ jest.clearAllMocks();
15
+ mockConfig = {
16
+ partner_id: 12345,
17
+ partner_key: "test_partner_key",
18
+ shop_id: 67890,
19
+ region: ShopeeRegion.GLOBAL,
20
+ base_url: "https://partner.test-stable.shopeemobile.com/api/v2",
21
+ };
22
+ logisticsManager = new LogisticsManager(mockConfig);
23
+ });
24
+ describe("getTrackingInfo", () => {
25
+ it("should get tracking info for an order", async () => {
26
+ const mockResponse = {
27
+ request_id: "test-request-id",
28
+ error: "",
29
+ message: "",
30
+ response: {
31
+ order_sn: "220101000000001",
32
+ package_number: "PKG123456789",
33
+ logistics_status: "LOGISTICS_DELIVERED",
34
+ tracking_info: [
35
+ {
36
+ update_time: 1640995200,
37
+ description: "Package has been delivered",
38
+ logistics_status: "LOGISTICS_DELIVERED",
39
+ },
40
+ {
41
+ update_time: 1640995100,
42
+ description: "Package is out for delivery",
43
+ logistics_status: "LOGISTICS_DELIVERY",
44
+ },
45
+ {
46
+ update_time: 1640995000,
47
+ description: "Package has arrived at delivery station",
48
+ logistics_status: "LOGISTICS_ARRIVAL",
49
+ },
50
+ {
51
+ update_time: 1640994900,
52
+ description: "Package is in transit",
53
+ logistics_status: "LOGISTICS_PICKUP_DONE",
54
+ },
55
+ {
56
+ update_time: 1640994800,
57
+ description: "Package has been picked up",
58
+ logistics_status: "LOGISTICS_PICKUP_RETRY",
59
+ },
60
+ ],
61
+ },
62
+ };
63
+ mockShopeeFetch.mockResolvedValue(mockResponse);
64
+ const result = await logisticsManager.getTrackingInfo({
65
+ order_sn: "220101000000001",
66
+ package_number: "PKG123456789",
67
+ });
68
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/logistics/get_tracking_info", {
69
+ method: "GET",
70
+ auth: true,
71
+ params: {
72
+ order_sn: "220101000000001",
73
+ package_number: "PKG123456789",
74
+ },
75
+ });
76
+ expect(result).toEqual(mockResponse);
77
+ });
78
+ it("should get tracking info without package number", async () => {
79
+ const mockResponse = {
80
+ request_id: "test-request-id",
81
+ error: "",
82
+ message: "",
83
+ response: {
84
+ order_sn: "220101000000002",
85
+ package_number: "",
86
+ logistics_status: "LOGISTICS_PICKUP_DONE",
87
+ tracking_info: [
88
+ {
89
+ update_time: 1640995000,
90
+ description: "Package has been picked up by courier",
91
+ logistics_status: "LOGISTICS_PICKUP_DONE",
92
+ },
93
+ {
94
+ update_time: 1640994900,
95
+ description: "Package is ready for pickup",
96
+ logistics_status: "LOGISTICS_PICKUP_RETRY",
97
+ },
98
+ ],
99
+ },
100
+ };
101
+ mockShopeeFetch.mockResolvedValue(mockResponse);
102
+ const result = await logisticsManager.getTrackingInfo({
103
+ order_sn: "220101000000002",
104
+ });
105
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/logistics/get_tracking_info", {
106
+ method: "GET",
107
+ auth: true,
108
+ params: {
109
+ order_sn: "220101000000002",
110
+ },
111
+ });
112
+ expect(result).toEqual(mockResponse);
113
+ });
114
+ it("should handle empty tracking info", async () => {
115
+ const mockResponse = {
116
+ request_id: "test-request-id",
117
+ error: "",
118
+ message: "",
119
+ response: {
120
+ order_sn: "220101000000003",
121
+ package_number: "PKG987654321",
122
+ logistics_status: "LOGISTICS_REQUEST_CREATED",
123
+ tracking_info: [],
124
+ },
125
+ };
126
+ mockShopeeFetch.mockResolvedValue(mockResponse);
127
+ const result = await logisticsManager.getTrackingInfo({
128
+ order_sn: "220101000000003",
129
+ package_number: "PKG987654321",
130
+ });
131
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/logistics/get_tracking_info", {
132
+ method: "GET",
133
+ auth: true,
134
+ params: {
135
+ order_sn: "220101000000003",
136
+ package_number: "PKG987654321",
137
+ },
138
+ });
139
+ expect(result).toEqual(mockResponse);
140
+ expect(result.response.tracking_info).toHaveLength(0);
141
+ });
142
+ });
143
+ describe("getChannelList", () => {
144
+ it("should get list of available logistics channels", async () => {
145
+ const mockResponse = {
146
+ request_id: "test-request-id",
147
+ error: "",
148
+ message: "",
149
+ response: {
150
+ logistics_channel_list: [
151
+ {
152
+ logistics_channel_id: 40029,
153
+ logistics_channel_name: "Shopee Self Pick-up",
154
+ cod_enabled: true,
155
+ enabled: true,
156
+ fee_type: "SIZE_INPUT",
157
+ force_enable: false,
158
+ mask_channel_id: 0,
159
+ size_list: [],
160
+ weight_limit: {
161
+ item_max_weight: 5,
162
+ item_min_weight: 0,
163
+ },
164
+ item_max_dimension: {
165
+ dimension_sum: 90,
166
+ height: 30,
167
+ length: 30,
168
+ unit: "cm",
169
+ width: 30,
170
+ },
171
+ volume_limit: {
172
+ item_max_volume: 0,
173
+ item_min_volume: 0,
174
+ },
175
+ logistics_description: "Shopee Self Collect operating hours",
176
+ block_seller_cover_shipping_fee: false,
177
+ support_cross_border: false,
178
+ seller_logistic_has_configuration: null,
179
+ logistics_capability: {
180
+ seller_logistics: false,
181
+ },
182
+ preprint: false,
183
+ },
184
+ {
185
+ logistics_channel_id: 40018,
186
+ logistics_channel_name: "J&T Express",
187
+ cod_enabled: true,
188
+ enabled: true,
189
+ fee_type: "SIZE_INPUT",
190
+ force_enable: false,
191
+ mask_channel_id: 4000,
192
+ size_list: [],
193
+ weight_limit: {
194
+ item_max_weight: 50,
195
+ item_min_weight: 0,
196
+ },
197
+ item_max_dimension: {
198
+ dimension_sum: 0,
199
+ height: 150,
200
+ length: 150,
201
+ unit: "cm",
202
+ width: 150,
203
+ },
204
+ volume_limit: {
205
+ item_max_volume: 0,
206
+ item_min_volume: 0,
207
+ },
208
+ logistics_description: "J&T branches operating hours",
209
+ block_seller_cover_shipping_fee: false,
210
+ support_cross_border: false,
211
+ seller_logistic_has_configuration: null,
212
+ logistics_capability: {
213
+ seller_logistics: false,
214
+ },
215
+ },
216
+ ],
217
+ },
218
+ };
219
+ mockShopeeFetch.mockResolvedValue(mockResponse);
220
+ const result = await logisticsManager.getChannelList();
221
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/logistics/get_channel_list", {
222
+ method: "GET",
223
+ auth: true,
224
+ });
225
+ expect(result).toEqual(mockResponse);
226
+ expect(result.response.logistics_channel_list).toHaveLength(2);
227
+ expect(result.response.logistics_channel_list[0].logistics_channel_name).toBe("Shopee Self Pick-up");
228
+ });
229
+ it("should handle empty channel list", async () => {
230
+ const mockResponse = {
231
+ request_id: "test-request-id",
232
+ error: "",
233
+ message: "",
234
+ response: {
235
+ logistics_channel_list: [],
236
+ },
237
+ };
238
+ mockShopeeFetch.mockResolvedValue(mockResponse);
239
+ const result = await logisticsManager.getChannelList();
240
+ expect(result).toEqual(mockResponse);
241
+ expect(result.response.logistics_channel_list).toHaveLength(0);
242
+ });
243
+ });
244
+ describe("getPauseStatus", () => {
245
+ it("should get pause status successfully", async () => {
246
+ const mockResponse = {
247
+ request_id: "test-request-id",
248
+ error: "",
249
+ message: "",
250
+ response: {
251
+ is_paused: true,
252
+ pause_end_time: 1773401096,
253
+ remaining_pause_quota: 0,
254
+ },
255
+ };
256
+ mockShopeeFetch.mockResolvedValue(mockResponse);
257
+ const result = await logisticsManager.getPauseStatus();
258
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/logistics/get_pause_status", {
259
+ method: "GET",
260
+ auth: true,
261
+ });
262
+ expect(result).toEqual(mockResponse);
263
+ });
264
+ });
265
+ describe("setPauseStatus", () => {
266
+ it("should set pause status successfully", async () => {
267
+ const mockResponse = {
268
+ request_id: "test-request-id",
269
+ error: "",
270
+ message: "",
271
+ response: {
272
+ is_paused: false,
273
+ remaining_pause_quota: 3600,
274
+ },
275
+ };
276
+ mockShopeeFetch.mockResolvedValue(mockResponse);
277
+ const result = await logisticsManager.setPauseStatus({ is_paused: false });
278
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/logistics/set_pause_status", {
279
+ method: "POST",
280
+ auth: true,
281
+ body: {
282
+ is_paused: false,
283
+ },
284
+ });
285
+ expect(result).toEqual(mockResponse);
286
+ });
287
+ });
288
+ describe("getShippingParameter", () => {
289
+ it("should get shipping parameters for an order", async () => {
290
+ const mockResponse = {
291
+ request_id: "test-request-id",
292
+ error: "",
293
+ message: "",
294
+ response: {
295
+ info_needed: {
296
+ dropoff: [],
297
+ pickup: ["address_id", "pickup_time_id"],
298
+ non_integrated: [],
299
+ },
300
+ pickup: {
301
+ address_list: [
302
+ {
303
+ address_id: 234,
304
+ region: "SG",
305
+ state: "Sarawak",
306
+ city: "Kuching",
307
+ district: "Central",
308
+ town: "Downtown",
309
+ address: "123 Main Street",
310
+ zipcode: "50003",
311
+ address_flag: ["default_address", "pickup_address"],
312
+ time_slot_list: [
313
+ {
314
+ date: 1608103685,
315
+ time_text: "9:00 AM - 12:00 PM",
316
+ pickup_time_id: "slot_123",
317
+ flags: ["recommended"],
318
+ },
319
+ {
320
+ date: 1608190085,
321
+ time_text: "2:00 PM - 5:00 PM",
322
+ pickup_time_id: "slot_124",
323
+ },
324
+ ],
325
+ },
326
+ ],
327
+ },
328
+ dropoff: {
329
+ branch_list: [],
330
+ slug_list: [],
331
+ },
332
+ },
333
+ };
334
+ mockShopeeFetch.mockResolvedValue(mockResponse);
335
+ const result = await logisticsManager.getShippingParameter({
336
+ order_sn: "ORDER123",
337
+ });
338
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/logistics/get_shipping_parameter", {
339
+ method: "GET",
340
+ auth: true,
341
+ params: {
342
+ order_sn: "ORDER123",
343
+ },
344
+ });
345
+ expect(result).toEqual(mockResponse);
346
+ expect(result.response.info_needed?.pickup).toContain("address_id");
347
+ expect(result.response.pickup?.address_list).toHaveLength(1);
348
+ });
349
+ it("should get shipping parameters with package number", async () => {
350
+ const mockResponse = {
351
+ request_id: "test-request-id",
352
+ error: "",
353
+ message: "",
354
+ response: {
355
+ info_needed: {
356
+ dropoff: ["branch_id"],
357
+ pickup: [],
358
+ },
359
+ dropoff: {
360
+ branch_list: [
361
+ {
362
+ branch_id: 101,
363
+ region: "PH",
364
+ state: "Metro Manila",
365
+ city: "Manila",
366
+ address: "456 Branch Ave",
367
+ zipcode: "1000",
368
+ district: "Downtown",
369
+ town: "Central",
370
+ },
371
+ ],
372
+ },
373
+ },
374
+ };
375
+ mockShopeeFetch.mockResolvedValue(mockResponse);
376
+ const result = await logisticsManager.getShippingParameter({
377
+ order_sn: "ORDER456",
378
+ package_number: "PKG789",
379
+ });
380
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/logistics/get_shipping_parameter", {
381
+ method: "GET",
382
+ auth: true,
383
+ params: {
384
+ order_sn: "ORDER456",
385
+ package_number: "PKG789",
386
+ },
387
+ });
388
+ expect(result).toEqual(mockResponse);
389
+ expect(result.response.dropoff?.branch_list).toHaveLength(1);
390
+ });
391
+ });
392
+ describe("getTrackingNumber", () => {
393
+ it("should get tracking number for an order", async () => {
394
+ const mockResponse = {
395
+ request_id: "test-request-id",
396
+ error: "",
397
+ message: "",
398
+ response: {
399
+ tracking_number: "MY200448706479IT",
400
+ plp_number: "PLP123456",
401
+ hint: "",
402
+ },
403
+ };
404
+ mockShopeeFetch.mockResolvedValue(mockResponse);
405
+ const result = await logisticsManager.getTrackingNumber({
406
+ order_sn: "ORDER789",
407
+ });
408
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/logistics/get_tracking_number", {
409
+ method: "GET",
410
+ auth: true,
411
+ params: {
412
+ order_sn: "ORDER789",
413
+ },
414
+ });
415
+ expect(result).toEqual(mockResponse);
416
+ expect(result.response.tracking_number).toBe("MY200448706479IT");
417
+ });
418
+ it("should get tracking number with optional fields", async () => {
419
+ const mockResponse = {
420
+ request_id: "test-request-id",
421
+ error: "",
422
+ message: "",
423
+ response: {
424
+ tracking_number: "MY200448706479IT",
425
+ first_mile_tracking_number: "CNF877146678717210312",
426
+ last_mile_tracking_number: "200448706479IT",
427
+ pickup_code: "ABC123",
428
+ },
429
+ };
430
+ mockShopeeFetch.mockResolvedValue(mockResponse);
431
+ const result = await logisticsManager.getTrackingNumber({
432
+ order_sn: "ORDER999",
433
+ package_number: "PKG999",
434
+ response_optional_fields: "first_mile_tracking_number,last_mile_tracking_number",
435
+ });
436
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/logistics/get_tracking_number", {
437
+ method: "GET",
438
+ auth: true,
439
+ params: {
440
+ order_sn: "ORDER999",
441
+ package_number: "PKG999",
442
+ response_optional_fields: "first_mile_tracking_number,last_mile_tracking_number",
443
+ },
444
+ });
445
+ expect(result).toEqual(mockResponse);
446
+ expect(result.response.first_mile_tracking_number).toBe("CNF877146678717210312");
447
+ expect(result.response.pickup_code).toBe("ABC123");
448
+ });
449
+ it("should handle hint message when tracking not available", async () => {
450
+ const mockResponse = {
451
+ request_id: "test-request-id",
452
+ error: "",
453
+ message: "",
454
+ response: {
455
+ tracking_number: "",
456
+ hint: "Buyers CVS closed, waiting for buyer to reselect another CVS stores",
457
+ },
458
+ };
459
+ mockShopeeFetch.mockResolvedValue(mockResponse);
460
+ const result = await logisticsManager.getTrackingNumber({
461
+ order_sn: "ORDER000",
462
+ });
463
+ expect(result).toEqual(mockResponse);
464
+ expect(result.response.hint).toBeTruthy();
465
+ expect(result.response.tracking_number).toBe("");
466
+ });
467
+ });
468
+ describe("shipOrder", () => {
469
+ it("should ship order with pickup information", async () => {
470
+ const mockResponse = {
471
+ request_id: "test-request-id",
472
+ error: "",
473
+ message: "",
474
+ response: {},
475
+ };
476
+ mockShopeeFetch.mockResolvedValue(mockResponse);
477
+ const result = await logisticsManager.shipOrder({
478
+ order_sn: "ORDER123",
479
+ pickup: {
480
+ address_id: 234,
481
+ pickup_time_id: "slot_123",
482
+ },
483
+ });
484
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/logistics/ship_order", {
485
+ method: "POST",
486
+ auth: true,
487
+ body: {
488
+ order_sn: "ORDER123",
489
+ pickup: {
490
+ address_id: 234,
491
+ pickup_time_id: "slot_123",
492
+ },
493
+ },
494
+ });
495
+ expect(result).toEqual(mockResponse);
496
+ });
497
+ it("should ship order with dropoff information", async () => {
498
+ const mockResponse = {
499
+ request_id: "test-request-id",
500
+ error: "",
501
+ message: "",
502
+ response: {},
503
+ };
504
+ mockShopeeFetch.mockResolvedValue(mockResponse);
505
+ const result = await logisticsManager.shipOrder({
506
+ order_sn: "ORDER456",
507
+ package_number: "PKG789",
508
+ dropoff: {
509
+ branch_id: 101,
510
+ sender_real_name: "John Doe",
511
+ },
512
+ });
513
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/logistics/ship_order", {
514
+ method: "POST",
515
+ auth: true,
516
+ body: {
517
+ order_sn: "ORDER456",
518
+ package_number: "PKG789",
519
+ dropoff: {
520
+ branch_id: 101,
521
+ sender_real_name: "John Doe",
522
+ },
523
+ },
524
+ });
525
+ expect(result).toEqual(mockResponse);
526
+ });
527
+ it("should ship order with non-integrated channel", async () => {
528
+ const mockResponse = {
529
+ request_id: "test-request-id",
530
+ error: "",
531
+ message: "",
532
+ response: {},
533
+ };
534
+ mockShopeeFetch.mockResolvedValue(mockResponse);
535
+ const result = await logisticsManager.shipOrder({
536
+ order_sn: "ORDER789",
537
+ non_integrated: {
538
+ tracking_number: "TRACK123",
539
+ },
540
+ });
541
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/logistics/ship_order", {
542
+ method: "POST",
543
+ auth: true,
544
+ body: {
545
+ order_sn: "ORDER789",
546
+ non_integrated: {
547
+ tracking_number: "TRACK123",
548
+ },
549
+ },
550
+ });
551
+ expect(result).toEqual(mockResponse);
552
+ });
553
+ });
554
+ describe("getAddressList", () => {
555
+ it("should get shop address list", async () => {
556
+ const mockResponse = {
557
+ request_id: "test-request-id",
558
+ error: "",
559
+ message: "",
560
+ response: {
561
+ show_pickup_address: true,
562
+ address_list: [
563
+ {
564
+ address_id: 1173,
565
+ region: "SG",
566
+ state: "Singapore",
567
+ city: "Singapore",
568
+ district: "Central",
569
+ town: "Downtown",
570
+ address: "123 Main Street",
571
+ zipcode: "123456",
572
+ address_flag: ["default_address", "pickup_address"],
573
+ address_status: "ACTIVE",
574
+ full_address: "123 Main Street, Downtown, Central, Singapore, Singapore 123456",
575
+ },
576
+ {
577
+ address_id: 1174,
578
+ region: "SG",
579
+ state: "Singapore",
580
+ city: "Singapore",
581
+ district: "West",
582
+ town: "Jurong",
583
+ address: "456 West Avenue",
584
+ zipcode: "654321",
585
+ address_flag: ["return_address"],
586
+ address_status: "ACTIVE",
587
+ full_address: "456 West Avenue, Jurong, West, Singapore, Singapore 654321",
588
+ },
589
+ ],
590
+ },
591
+ };
592
+ mockShopeeFetch.mockResolvedValue(mockResponse);
593
+ const result = await logisticsManager.getAddressList();
594
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/logistics/get_address_list", {
595
+ method: "GET",
596
+ auth: true,
597
+ });
598
+ expect(result).toEqual(mockResponse);
599
+ expect(result.response.address_list).toHaveLength(2);
600
+ expect(result.response.show_pickup_address).toBe(true);
601
+ });
602
+ it("should handle empty address list", async () => {
603
+ const mockResponse = {
604
+ request_id: "test-request-id",
605
+ error: "",
606
+ message: "",
607
+ response: {
608
+ show_pickup_address: false,
609
+ address_list: [],
610
+ },
611
+ };
612
+ mockShopeeFetch.mockResolvedValue(mockResponse);
613
+ const result = await logisticsManager.getAddressList();
614
+ expect(result).toEqual(mockResponse);
615
+ expect(result.response.address_list).toHaveLength(0);
616
+ });
617
+ });
618
+ // Tests for new functions (35 additional endpoints)
619
+ describe("batchShipOrder", () => {
620
+ it("should batch ship multiple orders", async () => {
621
+ const mockResponse = {
622
+ request_id: "test-request-id",
623
+ error: "",
624
+ message: "",
625
+ response: {},
626
+ };
627
+ mockShopeeFetch.mockResolvedValue(mockResponse);
628
+ const result = await logisticsManager.batchShipOrder({
629
+ order_list: [{ order_sn: "ORDER1" }, { order_sn: "ORDER2" }],
630
+ });
631
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/logistics/batch_ship_order", {
632
+ method: "POST",
633
+ auth: true,
634
+ body: { order_list: [{ order_sn: "ORDER1" }, { order_sn: "ORDER2" }] },
635
+ });
636
+ expect(result).toEqual(mockResponse);
637
+ });
638
+ });
639
+ describe("massShipOrder", () => {
640
+ it("should mass ship orders", async () => {
641
+ const mockResponse = { request_id: "test", error: "", message: "", response: {} };
642
+ mockShopeeFetch.mockResolvedValue(mockResponse);
643
+ await logisticsManager.massShipOrder({
644
+ logistics_channel_id: 123,
645
+ package_list: [{ order_sn: "ORDER1", package_number: "PKG1" }],
646
+ });
647
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/logistics/mass_ship_order", {
648
+ method: "POST",
649
+ auth: true,
650
+ body: {
651
+ logistics_channel_id: 123,
652
+ package_list: [{ order_sn: "ORDER1", package_number: "PKG1" }],
653
+ },
654
+ });
655
+ });
656
+ });
657
+ describe("shipBooking", () => {
658
+ it("should ship booking", async () => {
659
+ const mockResponse = { request_id: "test", error: "", message: "", response: {} };
660
+ mockShopeeFetch.mockResolvedValue(mockResponse);
661
+ await logisticsManager.shipBooking({
662
+ booking_sn: "BOOKING123",
663
+ pickup: { address_id: 1 },
664
+ });
665
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/logistics/ship_booking", {
666
+ method: "POST",
667
+ auth: true,
668
+ body: { booking_sn: "BOOKING123", pickup: { address_id: 1 } },
669
+ });
670
+ });
671
+ });
672
+ describe("getBookingShippingParameter", () => {
673
+ it("should get booking shipping parameter", async () => {
674
+ const mockResponse = {
675
+ request_id: "test",
676
+ error: "",
677
+ message: "",
678
+ response: { info_needed: {} },
679
+ };
680
+ mockShopeeFetch.mockResolvedValue(mockResponse);
681
+ await logisticsManager.getBookingShippingParameter({ booking_sn: "BOOKING123" });
682
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/logistics/get_booking_shipping_parameter", {
683
+ method: "GET",
684
+ auth: true,
685
+ params: { booking_sn: "BOOKING123" },
686
+ });
687
+ });
688
+ });
689
+ describe("getBookingTrackingInfo", () => {
690
+ it("should get booking tracking info", async () => {
691
+ const mockResponse = {
692
+ request_id: "test",
693
+ error: "",
694
+ message: "",
695
+ response: {
696
+ booking_sn: "BOOKING123",
697
+ logistics_status: "LOGISTICS_READY",
698
+ tracking_info: [],
699
+ },
700
+ };
701
+ mockShopeeFetch.mockResolvedValue(mockResponse);
702
+ await logisticsManager.getBookingTrackingInfo({ booking_sn: "BOOKING123" });
703
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/logistics/get_booking_tracking_info", {
704
+ method: "GET",
705
+ auth: true,
706
+ params: { booking_sn: "BOOKING123" },
707
+ });
708
+ });
709
+ });
710
+ describe("getBookingTrackingNumber", () => {
711
+ it("should get booking tracking number", async () => {
712
+ const mockResponse = {
713
+ request_id: "test",
714
+ error: "",
715
+ message: "",
716
+ response: { tracking_number: "TRACK123" },
717
+ };
718
+ mockShopeeFetch.mockResolvedValue(mockResponse);
719
+ await logisticsManager.getBookingTrackingNumber({ booking_sn: "BOOKING123" });
720
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/logistics/get_booking_tracking_number", {
721
+ method: "GET",
722
+ auth: true,
723
+ params: { booking_sn: "BOOKING123" },
724
+ });
725
+ });
726
+ });
727
+ describe("getMassShippingParameter", () => {
728
+ it("should get mass shipping parameter", async () => {
729
+ const mockResponse = {
730
+ request_id: "test",
731
+ error: "",
732
+ message: "",
733
+ response: { info_needed: {} },
734
+ };
735
+ mockShopeeFetch.mockResolvedValue(mockResponse);
736
+ await logisticsManager.getMassShippingParameter({
737
+ package_list: [{ package_number: "PKG1" }],
738
+ });
739
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/logistics/get_mass_shipping_parameter", {
740
+ method: "POST",
741
+ auth: true,
742
+ body: { package_list: [{ package_number: "PKG1" }] },
743
+ });
744
+ });
745
+ });
746
+ describe("getMassTrackingNumber", () => {
747
+ it("should get mass tracking number", async () => {
748
+ const mockResponse = {
749
+ request_id: "test",
750
+ error: "",
751
+ message: "",
752
+ response: { success_list: [], fail_list: [] },
753
+ };
754
+ mockShopeeFetch.mockResolvedValue(mockResponse);
755
+ await logisticsManager.getMassTrackingNumber({
756
+ package_list: [{ package_number: "PKG1" }],
757
+ });
758
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/logistics/get_mass_tracking_number", {
759
+ method: "POST",
760
+ auth: true,
761
+ body: { package_list: [{ package_number: "PKG1" }] },
762
+ });
763
+ });
764
+ });
765
+ describe("setAddressConfig", () => {
766
+ it("should set address config", async () => {
767
+ const mockResponse = { request_id: "test", error: "", message: "", response: {} };
768
+ mockShopeeFetch.mockResolvedValue(mockResponse);
769
+ await logisticsManager.setAddressConfig({ show_pickup_address: true });
770
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/logistics/set_address_config", {
771
+ method: "POST",
772
+ auth: true,
773
+ body: { show_pickup_address: true },
774
+ });
775
+ });
776
+ });
777
+ describe("deleteAddress", () => {
778
+ it("should delete address", async () => {
779
+ const mockResponse = { request_id: "test", error: "", message: "", response: {} };
780
+ mockShopeeFetch.mockResolvedValue(mockResponse);
781
+ await logisticsManager.deleteAddress({ address_id: 123 });
782
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/logistics/delete_address", {
783
+ method: "POST",
784
+ auth: true,
785
+ body: { address_id: 123 },
786
+ });
787
+ });
788
+ });
789
+ describe("shipping documents", () => {
790
+ it("should create shipping document", async () => {
791
+ const mockResponse = { request_id: "test", error: "", message: "", response: {} };
792
+ mockShopeeFetch.mockResolvedValue(mockResponse);
793
+ await logisticsManager.createShippingDocument({
794
+ order_list: [{ order_sn: "ORDER1", tracking_number: "TRK123" }],
795
+ shipping_document_type: "NORMAL_AIR_WAYBILL",
796
+ });
797
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/logistics/create_shipping_document", {
798
+ method: "POST",
799
+ auth: true,
800
+ body: {
801
+ order_list: [{ order_sn: "ORDER1", tracking_number: "TRK123" }],
802
+ shipping_document_type: "NORMAL_AIR_WAYBILL",
803
+ },
804
+ });
805
+ });
806
+ it("should download shipping document", async () => {
807
+ const mockResponse = Buffer.from("%PDF-1.4");
808
+ mockShopeeFetch.mockResolvedValue(mockResponse);
809
+ await logisticsManager.downloadShippingDocument({
810
+ order_list: [{ order_sn: "ORDER1" }],
811
+ shipping_document_type: "NORMAL_AIR_WAYBILL",
812
+ });
813
+ expect(mockShopeeFetch).toHaveBeenCalled();
814
+ });
815
+ it("should get shipping document parameter", async () => {
816
+ const mockResponse = { request_id: "test", error: "", message: "", response: {} };
817
+ mockShopeeFetch.mockResolvedValue(mockResponse);
818
+ await logisticsManager.getShippingDocumentParameter({ order_list: [{ order_sn: "ORDER1" }] });
819
+ expect(mockShopeeFetch).toHaveBeenCalled();
820
+ });
821
+ it("should get shipping document result", async () => {
822
+ const mockResponse = { request_id: "test", error: "", message: "", response: {} };
823
+ mockShopeeFetch.mockResolvedValue(mockResponse);
824
+ await logisticsManager.getShippingDocumentResult({
825
+ order_list: [{ order_sn: "ORDER1" }],
826
+ shipping_document_type: "NORMAL_AIR_WAYBILL",
827
+ });
828
+ expect(mockShopeeFetch).toHaveBeenCalled();
829
+ });
830
+ it("should get shipping document data info", async () => {
831
+ const mockResponse = { request_id: "test", error: "", message: "", response: {} };
832
+ mockShopeeFetch.mockResolvedValue(mockResponse);
833
+ await logisticsManager.getShippingDocumentDataInfo({ order_sn: "ORDER1" });
834
+ expect(mockShopeeFetch).toHaveBeenCalled();
835
+ });
836
+ });
837
+ describe("booking shipping documents", () => {
838
+ it("should create booking shipping document", async () => {
839
+ const mockResponse = { request_id: "test", error: "", message: "", response: {} };
840
+ mockShopeeFetch.mockResolvedValue(mockResponse);
841
+ await logisticsManager.createBookingShippingDocument({
842
+ booking_list: [{ booking_sn: "BOOKING1", shipping_document_type: "NORMAL_AIR_WAYBILL" }],
843
+ });
844
+ expect(mockShopeeFetch).toHaveBeenCalled();
845
+ });
846
+ it("should download booking shipping document", async () => {
847
+ const mockResponse = Buffer.from("%PDF-1.4");
848
+ mockShopeeFetch.mockResolvedValue(mockResponse);
849
+ await logisticsManager.downloadBookingShippingDocument({
850
+ booking_list: [{ booking_sn: "BOOKING1" }],
851
+ shipping_document_type: "NORMAL_AIR_WAYBILL",
852
+ });
853
+ expect(mockShopeeFetch).toHaveBeenCalled();
854
+ });
855
+ it("should get booking shipping document parameter", async () => {
856
+ const mockResponse = { request_id: "test", error: "", message: "", response: {} };
857
+ mockShopeeFetch.mockResolvedValue(mockResponse);
858
+ await logisticsManager.getBookingShippingDocumentParameter({
859
+ booking_list: [{ booking_sn: "BOOKING1" }],
860
+ });
861
+ expect(mockShopeeFetch).toHaveBeenCalled();
862
+ });
863
+ it("should get booking shipping document result", async () => {
864
+ const mockResponse = { request_id: "test", error: "", message: "", response: {} };
865
+ mockShopeeFetch.mockResolvedValue(mockResponse);
866
+ await logisticsManager.getBookingShippingDocumentResult({
867
+ booking_list: [{ booking_sn: "BOOKING1", shipping_document_type: "NORMAL_AIR_WAYBILL" }],
868
+ });
869
+ expect(mockShopeeFetch).toHaveBeenCalled();
870
+ });
871
+ it("should get booking shipping document data info", async () => {
872
+ const mockResponse = { request_id: "test", error: "", message: "", response: {} };
873
+ mockShopeeFetch.mockResolvedValue(mockResponse);
874
+ await logisticsManager.getBookingShippingDocumentDataInfo({ booking_sn: "BOOKING1" });
875
+ expect(mockShopeeFetch).toHaveBeenCalled();
876
+ });
877
+ });
878
+ describe("shipping document job", () => {
879
+ it("should create shipping document job", async () => {
880
+ const mockResponse = {
881
+ request_id: "test",
882
+ error: "",
883
+ message: "",
884
+ response: { job_id: "JOB1" },
885
+ };
886
+ mockShopeeFetch.mockResolvedValue(mockResponse);
887
+ await logisticsManager.createShippingDocumentJob({
888
+ shipping_document_type: "NORMAL_AIR_WAYBILL",
889
+ unpackaged_sku_requests: [{ order_sn: "ORDER1", unpackaged_sku_id: "SKU1" }],
890
+ package_list: [{ order_sn: "ORDER1" }],
891
+ });
892
+ expect(mockShopeeFetch).toHaveBeenCalled();
893
+ });
894
+ it("should download shipping document job", async () => {
895
+ const mockResponse = { request_id: "test", error: "", message: "", response: {} };
896
+ mockShopeeFetch.mockResolvedValue(mockResponse);
897
+ await logisticsManager.downloadShippingDocumentJob({ job_id: "JOB1" });
898
+ expect(mockShopeeFetch).toHaveBeenCalled();
899
+ });
900
+ it("should get shipping document job status", async () => {
901
+ const mockResponse = { request_id: "test", error: "", message: "", response: {} };
902
+ mockShopeeFetch.mockResolvedValue(mockResponse);
903
+ await logisticsManager.getShippingDocumentJobStatus({ job_id: "JOB1" });
904
+ expect(mockShopeeFetch).toHaveBeenCalled();
905
+ });
906
+ it("should download to label", async () => {
907
+ const mockResponse = { request_id: "test", error: "", message: "", response: {} };
908
+ mockShopeeFetch.mockResolvedValue(mockResponse);
909
+ await logisticsManager.downloadToLabel({ sorting_group: "GROUP_A", quantity: 1 });
910
+ expect(mockShopeeFetch).toHaveBeenCalled();
911
+ });
912
+ });
913
+ describe("channel and order updates", () => {
914
+ it("should update channel", async () => {
915
+ const mockResponse = { request_id: "test", error: "", message: "", response: {} };
916
+ mockShopeeFetch.mockResolvedValue(mockResponse);
917
+ await logisticsManager.updateChannel({ logistics_channel_id: 123, enabled: true });
918
+ expect(mockShopeeFetch).toHaveBeenCalled();
919
+ });
920
+ it("should update shipping order", async () => {
921
+ const mockResponse = { request_id: "test", error: "", message: "", response: {} };
922
+ mockShopeeFetch.mockResolvedValue(mockResponse);
923
+ await logisticsManager.updateShippingOrder({ order_sn: "ORDER1" });
924
+ expect(mockShopeeFetch).toHaveBeenCalled();
925
+ });
926
+ it("should update tracking status", async () => {
927
+ const mockResponse = { request_id: "test", error: "", message: "", response: {} };
928
+ mockShopeeFetch.mockResolvedValue(mockResponse);
929
+ await logisticsManager.updateTrackingStatus({ order_sn: "ORDER1" });
930
+ expect(mockShopeeFetch).toHaveBeenCalled();
931
+ });
932
+ it("should update self collection order logistics", async () => {
933
+ const mockResponse = { request_id: "test", error: "", message: "", response: {} };
934
+ mockShopeeFetch.mockResolvedValue(mockResponse);
935
+ await logisticsManager.updateSelfCollectionOrderLogistics({
936
+ package_number: "PKG1",
937
+ self_collection_logistics_action: "PICKUP",
938
+ epoc_image_list: ["IMG1"],
939
+ pin: "123456",
940
+ });
941
+ expect(mockShopeeFetch).toHaveBeenCalled();
942
+ });
943
+ });
944
+ describe("operating hours", () => {
945
+ it("should get operating hours", async () => {
946
+ const mockResponse = { request_id: "test", error: "", message: "", response: {} };
947
+ mockShopeeFetch.mockResolvedValue(mockResponse);
948
+ await logisticsManager.getOperatingHours({});
949
+ expect(mockShopeeFetch).toHaveBeenCalled();
950
+ });
951
+ it("should update operating hours", async () => {
952
+ const mockResponse = { request_id: "test", error: "", message: "", response: {} };
953
+ mockShopeeFetch.mockResolvedValue(mockResponse);
954
+ await logisticsManager.updateOperatingHours({});
955
+ expect(mockShopeeFetch).toHaveBeenCalled();
956
+ });
957
+ it("should get operating hour restrictions", async () => {
958
+ const mockResponse = { request_id: "test", error: "", message: "", response: {} };
959
+ mockShopeeFetch.mockResolvedValue(mockResponse);
960
+ await logisticsManager.getOperatingHourRestrictions({});
961
+ expect(mockShopeeFetch).toHaveBeenCalled();
962
+ });
963
+ it("should delete special operating hour", async () => {
964
+ const mockResponse = { request_id: "test", error: "", message: "", response: {} };
965
+ mockShopeeFetch.mockResolvedValue(mockResponse);
966
+ await logisticsManager.deleteSpecialOperatingHour({});
967
+ expect(mockShopeeFetch).toHaveBeenCalled();
968
+ });
969
+ });
970
+ describe("mart packaging", () => {
971
+ it("should get mart packaging info", async () => {
972
+ const mockResponse = { request_id: "test", error: "", message: "", response: {} };
973
+ mockShopeeFetch.mockResolvedValue(mockResponse);
974
+ await logisticsManager.getMartPackagingInfo({ order_sn: "ORDER1" });
975
+ expect(mockShopeeFetch).toHaveBeenCalled();
976
+ });
977
+ it("should set mart packaging info", async () => {
978
+ const mockResponse = { request_id: "test", error: "", message: "", response: {} };
979
+ mockShopeeFetch.mockResolvedValue(mockResponse);
980
+ await logisticsManager.setMartPackagingInfo({ enable: true });
981
+ expect(mockShopeeFetch).toHaveBeenCalled();
982
+ });
983
+ });
984
+ describe("batchUpdateTPFWarehouseTrackingStatus", () => {
985
+ it("should batch update TPF warehouse tracking status", async () => {
986
+ const mockResponse = { request_id: "test", error: "", message: "", response: {} };
987
+ mockShopeeFetch.mockResolvedValue(mockResponse);
988
+ await logisticsManager.batchUpdateTPFWarehouseTrackingStatus({
989
+ package_list: [{ package_number: "PKG1", tracking_status: "DELIVERED" }],
990
+ });
991
+ expect(mockShopeeFetch).toHaveBeenCalled();
992
+ });
993
+ });
994
+ describe("checkPolygonUpdateStatus", () => {
995
+ it("should check polygon update status successfully", async () => {
996
+ const mockResponse = {
997
+ request_id: "test-request-id",
998
+ error: "",
999
+ message: "",
1000
+ response: {
1001
+ status: 0,
1002
+ message: "Task completed",
1003
+ },
1004
+ };
1005
+ mockShopeeFetch.mockResolvedValue(mockResponse);
1006
+ const result = await logisticsManager.checkPolygonUpdateStatus({
1007
+ task_id: "task12345",
1008
+ });
1009
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/logistics/check_polygon_update_status", {
1010
+ method: "POST",
1011
+ auth: true,
1012
+ body: {
1013
+ task_id: "task12345",
1014
+ },
1015
+ });
1016
+ expect(result.error).toBe("");
1017
+ expect(result.response?.status).toBe(0);
1018
+ expect(result.response?.message).toBe("Task completed");
1019
+ });
1020
+ it("should handle failed polygon update status", async () => {
1021
+ const mockResponse = {
1022
+ request_id: "test-request-id",
1023
+ error: "",
1024
+ message: "",
1025
+ response: {
1026
+ status: 2,
1027
+ message: "Invalid KML file format",
1028
+ },
1029
+ };
1030
+ mockShopeeFetch.mockResolvedValue(mockResponse);
1031
+ const result = await logisticsManager.checkPolygonUpdateStatus({
1032
+ task_id: "task12345",
1033
+ });
1034
+ expect(result.response?.status).toBe(2);
1035
+ expect(result.response?.message).toBe("Invalid KML file format");
1036
+ });
1037
+ });
1038
+ describe("updateAddress", () => {
1039
+ it("should update address successfully", async () => {
1040
+ const mockResponse = {
1041
+ request_id: "test-request-id",
1042
+ error: "",
1043
+ message: "",
1044
+ };
1045
+ mockShopeeFetch.mockResolvedValue(mockResponse);
1046
+ const result = await logisticsManager.updateAddress({
1047
+ address_id: 12345,
1048
+ address: "Updated Street Address",
1049
+ city: "Updated City",
1050
+ state: "Updated State",
1051
+ zipcode: "12345",
1052
+ });
1053
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/logistics/update_address", {
1054
+ method: "POST",
1055
+ auth: true,
1056
+ body: {
1057
+ address_id: 12345,
1058
+ address: "Updated Street Address",
1059
+ city: "Updated City",
1060
+ state: "Updated State",
1061
+ zipcode: "12345",
1062
+ },
1063
+ });
1064
+ expect(result.error).toBe("");
1065
+ });
1066
+ it("should handle error when updating address", async () => {
1067
+ const mockResponse = {
1068
+ request_id: "test-request-id",
1069
+ error: "error_param",
1070
+ message: "Invalid zipcode format",
1071
+ };
1072
+ mockShopeeFetch.mockResolvedValue(mockResponse);
1073
+ const result = await logisticsManager.updateAddress({
1074
+ address_id: 12345,
1075
+ zipcode: "invalid",
1076
+ });
1077
+ expect(result.error).toBe("error_param");
1078
+ expect(result.message).toBe("Invalid zipcode format");
1079
+ });
1080
+ });
1081
+ describe("uploadServiceablePolygon", () => {
1082
+ it("should upload serviceable polygon successfully", async () => {
1083
+ const mockResponse = {
1084
+ request_id: "test-request-id",
1085
+ error: "",
1086
+ message: "",
1087
+ };
1088
+ mockShopeeFetch.mockResolvedValue(mockResponse);
1089
+ const result = await logisticsManager.uploadServiceablePolygon({
1090
+ address_id: 12345,
1091
+ kml_content: '<?xml version="1.0" encoding="UTF-8"?><kml>...</kml>',
1092
+ });
1093
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/logistics/upload_serviceable_polygon", {
1094
+ method: "POST",
1095
+ auth: true,
1096
+ body: {
1097
+ address_id: 12345,
1098
+ kml_content: '<?xml version="1.0" encoding="UTF-8"?><kml>...</kml>',
1099
+ },
1100
+ });
1101
+ expect(result.error).toBe("");
1102
+ });
1103
+ it("should handle error when uploading invalid polygon", async () => {
1104
+ const mockResponse = {
1105
+ request_id: "test-request-id",
1106
+ error: "error_invalid_kml",
1107
+ message: "KML file contains invalid polygon data",
1108
+ };
1109
+ mockShopeeFetch.mockResolvedValue(mockResponse);
1110
+ const result = await logisticsManager.uploadServiceablePolygon({
1111
+ address_id: 12345,
1112
+ kml_content: "invalid kml",
1113
+ });
1114
+ expect(result.error).toBe("error_invalid_kml");
1115
+ expect(result.message).toBe("KML file contains invalid polygon data");
1116
+ });
1117
+ });
1118
+ describe("Schema Evaluation Check", () => {
1119
+ it("should successfully reference all exported enums and constants", () => {
1120
+ expect(LogisticsStatus.LOGISTICS_READY).toBe("LOGISTICS_READY");
1121
+ expect(TrackingLogisticsStatus.DELIVERED).toBe("DELIVERED");
1122
+ });
1123
+ });
1124
+ });
1125
+ //# sourceMappingURL=logistics.manager.test.js.map