@congminh1254/shopee-sdk
Version:
Shopee SDK maintaining by community
681 lines • 28 kB
JavaScript
import { jest } from "@jest/globals";
import { MediaManager } from "../../managers/media.manager.js";
import { ShopeeRegion } from "../../schemas/region.js";
import { ShopeeFetch } from "../../fetch.js";
// Mock ShopeeFetch.fetch static method
const mockFetch = jest.fn();
ShopeeFetch.fetch = mockFetch;
describe("MediaManager", () => {
let mediaManager;
let mockConfig;
const mockShopeeFetch = mockFetch;
beforeEach(() => {
jest.clearAllMocks();
mockConfig = {
partner_id: 12345,
partner_key: "test_partner_key",
shop_id: 67890,
region: ShopeeRegion.GLOBAL,
base_url: "https://partner.test-stable.shopeemobile.com/api/v2",
};
mediaManager = new MediaManager(mockConfig);
});
describe("uploadMediaImage", () => {
it("should upload images for returns business scenario", async () => {
const mockResponse = {
request_id: "test-request-id",
error: "",
message: "",
response: {
image_list: [
{
image_id: "test_image_id_1",
image_url: "https://cf.shopee.sg/file/test_image_1",
},
{
image_id: "test_image_id_2",
image_url: "https://cf.shopee.sg/file/test_image_2",
},
],
},
};
mockShopeeFetch.mockResolvedValue(mockResponse);
const result = await mediaManager.uploadMediaImage({
business: 2,
scene: 1,
images: Buffer.from("image-bytes"),
});
expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/media/upload_image", {
method: "POST",
body: {
business: 2,
scene: 1,
images: Buffer.from("image-bytes"),
},
});
expect(result).toEqual(mockResponse);
expect(result.response.image_list).toHaveLength(2);
expect(result.response.image_list[0].image_id).toBe("test_image_id_1");
});
it("should upload multiple images for returns", async () => {
const mockResponse = {
request_id: "test-request-id",
error: "",
message: "",
response: {
image_list: [
{
image_id: "test_image_id_1",
image_url: "https://cf.shopee.sg/file/test_image_1",
},
{
image_id: "test_image_id_2",
image_url: "https://cf.shopee.sg/file/test_image_2",
},
{
image_id: "test_image_id_3",
image_url: "https://cf.shopee.sg/file/test_image_3",
},
],
},
};
mockShopeeFetch.mockResolvedValue(mockResponse);
const result = await mediaManager.uploadMediaImage({
business: 2,
scene: 1,
images: [Buffer.from("image1"), Buffer.from("image2"), Buffer.from("image3")],
});
expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/media/upload_image", {
method: "POST",
body: {
business: 2,
scene: 1,
images: [Buffer.from("image1"), Buffer.from("image2"), Buffer.from("image3")],
},
});
expect(result.response.image_list).toHaveLength(3);
});
});
describe("uploadImage", () => {
it("should upload a single image with default settings", async () => {
const mockResponse = {
request_id: "test-request-id",
error: "",
message: "",
response: {
image_info_list: [
{
id: 0,
error: "",
message: "",
image_info: {
image_id: "test_image_id",
image_url_list: [
{
image_url_region: "SG",
image_url: "https://cf.shopee.sg/file/test_image",
},
],
},
},
],
},
};
mockShopeeFetch.mockResolvedValue(mockResponse);
const result = await mediaManager.uploadImage({
image: Buffer.from("image-bytes"),
});
expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/media_space/upload_image", {
method: "POST",
auth: true,
body: {
image: Buffer.from("image-bytes"),
},
});
expect(result).toEqual(mockResponse);
expect(result.response.image_info_list).toHaveLength(1);
expect(result.response.image_info_list[0].image_info.image_id).toBe("test_image_id");
});
it("should upload multiple images with scene and ratio", async () => {
const mockResponse = {
request_id: "test-request-id",
error: "",
message: "",
response: {
image_info_list: [
{
id: 0,
error: "",
message: "",
image_info: {
image_id: "test_image_id_1",
image_url_list: [
{
image_url_region: "SG",
image_url: "https://cf.shopee.sg/file/test_image_1",
},
],
},
},
{
id: 1,
error: "",
message: "",
image_info: {
image_id: "test_image_id_2",
image_url_list: [
{
image_url_region: "SG",
image_url: "https://cf.shopee.sg/file/test_image_2",
},
],
},
},
],
},
};
mockShopeeFetch.mockResolvedValue(mockResponse);
const result = await mediaManager.uploadImage({
image: [Buffer.from("image1"), Buffer.from("image2")],
scene: "normal",
ratio: "1:1",
});
expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/media_space/upload_image", {
method: "POST",
auth: true,
body: {
image: [Buffer.from("image1"), Buffer.from("image2")],
scene: "normal",
ratio: "1:1",
},
});
expect(result.response.image_info_list).toHaveLength(2);
});
it("should upload description image without processing", async () => {
const mockResponse = {
request_id: "test-request-id",
error: "",
message: "",
response: {
image_info_list: [
{
id: 0,
error: "",
message: "",
image_info: {
image_id: "desc_image_id",
image_url_list: [
{
image_url_region: "SG",
image_url: "https://cf.shopee.sg/file/desc_image",
},
],
},
},
],
},
};
mockShopeeFetch.mockResolvedValue(mockResponse);
const result = await mediaManager.uploadImage({
image: Buffer.from("desc-image-bytes"),
scene: "desc",
});
expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/media_space/upload_image", {
method: "POST",
auth: true,
body: {
image: Buffer.from("desc-image-bytes"),
scene: "desc",
},
});
expect(result.response.image_info_list[0].image_info.image_id).toBe("desc_image_id");
});
});
describe("initVideoUpload", () => {
it("should initiate video upload session", async () => {
const mockResponse = {
request_id: "test-request-id",
error: "",
message: "",
response: {
video_upload_id: "sg_90ce045e-fd92-4f0b-97a4-eda40546cd9f_000000",
},
};
mockShopeeFetch.mockResolvedValue(mockResponse);
const result = await mediaManager.initVideoUpload({
file_md5: "2abf0b6e5ff90ff24437a0808f171a93",
file_size: 1261876,
});
expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/media_space/init_video_upload", {
method: "POST",
auth: true,
body: {
file_md5: "2abf0b6e5ff90ff24437a0808f171a93",
file_size: 1261876,
},
});
expect(result).toEqual(mockResponse);
expect(result.response.video_upload_id).toBe("sg_90ce045e-fd92-4f0b-97a4-eda40546cd9f_000000");
});
it("should handle video upload initialization with max file size", async () => {
const mockResponse = {
request_id: "test-request-id",
error: "",
message: "",
response: {
video_upload_id: "sg_test_video_id",
},
};
mockShopeeFetch.mockResolvedValue(mockResponse);
const result = await mediaManager.initVideoUpload({
file_md5: "abcdef1234567890",
file_size: 30 * 1024 * 1024, // 30MB
});
expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/media_space/init_video_upload", {
method: "POST",
auth: true,
body: {
file_md5: "abcdef1234567890",
file_size: 30 * 1024 * 1024,
},
});
expect(result.response.video_upload_id).toBe("sg_test_video_id");
});
});
describe("uploadVideoPart", () => {
it("should upload a video part", async () => {
const mockResponse = {
request_id: "test-request-id",
error: "",
message: "",
};
mockShopeeFetch.mockResolvedValue(mockResponse);
const result = await mediaManager.uploadVideoPart({
video_upload_id: "sg_90ce045e-fd92-4f0b-97a4-eda40546cd9f_000000",
part_seq: 0,
content_md5: "3bb08579fffbfc13ed9d23cda8bbb46d",
part_content: Buffer.from("part0"),
});
expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/media_space/upload_video_part", {
method: "POST",
body: {
video_upload_id: "sg_90ce045e-fd92-4f0b-97a4-eda40546cd9f_000000",
part_seq: 0,
content_md5: "3bb08579fffbfc13ed9d23cda8bbb46d",
part_content: Buffer.from("part0"),
},
});
expect(result).toEqual(mockResponse);
});
it("should upload multiple video parts sequentially", async () => {
const mockResponse = {
request_id: "test-request-id",
error: "",
message: "",
};
mockShopeeFetch.mockResolvedValue(mockResponse);
const videoUploadId = "sg_test_upload_id";
// Upload part 0
await mediaManager.uploadVideoPart({
video_upload_id: videoUploadId,
part_seq: 0,
content_md5: "md5_part_0",
part_content: Buffer.from("part0"),
});
// Upload part 1
await mediaManager.uploadVideoPart({
video_upload_id: videoUploadId,
part_seq: 1,
content_md5: "md5_part_1",
part_content: Buffer.from("part1"),
});
expect(mockShopeeFetch).toHaveBeenCalledTimes(2);
expect(mockShopeeFetch).toHaveBeenNthCalledWith(1, mockConfig, "/media_space/upload_video_part", {
method: "POST",
body: {
video_upload_id: videoUploadId,
part_seq: 0,
content_md5: "md5_part_0",
part_content: Buffer.from("part0"),
},
});
expect(mockShopeeFetch).toHaveBeenNthCalledWith(2, mockConfig, "/media_space/upload_video_part", {
method: "POST",
body: {
video_upload_id: videoUploadId,
part_seq: 1,
content_md5: "md5_part_1",
part_content: Buffer.from("part1"),
},
});
});
});
describe("completeVideoUpload", () => {
it("should complete video upload", async () => {
const mockResponse = {
request_id: "test-request-id",
error: "",
message: "",
};
mockShopeeFetch.mockResolvedValue(mockResponse);
const result = await mediaManager.completeVideoUpload({
video_upload_id: "sg_90ce045e-fd92-4f0b-97a4-eda40546cd9f_000000",
part_seq_list: [0, 1, 2, 3],
report_data: {
upload_cost: 11832,
},
});
expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/media_space/complete_video_upload", {
method: "POST",
body: {
video_upload_id: "sg_90ce045e-fd92-4f0b-97a4-eda40546cd9f_000000",
part_seq_list: [0, 1, 2, 3],
report_data: {
upload_cost: 11832,
},
},
});
expect(result).toEqual(mockResponse);
});
it("should complete video upload with single part", async () => {
const mockResponse = {
request_id: "test-request-id",
error: "",
message: "",
};
mockShopeeFetch.mockResolvedValue(mockResponse);
const result = await mediaManager.completeVideoUpload({
video_upload_id: "sg_small_video_id",
part_seq_list: [0],
report_data: {
upload_cost: 2500,
},
});
expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/media_space/complete_video_upload", {
method: "POST",
body: {
video_upload_id: "sg_small_video_id",
part_seq_list: [0],
report_data: {
upload_cost: 2500,
},
},
});
expect(result).toEqual(mockResponse);
});
});
describe("getVideoUploadResult", () => {
it("should get video upload result with SUCCEEDED status", async () => {
const mockResponse = {
request_id: "test-request-id",
error: "",
message: "",
response: {
status: "SUCCEEDED",
message: "success",
video_info: {
video_url_list: [
{
video_url_region: "SG",
video_url: "https://cvf.shopee.sg/file/ddb50833eee1c9fda5c522a2e6fc0ea6",
},
{
video_url_region: "VN",
video_url: "https://cvf.shopee.vn/file/ddb50833eee1c9fda5c522a2e6fc0ea6",
},
],
thumbnail_url_list: [
{
image_url_region: "SG",
image_url: "https://cf.shopee.sg/file/75eba55932c987851abc39895047dd54",
},
{
image_url_region: "VN",
image_url: "https://cf.shopee.vn/file/75eba55932c987851abc39895047dd54",
},
],
duration: 15,
},
},
};
mockShopeeFetch.mockResolvedValue(mockResponse);
const result = await mediaManager.getVideoUploadResult({
video_upload_id: "sg_90ce045e-fd92-4f0b-97a4-eda40546cd9f_000000",
});
expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/media_space/get_video_upload_result", {
method: "GET",
auth: true,
params: {
video_upload_id: "sg_90ce045e-fd92-4f0b-97a4-eda40546cd9f_000000",
},
});
expect(result).toEqual(mockResponse);
expect(result.response.status).toBe("SUCCEEDED");
expect(result.response.video_info).toBeDefined();
expect(result.response.video_info?.duration).toBe(15);
expect(result.response.video_info?.video_url_list).toHaveLength(2);
});
it("should get video upload result with TRANSCODING status", async () => {
const mockResponse = {
request_id: "test-request-id",
error: "",
message: "",
response: {
status: "TRANSCODING",
},
};
mockShopeeFetch.mockResolvedValue(mockResponse);
const result = await mediaManager.getVideoUploadResult({
video_upload_id: "sg_transcoding_video_id",
});
expect(result.response.status).toBe("TRANSCODING");
expect(result.response.video_info).toBeUndefined();
});
it("should get video upload result with FAILED status", async () => {
const mockResponse = {
request_id: "test-request-id",
error: "",
message: "",
response: {
status: "FAILED",
message: "Video is too short",
},
};
mockShopeeFetch.mockResolvedValue(mockResponse);
const result = await mediaManager.getVideoUploadResult({
video_upload_id: "sg_failed_video_id",
});
expect(result.response.status).toBe("FAILED");
expect(result.response.message).toBe("Video is too short");
expect(result.response.video_info).toBeUndefined();
});
it("should get video upload result with INITIATED status", async () => {
const mockResponse = {
request_id: "test-request-id",
error: "",
message: "",
response: {
status: "INITIATED",
},
};
mockShopeeFetch.mockResolvedValue(mockResponse);
const result = await mediaManager.getVideoUploadResult({
video_upload_id: "sg_initiated_video_id",
});
expect(result.response.status).toBe("INITIATED");
});
});
describe("cancelVideoUpload", () => {
it("should cancel video upload session", async () => {
const mockResponse = {
request_id: "test-request-id",
error: "",
message: "",
};
mockShopeeFetch.mockResolvedValue(mockResponse);
const result = await mediaManager.cancelVideoUpload({
video_upload_id: "sg_90ce045e-fd92-4f0b-97a4-eda40546cd9f_000000",
});
expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/media_space/cancel_video_upload", {
method: "POST",
auth: true,
body: {
video_upload_id: "sg_90ce045e-fd92-4f0b-97a4-eda40546cd9f_000000",
},
});
expect(result).toEqual(mockResponse);
});
it("should cancel video upload during upload", async () => {
const mockResponse = {
request_id: "test-request-id",
error: "",
message: "",
};
mockShopeeFetch.mockResolvedValue(mockResponse);
const result = await mediaManager.cancelVideoUpload({
video_upload_id: "sg_cancel_during_upload_id",
});
expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/media_space/cancel_video_upload", {
method: "POST",
auth: true,
body: {
video_upload_id: "sg_cancel_during_upload_id",
},
});
expect(result).toEqual(mockResponse);
});
});
describe("initMediaVideoUpload", () => {
it("should initiate media video upload session", async () => {
const mockResponse = {
request_id: "test-request-id",
error: "",
message: "",
response: {
video_upload_id: "sg_media_video_123",
part_size: 4194304,
},
};
mockShopeeFetch.mockResolvedValue(mockResponse);
const result = await mediaManager.initMediaVideoUpload({
business: 3,
scene: 1,
file_name: "test.mp4",
file_size: 10485760,
duration: 30,
});
expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/media/init_video_upload", {
method: "POST",
auth: true,
body: {
business: 3,
scene: 1,
file_name: "test.mp4",
file_size: 10485760,
duration: 30,
},
});
expect(result).toEqual(mockResponse);
});
});
describe("uploadMediaVideoPart", () => {
it("should upload a media video part", async () => {
const mockResponse = {
request_id: "test-request-id",
error: "",
message: "",
};
mockShopeeFetch.mockResolvedValue(mockResponse);
const result = await mediaManager.uploadMediaVideoPart({
video_upload_id: "sg_media_video_123",
part_seq: 0,
part_content: "base64-data",
part_md5: "md5checksum",
});
expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/media/upload_video_part", {
method: "POST",
body: {
video_upload_id: "sg_media_video_123",
part_seq: 0,
part_content: "base64-data",
part_md5: "md5checksum",
},
});
expect(result).toEqual(mockResponse);
});
});
describe("completeMediaVideoUpload", () => {
it("should complete media video upload session", async () => {
const mockResponse = {
request_id: "test-request-id",
error: "",
message: "",
};
mockShopeeFetch.mockResolvedValue(mockResponse);
const result = await mediaManager.completeMediaVideoUpload({
video_upload_id: "sg_media_video_123",
});
expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/media/complete_video_upload", {
method: "POST",
body: {
video_upload_id: "sg_media_video_123",
},
});
expect(result).toEqual(mockResponse);
});
});
describe("getMediaVideoUploadResult", () => {
it("should retrieve media video upload result", async () => {
const mockResponse = {
request_id: "test-request-id",
error: "",
message: "",
response: {
status: "SUCCEEDED",
video_info: {
video_url: "https://shopee.com/video.mp4",
video_thumbnail_url: "https://shopee.com/thumb.jpg",
thumbnail_width: 720,
thumbnail_height: 1280,
duration: 30,
resolution: "720x1280",
},
},
};
mockShopeeFetch.mockResolvedValue(mockResponse);
const result = await mediaManager.getMediaVideoUploadResult({
video_upload_id: "sg_media_video_123",
});
expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/media/get_video_upload_result", {
method: "GET",
auth: true,
params: {
video_upload_id: "sg_media_video_123",
},
});
expect(result).toEqual(mockResponse);
});
});
describe("cancelMediaVideoUpload", () => {
it("should cancel media video upload session", async () => {
const mockResponse = {
request_id: "test-request-id",
error: "",
message: "",
};
mockShopeeFetch.mockResolvedValue(mockResponse);
const result = await mediaManager.cancelMediaVideoUpload({
video_upload_id: "sg_media_video_123",
});
expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/media/cancel_video_upload", {
method: "POST",
auth: true,
body: {
video_upload_id: "sg_media_video_123",
},
});
expect(result).toEqual(mockResponse);
});
});
});
//# sourceMappingURL=media.manager.test.js.map