@congminh1254/shopee-sdk
Version:
Shopee SDK maintaining by community
877 lines • 33.8 kB
JavaScript
import { jest } from "@jest/globals";
import { LiveStreamManager } from "../../managers/livestream.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("LiveStreamManager", () => {
let liveStreamManager;
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",
};
liveStreamManager = new LiveStreamManager(mockConfig);
});
describe("createSession", () => {
it("should create a new livestream session", async () => {
const mockResponse = {
request_id: "test-request-id",
error: "",
message: "",
response: {
session_id: 6236215,
},
};
mockShopeeFetch.mockResolvedValue(mockResponse);
const result = await liveStreamManager.createSession({
title: "Test Livestream",
description: "This is a test livestream",
cover_image_url: "https://cf.shopee.sg/file/id-11134104-7r98o-m9pq7jw2cdhx5e",
is_test: true,
});
expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/livestream/create_session", {
method: "POST",
body: {
title: "Test Livestream",
description: "This is a test livestream",
cover_image_url: "https://cf.shopee.sg/file/id-11134104-7r98o-m9pq7jw2cdhx5e",
is_test: true,
},
});
expect(result).toEqual(mockResponse);
expect(result.response.session_id).toBe(6236215);
});
it("should create session without optional fields", async () => {
const mockResponse = {
request_id: "test-request-id",
error: "",
message: "",
response: {
session_id: 6236216,
},
};
mockShopeeFetch.mockResolvedValue(mockResponse);
const result = await liveStreamManager.createSession({
title: "Minimal Session",
cover_image_url: "https://cf.shopee.sg/file/test.jpg",
});
expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/livestream/create_session", {
method: "POST",
body: {
title: "Minimal Session",
cover_image_url: "https://cf.shopee.sg/file/test.jpg",
},
});
expect(result.response.session_id).toBe(6236216);
});
});
describe("startSession", () => {
it("should start a livestream session", async () => {
const mockResponse = {
request_id: "test-request-id",
error: "",
message: "",
response: {},
};
mockShopeeFetch.mockResolvedValue(mockResponse);
const result = await liveStreamManager.startSession({
session_id: 6236215,
domain_id: 1,
});
expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/livestream/start_session", {
method: "POST",
body: {
session_id: 6236215,
domain_id: 1,
},
});
expect(result).toEqual(mockResponse);
});
});
describe("endSession", () => {
it("should end a livestream session", async () => {
const mockResponse = {
request_id: "test-request-id",
error: "",
message: "",
response: {},
};
mockShopeeFetch.mockResolvedValue(mockResponse);
const result = await liveStreamManager.endSession({
session_id: 6236215,
});
expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/livestream/end_session", {
method: "POST",
body: {
session_id: 6236215,
},
});
expect(result).toEqual(mockResponse);
});
});
describe("updateSession", () => {
it("should update a livestream session", async () => {
const mockResponse = {
request_id: "test-request-id",
error: "",
message: "",
response: {},
};
mockShopeeFetch.mockResolvedValue(mockResponse);
const result = await liveStreamManager.updateSession({
session_id: 6236215,
title: "Updated Title",
description: "Updated description",
cover_image_url: "https://cf.shopee.sg/file/updated.jpg",
is_test: true,
});
expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/livestream/update_session", {
method: "POST",
body: {
session_id: 6236215,
title: "Updated Title",
description: "Updated description",
cover_image_url: "https://cf.shopee.sg/file/updated.jpg",
is_test: true,
},
});
expect(result).toEqual(mockResponse);
});
});
describe("getSessionDetail", () => {
it("should get session detail", async () => {
const mockResponse = {
request_id: "test-request-id",
error: "",
message: "",
response: {
session_id: 6236215,
title: "Test Livestream",
description: "Test description",
cover_image_url: "https://cf.shopee.sg/file/id-11134104-7r98o-m9y7ly25ngg927",
status: 1,
share_url: "https://live.test.shopee.co.id/share?session=6905656",
is_test: false,
create_time: 1747651742003,
update_time: 1747651742003,
start_time: 1747651742003,
end_time: 1747651742003,
stream_url_list: {
push_url: "rtmp://push-zl.lvb.test.shopee.co.id/live",
push_key: "id-test-1987885338002432-6905656?zlSecret=test",
play_url: "http://play-zl.livestream.test.shopee.co.id/live/test.flv",
domain_id: 57,
},
},
};
mockShopeeFetch.mockResolvedValue(mockResponse);
const result = await liveStreamManager.getSessionDetail({
session_id: 6236215,
});
expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/livestream/get_session_detail", {
method: "GET",
params: {
session_id: 6236215,
},
});
expect(result).toEqual(mockResponse);
expect(result.response.session_id).toBe(6236215);
expect(result.response.status).toBe(1);
});
});
describe("getSessionMetric", () => {
it("should get session metrics", async () => {
const mockResponse = {
request_id: "test-request-id",
error: "",
message: "",
response: {
gmv: 1000.5,
atc: 50,
ctr: 0.15,
co: 0.08,
orders: 25,
ccu: 150,
engage_ccu_1m: 120,
peak_ccu: 200,
likes: 500,
comments: 300,
shares: 50,
views: 1000,
avg_viewing_duration: 180,
},
};
mockShopeeFetch.mockResolvedValue(mockResponse);
const result = await liveStreamManager.getSessionMetric({
session_id: 6236215,
});
expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/livestream/get_session_metric", {
method: "GET",
params: {
session_id: 6236215,
},
});
expect(result).toEqual(mockResponse);
expect(result.response.gmv).toBe(1000.5);
expect(result.response.orders).toBe(25);
});
});
describe("getSessionItemMetric", () => {
it("should get session item metrics", async () => {
const mockResponse = {
request_id: "test-request-id",
error: "",
message: "",
response: {
more: false,
next_offset: 10,
list: [
{
item_id: 123456,
shop_id: 67890,
name: "Test Product",
clicks: 100,
orders: 10,
gmv: 500.0,
},
],
},
};
mockShopeeFetch.mockResolvedValue(mockResponse);
const result = await liveStreamManager.getSessionItemMetric({
session_id: 6236215,
offset: 0,
page_size: 10,
});
expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/livestream/get_session_item_metric", {
method: "GET",
params: {
session_id: 6236215,
offset: 0,
page_size: 10,
},
});
expect(result).toEqual(mockResponse);
expect(result.response.list).toHaveLength(1);
});
});
describe("addItemList", () => {
it("should add items to session", async () => {
const mockResponse = {
request_id: "test-request-id",
error: "",
message: "",
response: {},
};
mockShopeeFetch.mockResolvedValue(mockResponse);
const result = await liveStreamManager.addItemList({
session_id: 6236215,
item_list: [
{ item_id: 123, shop_id: 456 },
{ item_id: 789, shop_id: 456 },
],
});
expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/livestream/add_item_list", {
method: "POST",
body: {
session_id: 6236215,
item_list: [
{ item_id: 123, shop_id: 456 },
{ item_id: 789, shop_id: 456 },
],
},
});
expect(result).toEqual(mockResponse);
});
});
describe("updateItemList", () => {
it("should update item order in session", async () => {
const mockResponse = {
request_id: "test-request-id",
error: "",
message: "",
response: {},
};
mockShopeeFetch.mockResolvedValue(mockResponse);
const result = await liveStreamManager.updateItemList({
session_id: 6236215,
item_list: [
{ item_id: 123, shop_id: 456, item_no: 2 },
{ item_id: 789, shop_id: 456, item_no: 1 },
],
});
expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/livestream/update_item_list", {
method: "POST",
body: {
session_id: 6236215,
item_list: [
{ item_id: 123, shop_id: 456, item_no: 2 },
{ item_id: 789, shop_id: 456, item_no: 1 },
],
},
});
expect(result).toEqual(mockResponse);
});
});
describe("deleteItemList", () => {
it("should delete items from session", async () => {
const mockResponse = {
request_id: "test-request-id",
error: "",
message: "",
response: {},
};
mockShopeeFetch.mockResolvedValue(mockResponse);
const result = await liveStreamManager.deleteItemList({
session_id: 6236215,
item_list: [{ item_id: 123, shop_id: 456 }],
});
expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/livestream/delete_item_list", {
method: "POST",
body: {
session_id: 6236215,
item_list: [{ item_id: 123, shop_id: 456 }],
},
});
expect(result).toEqual(mockResponse);
});
});
describe("getItemList", () => {
it("should get item list from session", async () => {
const mockResponse = {
request_id: "test-request-id",
error: "",
message: "",
response: {
more: false,
next_offset: 10,
list: [
{
item_no: 1,
item_id: 123,
shop_id: 456,
name: "Test Product",
image_url: "https://cf.shopee.sg/file/test.jpg",
price_info: {
currency: "SGD",
current_price: 10.99,
original_price: 15.99,
},
affiliate_info: {
commission_rate: 0.1,
is_campaign: true,
campaign_mcn_name: "Test MCN",
campaign_start_time: 1735870969,
campaign_end_time: 1735870969,
},
},
],
},
};
mockShopeeFetch.mockResolvedValue(mockResponse);
const result = await liveStreamManager.getItemList({
session_id: 6236215,
offset: 0,
page_size: 10,
});
expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/livestream/get_item_list", {
method: "GET",
params: {
session_id: 6236215,
offset: 0,
page_size: 10,
},
});
expect(result).toEqual(mockResponse);
expect(result.response.list).toHaveLength(1);
});
});
describe("getItemCount", () => {
it("should get total item count", async () => {
const mockResponse = {
request_id: "test-request-id",
error: "",
message: "",
response: {
total_count: 25,
},
};
mockShopeeFetch.mockResolvedValue(mockResponse);
const result = await liveStreamManager.getItemCount({
session_id: 6236215,
});
expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/livestream/get_item_count", {
method: "GET",
params: {
session_id: 6236215,
},
});
expect(result).toEqual(mockResponse);
expect(result.response.total_count).toBe(25);
});
});
describe("getRecentItemList", () => {
it("should get recent item list", async () => {
const mockResponse = {
request_id: "test-request-id",
error: "",
message: "",
response: {
more: false,
next_offset: 10,
list: [
{
item_no: 1,
item_id: 123,
shop_id: 456,
name: "Recent Product",
image_url: "https://cf.shopee.sg/file/recent.jpg",
price_info: {
currency: "SGD",
current_price: 9.99,
original_price: 12.99,
},
affiliate_info: {
commission_rate: 0.05,
is_campaign: false,
campaign_mcn_name: "",
campaign_start_time: 0,
campaign_end_time: 0,
},
},
],
},
};
mockShopeeFetch.mockResolvedValue(mockResponse);
const result = await liveStreamManager.getRecentItemList({
session_id: 6236215,
offset: 0,
page_size: 10,
});
expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/livestream/get_recent_item_list", {
method: "GET",
params: {
session_id: 6236215,
offset: 0,
page_size: 10,
},
});
expect(result).toEqual(mockResponse);
});
});
describe("getLikeItemList", () => {
it("should get liked item list", async () => {
const mockResponse = {
request_id: "test-request-id",
error: "",
message: "",
response: {
more: false,
next_offset: 10,
list: [
{
item_no: 1,
item_id: 123,
shop_id: 456,
name: "Liked Product",
image_url: "https://cf.shopee.sg/file/liked.jpg",
price_info: {
currency: "SGD",
current_price: 19.99,
original_price: 29.99,
},
affiliate_info: {
commission_rate: 0.15,
is_campaign: true,
campaign_mcn_name: "Popular MCN",
campaign_start_time: 1735870969,
campaign_end_time: 1735970969,
},
},
],
},
};
mockShopeeFetch.mockResolvedValue(mockResponse);
const result = await liveStreamManager.getLikeItemList({
session_id: 6236215,
offset: 0,
page_size: 10,
keyword: "Summer",
});
expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/livestream/get_like_item_list", {
method: "GET",
params: {
session_id: 6236215,
offset: 0,
page_size: 10,
keyword: "Summer",
},
});
expect(result).toEqual(mockResponse);
});
});
describe("applyItemSet", () => {
it("should apply an item set to session", async () => {
const mockResponse = {
request_id: "test-request-id",
error: "",
message: "",
response: {},
};
mockShopeeFetch.mockResolvedValue(mockResponse);
const result = await liveStreamManager.applyItemSet({
session_id: 6236215,
item_set_id: 12345,
item_set_ids: [12345, 67890],
});
expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/livestream/apply_item_set", {
method: "POST",
body: {
session_id: 6236215,
item_set_id: 12345,
item_set_ids: [12345, 67890],
},
});
expect(result).toEqual(mockResponse);
});
});
describe("getItemSetList", () => {
it("should get item set list", async () => {
const mockResponse = {
request_id: "test-request-id",
error: "",
message: "",
response: {
more: false,
next_offset: 10,
list: [
{
item_set_id: 12345,
name: "Summer Collection",
item_count: 50,
},
{
item_set_id: 12346,
name: "Winter Sale",
item_count: 30,
},
],
},
};
mockShopeeFetch.mockResolvedValue(mockResponse);
const result = await liveStreamManager.getItemSetList({
offset: 0,
page_size: 10,
keyword: "Collection",
});
expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/livestream/get_item_set_list", {
method: "GET",
params: {
offset: 0,
page_size: 10,
keyword: "Collection",
},
});
expect(result).toEqual(mockResponse);
expect(result.response.list).toHaveLength(2);
});
});
describe("getItemSetItemList", () => {
it("should get items in an item set", async () => {
const mockResponse = {
request_id: "test-request-id",
error: "",
message: "",
response: {
more: false,
next_offset: 10,
list: [
{
item_no: 1,
item_id: 111,
shop_id: 456,
name: "Set Item 1",
image_url: "https://cf.shopee.sg/file/item1.jpg",
price_info: {
currency: "SGD",
current_price: 15.99,
original_price: 20.99,
},
affiliate_info: {
commission_rate: 0.1,
is_campaign: false,
campaign_mcn_name: "",
campaign_start_time: 0,
campaign_end_time: 0,
},
},
],
},
};
mockShopeeFetch.mockResolvedValue(mockResponse);
const result = await liveStreamManager.getItemSetItemList({
item_set_id: 12345,
offset: 0,
page_size: 10,
});
expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/livestream/get_item_set_item_list", {
method: "GET",
params: {
item_set_id: 12345,
offset: 0,
page_size: 10,
},
});
expect(result).toEqual(mockResponse);
});
});
describe("getShowItem", () => {
it("should get currently displayed item", async () => {
const mockResponse = {
request_id: "test-request-id",
error: "",
message: "",
response: {
item: {
item_id: 123,
shop_id: 456,
name: "Displayed Product",
image_url: "https://cf.shopee.sg/file/show.jpg",
price_info: {
currency: "SGD",
current_price: 25.99,
original_price: 35.99,
},
},
},
};
mockShopeeFetch.mockResolvedValue(mockResponse);
const result = await liveStreamManager.getShowItem({
session_id: 6236215,
});
expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/livestream/get_show_item", {
method: "GET",
params: {
session_id: 6236215,
},
});
expect(result).toEqual(mockResponse);
expect(result.response.item).not.toBeNull();
});
it("should handle no show item", async () => {
const mockResponse = {
request_id: "test-request-id",
error: "",
message: "",
response: {
item: null,
},
};
mockShopeeFetch.mockResolvedValue(mockResponse);
const result = await liveStreamManager.getShowItem({
session_id: 6236215,
});
expect(result.response.item).toBeNull();
});
});
describe("updateShowItem", () => {
it("should update the displayed item", async () => {
const mockResponse = {
request_id: "test-request-id",
error: "",
message: "",
response: {},
};
mockShopeeFetch.mockResolvedValue(mockResponse);
const result = await liveStreamManager.updateShowItem({
session_id: 6236215,
item_id: 123,
shop_id: 456,
});
expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/livestream/update_show_item", {
method: "POST",
body: {
session_id: 6236215,
item_id: 123,
shop_id: 456,
},
});
expect(result).toEqual(mockResponse);
});
});
describe("deleteShowItem", () => {
it("should remove the displayed item", async () => {
const mockResponse = {
request_id: "test-request-id",
error: "",
message: "",
response: {},
};
mockShopeeFetch.mockResolvedValue(mockResponse);
const result = await liveStreamManager.deleteShowItem({
session_id: 6236215,
});
expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/livestream/delete_show_item", {
method: "POST",
body: {
session_id: 6236215,
},
});
expect(result).toEqual(mockResponse);
});
});
describe("postComment", () => {
it("should post a comment to livestream", async () => {
const mockResponse = {
request_id: "test-request-id",
error: "",
message: "",
response: {},
};
mockShopeeFetch.mockResolvedValue(mockResponse);
const result = await liveStreamManager.postComment({
session_id: 6236215,
comment: "Great product!",
content: "Great product content!",
});
expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/livestream/post_comment", {
method: "POST",
body: {
session_id: 6236215,
comment: "Great product!",
content: "Great product content!",
},
});
expect(result).toEqual(mockResponse);
});
});
describe("getLatestCommentList", () => {
it("should get latest comments", async () => {
const mockResponse = {
request_id: "test-request-id",
error: "",
message: "",
response: {
more: false,
next_offset: 10,
list: [
{
comment_id: 1001,
user_id: 5001,
username: "user123",
comment: "Love this stream!",
comment_time: 1735870969,
},
{
comment_id: 1002,
user_id: 5002,
username: "user456",
comment: "When will you restock?",
comment_time: 1735871000,
},
],
},
};
mockShopeeFetch.mockResolvedValue(mockResponse);
const result = await liveStreamManager.getLatestCommentList({
session_id: 6236215,
offset: 0,
page_size: 10,
});
expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/livestream/get_latest_comment_list", {
method: "GET",
params: {
session_id: 6236215,
offset: 0,
page_size: 10,
},
});
expect(result).toEqual(mockResponse);
expect(result.response.list).toHaveLength(2);
});
});
describe("banUserComment", () => {
it("should ban a user from commenting", async () => {
const mockResponse = {
request_id: "test-request-id",
error: "",
message: "",
response: {},
};
mockShopeeFetch.mockResolvedValue(mockResponse);
const result = await liveStreamManager.banUserComment({
session_id: 6236215,
user_id: 5001,
ban_user_id: 5001,
});
expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/livestream/ban_user_comment", {
method: "POST",
body: {
session_id: 6236215,
user_id: 5001,
ban_user_id: 5001,
},
});
expect(result).toEqual(mockResponse);
});
});
describe("unbanUserComment", () => {
it("should unban a user from commenting", async () => {
const mockResponse = {
request_id: "test-request-id",
error: "",
message: "",
response: {},
};
mockShopeeFetch.mockResolvedValue(mockResponse);
const result = await liveStreamManager.unbanUserComment({
session_id: 6236215,
user_id: 5001,
unban_user_id: 5001,
});
expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/livestream/unban_user_comment", {
method: "POST",
body: {
session_id: 6236215,
user_id: 5001,
unban_user_id: 5001,
},
});
expect(result).toEqual(mockResponse);
});
});
describe("uploadImage", () => {
it("should upload an image", async () => {
const mockResponse = {
request_id: "test-request-id",
error: "",
message: "",
response: {
image_url: "https://cf.shopee.sg/file/id-11134104-7r98o-m9y7ly25ngg927",
},
};
mockShopeeFetch.mockResolvedValue(mockResponse);
const mockImage = Buffer.from("fake-image-data");
const result = await liveStreamManager.uploadImage({
image: mockImage,
});
expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/livestream/upload_image", {
method: "POST",
body: {
image: mockImage,
},
});
expect(result).toEqual(mockResponse);
expect(result.response.image_url).toBe("https://cf.shopee.sg/file/id-11134104-7r98o-m9y7ly25ngg927");
});
});
});
//# sourceMappingURL=livestream.manager.test.js.map