260 lines
8.0 KiB
Python
260 lines
8.0 KiB
Python
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
from datetime import datetime, timedelta
|
|
|
|
from odoo import fields
|
|
from odoo.addons.base.tests.common import BaseCommon
|
|
|
|
ORDER_ID_MOCK = 123456789
|
|
|
|
# Mock data for buyer address
|
|
|
|
BUYER_ADDRESS_MOCK = {
|
|
'first_name': 'Gederic',
|
|
'last_name': 'Frilson',
|
|
'phone': '+1 234-567-8910',
|
|
'address1': '123 RainBowMan Street',
|
|
'address2': 'Apartment 4B',
|
|
'address3': '', # Used as state/region
|
|
'city': 'New Duck City',
|
|
'post_code': '12345',
|
|
'country': 'VN',
|
|
}
|
|
|
|
ORDER_ITEM_MOCK = {
|
|
"order_id": ORDER_ID_MOCK,
|
|
"name": "Test Product",
|
|
"item_price": "100.0",
|
|
"tax_amount": "0.0",
|
|
"status": "pending",
|
|
"paid_price": "80.0",
|
|
"sku": "TEST-SKU-001",
|
|
"sku_id": "10001",
|
|
"order_item_id": 90001,
|
|
"currency": "VND",
|
|
"buyer_id": 30001,
|
|
"shipping_provider_type": "standard",
|
|
"shipment_provider": "",
|
|
"updated_at": "2020-01-15 00:00:00 +0000",
|
|
"is_fbl": 0,
|
|
"package_id": "",
|
|
"tracking_code": "",
|
|
}
|
|
|
|
|
|
def build_order_mock(
|
|
order_id=ORDER_ID_MOCK, items=None, shipping_fee=10.0, currency="VND", **extra
|
|
):
|
|
"""Build a Lazada order-detail payload for tests.
|
|
|
|
Any keyword in ``extra`` overrides the default payload key of the same name,
|
|
or adds a new key if absent.
|
|
|
|
:param order_id: Lazada order identifier.
|
|
:param list items: List of dicts compatible with ORDER_ITEM_MOCK shape.
|
|
:param float shipping_fee: Shipping fee to embed in the payload.
|
|
:param str currency: Currency code used when building items if needed.
|
|
:return: An order-detail payload dict.
|
|
:rtype: dict
|
|
"""
|
|
if items is None:
|
|
items = [ORDER_ITEM_MOCK]
|
|
non_canceled_items = [i for i in items if i.get("status") != "canceled"]
|
|
total_paid = sum(float(item["paid_price"]) for item in non_canceled_items)
|
|
payload = {
|
|
"order_id": order_id,
|
|
"created_at": "2020-01-15 00:00:00 +0000",
|
|
"updated_at": "2020-01-15 00:00:00 +0000",
|
|
"address_billing": BUYER_ADDRESS_MOCK,
|
|
"address_shipping": BUYER_ADDRESS_MOCK,
|
|
"customer_last_name": "Frilson",
|
|
"customer_first_name": "Gederic",
|
|
"order_items": items,
|
|
"shipping_fee": str(shipping_fee),
|
|
"payment_method": "COD",
|
|
"statuses": ["pending"],
|
|
"price": str(total_paid),
|
|
"items_count": len(items),
|
|
"voucher": str(0.0),
|
|
"voucher_platform": str(0.0),
|
|
"voucher_seller": str(0.0),
|
|
"order_number": order_id,
|
|
}
|
|
payload.update(extra)
|
|
return payload
|
|
|
|
|
|
AUTH_RESPONSE_MOCK = {
|
|
'code': '0',
|
|
'request_id': '0001',
|
|
'access_token': 'ACCESS_TOKEN_123',
|
|
'refresh_token': 'REFRESH_TOKEN_123',
|
|
'expires_in': 14400, # 4 days
|
|
'refresh_expires_in': 30 * 24 * 3600, # 30 days
|
|
}
|
|
|
|
REFRESH_TOKEN_RESPONSE_MOCK = {**AUTH_RESPONSE_MOCK}
|
|
|
|
GET_SELLER_RESPONSE_MOCK = {
|
|
'code': '0',
|
|
'request_id': '0001',
|
|
'data': {'name': 'mock_lazada_shop', 'seller_id': 1, 'status': 'ACTIVE'},
|
|
}
|
|
|
|
GET_ORDERS_RESPONSE_MOCK = {
|
|
"code": "0",
|
|
"request_id": "0001",
|
|
"data": {"countTotal": 1, "count": 1, "orders": [build_order_mock()]},
|
|
}
|
|
|
|
GET_ORDER_ITEMS_RESPONSE_MOCK = {
|
|
'code': '0',
|
|
'request_id': '0001',
|
|
'data': [
|
|
{'order_id': ORDER_ID_MOCK, 'order_number': ORDER_ID_MOCK, 'order_items': [ORDER_ITEM_MOCK]}
|
|
],
|
|
}
|
|
|
|
GET_ORDER_RESPONSE_MOCK = {"code": "0", "request_id": "0001", "data": build_order_mock()}
|
|
|
|
GET_PRODUCTS_RESPONSE_MOCK = {
|
|
'code': '0',
|
|
'request_id': '0001',
|
|
'data': {
|
|
'total_products': 1,
|
|
'products': [
|
|
{
|
|
'item_id': 1111111111,
|
|
'status': 'Active',
|
|
'skus': [
|
|
{
|
|
'SellerSku': ORDER_ITEM_MOCK['sku'],
|
|
'Status': 'active',
|
|
'SkuId': int(ORDER_ITEM_MOCK['sku_id']),
|
|
'fblWarehouseInventories': [],
|
|
}
|
|
],
|
|
}
|
|
],
|
|
},
|
|
}
|
|
|
|
UPDATE_STOCK_RESPONSE_MOCK = {'code': '0', 'request_id': '0001'}
|
|
|
|
GET_SHIPMENT_PROVIDER_RESPONSE_MOCK = {
|
|
'code': '0',
|
|
'request_id': '0001',
|
|
'result': {
|
|
'success': True,
|
|
'data': {
|
|
'platform_default': 1,
|
|
'shipment_providers': [{'name': 'warehouse_name', 'provider_code': 'A'}],
|
|
'shipping_allocate_type': 'NTFS',
|
|
},
|
|
},
|
|
}
|
|
|
|
SET_RTS_RESPONSE_MOCK = {'code': '0', 'request_id': '0001', 'result': {'success': True}}
|
|
|
|
PRINT_AWB_RESPONSE_MOCK = {
|
|
'code': '0',
|
|
'request_id': '0001',
|
|
'result': {'success': True, 'data': {'pdf_url': 'https://lazada.com/lazada-label.pdf'}},
|
|
}
|
|
|
|
PACKAGE_PACK_RESPONSE_MOCK = {
|
|
'code': '0',
|
|
'request_id': '0001',
|
|
'result': {
|
|
'success': True,
|
|
'data': {
|
|
'pack_order_list': [
|
|
{
|
|
'order_item_list': [
|
|
{
|
|
'order_item_id': ORDER_ITEM_MOCK['order_item_id'],
|
|
'item_err_code': '0',
|
|
'package_id': 'PACK-001',
|
|
'tracking_number': 'TRACK-001',
|
|
}
|
|
]
|
|
}
|
|
]
|
|
},
|
|
},
|
|
}
|
|
|
|
# Map of API operations to their corresponding response data
|
|
OPERATIONS_RESPONSES_MAP = {
|
|
'RefreshAccessToken': REFRESH_TOKEN_RESPONSE_MOCK,
|
|
'GetSeller': GET_SELLER_RESPONSE_MOCK,
|
|
'GetOrders': GET_ORDERS_RESPONSE_MOCK,
|
|
'GetMultipleOrderItems': GET_ORDER_ITEMS_RESPONSE_MOCK,
|
|
'GetOrder': GET_ORDER_RESPONSE_MOCK,
|
|
'GetProducts': GET_PRODUCTS_RESPONSE_MOCK,
|
|
'UpdateSellableQuantity': UPDATE_STOCK_RESPONSE_MOCK,
|
|
'GetShipmentProvider': GET_SHIPMENT_PROVIDER_RESPONSE_MOCK,
|
|
'SetReadyToShip': SET_RTS_RESPONSE_MOCK,
|
|
'PrintAWB': PRINT_AWB_RESPONSE_MOCK,
|
|
'PackagePack': PACKAGE_PACK_RESPONSE_MOCK,
|
|
}
|
|
|
|
|
|
# Test class for common Lazada-related functionality
|
|
class TestLazadaCommon(BaseCommon):
|
|
def setUp(self):
|
|
super().setUp()
|
|
self.initial_sync_date = datetime(2020, 1, 1)
|
|
|
|
self.shop = self.env['lazada.shop'].create({
|
|
'name': "mock_lazada_shop",
|
|
'company_id': self.env.company.id,
|
|
'country_id': self.env.ref('base.vn').id,
|
|
'app_key': '1',
|
|
'app_secret': 'test_app_secret',
|
|
'shop_extern_id': '50001',
|
|
'access_token': 'test_access_token',
|
|
'access_token_expiration_date': fields.Datetime.now() + timedelta(hours=4),
|
|
'refresh_token': 'test_refresh_token',
|
|
'refresh_token_expiration_date': fields.Datetime.now() + timedelta(days=30),
|
|
'last_orders_sync_date': self.initial_sync_date,
|
|
'last_product_catalog_sync_date': self.initial_sync_date,
|
|
})
|
|
|
|
self.product = self.env['product.product'].create({
|
|
'name': "Test Product",
|
|
'type': 'consu',
|
|
'default_code': ORDER_ITEM_MOCK['sku'],
|
|
'list_price': 100.0,
|
|
'is_storable': True,
|
|
'tracking': 'none',
|
|
'taxes_id': [],
|
|
})
|
|
|
|
self.item = self.env['lazada.item'].create({
|
|
'product_id': self.product.id,
|
|
'shop_id': self.shop.id,
|
|
'lazada_item_extern_id': ORDER_ITEM_MOCK['sku_id'],
|
|
'lazada_sku': ORDER_ITEM_MOCK['sku'],
|
|
'sync_lazada_inventory': True,
|
|
})
|
|
|
|
self.partner = self.env['res.partner'].create({'name': "Test Partner"})
|
|
|
|
tax_group = self.env["account.tax.group"].create({
|
|
"name": "Lazada Test Tax Group",
|
|
})
|
|
|
|
self.tax_price_include_7 = self.env["account.tax"].create({
|
|
"name": "Lazada Test Tax 7% Included",
|
|
"amount": 7.0,
|
|
"price_include_override": "tax_included",
|
|
"tax_group_id": tax_group.id,
|
|
})
|
|
self.tax_price_exclude_7 = self.env["account.tax"].create({
|
|
"name": "Lazada Test Tax 7% Excluded",
|
|
"amount": 7.0,
|
|
"price_include_override": "tax_excluded",
|
|
"tax_group_id": tax_group.id,
|
|
})
|