Files
Odoo14Kanjabung/test_frontend_shipping_rule_api.py

147 lines
4.7 KiB
Python

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Smoke test untuk endpoint frontend sales dengan auto shipping rule.
Contoh:
python test_frontend_shipping_rule_api.py ^
--base-url http://localhost:8070 ^
--db kanjabung_MRP ^
--login admin ^
--password admin ^
--endpoint /api/sales/draft-order/bon-kering ^
--partner-id 45 ^
--payment-term-id 4 ^
--team-id 3 ^
--business-category-id 2 ^
--product-id 1001
"""
import argparse
import json
import sys
import requests
def parse_args():
parser = argparse.ArgumentParser(description="Test frontend shipping rule sales API")
parser.add_argument("--base-url", default="http://localhost:8070")
parser.add_argument("--db", required=True)
parser.add_argument("--login", required=True)
parser.add_argument("--password", required=True)
parser.add_argument("--endpoint", default="/api/sales/draft-order/bon-kering")
parser.add_argument("--partner-id", type=int, required=True)
parser.add_argument("--customer-qr-ref")
parser.add_argument("--commitment-date", default="2026-04-04 10:00:00")
parser.add_argument("--payment-term-id", type=int, required=True)
parser.add_argument("--team-id", type=int, required=True)
parser.add_argument("--business-category-id", type=int, required=True)
parser.add_argument("--product-id", type=int, required=True)
parser.add_argument("--qty", type=float, default=1.0)
parser.add_argument("--price-unit", type=float)
parser.add_argument("--note", default="Uji auto ongkir frontend")
return parser.parse_args()
def pretty(data):
return json.dumps(data, indent=2, ensure_ascii=False)
def authenticate(session, base_url, db, login, password):
url = "%s/api/sales/authenticate" % base_url.rstrip("/")
payload = {
"params": {
"login": login,
"password": password,
"db": db,
}
}
response = session.post(url, json=payload, timeout=60)
response.raise_for_status()
data = response.json()
if data.get("status") != "success":
raise RuntimeError("Authentication failed: %s" % data.get("message"))
return data
def create_order(session, base_url, endpoint, args):
url = "%s%s" % (base_url.rstrip("/"), endpoint)
order_line = {
"product_id": args.product_id,
"product_uom_qty": args.qty,
}
if args.price_unit is not None:
order_line["price_unit"] = args.price_unit
params = {
"partner_id": args.partner_id,
"commitment_date": args.commitment_date,
"payment_term_id": args.payment_term_id,
"team_id": args.team_id,
"business_category_id": args.business_category_id,
"note": args.note,
"order_line": [order_line],
}
if args.customer_qr_ref:
params["customer_qr_ref"] = args.customer_qr_ref
payload = {"params": params}
response = session.post(url, json=payload, timeout=60)
response.raise_for_status()
return payload, response.json()
def main():
args = parse_args()
session = requests.Session()
session.headers.update({"Content-Type": "application/json"})
print("=" * 80)
print("FRONTEND SHIPPING RULE API TEST")
print("=" * 80)
print("Base URL :", args.base_url)
print("Database :", args.db)
print("Endpoint :", args.endpoint)
print()
try:
auth_data = authenticate(session, args.base_url, args.db, args.login, args.password)
print("Authentication OK")
print(pretty(auth_data))
print()
request_payload, order_data = create_order(session, args.base_url, args.endpoint, args)
print("Request Payload")
print(pretty(request_payload))
print()
print("Response")
print(pretty(order_data))
print()
if order_data.get("status") != "success":
print("Order creation failed")
sys.exit(1)
data = order_data.get("data", {})
print("Verification Summary")
print("sale_order_id :", data.get("sale_order_id"))
print("name :", data.get("name"))
print("state :", data.get("state"))
print("amount_total :", data.get("amount_total"))
print("line_count :", data.get("line_count"))
print("is_frontend_order :", data.get("is_frontend_order"))
print("wilayah_id :", data.get("wilayah_id"))
print("wilayah_name :", data.get("wilayah_name"))
print("shipping_product :", data.get("shipping_product_name"))
print("terms :", data.get("terms_and_conditions"))
except Exception as exc:
print("ERROR:", exc)
sys.exit(1)
if __name__ == "__main__":
main()