147 lines
4.7 KiB
Python
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()
|