@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,783 @@
1
+ import { jest } from "@jest/globals";
2
+ import { ReturnsManager } from "../../managers/returns.manager.js";
3
+ import { ShopeeRegion } from "../../schemas/region.js";
4
+ import { ShopeeFetch } from "../../fetch.js";
5
+ import { ReturnStatus, NegotiationStatus, SellerProofStatus, SellerCompensationStatus, ReturnSolution, } from "../../schemas/returns.js";
6
+ // Mock ShopeeFetch.fetch static method
7
+ const mockFetch = jest.fn();
8
+ ShopeeFetch.fetch = mockFetch;
9
+ describe("ReturnsManager", () => {
10
+ let returnsManager;
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
+ returnsManager = new ReturnsManager(mockConfig);
23
+ });
24
+ describe("getReturnList", () => {
25
+ it("should get list of returns with pagination", async () => {
26
+ const mockResponse = {
27
+ request_id: "test-request-id",
28
+ error: "",
29
+ message: "",
30
+ response: {
31
+ more: true,
32
+ return: [
33
+ {
34
+ image: ["https://cf.shopee.sg/file/test-image.jpg"],
35
+ reason: "PHYSICAL_DMG",
36
+ text_reason: "Product damaged",
37
+ return_sn: "200203171852695",
38
+ refund_amount: 100.0,
39
+ currency: "SGD",
40
+ create_time: 1580721513,
41
+ update_time: 1580729377,
42
+ status: "REQUESTED",
43
+ due_date: 1580721513,
44
+ tracking_number: "RNSHS00177569",
45
+ needs_logistics: true,
46
+ amount_before_discount: 100.0,
47
+ user: {
48
+ username: "testuser",
49
+ email: "test@example.com",
50
+ portrait: "https://cf.shopee.sg/file/portrait.jpg",
51
+ },
52
+ item: [
53
+ {
54
+ model_id: 123456,
55
+ name: "Test Product",
56
+ images: ["https://cf.shopee.sg/file/product.jpg"],
57
+ amount: 1,
58
+ item_price: 100.0,
59
+ is_add_on_deal: false,
60
+ is_main_item: true,
61
+ add_on_deal_id: 0,
62
+ item_id: 789012,
63
+ item_sku: "SKU-001",
64
+ variation_sku: "VAR-001",
65
+ },
66
+ ],
67
+ order_sn: "200203C6W0AR27",
68
+ return_ship_due_date: 1655438336,
69
+ return_seller_due_date: 1655438336,
70
+ },
71
+ ],
72
+ },
73
+ };
74
+ mockShopeeFetch.mockResolvedValue(mockResponse);
75
+ const result = await returnsManager.getReturnList({
76
+ page_no: 1,
77
+ page_size: 10,
78
+ });
79
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/returns/get_return_list", {
80
+ method: "GET",
81
+ auth: true,
82
+ params: {
83
+ page_no: 1,
84
+ page_size: 10,
85
+ },
86
+ });
87
+ expect(result).toEqual(mockResponse);
88
+ expect(result.response.more).toBe(true);
89
+ expect(result.response.return).toHaveLength(1);
90
+ expect(result.response.return[0].return_sn).toBe("200203171852695");
91
+ });
92
+ it("should get returns with filters", async () => {
93
+ const mockResponse = {
94
+ request_id: "test-request-id",
95
+ error: "",
96
+ message: "",
97
+ response: {
98
+ more: false,
99
+ return: [],
100
+ },
101
+ };
102
+ mockShopeeFetch.mockResolvedValue(mockResponse);
103
+ const result = await returnsManager.getReturnList({
104
+ page_no: 1,
105
+ page_size: 20,
106
+ create_time_from: 1655392442,
107
+ create_time_to: 1655392542,
108
+ status: "REQUESTED",
109
+ negotiation_status: "PENDING_RESPOND",
110
+ });
111
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/returns/get_return_list", {
112
+ method: "GET",
113
+ auth: true,
114
+ params: {
115
+ page_no: 1,
116
+ page_size: 20,
117
+ create_time_from: 1655392442,
118
+ create_time_to: 1655392542,
119
+ status: "REQUESTED",
120
+ negotiation_status: "PENDING_RESPOND",
121
+ },
122
+ });
123
+ expect(result).toEqual(mockResponse);
124
+ });
125
+ });
126
+ describe("getReturnDetail", () => {
127
+ it("should get detailed information for a specific return", async () => {
128
+ const mockResponse = {
129
+ request_id: "test-request-id",
130
+ error: "",
131
+ message: "",
132
+ response: {
133
+ image: ["https://cf.shopee.sg/file/test-image.jpg"],
134
+ reason: "NOT_RECEIPT",
135
+ text_reason: "Not received",
136
+ return_sn: "2206140TA5PM808",
137
+ refund_amount: 13.97,
138
+ currency: "SGD",
139
+ create_time: 1655205084,
140
+ update_time: 1655219544,
141
+ status: "ACCEPTED",
142
+ due_date: 1655377883,
143
+ tracking_number: "RNSHS00177569",
144
+ needs_logistics: false,
145
+ amount_before_discount: 13.99,
146
+ user: {
147
+ username: "gwlsg01",
148
+ email: "test@shopee.com",
149
+ portrait: "https://cf.shopee.sg/file/portrait.jpg",
150
+ },
151
+ item: [
152
+ {
153
+ model_id: 2001586745,
154
+ name: "Orange macaron",
155
+ images: ["https://cf.shopee.sg/file/product.jpg"],
156
+ amount: 1,
157
+ item_price: 10.0,
158
+ is_add_on_deal: false,
159
+ is_main_item: false,
160
+ add_on_deal_id: 0,
161
+ item_id: 2700126223,
162
+ item_sku: "USB",
163
+ variation_sku: "RED",
164
+ refund_amount: 12.34,
165
+ },
166
+ ],
167
+ order_sn: "220614T9XV8JTN",
168
+ return_ship_due_date: 1655438205,
169
+ return_seller_due_date: 1655438205,
170
+ seller_proof: {
171
+ seller_proof_status: "PENDING",
172
+ seller_evidence_deadline: 1655438336,
173
+ },
174
+ seller_compensation: {
175
+ seller_compensation_status: "PENDING_REQUEST",
176
+ seller_compensation_due_date: 1655438336,
177
+ compensation_amount: 100.0,
178
+ },
179
+ negotiation: {
180
+ negotiation_status: "PENDING_RESPOND",
181
+ latest_solution: "RETURN_REFUND",
182
+ latest_offer_amount: 12.34,
183
+ latest_offer_creator: "buyer",
184
+ counter_limit: 0,
185
+ offer_due_date: 1655438336,
186
+ },
187
+ },
188
+ };
189
+ mockShopeeFetch.mockResolvedValue(mockResponse);
190
+ const result = await returnsManager.getReturnDetail({
191
+ return_sn: "2206140TA5PM808",
192
+ });
193
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/returns/get_return_detail", {
194
+ method: "GET",
195
+ auth: true,
196
+ params: {
197
+ return_sn: "2206140TA5PM808",
198
+ },
199
+ });
200
+ expect(result).toEqual(mockResponse);
201
+ expect(result.response.return_sn).toBe("2206140TA5PM808");
202
+ expect(result.response.status).toBe("ACCEPTED");
203
+ });
204
+ });
205
+ describe("confirm", () => {
206
+ it("should confirm a return refund", async () => {
207
+ const mockResponse = {
208
+ request_id: "test-request-id",
209
+ error: "",
210
+ message: "",
211
+ response: {
212
+ return_sn: "200203171852695",
213
+ },
214
+ };
215
+ mockShopeeFetch.mockResolvedValue(mockResponse);
216
+ const result = await returnsManager.confirm({
217
+ return_sn: "200203171852695",
218
+ });
219
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/returns/confirm", {
220
+ method: "POST",
221
+ auth: true,
222
+ body: {
223
+ return_sn: "200203171852695",
224
+ },
225
+ });
226
+ expect(result).toEqual(mockResponse);
227
+ expect(result.response.return_sn).toBe("200203171852695");
228
+ });
229
+ });
230
+ describe("dispute", () => {
231
+ it("should dispute a return with reason and images", async () => {
232
+ const mockResponse = {
233
+ request_id: "test-request-id",
234
+ error: "",
235
+ message: "",
236
+ response: {
237
+ return_sn: "200203171852695",
238
+ },
239
+ };
240
+ mockShopeeFetch.mockResolvedValue(mockResponse);
241
+ const result = await returnsManager.dispute({
242
+ return_sn: "200203171852695",
243
+ email: "seller@example.com",
244
+ dispute_reason: 2,
245
+ dispute_text_reason: "Product condition not as described by buyer",
246
+ images: ["https://cf.shopee.sg/file/evidence1.jpg"],
247
+ dispute_reason_id: 1002,
248
+ image_list: ["image_id_1"],
249
+ });
250
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/returns/dispute", {
251
+ method: "POST",
252
+ auth: true,
253
+ body: {
254
+ return_sn: "200203171852695",
255
+ email: "seller@example.com",
256
+ dispute_reason: 2,
257
+ dispute_text_reason: "Product condition not as described by buyer",
258
+ images: ["https://cf.shopee.sg/file/evidence1.jpg"],
259
+ dispute_reason_id: 1002,
260
+ image_list: ["image_id_1"],
261
+ },
262
+ });
263
+ expect(result).toEqual(mockResponse);
264
+ });
265
+ it("should dispute a return with minimum required fields", async () => {
266
+ const mockResponse = {
267
+ request_id: "test-request-id",
268
+ error: "",
269
+ message: "",
270
+ response: {
271
+ return_sn: "200203171852695",
272
+ },
273
+ };
274
+ mockShopeeFetch.mockResolvedValue(mockResponse);
275
+ const result = await returnsManager.dispute({
276
+ return_sn: "200203171852695",
277
+ email: "seller@example.com",
278
+ dispute_reason: 1,
279
+ });
280
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/returns/dispute", {
281
+ method: "POST",
282
+ auth: true,
283
+ body: {
284
+ return_sn: "200203171852695",
285
+ email: "seller@example.com",
286
+ dispute_reason: 1,
287
+ },
288
+ });
289
+ expect(result).toEqual(mockResponse);
290
+ });
291
+ });
292
+ describe("offer", () => {
293
+ it("should offer a solution to the buyer", async () => {
294
+ const mockResponse = {
295
+ request_id: "test-request-id",
296
+ error: "",
297
+ message: "",
298
+ response: {
299
+ return_sn: "200203171852695",
300
+ },
301
+ };
302
+ mockShopeeFetch.mockResolvedValue(mockResponse);
303
+ const result = await returnsManager.offer({
304
+ return_sn: "200203171852695",
305
+ solution: 0,
306
+ refund_amount: 50.0,
307
+ proposed_solution: "RETURN_REFUND",
308
+ proposed_adjusted_refund_amount: 50.0,
309
+ });
310
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/returns/offer", {
311
+ method: "POST",
312
+ auth: true,
313
+ body: {
314
+ return_sn: "200203171852695",
315
+ solution: 0,
316
+ refund_amount: 50.0,
317
+ proposed_solution: "RETURN_REFUND",
318
+ proposed_adjusted_refund_amount: 50.0,
319
+ },
320
+ });
321
+ expect(result).toEqual(mockResponse);
322
+ });
323
+ });
324
+ describe("acceptOffer", () => {
325
+ it("should accept an offer from the buyer", async () => {
326
+ const mockResponse = {
327
+ request_id: "test-request-id",
328
+ error: "",
329
+ message: "",
330
+ response: {
331
+ return_sn: "200203171852695",
332
+ },
333
+ };
334
+ mockShopeeFetch.mockResolvedValue(mockResponse);
335
+ const result = await returnsManager.acceptOffer({
336
+ return_sn: "200203171852695",
337
+ });
338
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/returns/accept_offer", {
339
+ method: "POST",
340
+ auth: true,
341
+ body: {
342
+ return_sn: "200203171852695",
343
+ },
344
+ });
345
+ expect(result).toEqual(mockResponse);
346
+ expect(result.response.return_sn).toBe("200203171852695");
347
+ });
348
+ });
349
+ describe("getAvailableSolutions", () => {
350
+ it("should get available solutions for a return", async () => {
351
+ const mockResponse = {
352
+ request_id: "test-request-id",
353
+ error: "",
354
+ message: "",
355
+ response: {
356
+ solution: [
357
+ {
358
+ solution: 0,
359
+ max_refund_amount: 100.0,
360
+ },
361
+ {
362
+ solution: 1,
363
+ max_refund_amount: 100.0,
364
+ },
365
+ ],
366
+ },
367
+ };
368
+ mockShopeeFetch.mockResolvedValue(mockResponse);
369
+ const result = await returnsManager.getAvailableSolutions({
370
+ return_sn: "200203171852695",
371
+ });
372
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/returns/get_available_solutions", {
373
+ method: "GET",
374
+ auth: true,
375
+ params: {
376
+ return_sn: "200203171852695",
377
+ },
378
+ });
379
+ expect(result).toEqual(mockResponse);
380
+ expect(result.response.solution).toHaveLength(2);
381
+ expect(result.response.solution[0].solution).toBe(0);
382
+ });
383
+ });
384
+ describe("cancelDispute", () => {
385
+ it("should cancel a compensation dispute", async () => {
386
+ const mockResponse = {
387
+ request_id: "test-request-id",
388
+ error: "",
389
+ message: "",
390
+ response: {
391
+ return_sn: "200203171852695",
392
+ },
393
+ };
394
+ mockShopeeFetch.mockResolvedValue(mockResponse);
395
+ const result = await returnsManager.cancelDispute({
396
+ return_sn: "200203171852695",
397
+ email: "seller@example.com",
398
+ });
399
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/returns/cancel_dispute", {
400
+ method: "POST",
401
+ auth: true,
402
+ body: {
403
+ return_sn: "200203171852695",
404
+ email: "seller@example.com",
405
+ },
406
+ });
407
+ expect(result).toEqual(mockResponse);
408
+ expect(result.response.return_sn).toBe("200203171852695");
409
+ });
410
+ });
411
+ describe("getReturnDisputeReason", () => {
412
+ it("should get available dispute reasons", async () => {
413
+ const mockResponse = {
414
+ request_id: "test-request-id",
415
+ error: "",
416
+ message: "",
417
+ response: {
418
+ dispute_reason: [
419
+ {
420
+ reason_id: 1,
421
+ reason_text: "Product not as described",
422
+ },
423
+ {
424
+ reason_id: 2,
425
+ reason_text: "Product damaged in transit",
426
+ },
427
+ ],
428
+ },
429
+ };
430
+ mockShopeeFetch.mockResolvedValue(mockResponse);
431
+ const result = await returnsManager.getReturnDisputeReason({
432
+ return_sn: "200203171852695",
433
+ });
434
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/returns/get_return_dispute_reason", {
435
+ method: "GET",
436
+ auth: true,
437
+ params: {
438
+ return_sn: "200203171852695",
439
+ },
440
+ });
441
+ expect(result).toEqual(mockResponse);
442
+ expect(result.response.dispute_reason).toHaveLength(2);
443
+ expect(result.response.dispute_reason[0].reason_id).toBe(1);
444
+ });
445
+ });
446
+ describe("convertImage", () => {
447
+ it("should convert images to URLs", async () => {
448
+ const mockResponse = {
449
+ request_id: "test-request-id",
450
+ error: "",
451
+ message: "",
452
+ response: {
453
+ images: [
454
+ {
455
+ url: "https://cf.shopee.sg/file/converted1.jpg",
456
+ thumbnail_url: "https://cf.shopee.sg/file/thumb1.jpg",
457
+ },
458
+ {
459
+ url: "https://cf.shopee.sg/file/converted2.jpg",
460
+ },
461
+ ],
462
+ },
463
+ };
464
+ mockShopeeFetch.mockResolvedValue(mockResponse);
465
+ const result = await returnsManager.convertImage({
466
+ images: [{ image: "base64_encoded_image_1" }, { image: "base64_encoded_image_2" }],
467
+ return_sn: "200203171852695",
468
+ upload_image: "image_data",
469
+ });
470
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/returns/convert_image", {
471
+ method: "POST",
472
+ auth: true,
473
+ body: {
474
+ images: [{ image: "base64_encoded_image_1" }, { image: "base64_encoded_image_2" }],
475
+ return_sn: "200203171852695",
476
+ upload_image: "image_data",
477
+ },
478
+ });
479
+ expect(result).toEqual(mockResponse);
480
+ expect(result.response.images).toHaveLength(2);
481
+ });
482
+ });
483
+ describe("uploadProof", () => {
484
+ it("should upload proof with text, images, and videos", async () => {
485
+ const mockResponse = {
486
+ request_id: "test-request-id",
487
+ error: "",
488
+ message: "",
489
+ response: {
490
+ return_sn: "200203171852695",
491
+ },
492
+ };
493
+ mockShopeeFetch.mockResolvedValue(mockResponse);
494
+ const result = await returnsManager.uploadProof({
495
+ return_sn: "200203171852695",
496
+ proof_text: [{ text: "Product was not damaged when shipped" }],
497
+ proof_image: [{ url: "https://cf.shopee.sg/file/proof1.jpg" }],
498
+ proof_video: [{ url: "https://cf.shopee.sg/file/proof1.mp4" }],
499
+ photo: [
500
+ {
501
+ url: "https://cf.shopee.sg/file/evidence.jpg",
502
+ thumbnail: "https://cf.shopee.sg/file/evidence_thumb.jpg",
503
+ },
504
+ ],
505
+ description: "evidence proof text",
506
+ });
507
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/returns/upload_proof", {
508
+ method: "POST",
509
+ auth: true,
510
+ body: {
511
+ return_sn: "200203171852695",
512
+ proof_text: [{ text: "Product was not damaged when shipped" }],
513
+ proof_image: [{ url: "https://cf.shopee.sg/file/proof1.jpg" }],
514
+ proof_video: [{ url: "https://cf.shopee.sg/file/proof1.mp4" }],
515
+ photo: [
516
+ {
517
+ url: "https://cf.shopee.sg/file/evidence.jpg",
518
+ thumbnail: "https://cf.shopee.sg/file/evidence_thumb.jpg",
519
+ },
520
+ ],
521
+ description: "evidence proof text",
522
+ },
523
+ });
524
+ expect(result).toEqual(mockResponse);
525
+ expect(result.response.return_sn).toBe("200203171852695");
526
+ });
527
+ it("should upload proof with only text", async () => {
528
+ const mockResponse = {
529
+ request_id: "test-request-id",
530
+ error: "",
531
+ message: "",
532
+ response: {
533
+ return_sn: "200203171852695",
534
+ },
535
+ };
536
+ mockShopeeFetch.mockResolvedValue(mockResponse);
537
+ const result = await returnsManager.uploadProof({
538
+ return_sn: "200203171852695",
539
+ proof_text: [{ text: "Evidence description" }],
540
+ });
541
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/returns/upload_proof", {
542
+ method: "POST",
543
+ auth: true,
544
+ body: {
545
+ return_sn: "200203171852695",
546
+ proof_text: [{ text: "Evidence description" }],
547
+ },
548
+ });
549
+ expect(result).toEqual(mockResponse);
550
+ });
551
+ });
552
+ describe("queryProof", () => {
553
+ it("should query uploaded proof", async () => {
554
+ const mockResponse = {
555
+ request_id: "test-request-id",
556
+ error: "",
557
+ message: "",
558
+ response: {
559
+ proof_text: [{ text: "Product was not damaged when shipped" }],
560
+ proof_image: [{ url: "https://cf.shopee.sg/file/proof1.jpg" }],
561
+ proof_video: [{ url: "https://cf.shopee.sg/file/proof1.mp4" }],
562
+ },
563
+ };
564
+ mockShopeeFetch.mockResolvedValue(mockResponse);
565
+ const result = await returnsManager.queryProof({
566
+ return_sn: "200203171852695",
567
+ });
568
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/returns/query_proof", {
569
+ method: "GET",
570
+ auth: true,
571
+ params: {
572
+ return_sn: "200203171852695",
573
+ },
574
+ });
575
+ expect(result).toEqual(mockResponse);
576
+ expect(result.response.proof_text).toHaveLength(1);
577
+ expect(result.response.proof_image).toHaveLength(1);
578
+ expect(result.response.proof_video).toHaveLength(1);
579
+ });
580
+ });
581
+ describe("getShippingCarrier", () => {
582
+ it("should get list of shipping carriers", async () => {
583
+ const mockResponse = {
584
+ request_id: "test-request-id",
585
+ error: "",
586
+ message: "",
587
+ response: {
588
+ carrier_list: [
589
+ {
590
+ carrier_id: 1,
591
+ carrier_name: "DHL Express",
592
+ required_fields: ["tracking_number", "pickup_date"],
593
+ },
594
+ {
595
+ carrier_id: 2,
596
+ carrier_name: "FedEx",
597
+ required_fields: ["tracking_number"],
598
+ },
599
+ ],
600
+ },
601
+ };
602
+ mockShopeeFetch.mockResolvedValue(mockResponse);
603
+ const result = await returnsManager.getShippingCarrier({
604
+ return_sn: "200203171852695",
605
+ });
606
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/returns/get_shipping_carrier", {
607
+ method: "GET",
608
+ auth: true,
609
+ params: {
610
+ return_sn: "200203171852695",
611
+ },
612
+ });
613
+ expect(result).toEqual(mockResponse);
614
+ expect(result.response.carrier_list).toHaveLength(2);
615
+ expect(result.response.carrier_list[0].carrier_name).toBe("DHL Express");
616
+ });
617
+ });
618
+ describe("uploadShippingProof", () => {
619
+ it("should upload shipping proof", async () => {
620
+ const mockResponse = {
621
+ request_id: "test-request-id",
622
+ error: "",
623
+ message: "",
624
+ response: {
625
+ return_sn: "200203171852695",
626
+ },
627
+ };
628
+ mockShopeeFetch.mockResolvedValue(mockResponse);
629
+ const result = await returnsManager.uploadShippingProof({
630
+ return_sn: "200203171852695",
631
+ carrier_id: 1,
632
+ tracking_number: "DHL123456789",
633
+ reverse_logistics_carrier_id: 12,
634
+ reverse_logistics_carrier_name: "DHL Reverse",
635
+ image_id_list: [{ image_id: "img1" }],
636
+ remarks: "fragile",
637
+ });
638
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/returns/upload_shipping_proof", {
639
+ method: "POST",
640
+ auth: true,
641
+ body: {
642
+ return_sn: "200203171852695",
643
+ carrier_id: 1,
644
+ tracking_number: "DHL123456789",
645
+ reverse_logistics_carrier_id: 12,
646
+ reverse_logistics_carrier_name: "DHL Reverse",
647
+ image_id_list: [{ image_id: "img1" }],
648
+ remarks: "fragile",
649
+ },
650
+ });
651
+ expect(result).toEqual(mockResponse);
652
+ expect(result.response.return_sn).toBe("200203171852695");
653
+ });
654
+ it("should upload shipping proof with additional fields", async () => {
655
+ const mockResponse = {
656
+ request_id: "test-request-id",
657
+ error: "",
658
+ message: "",
659
+ response: {
660
+ return_sn: "200203171852695",
661
+ },
662
+ };
663
+ mockShopeeFetch.mockResolvedValue(mockResponse);
664
+ const result = await returnsManager.uploadShippingProof({
665
+ return_sn: "200203171852695",
666
+ carrier_id: 1,
667
+ tracking_number: "DHL123456789",
668
+ pickup_date: "2024-01-15",
669
+ pickup_time: "14:00",
670
+ });
671
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/returns/upload_shipping_proof", {
672
+ method: "POST",
673
+ auth: true,
674
+ body: {
675
+ return_sn: "200203171852695",
676
+ carrier_id: 1,
677
+ tracking_number: "DHL123456789",
678
+ pickup_date: "2024-01-15",
679
+ pickup_time: "14:00",
680
+ },
681
+ });
682
+ expect(result).toEqual(mockResponse);
683
+ });
684
+ });
685
+ describe("getReverseTrackingInfo", () => {
686
+ it("should get reverse tracking info for seller validation", async () => {
687
+ const mockResponse = {
688
+ request_id: "d52ca43b277a4f9292fb8be658bfd33d",
689
+ error: "",
690
+ message: "",
691
+ response: {
692
+ return_sn: "2206150VT13E3MQ",
693
+ return_refund_request_type: 0,
694
+ validation_type: "seller_validation",
695
+ reverse_logistics_status: "LOGISTICS_REQUEST_CREATED",
696
+ reverse_logistics_update_time: 1740728119,
697
+ estimated_delivery_date_max: 1740728121,
698
+ estimated_delivery_date_min: 1740626000,
699
+ tracking_number: "MY257829361436J",
700
+ tracking_info: [
701
+ {
702
+ update_time: 1740728119,
703
+ tracking_description: "Parcel has been picked up by our logistics partner",
704
+ epop_image_list: ["https://cf.shopee.sg/file/4ecbb6fa567e42c1b1e02993ad53df12"],
705
+ epod_image_list: ["https://cf.shopee.sg/file/4ecbb6fa567e42c1b1e02993ad53df12"],
706
+ },
707
+ ],
708
+ },
709
+ };
710
+ mockShopeeFetch.mockResolvedValue(mockResponse);
711
+ const result = await returnsManager.getReverseTrackingInfo({
712
+ return_sn: "2206150VT13E3MQ",
713
+ });
714
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/returns/get_reverse_tracking_info", {
715
+ method: "GET",
716
+ auth: true,
717
+ params: {
718
+ return_sn: "2206150VT13E3MQ",
719
+ },
720
+ });
721
+ expect(result).toEqual(mockResponse);
722
+ expect(result.response.return_sn).toBe("2206150VT13E3MQ");
723
+ expect(result.response.validation_type).toBe("seller_validation");
724
+ expect(result.response.tracking_info).toHaveLength(1);
725
+ expect(result.response.tracking_info[0].tracking_description).toBe("Parcel has been picked up by our logistics partner");
726
+ });
727
+ it("should get reverse tracking info for warehouse validation", async () => {
728
+ const mockResponse = {
729
+ request_id: "test-request-id-2",
730
+ error: "",
731
+ message: "",
732
+ response: {
733
+ return_sn: "2206150VT13E3MQ",
734
+ return_refund_request_type: 0,
735
+ validation_type: "warehouse_validation",
736
+ reverse_logistics_status: "LOGISTICS_DELIVERY_DONE",
737
+ reverse_logistics_update_time: 1740728119,
738
+ tracking_number: "MY257829361436J",
739
+ tracking_info: [
740
+ {
741
+ update_time: 1740728119,
742
+ tracking_description: "Delivered to warehouse",
743
+ },
744
+ ],
745
+ post_return_logistics_status: "LOGISTICS_IN_TRANSIT",
746
+ post_return_logistics_update_time: 1740828119,
747
+ rts_tracking_number: "RTS123456789",
748
+ post_return_logistics_tracking_info: [
749
+ {
750
+ update_time: 1740828119,
751
+ tracking_description: "Shipped from warehouse to seller",
752
+ },
753
+ ],
754
+ },
755
+ };
756
+ mockShopeeFetch.mockResolvedValue(mockResponse);
757
+ const result = await returnsManager.getReverseTrackingInfo({
758
+ return_sn: "2206150VT13E3MQ",
759
+ });
760
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/returns/get_reverse_tracking_info", {
761
+ method: "GET",
762
+ auth: true,
763
+ params: {
764
+ return_sn: "2206150VT13E3MQ",
765
+ },
766
+ });
767
+ expect(result).toEqual(mockResponse);
768
+ expect(result.response.validation_type).toBe("warehouse_validation");
769
+ expect(result.response.post_return_logistics_tracking_info).toHaveLength(1);
770
+ expect(result.response.rts_tracking_number).toBe("RTS123456789");
771
+ });
772
+ });
773
+ describe("Schema Evaluation Check", () => {
774
+ it("should successfully reference all exported enums and constants", () => {
775
+ expect(ReturnStatus.REQUESTED).toBe("REQUESTED");
776
+ expect(NegotiationStatus.PENDING_RESPOND).toBe("PENDING_RESPOND");
777
+ expect(SellerProofStatus.PENDING).toBe("PENDING");
778
+ expect(SellerCompensationStatus.PENDING_REQUEST).toBe("PENDING_REQUEST");
779
+ expect(ReturnSolution.REFUND_ONLY).toBe("REFUND_ONLY");
780
+ });
781
+ });
782
+ });
783
+ //# sourceMappingURL=returns.manager.test.js.map