@congminh1254/shopee-sdk 1.6.2 → 1.7.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 (154) 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 +227 -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/returns.d.ts +38 -1
  145. package/lib/schemas/shop.d.ts +16 -0
  146. package/lib/schemas/video.d.ts +83 -37
  147. package/lib/schemas/voucher.d.ts +2 -0
  148. package/lib/sdk.js +31 -0
  149. package/lib/sdk.js.map +1 -1
  150. package/lib/storage/custom-token-storage.js +2 -0
  151. package/lib/storage/custom-token-storage.js.map +1 -1
  152. package/lib/version.d.ts +1 -1
  153. package/lib/version.js +1 -1
  154. package/package.json +3 -3
@@ -0,0 +1,1167 @@
1
+ import { jest } from "@jest/globals";
2
+ import { PaymentManager } from "../../managers/payment.manager.js";
3
+ import { ShopeeRegion } from "../../schemas/region.js";
4
+ import { ShopeeFetch } from "../../fetch.js";
5
+ // Mock ShopeeFetch.fetch static method
6
+ const mockFetch = jest.fn();
7
+ ShopeeFetch.fetch = mockFetch;
8
+ describe("PaymentManager", () => {
9
+ let paymentManager;
10
+ let mockConfig;
11
+ const mockShopeeFetch = mockFetch;
12
+ beforeEach(() => {
13
+ jest.clearAllMocks();
14
+ mockConfig = {
15
+ partner_id: 12345,
16
+ partner_key: "test_partner_key",
17
+ shop_id: 67890,
18
+ region: ShopeeRegion.GLOBAL,
19
+ base_url: "https://partner.test-stable.shopeemobile.com/api/v2",
20
+ };
21
+ paymentManager = new PaymentManager(mockConfig);
22
+ });
23
+ describe("getEscrowDetail", () => {
24
+ it("should get escrow detail for an order", async () => {
25
+ const mockResponse = {
26
+ request_id: "test-request-id",
27
+ error: "",
28
+ message: "",
29
+ response: {
30
+ order_sn: "220101000000001",
31
+ buyer_user_name: "testbuyer123",
32
+ return_order_sn_list: [],
33
+ order_income: {
34
+ escrow_amount: 22.5,
35
+ buyer_total_amount: 25.5,
36
+ original_price: 23.0,
37
+ seller_discount: 0.0,
38
+ shopee_discount: 0.0,
39
+ voucher_from_seller: 0.0,
40
+ voucher_from_shopee: 0.0,
41
+ coins: 0.0,
42
+ buyer_paid_shipping_fee: 2.5,
43
+ buyer_transaction_fee: 0.0,
44
+ cross_border_tax: 0.0,
45
+ payment_promotion: 0.0,
46
+ commission_fee: 1.38,
47
+ service_fee: 0.12,
48
+ seller_transaction_fee: 0.0,
49
+ seller_lost_compensation: 0.0,
50
+ seller_coin_cash_back: 0.0,
51
+ escrow_tax: 0.5,
52
+ estimated_shipping_fee: 2.5,
53
+ final_shipping_fee: 2.5,
54
+ actual_shipping_fee: 2.5,
55
+ shopee_shipping_rebate: 0.0,
56
+ shipping_fee_discount_from_3pl: 0.0,
57
+ seller_shipping_discount: 0.0,
58
+ seller_voucher_code: [],
59
+ drc_adjustable_refund: 0.0,
60
+ cost_of_goods_sold: 23.0,
61
+ original_cost_of_goods_sold: 23.0,
62
+ original_shopee_discount: 0.0,
63
+ seller_return_refund: 0.0,
64
+ reverse_shipping_fee: 0.0,
65
+ final_product_protection: 0.0,
66
+ credit_card_promotion: 0.0,
67
+ credit_card_transaction_fee: 0.0,
68
+ final_product_vat_tax: 0.0,
69
+ items: [
70
+ {
71
+ item_id: 111111,
72
+ item_name: "Test Product",
73
+ item_sku: "TEST-SKU-001-RED-L",
74
+ model_id: 222222,
75
+ model_name: "Red-Large",
76
+ model_sku: "TEST-SKU-001-RED-L",
77
+ original_price: 23.0,
78
+ discounted_price: 23.0,
79
+ seller_discount: 0.0,
80
+ shopee_discount: 0.0,
81
+ discount_from_coin: 0.0,
82
+ discount_from_voucher_shopee: 0.0,
83
+ discount_from_voucher_seller: 0.0,
84
+ activity_type: "",
85
+ activity_id: 0,
86
+ is_main_item: false,
87
+ quantity_purchased: 1,
88
+ },
89
+ ],
90
+ },
91
+ buyer_payment_info: {
92
+ buyer_payment_method: "Credit Card",
93
+ buyer_service_fee: 0.0,
94
+ buyer_tax_amount: 0.0,
95
+ buyer_total_amount: 25.5,
96
+ credit_card_promotion: 0.0,
97
+ icms_tax_amount: 0.0,
98
+ import_tax_amount: 0.0,
99
+ initial_buyer_txn_fee: 0.0,
100
+ insurance_premium: 0.0,
101
+ iof_tax_amount: 0.0,
102
+ is_paid_by_credit_card: true,
103
+ merchant_subtotal: 23.0,
104
+ seller_voucher: 0.0,
105
+ shipping_fee: 2.5,
106
+ shipping_fee_sst_amount: 0.0,
107
+ shopee_voucher: 0.0,
108
+ shopee_coins_redeemed: 0.0,
109
+ },
110
+ },
111
+ };
112
+ mockShopeeFetch.mockResolvedValue(mockResponse);
113
+ const result = await paymentManager.getEscrowDetail({
114
+ order_sn: "220101000000001",
115
+ });
116
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/payment/get_escrow_detail", {
117
+ method: "GET",
118
+ auth: true,
119
+ params: {
120
+ order_sn: "220101000000001",
121
+ },
122
+ });
123
+ expect(result).toEqual(mockResponse);
124
+ expect(result.response.order_income.escrow_amount).toBe(22.5);
125
+ expect(result.response.order_income.items).toHaveLength(1);
126
+ expect(result.response.buyer_user_name).toBe("testbuyer123");
127
+ });
128
+ it("should get escrow detail with return orders", async () => {
129
+ const mockResponse = {
130
+ request_id: "test-request-id",
131
+ error: "",
132
+ message: "",
133
+ response: {
134
+ order_sn: "220101000000002",
135
+ buyer_user_name: "anotherbuyer",
136
+ return_order_sn_list: ["RET220101000000001", "RET220101000000002"],
137
+ order_income: {
138
+ escrow_amount: 18.75,
139
+ buyer_total_amount: 25.5,
140
+ original_price: 23.0,
141
+ seller_discount: 2.0,
142
+ shopee_discount: 0.0,
143
+ voucher_from_seller: 0.0,
144
+ voucher_from_shopee: 0.0,
145
+ coins: 0.0,
146
+ buyer_paid_shipping_fee: 2.5,
147
+ buyer_transaction_fee: 0.0,
148
+ cross_border_tax: 0.0,
149
+ payment_promotion: 0.0,
150
+ commission_fee: 1.26,
151
+ service_fee: 0.09,
152
+ seller_transaction_fee: 0.0,
153
+ seller_lost_compensation: 0.0,
154
+ seller_coin_cash_back: 0.0,
155
+ escrow_tax: 0.25,
156
+ estimated_shipping_fee: 2.5,
157
+ final_shipping_fee: 2.5,
158
+ actual_shipping_fee: 2.5,
159
+ shopee_shipping_rebate: 0.0,
160
+ shipping_fee_discount_from_3pl: 0.0,
161
+ seller_shipping_discount: 0.0,
162
+ seller_voucher_code: [],
163
+ drc_adjustable_refund: 2.0,
164
+ cost_of_goods_sold: 21.0,
165
+ original_cost_of_goods_sold: 23.0,
166
+ original_shopee_discount: 0.0,
167
+ seller_return_refund: 0.0,
168
+ reverse_shipping_fee: 0.0,
169
+ final_product_protection: 0.0,
170
+ credit_card_promotion: 0.0,
171
+ credit_card_transaction_fee: 0.0,
172
+ final_product_vat_tax: 0.0,
173
+ items: [
174
+ {
175
+ item_id: 333333,
176
+ item_name: "Another Test Product",
177
+ item_sku: "TEST-SKU-002-BLUE-M",
178
+ model_id: 444444,
179
+ model_name: "Blue-Medium",
180
+ model_sku: "TEST-SKU-002-BLUE-M",
181
+ original_price: 23.0,
182
+ discounted_price: 21.0,
183
+ seller_discount: 2.0,
184
+ shopee_discount: 0.0,
185
+ discount_from_coin: 0.0,
186
+ discount_from_voucher_shopee: 0.0,
187
+ discount_from_voucher_seller: 0.0,
188
+ activity_type: "",
189
+ activity_id: 0,
190
+ is_main_item: false,
191
+ quantity_purchased: 1,
192
+ },
193
+ ],
194
+ },
195
+ buyer_payment_info: {
196
+ buyer_payment_method: "Credit Card",
197
+ buyer_service_fee: 0.0,
198
+ buyer_tax_amount: 0.0,
199
+ buyer_total_amount: 23.5,
200
+ credit_card_promotion: 0.0,
201
+ icms_tax_amount: 0.0,
202
+ import_tax_amount: 0.0,
203
+ initial_buyer_txn_fee: 0.0,
204
+ insurance_premium: 0.0,
205
+ iof_tax_amount: 0.0,
206
+ is_paid_by_credit_card: true,
207
+ merchant_subtotal: 21.0,
208
+ seller_voucher: 0.0,
209
+ shipping_fee: 2.5,
210
+ shipping_fee_sst_amount: 0.0,
211
+ shopee_voucher: 0.0,
212
+ shopee_coins_redeemed: 0.0,
213
+ },
214
+ },
215
+ };
216
+ mockShopeeFetch.mockResolvedValue(mockResponse);
217
+ const result = await paymentManager.getEscrowDetail({
218
+ order_sn: "220101000000002",
219
+ });
220
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/payment/get_escrow_detail", {
221
+ method: "GET",
222
+ auth: true,
223
+ params: {
224
+ order_sn: "220101000000002",
225
+ },
226
+ });
227
+ expect(result).toEqual(mockResponse);
228
+ expect(result.response.return_order_sn_list).toHaveLength(2);
229
+ expect(result.response.order_income.seller_discount).toBe(2.0);
230
+ expect(result.response.order_income.drc_adjustable_refund).toBe(2.0);
231
+ });
232
+ it("should handle orders with no escrow detail breakdown", async () => {
233
+ const mockResponse = {
234
+ request_id: "test-request-id",
235
+ error: "",
236
+ message: "",
237
+ response: {
238
+ order_sn: "220101000000003",
239
+ buyer_user_name: "simpleorder",
240
+ return_order_sn_list: [],
241
+ order_income: {
242
+ escrow_amount: 15.0,
243
+ buyer_total_amount: 15.0,
244
+ original_price: 15.0,
245
+ seller_discount: 0.0,
246
+ shopee_discount: 0.0,
247
+ voucher_from_seller: 0.0,
248
+ voucher_from_shopee: 0.0,
249
+ coins: 0.0,
250
+ buyer_paid_shipping_fee: 0.0,
251
+ buyer_transaction_fee: 0.0,
252
+ cross_border_tax: 0.0,
253
+ payment_promotion: 0.0,
254
+ commission_fee: 0.0,
255
+ service_fee: 0.0,
256
+ seller_transaction_fee: 0.0,
257
+ seller_lost_compensation: 0.0,
258
+ seller_coin_cash_back: 0.0,
259
+ escrow_tax: 0.0,
260
+ estimated_shipping_fee: 0.0,
261
+ final_shipping_fee: 0.0,
262
+ actual_shipping_fee: 0.0,
263
+ shopee_shipping_rebate: 0.0,
264
+ shipping_fee_discount_from_3pl: 0.0,
265
+ seller_shipping_discount: 0.0,
266
+ seller_voucher_code: [],
267
+ drc_adjustable_refund: 0.0,
268
+ cost_of_goods_sold: 15.0,
269
+ original_cost_of_goods_sold: 15.0,
270
+ original_shopee_discount: 0.0,
271
+ seller_return_refund: 0.0,
272
+ reverse_shipping_fee: 0.0,
273
+ final_product_protection: 0.0,
274
+ credit_card_promotion: 0.0,
275
+ credit_card_transaction_fee: 0.0,
276
+ final_product_vat_tax: 0.0,
277
+ items: [
278
+ {
279
+ item_id: 555555,
280
+ item_name: "Digital Product",
281
+ item_sku: "DIGITAL-001",
282
+ model_id: 666666,
283
+ model_name: "Standard",
284
+ model_sku: "DIGITAL-001",
285
+ original_price: 15.0,
286
+ discounted_price: 15.0,
287
+ seller_discount: 0.0,
288
+ shopee_discount: 0.0,
289
+ discount_from_coin: 0.0,
290
+ discount_from_voucher_shopee: 0.0,
291
+ discount_from_voucher_seller: 0.0,
292
+ activity_type: "",
293
+ activity_id: 0,
294
+ is_main_item: false,
295
+ quantity_purchased: 1,
296
+ },
297
+ ],
298
+ },
299
+ buyer_payment_info: {
300
+ buyer_payment_method: "Credit Card",
301
+ buyer_service_fee: 0.0,
302
+ buyer_tax_amount: 0.0,
303
+ buyer_total_amount: 15.0,
304
+ credit_card_promotion: 0.0,
305
+ icms_tax_amount: 0.0,
306
+ import_tax_amount: 0.0,
307
+ initial_buyer_txn_fee: 0.0,
308
+ insurance_premium: 0.0,
309
+ iof_tax_amount: 0.0,
310
+ is_paid_by_credit_card: false,
311
+ merchant_subtotal: 15.0,
312
+ seller_voucher: 0.0,
313
+ shipping_fee: 0.0,
314
+ shipping_fee_sst_amount: 0.0,
315
+ shopee_voucher: 0.0,
316
+ shopee_coins_redeemed: 0.0,
317
+ },
318
+ },
319
+ };
320
+ mockShopeeFetch.mockResolvedValue(mockResponse);
321
+ const result = await paymentManager.getEscrowDetail({
322
+ order_sn: "220101000000003",
323
+ });
324
+ expect(result).toEqual(mockResponse);
325
+ expect(result.response.order_income.escrow_amount).toBe(15.0);
326
+ expect(result.response.order_income.final_shipping_fee).toBe(0.0);
327
+ expect(result.response.order_income.commission_fee).toBe(0.0);
328
+ });
329
+ });
330
+ describe("getEscrowDetail with new fields", () => {
331
+ it("should include th_import_duty and other new fields in order income", async () => {
332
+ const mockResponse = {
333
+ request_id: "test-request-id",
334
+ error: "",
335
+ message: "",
336
+ response: {
337
+ order_sn: "220101TH0000001",
338
+ buyer_user_name: "thbuyer",
339
+ return_order_sn_list: [],
340
+ order_income: {
341
+ escrow_amount: 95.0,
342
+ buyer_total_amount: 100.0,
343
+ original_price: 100.0,
344
+ seller_discount: 0.0,
345
+ shopee_discount: 0.0,
346
+ voucher_from_seller: 0.0,
347
+ voucher_from_shopee: 0.0,
348
+ coins: 0.0,
349
+ buyer_paid_shipping_fee: 0.0,
350
+ buyer_transaction_fee: 0.0,
351
+ cross_border_tax: 0.0,
352
+ payment_promotion: 0.0,
353
+ commission_fee: 3.0,
354
+ service_fee: 0.5,
355
+ seller_transaction_fee: 0.0,
356
+ seller_lost_compensation: 0.0,
357
+ seller_coin_cash_back: 0.0,
358
+ escrow_tax: 0.0,
359
+ estimated_shipping_fee: 0.0,
360
+ final_shipping_fee: 0.0,
361
+ actual_shipping_fee: 0.0,
362
+ shopee_shipping_rebate: 0.0,
363
+ shipping_fee_discount_from_3pl: 0.0,
364
+ seller_shipping_discount: 0.0,
365
+ seller_voucher_code: [],
366
+ drc_adjustable_refund: 0.0,
367
+ cost_of_goods_sold: 100.0,
368
+ original_cost_of_goods_sold: 100.0,
369
+ original_shopee_discount: 0.0,
370
+ seller_return_refund: 0.0,
371
+ items: [],
372
+ reverse_shipping_fee: 0.0,
373
+ final_product_protection: 0.0,
374
+ credit_card_promotion: 0.0,
375
+ credit_card_transaction_fee: 0.0,
376
+ final_product_vat_tax: 0.0,
377
+ th_import_duty: 1.5,
378
+ withholding_vat_tax: 0.3,
379
+ withholding_pit_tax: 0.2,
380
+ seller_order_processing_fee: 0.5,
381
+ buyer_paid_packaging_fee: 0.0,
382
+ trade_in_bonus_by_seller: 0.0,
383
+ fbs_fee: 0.0,
384
+ net_commission_fee: 2.5,
385
+ net_service_fee: 0.4,
386
+ pix_discount: 0.0,
387
+ prorated_pix_discount_offset_return_items: 0.0,
388
+ ads_escrow_top_up_fee_or_technical_support_fee: 0.0,
389
+ },
390
+ buyer_payment_info: {
391
+ buyer_payment_method: "Credit Card",
392
+ buyer_service_fee: 0.0,
393
+ buyer_tax_amount: 0.0,
394
+ buyer_total_amount: 100.0,
395
+ credit_card_promotion: 0.0,
396
+ icms_tax_amount: 0.0,
397
+ import_tax_amount: 0.0,
398
+ initial_buyer_txn_fee: 0.0,
399
+ insurance_premium: 0.0,
400
+ iof_tax_amount: 0.0,
401
+ is_paid_by_credit_card: true,
402
+ merchant_subtotal: 100.0,
403
+ seller_voucher: 0.0,
404
+ shipping_fee: 0.0,
405
+ shipping_fee_sst_amount: 0.0,
406
+ shopee_voucher: 0.0,
407
+ shopee_coins_redeemed: 0.0,
408
+ },
409
+ },
410
+ };
411
+ mockShopeeFetch.mockResolvedValue(mockResponse);
412
+ const result = await paymentManager.getEscrowDetail({
413
+ order_sn: "220101TH0000001",
414
+ });
415
+ expect(result).toEqual(mockResponse);
416
+ expect(result.response.order_income.th_import_duty).toBe(1.5);
417
+ expect(result.response.order_income.withholding_vat_tax).toBe(0.3);
418
+ expect(result.response.order_income.withholding_pit_tax).toBe(0.2);
419
+ expect(result.response.order_income.seller_order_processing_fee).toBe(0.5);
420
+ expect(result.response.order_income.net_commission_fee).toBe(2.5);
421
+ expect(result.response.order_income.net_service_fee).toBe(0.4);
422
+ });
423
+ });
424
+ describe("getEscrowList", () => {
425
+ it("should get escrow list for a time range", async () => {
426
+ const mockResponse = {
427
+ request_id: "test-request-id",
428
+ error: "",
429
+ message: "",
430
+ response: {
431
+ escrow_list: [
432
+ {
433
+ order_sn: "220415N6SB140P",
434
+ payout_amount: 57334,
435
+ escrow_release_time: 1651849648,
436
+ },
437
+ {
438
+ order_sn: "220415M9J6GHBP",
439
+ payout_amount: 5930,
440
+ escrow_release_time: 1651849648,
441
+ },
442
+ ],
443
+ more: true,
444
+ },
445
+ };
446
+ mockShopeeFetch.mockResolvedValue(mockResponse);
447
+ const result = await paymentManager.getEscrowList({
448
+ release_time_from: 1651680000,
449
+ release_time_to: 1651939200,
450
+ page_size: 40,
451
+ page_no: 1,
452
+ });
453
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/payment/get_escrow_list", {
454
+ method: "GET",
455
+ auth: true,
456
+ params: {
457
+ release_time_from: 1651680000,
458
+ release_time_to: 1651939200,
459
+ page_size: 40,
460
+ page_no: 1,
461
+ },
462
+ });
463
+ expect(result).toEqual(mockResponse);
464
+ expect(result.response.escrow_list).toHaveLength(2);
465
+ expect(result.response.more).toBe(true);
466
+ });
467
+ });
468
+ describe("getEscrowDetailBatch", () => {
469
+ it("should get escrow details for multiple orders", async () => {
470
+ const mockResponse = {
471
+ request_id: "test-request-id",
472
+ error: "",
473
+ message: "",
474
+ response: {
475
+ order_income_list: [
476
+ {
477
+ order_sn: "220101000000001",
478
+ buyer_user_name: "testbuyer1",
479
+ return_order_sn_list: [],
480
+ order_income: {
481
+ escrow_amount: 100.0,
482
+ buyer_total_amount: 105.0,
483
+ original_price: 100.0,
484
+ seller_discount: 0.0,
485
+ shopee_discount: 0.0,
486
+ voucher_from_seller: 0.0,
487
+ voucher_from_shopee: 0.0,
488
+ coins: 0.0,
489
+ buyer_paid_shipping_fee: 5.0,
490
+ buyer_transaction_fee: 0.0,
491
+ cross_border_tax: 0.0,
492
+ payment_promotion: 0.0,
493
+ commission_fee: 5.0,
494
+ service_fee: 1.0,
495
+ seller_transaction_fee: 0.0,
496
+ seller_lost_compensation: 0.0,
497
+ seller_coin_cash_back: 0.0,
498
+ escrow_tax: 0.0,
499
+ estimated_shipping_fee: 5.0,
500
+ final_shipping_fee: 5.0,
501
+ actual_shipping_fee: 5.0,
502
+ shopee_shipping_rebate: 0.0,
503
+ shipping_fee_discount_from_3pl: 0.0,
504
+ seller_shipping_discount: 0.0,
505
+ seller_voucher_code: [],
506
+ drc_adjustable_refund: 0.0,
507
+ cost_of_goods_sold: 100.0,
508
+ original_cost_of_goods_sold: 100.0,
509
+ original_shopee_discount: 0.0,
510
+ seller_return_refund: 0.0,
511
+ items: [],
512
+ reverse_shipping_fee: 0.0,
513
+ final_product_protection: 0.0,
514
+ credit_card_promotion: 0.0,
515
+ credit_card_transaction_fee: 0.0,
516
+ final_product_vat_tax: 0.0,
517
+ },
518
+ buyer_payment_info: {
519
+ buyer_payment_method: "Credit Card",
520
+ buyer_service_fee: 0.0,
521
+ buyer_tax_amount: 0.0,
522
+ buyer_total_amount: 105.0,
523
+ credit_card_promotion: 0.0,
524
+ icms_tax_amount: 0.0,
525
+ import_tax_amount: 0.0,
526
+ initial_buyer_txn_fee: 0.0,
527
+ insurance_premium: 0.0,
528
+ iof_tax_amount: 0.0,
529
+ is_paid_by_credit_card: true,
530
+ merchant_subtotal: 100.0,
531
+ seller_voucher: 0.0,
532
+ shipping_fee: 5.0,
533
+ shipping_fee_sst_amount: 0.0,
534
+ shopee_voucher: 0.0,
535
+ shopee_coins_redeemed: 0.0,
536
+ },
537
+ },
538
+ ],
539
+ },
540
+ };
541
+ mockShopeeFetch.mockResolvedValue(mockResponse);
542
+ const result = await paymentManager.getEscrowDetailBatch({
543
+ order_sn_list: ["220101000000001", "220101000000002"],
544
+ });
545
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/payment/get_escrow_detail_batch", {
546
+ method: "POST",
547
+ auth: true,
548
+ body: {
549
+ order_sn_list: ["220101000000001", "220101000000002"],
550
+ },
551
+ });
552
+ expect(result).toEqual(mockResponse);
553
+ expect(result.response.order_income_list).toHaveLength(1);
554
+ });
555
+ it("should include th_import_duty in batch escrow order income", async () => {
556
+ const mockResponse = {
557
+ request_id: "test-request-id",
558
+ error: "",
559
+ message: "",
560
+ response: {
561
+ order_income_list: [
562
+ {
563
+ order_sn: "220101TH0000002",
564
+ buyer_user_name: "thbuyer2",
565
+ return_order_sn_list: [],
566
+ order_income: {
567
+ escrow_amount: 47.5,
568
+ buyer_total_amount: 50.0,
569
+ original_price: 50.0,
570
+ seller_discount: 0.0,
571
+ shopee_discount: 0.0,
572
+ voucher_from_seller: 0.0,
573
+ voucher_from_shopee: 0.0,
574
+ coins: 0.0,
575
+ buyer_paid_shipping_fee: 0.0,
576
+ buyer_transaction_fee: 0.0,
577
+ cross_border_tax: 0.0,
578
+ payment_promotion: 0.0,
579
+ commission_fee: 1.5,
580
+ service_fee: 0.25,
581
+ seller_transaction_fee: 0.0,
582
+ seller_lost_compensation: 0.0,
583
+ seller_coin_cash_back: 0.0,
584
+ escrow_tax: 0.0,
585
+ estimated_shipping_fee: 0.0,
586
+ final_shipping_fee: 0.0,
587
+ actual_shipping_fee: 0.0,
588
+ shopee_shipping_rebate: 0.0,
589
+ shipping_fee_discount_from_3pl: 0.0,
590
+ seller_shipping_discount: 0.0,
591
+ seller_voucher_code: [],
592
+ drc_adjustable_refund: 0.0,
593
+ cost_of_goods_sold: 50.0,
594
+ original_cost_of_goods_sold: 50.0,
595
+ original_shopee_discount: 0.0,
596
+ seller_return_refund: 0.0,
597
+ items: [],
598
+ reverse_shipping_fee: 0.0,
599
+ final_product_protection: 0.0,
600
+ credit_card_promotion: 0.0,
601
+ credit_card_transaction_fee: 0.0,
602
+ final_product_vat_tax: 0.0,
603
+ th_import_duty: 0.75,
604
+ fbs_fee: 0.5,
605
+ ads_escrow_top_up_fee_or_technical_support_fee: 0.0,
606
+ net_commission_fee_info_list: [
607
+ { rule_id: 1, fee_amount: 1.5, rule_display_name: "Standard Commission" },
608
+ ],
609
+ net_service_fee_info_list: [
610
+ {
611
+ rule_id: 2,
612
+ fee_amount: 0.25,
613
+ rule_display_name: "Standard Service Fee",
614
+ category: "service",
615
+ },
616
+ ],
617
+ seller_product_rebate: {
618
+ amount: 0.1,
619
+ commission_fee_offset: 0.05,
620
+ service_fee_offset: 0.05,
621
+ },
622
+ },
623
+ buyer_payment_info: {
624
+ buyer_payment_method: "PayNow",
625
+ buyer_service_fee: 0.0,
626
+ buyer_tax_amount: 0.0,
627
+ buyer_total_amount: 50.0,
628
+ credit_card_promotion: 0.0,
629
+ icms_tax_amount: 0.0,
630
+ import_tax_amount: 0.0,
631
+ initial_buyer_txn_fee: 0.0,
632
+ insurance_premium: 0.0,
633
+ iof_tax_amount: 0.0,
634
+ is_paid_by_credit_card: false,
635
+ merchant_subtotal: 50.0,
636
+ seller_voucher: 0.0,
637
+ shipping_fee: 0.0,
638
+ shipping_fee_sst_amount: 0.0,
639
+ shopee_voucher: 0.0,
640
+ shopee_coins_redeemed: 0.0,
641
+ },
642
+ },
643
+ ],
644
+ },
645
+ };
646
+ mockShopeeFetch.mockResolvedValue(mockResponse);
647
+ const result = await paymentManager.getEscrowDetailBatch({
648
+ order_sn_list: ["220101TH0000002"],
649
+ });
650
+ expect(result).toEqual(mockResponse);
651
+ expect(result.response.order_income_list[0].order_income.th_import_duty).toBe(0.75);
652
+ expect(result.response.order_income_list[0].order_income.fbs_fee).toBe(0.5);
653
+ expect(result.response.order_income_list[0].order_income.net_commission_fee_info_list).toHaveLength(1);
654
+ expect(result.response.order_income_list[0].order_income.net_service_fee_info_list).toHaveLength(1);
655
+ expect(result.response.order_income_list[0].order_income.seller_product_rebate?.amount).toBe(0.1);
656
+ });
657
+ });
658
+ describe("getWalletTransactionList", () => {
659
+ it("should get wallet transaction list", async () => {
660
+ const mockResponse = {
661
+ request_id: "test-request-id",
662
+ error: "",
663
+ message: "",
664
+ response: {
665
+ transaction_list: [
666
+ {
667
+ transaction_type: "ORDER_PAYMENT",
668
+ status: "COMPLETED",
669
+ amount: 100.0,
670
+ current_balance: 1000.0,
671
+ create_time: 1651680000,
672
+ order_sn: "220101000000001",
673
+ money_flow: "MONEY_IN",
674
+ transaction_tab_type: "wallet_order_income",
675
+ },
676
+ ],
677
+ more: false,
678
+ },
679
+ };
680
+ mockShopeeFetch.mockResolvedValue(mockResponse);
681
+ const result = await paymentManager.getWalletTransactionList({
682
+ page_no: 1,
683
+ page_size: 40,
684
+ create_time_from: 1651680000,
685
+ create_time_to: 1651939200,
686
+ });
687
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/payment/get_wallet_transaction_list", {
688
+ method: "GET",
689
+ auth: true,
690
+ params: {
691
+ page_no: 1,
692
+ page_size: 40,
693
+ create_time_from: 1651680000,
694
+ create_time_to: 1651939200,
695
+ },
696
+ });
697
+ expect(result).toEqual(mockResponse);
698
+ expect(result.response.transaction_list).toHaveLength(1);
699
+ expect(result.response.more).toBe(false);
700
+ });
701
+ });
702
+ describe("getPaymentMethodList", () => {
703
+ it("should get payment method list without authentication", async () => {
704
+ const mockResponse = {
705
+ request_id: "test-request-id",
706
+ error: "",
707
+ message: "",
708
+ response: {
709
+ payment_method_list: [
710
+ {
711
+ payment_method_id: 1,
712
+ payment_method_name: "Credit Card",
713
+ is_enabled: true,
714
+ },
715
+ {
716
+ payment_method_id: 2,
717
+ payment_method_name: "Bank Transfer",
718
+ is_enabled: true,
719
+ },
720
+ ],
721
+ },
722
+ };
723
+ mockShopeeFetch.mockResolvedValue(mockResponse);
724
+ const result = await paymentManager.getPaymentMethodList();
725
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/payment/get_payment_method_list", {
726
+ method: "GET",
727
+ auth: false,
728
+ });
729
+ expect(result).toEqual(mockResponse);
730
+ expect(result.response.payment_method_list).toHaveLength(2);
731
+ });
732
+ });
733
+ describe("getShopInstallmentStatus", () => {
734
+ it("should get shop installment status", async () => {
735
+ const mockResponse = {
736
+ request_id: "test-request-id",
737
+ error: "",
738
+ message: "",
739
+ response: {
740
+ tenure_list: [3, 6, 12],
741
+ status: "ENABLED",
742
+ },
743
+ };
744
+ mockShopeeFetch.mockResolvedValue(mockResponse);
745
+ const result = await paymentManager.getShopInstallmentStatus();
746
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/payment/get_shop_installment_status", {
747
+ method: "GET",
748
+ auth: true,
749
+ });
750
+ expect(result).toEqual(mockResponse);
751
+ expect(result.response.tenure_list).toHaveLength(3);
752
+ expect(result.response.status).toBe("ENABLED");
753
+ });
754
+ });
755
+ describe("setShopInstallmentStatus", () => {
756
+ it("should set shop installment status", async () => {
757
+ const mockResponse = {
758
+ request_id: "test-request-id",
759
+ error: "",
760
+ message: "",
761
+ response: {},
762
+ };
763
+ mockShopeeFetch.mockResolvedValue(mockResponse);
764
+ const result = await paymentManager.setShopInstallmentStatus({
765
+ installment_status: 1,
766
+ });
767
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/payment/set_shop_installment_status", {
768
+ method: "POST",
769
+ auth: true,
770
+ body: {
771
+ installment_status: 1,
772
+ },
773
+ });
774
+ expect(result).toEqual(mockResponse);
775
+ });
776
+ });
777
+ describe("getItemInstallmentStatus", () => {
778
+ it("should get item installment status", async () => {
779
+ const mockResponse = {
780
+ request_id: "test-request-id",
781
+ error: "",
782
+ message: "",
783
+ response: {
784
+ item_installment_list: [
785
+ {
786
+ item_id: 123456,
787
+ tenure_list: [3, 6],
788
+ },
789
+ ],
790
+ },
791
+ };
792
+ mockShopeeFetch.mockResolvedValue(mockResponse);
793
+ const result = await paymentManager.getItemInstallmentStatus({
794
+ item_id_list: [123456],
795
+ });
796
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/payment/get_item_installment_status", {
797
+ method: "POST",
798
+ auth: true,
799
+ body: {
800
+ item_id_list: [123456],
801
+ },
802
+ });
803
+ expect(result).toEqual(mockResponse);
804
+ expect(result.response.item_installment_list).toHaveLength(1);
805
+ expect(result.response.item_installment_list[0].item_id).toBe(123456);
806
+ expect(result.response.item_installment_list[0].tenure_list).toHaveLength(2);
807
+ });
808
+ });
809
+ describe("setItemInstallmentStatus", () => {
810
+ it("should set item installment status", async () => {
811
+ const mockResponse = {
812
+ request_id: "test-request-id",
813
+ error: "",
814
+ message: "",
815
+ response: {},
816
+ };
817
+ mockShopeeFetch.mockResolvedValue(mockResponse);
818
+ const result = await paymentManager.setItemInstallmentStatus({
819
+ item_id_list: [123456],
820
+ tenure_list: [3, 6, 12],
821
+ });
822
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/payment/set_item_installment_status", {
823
+ method: "POST",
824
+ auth: true,
825
+ body: {
826
+ item_id_list: [123456],
827
+ tenure_list: [3, 6, 12],
828
+ },
829
+ });
830
+ expect(result).toEqual(mockResponse);
831
+ });
832
+ });
833
+ describe("generateIncomeReport", () => {
834
+ it("should trigger income report generation", async () => {
835
+ const mockResponse = {
836
+ request_id: "test-request-id",
837
+ error: "",
838
+ message: "",
839
+ response: {
840
+ income_report_id: "REPORT_123456",
841
+ },
842
+ };
843
+ mockShopeeFetch.mockResolvedValue(mockResponse);
844
+ const result = await paymentManager.generateIncomeReport({
845
+ start_time: 1651680000,
846
+ end_time: 1651939200,
847
+ currency: "SGD",
848
+ });
849
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/payment/generate_income_report", {
850
+ method: "GET",
851
+ auth: true,
852
+ params: {
853
+ start_time: 1651680000,
854
+ end_time: 1651939200,
855
+ currency: "SGD",
856
+ },
857
+ });
858
+ expect(result).toEqual(mockResponse);
859
+ expect(result.response.income_report_id).toBe("REPORT_123456");
860
+ });
861
+ });
862
+ describe("getIncomeReport", () => {
863
+ it("should get income report status and download link", async () => {
864
+ const mockResponse = {
865
+ request_id: "test-request-id",
866
+ error: "",
867
+ message: "",
868
+ response: {
869
+ income_report_id: "REPORT_123456",
870
+ status: "COMPLETED",
871
+ url: "https://example.com/report.csv",
872
+ create_time: 1651680000,
873
+ },
874
+ };
875
+ mockShopeeFetch.mockResolvedValue(mockResponse);
876
+ const result = await paymentManager.getIncomeReport({
877
+ income_report_id: "REPORT_123456",
878
+ });
879
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/payment/get_income_report", {
880
+ method: "GET",
881
+ auth: true,
882
+ params: {
883
+ income_report_id: "REPORT_123456",
884
+ },
885
+ });
886
+ expect(result).toEqual(mockResponse);
887
+ expect(result.response.status).toBe("COMPLETED");
888
+ expect(result.response.url).toBe("https://example.com/report.csv");
889
+ });
890
+ });
891
+ describe("generateIncomeStatement", () => {
892
+ it("should trigger income statement generation", async () => {
893
+ const mockResponse = {
894
+ request_id: "test-request-id",
895
+ error: "",
896
+ message: "",
897
+ response: {
898
+ income_statement_id: "STATEMENT_123456",
899
+ },
900
+ };
901
+ mockShopeeFetch.mockResolvedValue(mockResponse);
902
+ const result = await paymentManager.generateIncomeStatement({
903
+ start_time: 1651680000,
904
+ end_time: 1651939200,
905
+ });
906
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/payment/generate_income_statement", {
907
+ method: "GET",
908
+ auth: true,
909
+ params: {
910
+ start_time: 1651680000,
911
+ end_time: 1651939200,
912
+ },
913
+ });
914
+ expect(result).toEqual(mockResponse);
915
+ expect(result.response.income_statement_id).toBe("STATEMENT_123456");
916
+ });
917
+ });
918
+ describe("getIncomeStatement", () => {
919
+ it("should get income statement status and download link", async () => {
920
+ const mockResponse = {
921
+ request_id: "test-request-id",
922
+ error: "",
923
+ message: "",
924
+ response: {
925
+ income_statement_id: "STATEMENT_123456",
926
+ status: "COMPLETED",
927
+ url: "https://example.com/statement.pdf",
928
+ create_time: 1651680000,
929
+ },
930
+ };
931
+ mockShopeeFetch.mockResolvedValue(mockResponse);
932
+ const result = await paymentManager.getIncomeStatement({
933
+ income_statement_id: "STATEMENT_123456",
934
+ });
935
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/payment/get_income_statement", {
936
+ method: "GET",
937
+ auth: true,
938
+ params: {
939
+ income_statement_id: "STATEMENT_123456",
940
+ },
941
+ });
942
+ expect(result).toEqual(mockResponse);
943
+ expect(result.response.status).toBe("COMPLETED");
944
+ expect(result.response.url).toBe("https://example.com/statement.pdf");
945
+ });
946
+ });
947
+ describe("getBillingTransactionInfo", () => {
948
+ it("should get billing transaction info for CB sellers", async () => {
949
+ const mockResponse = {
950
+ request_id: "test-request-id",
951
+ error: "",
952
+ message: "",
953
+ response: {
954
+ transactions: [
955
+ {
956
+ amount: 1000.0,
957
+ currency: "USD",
958
+ order_sn: "220101000000001",
959
+ billing_transaction_type: "ORDER_PAYMENT",
960
+ billing_transaction_status: "COMPLETED",
961
+ },
962
+ ],
963
+ more: false,
964
+ next_cursor: "",
965
+ },
966
+ };
967
+ mockShopeeFetch.mockResolvedValue(mockResponse);
968
+ const result = await paymentManager.getBillingTransactionInfo({
969
+ billing_transaction_info_type: 1,
970
+ cursor: "",
971
+ page_size: 40,
972
+ });
973
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/payment/get_billing_transaction_info", {
974
+ method: "POST",
975
+ auth: true,
976
+ body: {
977
+ billing_transaction_info_type: 1,
978
+ cursor: "",
979
+ page_size: 40,
980
+ },
981
+ });
982
+ expect(result).toEqual(mockResponse);
983
+ expect(result.response.transactions).toHaveLength(1);
984
+ });
985
+ });
986
+ describe("getPayoutDetail", () => {
987
+ it("should get payout detail for CB sellers (deprecated)", async () => {
988
+ const mockResponse = {
989
+ request_id: "test-request-id",
990
+ error: "",
991
+ message: "",
992
+ response: {
993
+ payout_list: [
994
+ {
995
+ payout_id: "PAYOUT_123456",
996
+ payout_amount: 5000.0,
997
+ payout_time: 1651680000,
998
+ currency: "USD",
999
+ exchange_rate: 1.35,
1000
+ },
1001
+ ],
1002
+ more: false,
1003
+ },
1004
+ };
1005
+ mockShopeeFetch.mockResolvedValue(mockResponse);
1006
+ const result = await paymentManager.getPayoutDetail({
1007
+ payout_time_from: 1651680000,
1008
+ payout_time_to: 1651939200,
1009
+ page_no: 1,
1010
+ page_size: 40,
1011
+ });
1012
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/payment/get_payout_detail", {
1013
+ method: "GET",
1014
+ auth: true,
1015
+ params: {
1016
+ payout_time_from: 1651680000,
1017
+ payout_time_to: 1651939200,
1018
+ page_no: 1,
1019
+ page_size: 40,
1020
+ },
1021
+ });
1022
+ expect(result).toEqual(mockResponse);
1023
+ expect(result.response.payout_list).toHaveLength(1);
1024
+ });
1025
+ });
1026
+ describe("getPayoutInfo", () => {
1027
+ it("should get payout info for CB sellers", async () => {
1028
+ const mockResponse = {
1029
+ request_id: "test-request-id",
1030
+ error: "",
1031
+ message: "",
1032
+ response: {
1033
+ payout_list: [
1034
+ {
1035
+ payout_id: "PAYOUT_789012",
1036
+ payout_amount: 7500.0,
1037
+ payout_time: 1651680000,
1038
+ currency: "USD",
1039
+ exchange_rate: 1.35,
1040
+ payout_fee: 25.0,
1041
+ },
1042
+ ],
1043
+ more: false,
1044
+ },
1045
+ };
1046
+ mockShopeeFetch.mockResolvedValue(mockResponse);
1047
+ const result = await paymentManager.getPayoutInfo({
1048
+ payout_time_from: 1651680000,
1049
+ payout_time_to: 1651939200,
1050
+ page_no: 1,
1051
+ page_size: 40,
1052
+ });
1053
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/payment/get_payout_info", {
1054
+ method: "GET",
1055
+ auth: true,
1056
+ params: {
1057
+ payout_time_from: 1651680000,
1058
+ payout_time_to: 1651939200,
1059
+ page_no: 1,
1060
+ page_size: 40,
1061
+ },
1062
+ });
1063
+ expect(result).toEqual(mockResponse);
1064
+ expect(result.response.payout_list).toHaveLength(1);
1065
+ expect(result.response.payout_list[0].payout_fee).toBe(25.0);
1066
+ });
1067
+ });
1068
+ describe("getIncomeDetail", () => {
1069
+ it("should get income detail successfully", async () => {
1070
+ const mockResponse = {
1071
+ request_id: "test-request-id",
1072
+ error: "",
1073
+ message: "",
1074
+ income_detail_list: {
1075
+ list: [
1076
+ {
1077
+ actual_payout_time: 1762532978,
1078
+ currency: "IDR",
1079
+ order_sn: "251101MPY3RDD3",
1080
+ payment_method: "Cash on Delivery",
1081
+ released_amount: 19246,
1082
+ status: "Dana telah dilepaskan",
1083
+ },
1084
+ ],
1085
+ next_page: {
1086
+ cursor: "216223606250140",
1087
+ page_size: 10,
1088
+ },
1089
+ },
1090
+ };
1091
+ mockShopeeFetch.mockResolvedValue(mockResponse);
1092
+ const result = await paymentManager.getIncomeDetail({
1093
+ date_from: "2025-08-08",
1094
+ date_to: "2025-08-20",
1095
+ income_status: 1,
1096
+ cursor: "",
1097
+ page_size: 10,
1098
+ });
1099
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/payment/get_income_detail", {
1100
+ method: "GET",
1101
+ auth: true,
1102
+ params: {
1103
+ date_from: "2025-08-08",
1104
+ date_to: "2025-08-20",
1105
+ income_status: 1,
1106
+ cursor: "",
1107
+ page_size: 10,
1108
+ },
1109
+ });
1110
+ expect(result).toEqual(mockResponse);
1111
+ expect(result.income_detail_list?.list).toHaveLength(1);
1112
+ expect(result.income_detail_list?.next_page?.cursor).toBe("216223606250140");
1113
+ });
1114
+ });
1115
+ describe("getIncomeOverview", () => {
1116
+ it("should get income overview successfully", async () => {
1117
+ const mockResponse = {
1118
+ request_id: "test-request-id",
1119
+ error: "",
1120
+ message: "",
1121
+ total_income: {
1122
+ pending_amount: 4010,
1123
+ released_amount: 1545,
1124
+ },
1125
+ };
1126
+ mockShopeeFetch.mockResolvedValue(mockResponse);
1127
+ const result = await paymentManager.getIncomeOverview({
1128
+ income_status: 1,
1129
+ });
1130
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/payment/get_income_overview", {
1131
+ method: "GET",
1132
+ auth: true,
1133
+ params: {
1134
+ income_status: 1,
1135
+ },
1136
+ });
1137
+ expect(result).toEqual(mockResponse);
1138
+ expect(result.total_income?.pending_amount).toBe(4010);
1139
+ expect(result.total_income?.released_amount).toBe(1545);
1140
+ });
1141
+ it("should get income overview without parameters", async () => {
1142
+ const mockResponse = {
1143
+ request_id: "test-request-id",
1144
+ error: "",
1145
+ message: "",
1146
+ response: {
1147
+ latest_payout_date: "2025-08-19",
1148
+ total_income: {
1149
+ pending_amount: 330598.87,
1150
+ released_amount: 330598.87,
1151
+ },
1152
+ },
1153
+ };
1154
+ mockShopeeFetch.mockResolvedValue(mockResponse);
1155
+ const result = await paymentManager.getIncomeOverview();
1156
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/payment/get_income_overview", {
1157
+ method: "GET",
1158
+ auth: true,
1159
+ params: undefined,
1160
+ });
1161
+ expect(result).toEqual(mockResponse);
1162
+ expect(result.response?.latest_payout_date).toBe("2025-08-19");
1163
+ expect(result.response?.total_income?.pending_amount).toBe(330598.87);
1164
+ });
1165
+ });
1166
+ });
1167
+ //# sourceMappingURL=payment.manager.test.js.map