@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,1039 @@
1
+ import { jest } from "@jest/globals";
2
+ import { VideoManager } from "../../managers/video.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("VideoManager", () => {
9
+ let videoManager;
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
+ videoManager = new VideoManager(mockConfig);
22
+ });
23
+ describe("deleteVideo", () => {
24
+ it("should delete draft videos successfully", async () => {
25
+ const mockResponse = {
26
+ request_id: "test-request-id",
27
+ error: "",
28
+ message: "",
29
+ response: {
30
+ successList: [
31
+ {
32
+ successVideoUploadId: "upload123",
33
+ },
34
+ {
35
+ successVideoUploadId: "upload456",
36
+ },
37
+ ],
38
+ failureList: [],
39
+ },
40
+ };
41
+ mockShopeeFetch.mockResolvedValue(mockResponse);
42
+ const result = await videoManager.deleteVideo({
43
+ videoUploadIdList: ["upload123", "upload456"],
44
+ });
45
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/video/delete_video", {
46
+ method: "POST",
47
+ auth: true,
48
+ body: {
49
+ videoUploadIdList: ["upload123", "upload456"],
50
+ },
51
+ });
52
+ expect(result.error).toBe("");
53
+ expect(result.response.successList).toHaveLength(2);
54
+ expect(result.response.failureList).toHaveLength(0);
55
+ });
56
+ it("should delete draft videos using snake_case parameters successfully", async () => {
57
+ const mockResponse = {
58
+ request_id: "test-request-id",
59
+ error: "",
60
+ message: "",
61
+ response: {
62
+ successList: [
63
+ {
64
+ successVideoUploadId: "upload123",
65
+ },
66
+ ],
67
+ failureList: [],
68
+ },
69
+ };
70
+ mockShopeeFetch.mockResolvedValue(mockResponse);
71
+ const result = await videoManager.deleteVideo({
72
+ video_upload_id_list: ["upload123"],
73
+ post_id_list: ["post456"],
74
+ });
75
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/video/delete_video", {
76
+ method: "POST",
77
+ auth: true,
78
+ body: {
79
+ video_upload_id_list: ["upload123"],
80
+ post_id_list: ["post456"],
81
+ },
82
+ });
83
+ expect(result.error).toBe("");
84
+ });
85
+ it("should handle partial deletion failure", async () => {
86
+ const mockResponse = {
87
+ request_id: "test-request-id",
88
+ error: "",
89
+ message: "",
90
+ response: {
91
+ successList: [
92
+ {
93
+ successVideoUploadId: "upload123",
94
+ },
95
+ ],
96
+ failureList: [
97
+ {
98
+ failVideoUploadId: "upload456",
99
+ failedReason: "Video not found",
100
+ },
101
+ ],
102
+ },
103
+ };
104
+ mockShopeeFetch.mockResolvedValue(mockResponse);
105
+ const result = await videoManager.deleteVideo({
106
+ videoUploadIdList: ["upload123", "upload456"],
107
+ });
108
+ expect(result.response.successList).toHaveLength(1);
109
+ expect(result.response.failureList).toHaveLength(1);
110
+ expect(result.response.failureList[0].failedReason).toBe("Video not found");
111
+ });
112
+ });
113
+ describe("editVideoInfo", () => {
114
+ it("should edit video info successfully", async () => {
115
+ const mockResponse = {
116
+ request_id: "test-request-id",
117
+ error: "",
118
+ message: "",
119
+ response: {
120
+ successList: ["upload123"],
121
+ failureList: [],
122
+ },
123
+ };
124
+ mockShopeeFetch.mockResolvedValue(mockResponse);
125
+ const result = await videoManager.editVideoInfo({
126
+ videoUploadList: [
127
+ {
128
+ videoUploadId: "upload123",
129
+ caption: "Updated caption",
130
+ coverImageUrl: "https://example.com/cover1.jpg",
131
+ allowInfo: {
132
+ allowDuet: true,
133
+ allowStitch: true,
134
+ },
135
+ scheduledInfo: {
136
+ scheduledPost: false,
137
+ },
138
+ },
139
+ ],
140
+ });
141
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/video/edit_video_info", {
142
+ method: "POST",
143
+ auth: true,
144
+ body: {
145
+ videoUploadList: [
146
+ {
147
+ videoUploadId: "upload123",
148
+ caption: "Updated caption",
149
+ coverImageUrl: "https://example.com/cover1.jpg",
150
+ allowInfo: {
151
+ allowDuet: true,
152
+ allowStitch: true,
153
+ },
154
+ scheduledInfo: {
155
+ scheduledPost: false,
156
+ },
157
+ },
158
+ ],
159
+ },
160
+ });
161
+ expect(result.error).toBe("");
162
+ expect(result.response.successList).toHaveLength(1);
163
+ });
164
+ it("should edit video info using snake_case parameters successfully", async () => {
165
+ const mockResponse = {
166
+ request_id: "test-request-id",
167
+ error: "",
168
+ message: "",
169
+ response: {
170
+ successList: ["upload123"],
171
+ failureList: [],
172
+ },
173
+ };
174
+ mockShopeeFetch.mockResolvedValue(mockResponse);
175
+ const result = await videoManager.editVideoInfo({
176
+ video_upload_list: [
177
+ {
178
+ video_upload_id: "upload123",
179
+ caption: "Updated caption",
180
+ cover_image_url: "https://example.com/cover1.jpg",
181
+ item_info: [
182
+ {
183
+ item_id: 9999,
184
+ custom_item_name: "custom product name",
185
+ },
186
+ ],
187
+ allow_info: {
188
+ allow_duet: true,
189
+ allow_stitch: true,
190
+ },
191
+ scheduled_info: {
192
+ scheduled_post: false,
193
+ scheduled_post_time: 123456789,
194
+ },
195
+ },
196
+ ],
197
+ });
198
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/video/edit_video_info", {
199
+ method: "POST",
200
+ auth: true,
201
+ body: {
202
+ video_upload_list: [
203
+ {
204
+ video_upload_id: "upload123",
205
+ caption: "Updated caption",
206
+ cover_image_url: "https://example.com/cover1.jpg",
207
+ item_info: [
208
+ {
209
+ item_id: 9999,
210
+ custom_item_name: "custom product name",
211
+ },
212
+ ],
213
+ allow_info: {
214
+ allow_duet: true,
215
+ allow_stitch: true,
216
+ },
217
+ scheduled_info: {
218
+ scheduled_post: false,
219
+ scheduled_post_time: 123456789,
220
+ },
221
+ },
222
+ ],
223
+ },
224
+ });
225
+ expect(result.error).toBe("");
226
+ });
227
+ it("should handle edit failure", async () => {
228
+ const mockResponse = {
229
+ request_id: "test-request-id",
230
+ error: "",
231
+ message: "",
232
+ response: {
233
+ successList: [],
234
+ failureList: [
235
+ {
236
+ failVideoUploadId: "upload123",
237
+ failedReason: "Caption exceeds limit",
238
+ },
239
+ ],
240
+ },
241
+ };
242
+ mockShopeeFetch.mockResolvedValue(mockResponse);
243
+ const result = await videoManager.editVideoInfo({
244
+ videoUploadList: [
245
+ {
246
+ videoUploadId: "upload123",
247
+ caption: "a".repeat(1001),
248
+ coverImageUrl: "https://example.com/cover1.jpg",
249
+ allowInfo: {
250
+ allowDuet: true,
251
+ allowStitch: true,
252
+ },
253
+ scheduledInfo: {
254
+ scheduledPost: false,
255
+ },
256
+ },
257
+ ],
258
+ });
259
+ expect(result.response.failureList).toHaveLength(1);
260
+ expect(result.response.failureList[0].failedReason).toBe("Caption exceeds limit");
261
+ });
262
+ });
263
+ describe("getCoverList", () => {
264
+ it("should get cover list successfully", async () => {
265
+ const mockResponse = {
266
+ request_id: "test-request-id",
267
+ error: "",
268
+ message: "",
269
+ response: {
270
+ imageUrlList: ["https://example.com/cover1.jpg", "https://example.com/cover2.jpg"],
271
+ },
272
+ };
273
+ mockShopeeFetch.mockResolvedValue(mockResponse);
274
+ const result = await videoManager.getCoverList({
275
+ videoUploadId: "upload123",
276
+ });
277
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/video/get_cover_list", {
278
+ method: "GET",
279
+ auth: true,
280
+ params: {
281
+ videoUploadId: "upload123",
282
+ },
283
+ });
284
+ expect(result.error).toBe("");
285
+ expect(result.response.imageUrlList).toHaveLength(2);
286
+ });
287
+ it("should get cover list using snake_case parameters successfully", async () => {
288
+ const mockResponse = {
289
+ request_id: "test-request-id",
290
+ error: "",
291
+ message: "",
292
+ response: {
293
+ imageUrlList: ["https://example.com/cover1.jpg"],
294
+ },
295
+ };
296
+ mockShopeeFetch.mockResolvedValue(mockResponse);
297
+ const result = await videoManager.getCoverList({
298
+ video_upload_id: "upload123",
299
+ });
300
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/video/get_cover_list", {
301
+ method: "GET",
302
+ auth: true,
303
+ params: {
304
+ video_upload_id: "upload123",
305
+ },
306
+ });
307
+ expect(result.error).toBe("");
308
+ });
309
+ });
310
+ describe("getMetricTrend", () => {
311
+ it("should get metric trend successfully", async () => {
312
+ const mockResponse = {
313
+ request_id: "test-request-id",
314
+ error: "",
315
+ message: "",
316
+ response: {
317
+ videoTotalMetricList: [
318
+ {
319
+ dataPeriod: "2024-01-01",
320
+ totalViews: 1000,
321
+ totalLikes: 50,
322
+ totalShares: 10,
323
+ },
324
+ {
325
+ dataPeriod: "2024-01-02",
326
+ totalViews: 1200,
327
+ totalLikes: 60,
328
+ totalShares: 15,
329
+ },
330
+ ],
331
+ },
332
+ };
333
+ mockShopeeFetch.mockResolvedValue(mockResponse);
334
+ const result = await videoManager.getMetricTrend({
335
+ periodType: "Day",
336
+ endDate: "2026-05-20",
337
+ });
338
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/video/get_metric_trend", {
339
+ method: "GET",
340
+ auth: true,
341
+ params: {
342
+ periodType: "Day",
343
+ endDate: "2026-05-20",
344
+ },
345
+ });
346
+ expect(result.error).toBe("");
347
+ expect(result.response.videoTotalMetricList).toHaveLength(2);
348
+ });
349
+ it("should get metric trend using snake_case parameters successfully", async () => {
350
+ const mockResponse = {
351
+ request_id: "test-request-id",
352
+ error: "",
353
+ message: "",
354
+ response: {
355
+ videoTotalMetricList: [],
356
+ },
357
+ };
358
+ mockShopeeFetch.mockResolvedValue(mockResponse);
359
+ const result = await videoManager.getMetricTrend({
360
+ period_type: "Day",
361
+ end_date: "2026-05-20",
362
+ });
363
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/video/get_metric_trend", {
364
+ method: "GET",
365
+ auth: true,
366
+ params: {
367
+ period_type: "Day",
368
+ end_date: "2026-05-20",
369
+ },
370
+ });
371
+ expect(result.error).toBe("");
372
+ });
373
+ });
374
+ describe("getOverviewPerformance", () => {
375
+ it("should get overview performance successfully", async () => {
376
+ const mockResponse = {
377
+ request_id: "test-request-id",
378
+ error: "",
379
+ message: "",
380
+ response: {
381
+ keyMetric: {
382
+ totalViewers: 10000,
383
+ },
384
+ engagement: {
385
+ totalViews: 12000,
386
+ totalLikes: 500,
387
+ totalShares: 100,
388
+ totalComments: 200,
389
+ },
390
+ fetchedDateRange: "2026-05-19 - 2026-05-19",
391
+ },
392
+ };
393
+ mockShopeeFetch.mockResolvedValue(mockResponse);
394
+ const result = await videoManager.getOverviewPerformance({
395
+ periodType: "Day",
396
+ endDate: "2026-05-20",
397
+ });
398
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/video/get_overview_performance", {
399
+ method: "GET",
400
+ auth: true,
401
+ params: {
402
+ periodType: "Day",
403
+ endDate: "2026-05-20",
404
+ },
405
+ });
406
+ expect(result.error).toBe("");
407
+ expect(result.response.keyMetric?.totalViewers).toBe(10000);
408
+ expect(result.response.engagement?.totalLikes).toBe(500);
409
+ });
410
+ it("should get overview performance using snake_case parameters successfully", async () => {
411
+ const mockResponse = {
412
+ request_id: "test-request-id",
413
+ error: "",
414
+ message: "",
415
+ response: {},
416
+ };
417
+ mockShopeeFetch.mockResolvedValue(mockResponse);
418
+ const result = await videoManager.getOverviewPerformance({
419
+ period_type: "Day",
420
+ end_date: "2026-05-20",
421
+ });
422
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/video/get_overview_performance", {
423
+ method: "GET",
424
+ auth: true,
425
+ params: {
426
+ period_type: "Day",
427
+ end_date: "2026-05-20",
428
+ },
429
+ });
430
+ expect(result.error).toBe("");
431
+ });
432
+ });
433
+ describe("getProductPerformanceList", () => {
434
+ it("should get product performance list successfully", async () => {
435
+ const mockResponse = {
436
+ request_id: "test-request-id",
437
+ error: "",
438
+ message: "",
439
+ response: {
440
+ list: [
441
+ {
442
+ itemId: 123456,
443
+ placedOrders: 10,
444
+ placedSales: 100,
445
+ },
446
+ {
447
+ itemId: 789012,
448
+ placedOrders: 8,
449
+ placedSales: 80,
450
+ },
451
+ ],
452
+ },
453
+ };
454
+ mockShopeeFetch.mockResolvedValue(mockResponse);
455
+ const result = await videoManager.getProductPerformanceList({
456
+ pageNo: 1,
457
+ pageSize: 10,
458
+ periodType: "Day",
459
+ endDate: "2026-05-20",
460
+ orderBy: "PlacedOrders",
461
+ sort: "desc",
462
+ });
463
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/video/get_prodcut_performance_list", {
464
+ method: "GET",
465
+ auth: true,
466
+ params: {
467
+ pageNo: 1,
468
+ pageSize: 10,
469
+ periodType: "Day",
470
+ endDate: "2026-05-20",
471
+ orderBy: "PlacedOrders",
472
+ sort: "desc",
473
+ },
474
+ });
475
+ expect(result.error).toBe("");
476
+ expect(result.response.list).toHaveLength(2);
477
+ });
478
+ it("should get product performance list using snake_case parameters successfully", async () => {
479
+ const mockResponse = {
480
+ request_id: "test-request-id",
481
+ error: "",
482
+ message: "",
483
+ response: {},
484
+ };
485
+ mockShopeeFetch.mockResolvedValue(mockResponse);
486
+ const result = await videoManager.getProductPerformanceList({
487
+ page_no: 1,
488
+ page_size: 10,
489
+ period_type: "Day",
490
+ end_date: "2026-05-20",
491
+ order_by: "PlacedOrders",
492
+ sort: "desc",
493
+ item_id: 123456,
494
+ item_name: "test product",
495
+ });
496
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/video/get_prodcut_performance_list", {
497
+ method: "GET",
498
+ auth: true,
499
+ params: {
500
+ page_no: 1,
501
+ page_size: 10,
502
+ period_type: "Day",
503
+ end_date: "2026-05-20",
504
+ order_by: "PlacedOrders",
505
+ sort: "desc",
506
+ item_id: 123456,
507
+ item_name: "test product",
508
+ },
509
+ });
510
+ expect(result.error).toBe("");
511
+ });
512
+ });
513
+ describe("getUserDemographics", () => {
514
+ it("should get user demographics successfully", async () => {
515
+ const mockResponse = {
516
+ request_id: "test-request-id",
517
+ error: "",
518
+ message: "",
519
+ response: {
520
+ age: {
521
+ "18-24": 30,
522
+ "25-34": 70,
523
+ },
524
+ gender: {
525
+ Male: 40,
526
+ Female: 60,
527
+ },
528
+ },
529
+ };
530
+ mockShopeeFetch.mockResolvedValue(mockResponse);
531
+ const result = await videoManager.getUserDemographics();
532
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/video/get_user_demographics", {
533
+ method: "GET",
534
+ auth: true,
535
+ params: {},
536
+ });
537
+ expect(result.error).toBe("");
538
+ expect(result.response.age).toBeDefined();
539
+ expect(result.response.gender).toBeDefined();
540
+ });
541
+ });
542
+ describe("getVideoDetail", () => {
543
+ it("should get video detail successfully", async () => {
544
+ const mockResponse = {
545
+ request_id: "test-request-id",
546
+ error: "",
547
+ message: "",
548
+ response: {
549
+ videoUploadId: "upload123",
550
+ postId: "post123",
551
+ caption: "Test video caption",
552
+ status: 200,
553
+ postTime: 1704070800,
554
+ },
555
+ };
556
+ mockShopeeFetch.mockResolvedValue(mockResponse);
557
+ const result = await videoManager.getVideoDetail({
558
+ videoUploadId: "upload123",
559
+ });
560
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/video/get_video_detail", {
561
+ method: "GET",
562
+ auth: true,
563
+ params: {
564
+ videoUploadId: "upload123",
565
+ },
566
+ });
567
+ expect(result.error).toBe("");
568
+ expect(result.response.videoUploadId).toBe("upload123");
569
+ expect(result.response.caption).toBe("Test video caption");
570
+ });
571
+ it("should get video detail using snake_case parameters successfully", async () => {
572
+ const mockResponse = {
573
+ request_id: "test-request-id",
574
+ error: "",
575
+ message: "",
576
+ response: {},
577
+ };
578
+ mockShopeeFetch.mockResolvedValue(mockResponse);
579
+ const result = await videoManager.getVideoDetail({
580
+ video_upload_id: "upload123",
581
+ post_id: "post123",
582
+ });
583
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/video/get_video_detail", {
584
+ method: "GET",
585
+ auth: true,
586
+ params: {
587
+ video_upload_id: "upload123",
588
+ post_id: "post123",
589
+ },
590
+ });
591
+ expect(result.error).toBe("");
592
+ });
593
+ });
594
+ describe("getVideoDetailAudienceDistribution", () => {
595
+ it("should get video detail audience distribution successfully", async () => {
596
+ const mockResponse = {
597
+ request_id: "test-request-id",
598
+ error: "",
599
+ message: "",
600
+ response: {
601
+ age: {
602
+ "18-24": 35.0,
603
+ "25-34": 50.0,
604
+ },
605
+ gender: {
606
+ male: 45.0,
607
+ female: 55.0,
608
+ },
609
+ },
610
+ };
611
+ mockShopeeFetch.mockResolvedValue(mockResponse);
612
+ const result = await videoManager.getVideoDetailAudienceDistribution({
613
+ postId: "post123",
614
+ });
615
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/video/get_video_detail_audience_distribution", {
616
+ method: "GET",
617
+ auth: true,
618
+ params: {
619
+ postId: "post123",
620
+ },
621
+ });
622
+ expect(result.error).toBe("");
623
+ expect(result.response.age).toBeDefined();
624
+ });
625
+ it("should get video detail audience distribution using snake_case parameters successfully", async () => {
626
+ const mockResponse = {
627
+ request_id: "test-request-id",
628
+ error: "",
629
+ message: "",
630
+ response: {},
631
+ };
632
+ mockShopeeFetch.mockResolvedValue(mockResponse);
633
+ const result = await videoManager.getVideoDetailAudienceDistribution({
634
+ post_id: "post123",
635
+ });
636
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/video/get_video_detail_audience_distribution", {
637
+ method: "GET",
638
+ auth: true,
639
+ params: {
640
+ post_id: "post123",
641
+ },
642
+ });
643
+ expect(result.error).toBe("");
644
+ });
645
+ });
646
+ describe("getVideoDetailMetricTrend", () => {
647
+ it("should get video detail metric trend successfully", async () => {
648
+ const mockResponse = {
649
+ request_id: "test-request-id",
650
+ error: "",
651
+ message: "",
652
+ response: {
653
+ metricTrend: {
654
+ "1704067200": 500,
655
+ "1704153600": 600,
656
+ },
657
+ },
658
+ };
659
+ mockShopeeFetch.mockResolvedValue(mockResponse);
660
+ const result = await videoManager.getVideoDetailMetricTrend({
661
+ postId: "post123",
662
+ metricName: "Views",
663
+ });
664
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/video/get_video_detail_metric_trend", {
665
+ method: "GET",
666
+ auth: true,
667
+ params: {
668
+ postId: "post123",
669
+ metricName: "Views",
670
+ },
671
+ });
672
+ expect(result.error).toBe("");
673
+ expect(result.response.metricTrend).toBeDefined();
674
+ });
675
+ it("should get video detail metric trend using snake_case parameters successfully", async () => {
676
+ const mockResponse = {
677
+ request_id: "test-request-id",
678
+ error: "",
679
+ message: "",
680
+ response: {},
681
+ };
682
+ mockShopeeFetch.mockResolvedValue(mockResponse);
683
+ const result = await videoManager.getVideoDetailMetricTrend({
684
+ post_id: "post123",
685
+ metric_name: "Views",
686
+ });
687
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/video/get_video_detail_metric_trend", {
688
+ method: "GET",
689
+ auth: true,
690
+ params: {
691
+ post_id: "post123",
692
+ metric_name: "Views",
693
+ },
694
+ });
695
+ expect(result.error).toBe("");
696
+ });
697
+ });
698
+ describe("getVideoDetailPerformance", () => {
699
+ it("should get video detail performance successfully", async () => {
700
+ const mockResponse = {
701
+ request_id: "test-request-id",
702
+ error: "",
703
+ message: "",
704
+ response: {
705
+ videoInfo: {
706
+ postId: "post123",
707
+ },
708
+ videoPerformance: {
709
+ views: 5000,
710
+ likes: 250,
711
+ shares: 50,
712
+ comments: 100,
713
+ },
714
+ },
715
+ };
716
+ mockShopeeFetch.mockResolvedValue(mockResponse);
717
+ const result = await videoManager.getVideoDetailPerformance({
718
+ postId: "post123",
719
+ });
720
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/video/get_video_detail_performance", {
721
+ method: "GET",
722
+ auth: true,
723
+ params: {
724
+ postId: "post123",
725
+ },
726
+ });
727
+ expect(result.error).toBe("");
728
+ expect(result.response.videoPerformance?.views).toBe(5000);
729
+ expect(result.response.videoPerformance?.likes).toBe(250);
730
+ });
731
+ it("should get video detail performance using snake_case parameters successfully", async () => {
732
+ const mockResponse = {
733
+ request_id: "test-request-id",
734
+ error: "",
735
+ message: "",
736
+ response: {},
737
+ };
738
+ mockShopeeFetch.mockResolvedValue(mockResponse);
739
+ const result = await videoManager.getVideoDetailPerformance({
740
+ post_id: "post123",
741
+ });
742
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/video/get_video_detail_performance", {
743
+ method: "GET",
744
+ auth: true,
745
+ params: {
746
+ post_id: "post123",
747
+ },
748
+ });
749
+ expect(result.error).toBe("");
750
+ });
751
+ });
752
+ describe("getVideoDetailProductPerformance", () => {
753
+ it("should get video detail product performance successfully", async () => {
754
+ const mockResponse = {
755
+ request_id: "test-request-id",
756
+ error: "",
757
+ message: "",
758
+ response: {
759
+ list: [
760
+ {
761
+ itemId: 123456,
762
+ placedOrders: 10,
763
+ placedSales: 100,
764
+ },
765
+ ],
766
+ },
767
+ };
768
+ mockShopeeFetch.mockResolvedValue(mockResponse);
769
+ const result = await videoManager.getVideoDetailProductPerformance({
770
+ postId: "post123",
771
+ pageNo: 1,
772
+ pageSize: 10,
773
+ });
774
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/video/get_video_detail_product_performance", {
775
+ method: "GET",
776
+ auth: true,
777
+ params: {
778
+ postId: "post123",
779
+ pageNo: 1,
780
+ pageSize: 10,
781
+ },
782
+ });
783
+ expect(result.error).toBe("");
784
+ expect(result.response.list).toHaveLength(1);
785
+ });
786
+ it("should get video detail product performance using snake_case parameters successfully", async () => {
787
+ const mockResponse = {
788
+ request_id: "test-request-id",
789
+ error: "",
790
+ message: "",
791
+ response: {},
792
+ };
793
+ mockShopeeFetch.mockResolvedValue(mockResponse);
794
+ const result = await videoManager.getVideoDetailProductPerformance({
795
+ post_id: "post123",
796
+ page_no: 1,
797
+ page_size: 10,
798
+ item_id: 123456,
799
+ item_name: "test product",
800
+ });
801
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/video/get_video_detail_product_performance", {
802
+ method: "GET",
803
+ auth: true,
804
+ params: {
805
+ post_id: "post123",
806
+ page_no: 1,
807
+ page_size: 10,
808
+ item_id: 123456,
809
+ item_name: "test product",
810
+ },
811
+ });
812
+ expect(result.error).toBe("");
813
+ });
814
+ });
815
+ describe("getVideoList", () => {
816
+ it("should get video list successfully", async () => {
817
+ const mockResponse = {
818
+ request_id: "test-request-id",
819
+ error: "",
820
+ message: "",
821
+ response: {
822
+ list: [
823
+ {
824
+ videoUploadId: "upload123",
825
+ caption: "First video",
826
+ status: 300,
827
+ updateTime: 1704067200,
828
+ },
829
+ {
830
+ videoUploadId: "upload456",
831
+ caption: "Second video",
832
+ status: 200,
833
+ updateTime: 1704070800,
834
+ },
835
+ ],
836
+ hasMore: false,
837
+ },
838
+ };
839
+ mockShopeeFetch.mockResolvedValue(mockResponse);
840
+ const result = await videoManager.getVideoList({
841
+ pageNo: 1,
842
+ pageSize: 10,
843
+ listType: 2,
844
+ });
845
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/video/get_video_list", {
846
+ method: "GET",
847
+ auth: true,
848
+ params: {
849
+ pageNo: 1,
850
+ pageSize: 10,
851
+ listType: 2,
852
+ },
853
+ });
854
+ expect(result.error).toBe("");
855
+ expect(result.response.list).toHaveLength(2);
856
+ expect(result.response.hasMore).toBe(false);
857
+ });
858
+ it("should get video list using snake_case parameters successfully", async () => {
859
+ const mockResponse = {
860
+ request_id: "test-request-id",
861
+ error: "",
862
+ message: "",
863
+ response: {
864
+ list: [],
865
+ hasMore: false,
866
+ },
867
+ };
868
+ mockShopeeFetch.mockResolvedValue(mockResponse);
869
+ const result = await videoManager.getVideoList({
870
+ page_no: 1,
871
+ page_size: 10,
872
+ list_type: 2,
873
+ });
874
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/video/get_video_list", {
875
+ method: "GET",
876
+ auth: true,
877
+ params: {
878
+ page_no: 1,
879
+ page_size: 10,
880
+ list_type: 2,
881
+ },
882
+ });
883
+ expect(result.error).toBe("");
884
+ });
885
+ });
886
+ describe("getVideoPerformanceList", () => {
887
+ it("should get video performance list successfully", async () => {
888
+ const mockResponse = {
889
+ request_id: "test-request-id",
890
+ error: "",
891
+ message: "",
892
+ response: {
893
+ list: [
894
+ {
895
+ postId: "post123",
896
+ views: 5000,
897
+ likes: 250,
898
+ shares: 50,
899
+ },
900
+ {
901
+ postId: "post456",
902
+ views: 3000,
903
+ likes: 150,
904
+ shares: 30,
905
+ },
906
+ ],
907
+ },
908
+ };
909
+ mockShopeeFetch.mockResolvedValue(mockResponse);
910
+ const result = await videoManager.getVideoPerformanceList({
911
+ pageNo: 1,
912
+ pageSize: 10,
913
+ periodType: "Day",
914
+ endDate: "2026-05-20",
915
+ orderBy: "Views",
916
+ sort: "desc",
917
+ });
918
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/video/get_video_performance_list", {
919
+ method: "GET",
920
+ auth: true,
921
+ params: {
922
+ pageNo: 1,
923
+ pageSize: 10,
924
+ periodType: "Day",
925
+ endDate: "2026-05-20",
926
+ orderBy: "Views",
927
+ sort: "desc",
928
+ },
929
+ });
930
+ expect(result.error).toBe("");
931
+ expect(result.response.list).toHaveLength(2);
932
+ });
933
+ it("should get video performance list using snake_case parameters successfully", async () => {
934
+ const mockResponse = {
935
+ request_id: "test-request-id",
936
+ error: "",
937
+ message: "",
938
+ response: {},
939
+ };
940
+ mockShopeeFetch.mockResolvedValue(mockResponse);
941
+ const result = await videoManager.getVideoPerformanceList({
942
+ page_no: 1,
943
+ page_size: 10,
944
+ period_type: "Day",
945
+ end_date: "2026-05-20",
946
+ order_by: "Views",
947
+ sort: "desc",
948
+ });
949
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/video/get_video_performance_list", {
950
+ method: "GET",
951
+ auth: true,
952
+ params: {
953
+ page_no: 1,
954
+ page_size: 10,
955
+ period_type: "Day",
956
+ end_date: "2026-05-20",
957
+ order_by: "Views",
958
+ sort: "desc",
959
+ },
960
+ });
961
+ expect(result.error).toBe("");
962
+ });
963
+ });
964
+ describe("postVideo", () => {
965
+ it("should post video successfully", async () => {
966
+ const mockResponse = {
967
+ request_id: "test-request-id",
968
+ error: "",
969
+ message: "",
970
+ response: {
971
+ successList: [
972
+ {
973
+ successVideoUploadId: "upload123",
974
+ postId: "post123",
975
+ },
976
+ ],
977
+ failureList: [],
978
+ },
979
+ };
980
+ mockShopeeFetch.mockResolvedValue(mockResponse);
981
+ const result = await videoManager.postVideo({
982
+ videoUploadIdList: ["upload123"],
983
+ });
984
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/video/post_video", {
985
+ method: "POST",
986
+ auth: true,
987
+ body: {
988
+ videoUploadIdList: ["upload123"],
989
+ },
990
+ });
991
+ expect(result.error).toBe("");
992
+ expect(result.response.successList).toHaveLength(1);
993
+ expect(result.response.successList[0].postId).toBe("post123");
994
+ });
995
+ it("should post video using snake_case parameters successfully", async () => {
996
+ const mockResponse = {
997
+ request_id: "test-request-id",
998
+ error: "",
999
+ message: "",
1000
+ response: {},
1001
+ };
1002
+ mockShopeeFetch.mockResolvedValue(mockResponse);
1003
+ const result = await videoManager.postVideo({
1004
+ video_upload_id_list: ["upload123"],
1005
+ });
1006
+ expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/video/post_video", {
1007
+ method: "POST",
1008
+ auth: true,
1009
+ body: {
1010
+ video_upload_id_list: ["upload123"],
1011
+ },
1012
+ });
1013
+ expect(result.error).toBe("");
1014
+ });
1015
+ it("should handle post video failure", async () => {
1016
+ const mockResponse = {
1017
+ request_id: "test-request-id",
1018
+ error: "",
1019
+ message: "",
1020
+ response: {
1021
+ successList: [],
1022
+ failureList: [
1023
+ {
1024
+ failVideoUploadId: "upload123",
1025
+ failedReason: "Video is still processing",
1026
+ },
1027
+ ],
1028
+ },
1029
+ };
1030
+ mockShopeeFetch.mockResolvedValue(mockResponse);
1031
+ const result = await videoManager.postVideo({
1032
+ videoUploadIdList: ["upload123"],
1033
+ });
1034
+ expect(result.response.failureList).toHaveLength(1);
1035
+ expect(result.response.failureList[0].failedReason).toBe("Video is still processing");
1036
+ });
1037
+ });
1038
+ });
1039
+ //# sourceMappingURL=video.manager.test.js.map