@congminh1254/shopee-sdk
Version:
Shopee SDK maintaining by community
975 lines • 38.5 kB
JavaScript
import { jest } from "@jest/globals";
import { OrderManager } from "../../managers/order.manager.js";
import { ShopeeRegion } from "../../schemas/region.js";
import { ShopeeFetch } from "../../fetch.js";
import { allOptionalFields, } from "../../schemas/order.js";
// Mock ShopeeFetch.fetch static method
const mockFetch = jest.fn();
ShopeeFetch.fetch = mockFetch;
describe("OrderManager", () => {
let orderManager;
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",
};
orderManager = new OrderManager(mockConfig);
});
describe("getOrderList", () => {
it("should get order list with required parameters", async () => {
const mockResponse = {
request_id: "test-request-id",
error: "",
message: "",
response: {
more: false,
next_cursor: "",
order_list: [
{
order_sn: "220101000000001",
order_status: "READY_TO_SHIP",
},
{
order_sn: "220101000000002",
order_status: "COMPLETED",
},
],
},
};
mockShopeeFetch.mockResolvedValue(mockResponse);
const result = await orderManager.getOrderList({
time_range_field: "create_time",
time_from: 1640908800,
time_to: 1640995200,
page_size: 20,
cursor: "",
});
expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/order/get_order_list", {
method: "GET",
auth: true,
params: {
time_range_field: "create_time",
time_from: 1640908800,
time_to: 1640995200,
page_size: 20,
cursor: "",
},
});
expect(result).toEqual(mockResponse);
});
it("should get order list with status filter", async () => {
const mockResponse = {
request_id: "test-request-id",
error: "",
message: "",
response: {
more: false,
next_cursor: "",
order_list: [
{
order_sn: "220101000000003",
order_status: "READY_TO_SHIP",
update_time: 1640995200,
},
],
},
};
mockShopeeFetch.mockResolvedValue(mockResponse);
const result = await orderManager.getOrderList({
time_range_field: "update_time",
time_from: 1640908800,
time_to: 1640995200,
page_size: 10,
cursor: "",
order_status: "READY_TO_SHIP",
});
expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/order/get_order_list", {
method: "GET",
auth: true,
params: {
time_range_field: "update_time",
time_from: 1640908800,
time_to: 1640995200,
page_size: 10,
cursor: "",
order_status: "READY_TO_SHIP",
},
});
expect(result).toEqual(mockResponse);
});
});
describe("getOrdersDetail", () => {
it("should get orders detail for multiple orders", async () => {
const mockResponse = {
request_id: "test-request-id",
error: "",
message: "",
response: {
order_list: [
{
order_sn: "220101000000001",
pending_terms: [],
message_to_seller: "",
pickup_done_time: 0,
order_status: "READY_TO_SHIP",
region: "SG",
currency: "SGD",
cod: false,
total_amount: 25.5,
create_time: 1640995200,
update_time: 1640995300,
days_to_ship: 3,
ship_by_date: 1641259200,
buyer_user_id: 123456,
buyer_username: "testbuyer",
estimated_shipping_fee: 2.5,
recipient_address: {
name: "John Doe",
phone: "+6512345678",
full_address: "123 Test Street, Singapore 123456",
district: "Central",
city: "Singapore",
state: "Singapore",
zipcode: "123456",
town: "Test Town",
region: "SG",
},
actual_shipping_fee: 2.5,
goods_to_declare: false,
note: "Test order",
note_update_time: 1640995250,
item_list: [
{
item_id: 111111,
item_name: "Test Product",
item_sku: "TEST-SKU-001",
model_id: 222222,
model_name: "Red-Large",
model_sku: "TEST-SKU-001-RED-L",
model_quantity_purchased: 1,
model_original_price: 25.0,
model_discounted_price: 23.0,
wholesale: false,
weight: 0.5,
add_on_deal: false,
main_item: false,
add_on_deal_id: 0,
promotion_type: "NORMAL",
promotion_id: 0,
order_item_id: 333333,
promotion_group_id: 0,
image_info: {
image_url: "https://example.com/image.jpg",
},
product_location_id: [],
is_prescription_item: false,
is_b2c_owned_item: false,
},
],
pay_time: 1640995250,
dropshipper: "",
dropshipper_phone: "",
split_up: false,
buyer_cancel_reason: "",
cancel_by: "",
cancel_reason: "",
actual_shipping_fee_confirmed: true,
buyer_cpf_id: "",
fulfillment_flag: "FULFILLED_BY_SHOPEE",
package_list: [],
shipping_carrier: "",
payment_method: "Credit Card",
invoice_data: {
number: "INV-001",
series_number: "2022",
access_key: "abc123",
issue_date: 1640995200,
total_value: 25.5,
products_total_value: 23.0,
tax_code: "TAX001",
},
checkout_shipping_carrier: "Standard",
reverse_shipping_fee: 0,
order_chargeable_weight_gram: 500,
edt_from: 1641340800,
edt_to: 1641340800,
},
],
},
};
mockShopeeFetch.mockResolvedValue(mockResponse);
const result = await orderManager.getOrdersDetail({
order_sn_list: ["220101000000001"],
response_optional_fields: [
"buyer_user_id",
"buyer_username",
"estimated_shipping_fee",
"recipient_address",
].join(","),
});
expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/order/get_order_detail", {
method: "GET",
auth: true,
params: {
order_sn_list: "220101000000001",
response_optional_fields: "buyer_user_id,buyer_username,estimated_shipping_fee,recipient_address",
},
});
expect(result).toEqual(mockResponse);
});
});
describe("getShipmentList", () => {
it("should get shipment list", async () => {
const mockResponse = {
request_id: "test-request-id",
error: "",
message: "",
response: {
more: false,
next_cursor: "",
order_list: [
{
order_sn: "220101000000001",
package_number: "PKG001",
},
],
},
};
mockShopeeFetch.mockResolvedValue(mockResponse);
const result = await orderManager.getShipmentList({
cursor: "",
page_size: 20,
});
expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/order/get_shipment_list", {
method: "GET",
auth: true,
params: {
cursor: "",
page_size: 20,
},
});
expect(result).toEqual(mockResponse);
});
});
describe("splitOrder", () => {
it("should split an order", async () => {
const mockResponse = {
request_id: "test-request-id",
error: "",
message: "",
response: {
order_sn: "220101000000001",
package_list: [
{
package_number: "PKG123456789",
item_list: [
{
item_id: 111111,
model_id: 222222,
order_item_id: 333333,
promotion_group_id: 0,
model_quantity: 1,
},
],
},
],
},
};
mockShopeeFetch.mockResolvedValue(mockResponse);
const result = await orderManager.splitOrder({
order_sn: "220101000000001",
package_list: [
{
item_list: [
{
item_id: 111111,
model_id: 222222,
order_item_id: 333333,
promotion_group_id: 0,
model_quantity: 1,
},
],
},
],
});
expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/order/split_order", {
method: "POST",
auth: true,
body: {
order_sn: "220101000000001",
package_list: [
{
item_list: [
{
item_id: 111111,
model_id: 222222,
order_item_id: 333333,
promotion_group_id: 0,
model_quantity: 1,
},
],
},
],
},
});
expect(result).toEqual(mockResponse);
});
});
describe("unsplitOrder", () => {
it("should unsplit an order", async () => {
const mockResponse = {
request_id: "test-request-id",
error: "",
message: "",
response: null,
};
mockShopeeFetch.mockResolvedValue(mockResponse);
const result = await orderManager.unsplitOrder({
order_sn: "220101000000001",
});
expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/order/unsplit_order", {
method: "POST",
auth: true,
body: {
order_sn: "220101000000001",
},
});
expect(result).toEqual(mockResponse);
});
});
describe("cancelOrder", () => {
it("should cancel an order", async () => {
const mockResponse = {
request_id: "test-request-id",
error: "",
message: "",
response: {
update_time: 1640995300,
},
};
mockShopeeFetch.mockResolvedValue(mockResponse);
const result = await orderManager.cancelOrder({
order_sn: "220101000000001",
cancel_reason: "OUT_OF_STOCK",
item_list: [
{
item_id: 111111,
model_id: 222222,
},
],
});
expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/order/cancel_order", {
method: "POST",
auth: true,
body: {
order_sn: "220101000000001",
cancel_reason: "OUT_OF_STOCK",
item_list: [
{
item_id: 111111,
model_id: 222222,
},
],
},
});
expect(result).toEqual(mockResponse);
});
});
describe("getEstimateCancelValue", () => {
it("should estimate cancel value", async () => {
const mockResponse = {
request_id: "test-request-id",
error: "",
message: "",
response: {
cancel_value: 10,
},
};
mockShopeeFetch.mockResolvedValue(mockResponse);
const result = await orderManager.getEstimateCancelValue({
order_sn: "220101000000001",
partial_cancel_item_list: [
{
item_id: 111111,
model_id: 222222,
model_quantity: 2,
},
],
});
expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/order/get_estimiate_cancel_value", {
method: "POST",
auth: true,
body: {
order_sn: "220101000000001",
partial_cancel_item_list: [
{
item_id: 111111,
model_id: 222222,
model_quantity: 2,
},
],
},
});
expect(result).toEqual(mockResponse);
});
});
describe("getBuyerInvoiceInfo", () => {
it("should get buyer invoice info", async () => {
const mockResponse = {
request_id: "test-request-id",
error: "",
message: "",
response: null,
invoice_info_list: [
{
order_sn: "220101000000001",
invoice_type: "personal",
invoice_detail: {
name: "John Doe",
email: "john@example.com",
tax_id: "TAX123",
},
error: "",
is_requested: true,
},
],
};
mockShopeeFetch.mockResolvedValue(mockResponse);
const result = await orderManager.getBuyerInvoiceInfo({
queries: [
{
order_sn: "220101000000001",
},
],
});
expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/order/get_buyer_invoice_info", {
method: "POST",
auth: true,
body: {
queries: [
{
order_sn: "220101000000001",
},
],
},
});
expect(result).toEqual(mockResponse);
});
it("should get buyer invoice info with household invoice type", async () => {
const mockResponse = {
request_id: "test-request-id",
error: "",
message: "",
response: null,
invoice_info_list: [
{
order_sn: "220101VN0000001",
invoice_type: "household",
invoice_detail: {
household_address_breakdown: {
household_region: "Southeast",
household_state: "Ho Chi Minh",
household_city: "District 1",
household_province: "Ho Chi Minh City",
household_district: "Ben Nghe",
household_town: "Ben Nghe Ward",
household_barangay: "",
household_postcode: "700000",
household_detailed_address: "123 Nguyen Hue",
household_additional_info: "",
household_full_address: "123 Nguyen Hue, Ben Nghe Ward, District 1, Ho Chi Minh City, 700000",
},
},
error: "",
is_requested: true,
},
],
};
mockShopeeFetch.mockResolvedValue(mockResponse);
const result = await orderManager.getBuyerInvoiceInfo({
queries: [{ order_sn: "220101VN0000001" }],
});
expect(result).toEqual(mockResponse);
expect(result.invoice_info_list[0].invoice_type).toBe("household");
expect(result.invoice_info_list[0].invoice_detail?.household_address_breakdown?.household_province).toBe("Ho Chi Minh City");
expect(result.invoice_info_list[0].invoice_detail?.household_address_breakdown
?.household_full_address).toBe("123 Nguyen Hue, Ben Nghe Ward, District 1, Ho Chi Minh City, 700000");
});
});
describe("setNote", () => {
it("should set note for an order", async () => {
const mockResponse = {
request_id: "test-request-id",
error: "",
message: "",
response: null,
};
mockShopeeFetch.mockResolvedValue(mockResponse);
const result = await orderManager.setNote({
order_sn: "220101000000001",
note: "Thank you for your order",
});
expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/order/set_note", {
method: "POST",
auth: true,
body: {
order_sn: "220101000000001",
note: "Thank you for your order",
},
});
expect(result).toEqual(mockResponse);
});
});
describe("getPackageDetail", () => {
it("should get package detail", async () => {
const mockResponse = {
request_id: "test-request-id",
error: "",
message: "",
response: {
package_list: [
{
order_sn: "220101000000001",
package_number: "PKG001",
fulfillment_status: "READY_TO_SHIP",
update_time: 1640995200,
logistics_channel_id: 80001,
shipping_carrier: "Standard Delivery",
allow_self_design_awb: true,
days_to_ship: 3,
ship_by_date: 1641254400,
is_split_up: false,
item_list: [
{
item_id: 111111,
model_id: 222222,
model_quantity: 1,
order_item_id: 333333,
product_location_id: "LOC001",
promotion_group_id: 0,
},
],
},
],
},
};
mockShopeeFetch.mockResolvedValue(mockResponse);
const result = await orderManager.getPackageDetail({
package_number_list: ["PKG001", "PKG002"],
});
expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/order/get_package_detail", {
method: "GET",
auth: true,
params: {
package_number_list: "PKG001,PKG002",
},
});
expect(result).toEqual(mockResponse);
});
});
describe("handleBuyerCancellation", () => {
it("should accept buyer cancellation", async () => {
const mockResponse = {
request_id: "test-request-id",
error: "",
message: "",
response: {
order_sn: "220101000000001",
},
};
mockShopeeFetch.mockResolvedValue(mockResponse);
const result = await orderManager.handleBuyerCancellation({
order_sn: "220101000000001",
operation: "ACCEPT",
});
expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/order/handle_buyer_cancellation", {
method: "POST",
auth: true,
body: {
order_sn: "220101000000001",
operation: "ACCEPT",
},
});
expect(result).toEqual(mockResponse);
});
});
describe("searchPackageList", () => {
it("should search package list with filters", async () => {
const mockResponse = {
request_id: "test-request-id",
error: "",
message: "",
response: {
more: false,
next_cursor: "",
package_list: [
{
order_sn: "220101000000001",
package_number: "PKG001",
fulfillment_status: "READY_TO_SHIP",
update_time: 1640995200,
logistics_channel_id: 80001,
days_to_ship: 3,
ship_by_date: 1641254400,
create_time: 1640908800,
},
],
},
};
mockShopeeFetch.mockResolvedValue(mockResponse);
const result = await orderManager.searchPackageList({
filter: {
package_status: 2,
},
pagination: {
page_size: 20,
cursor: "",
},
});
expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/order/search_package_list", {
method: "POST",
auth: true,
body: {
filter: {
package_status: 2,
},
pagination: {
page_size: 20,
cursor: "",
},
},
});
expect(result).toEqual(mockResponse);
});
});
describe("getPendingBuyerInvoiceOrderList", () => {
it("should get pending buyer invoice order list", async () => {
const mockResponse = {
request_id: "test-request-id",
error: "",
message: "",
response: {
more: false,
next_cursor: "",
order_sn_list: ["220101000000001", "220101000000002"],
},
};
mockShopeeFetch.mockResolvedValue(mockResponse);
const result = await orderManager.getPendingBuyerInvoiceOrderList({
page_size: 20,
cursor: "",
});
expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/order/get_pending_buyer_invoice_order_list", {
method: "GET",
auth: true,
params: {
page_size: 20,
cursor: "",
},
});
expect(result).toEqual(mockResponse);
});
});
describe("handlePrescriptionCheck", () => {
it("should approve prescription", async () => {
const mockResponse = {
request_id: "test-request-id",
error: "",
message: "",
response: {
package_number: "PKG001",
},
};
mockShopeeFetch.mockResolvedValue(mockResponse);
const result = await orderManager.handlePrescriptionCheck({
package_number: "PKG001",
operation: "APPROVE",
order_sn: "220101000000001",
is_approved: true,
reject_reason_code: 0,
items: [{ item_id: 111111, model_id: 222222, prescription_status: 1 }],
pharmacist_name: "John Doe",
free_text: "Checked",
});
expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/order/handle_prescription_check", {
method: "POST",
auth: true,
body: {
package_number: "PKG001",
operation: "APPROVE",
order_sn: "220101000000001",
is_approved: true,
reject_reason_code: 0,
items: [{ item_id: 111111, model_id: 222222, prescription_status: 1 }],
pharmacist_name: "John Doe",
free_text: "Checked",
},
});
expect(result).toEqual(mockResponse);
});
});
describe("downloadInvoiceDoc", () => {
it("should download invoice document", async () => {
const mockResponse = {
request_id: "test-request-id",
error: "",
message: "",
response: {
url: "https://example.com/invoice.pdf",
},
};
mockShopeeFetch.mockResolvedValue(mockResponse);
const result = await orderManager.downloadInvoiceDoc({
order_sn: "220101000000001",
});
expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/order/download_invoice_doc", {
method: "GET",
auth: true,
params: {
order_sn: "220101000000001",
},
});
expect(result).toEqual(mockResponse);
});
});
describe("uploadInvoiceDoc", () => {
it("should upload invoice document", async () => {
const mockResponse = {
request_id: "test-request-id",
error: "",
message: "",
response: null,
};
mockShopeeFetch.mockResolvedValue(mockResponse);
const result = await orderManager.uploadInvoiceDoc({
order_sn: "220101000000001",
invoice_file: "base64_encoded_file_content",
file_type: "pdf",
file: "invoice.pdf",
});
expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/order/upload_invoice_doc", {
method: "POST",
auth: true,
body: {
order_sn: "220101000000001",
invoice_file: "base64_encoded_file_content",
file_type: "pdf",
file: "invoice.pdf",
},
});
expect(result).toEqual(mockResponse);
});
});
describe("getBookingDetail", () => {
it("should get booking detail", async () => {
const mockResponse = {
request_id: "test-request-id",
error: "",
message: "",
response: {
booking_list: [
{
booking_sn: "BOOK001",
order_sn: "220101000000001",
booking_status: "READY_TO_SHIP",
create_time: 1640908800,
update_time: 1640995200,
logistics_channel_id: 80001,
package_list: ["PKG001", "PKG002"],
},
],
},
};
mockShopeeFetch.mockResolvedValue(mockResponse);
const result = await orderManager.getBookingDetail({
booking_sn_list: ["BOOK001"],
response_optional_fields: "booking_status",
});
expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/order/get_booking_detail", {
method: "GET",
auth: true,
params: {
booking_sn_list: "BOOK001",
response_optional_fields: "booking_status",
},
});
expect(result).toEqual(mockResponse);
});
});
describe("getBookingList", () => {
it("should get booking list", async () => {
const mockResponse = {
request_id: "test-request-id",
error: "",
message: "",
response: {
more: false,
next_cursor: "",
booking_list: [
{
booking_sn: "BOOK001",
booking_status: "READY_TO_SHIP",
update_time: 1640995200,
},
],
},
};
mockShopeeFetch.mockResolvedValue(mockResponse);
const result = await orderManager.getBookingList({
time_range_field: "create_time",
time_from: 1640908800,
time_to: 1640995200,
page_size: 20,
cursor: "",
});
expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/order/get_booking_list", {
method: "GET",
auth: true,
params: {
time_range_field: "create_time",
time_from: 1640908800,
time_to: 1640995200,
page_size: 20,
cursor: "",
},
});
expect(result).toEqual(mockResponse);
});
});
describe("getWarehouseFilterConfig", () => {
it("should get warehouse filter config", async () => {
const mockResponse = {
request_id: "test-request-id",
error: "",
message: "",
response: {
warehouse_list: [
{
product_location_id: "LOC001",
address_id: 12345,
},
],
},
};
mockShopeeFetch.mockResolvedValue(mockResponse);
const result = await orderManager.getWarehouseFilterConfig();
expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/order/get_warehouse_filter_config", {
method: "GET",
auth: true,
});
expect(result).toEqual(mockResponse);
});
});
describe("downloadFbsInvoices", () => {
it("should download FBS invoices", async () => {
const mockResponse = {
request_id: "test-request-id",
error: "",
message: "",
response: {
result_list: [
{
request_id: 123,
url: "https://example.com/invoice.pdf",
},
],
},
};
mockShopeeFetch.mockResolvedValue(mockResponse);
const result = await orderManager.downloadFbsInvoices({
request_id_list: {
request_id: [123, 456],
},
});
expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/order/download_fbs_invoices", {
method: "POST",
auth: true,
body: {
request_id_list: {
request_id: [123, 456],
},
},
});
expect(result).toEqual(mockResponse);
});
});
describe("generateFbsInvoices", () => {
it("should generate FBS invoices", async () => {
const mockResponse = {
request_id: "test-request-id",
error: "",
message: "",
response: {
request_id: 123,
},
};
mockShopeeFetch.mockResolvedValue(mockResponse);
const result = await orderManager.generateFbsInvoices({
batch_download: {
start: 20240101,
end: 20240131,
document_type: 1,
file_type: 3,
},
});
expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/order/generate_fbs_invoices", {
method: "POST",
auth: true,
body: {
batch_download: {
start: 20240101,
end: 20240131,
document_type: 1,
file_type: 3,
},
},
});
expect(result).toEqual(mockResponse);
});
});
describe("getFbsInvoicesResult", () => {
it("should get FBS invoices result", async () => {
const mockResponse = {
request_id: "test-request-id",
error: "",
message: "",
response: {
result_list: [
{
request_id: 123,
status: "READY",
},
],
},
};
mockShopeeFetch.mockResolvedValue(mockResponse);
const result = await orderManager.getFbsInvoicesResult({
request_id_list: {
request_id: [123],
},
});
expect(mockShopeeFetch).toHaveBeenCalledWith(mockConfig, "/order/get_fbs_invoices_result", {
method: "POST",
auth: true,
body: {
request_id_list: {
request_id: [123],
},
},
});
expect(result).toEqual(mockResponse);
});
});
describe("Schema Evaluation Check", () => {
it("should successfully reference all exported enums and constants", () => {
expect(allOptionalFields).toContain("recipient_address");
});
});
});
//# sourceMappingURL=order.manager.test.js.map