112 lines
3.2 KiB
Python
112 lines
3.2 KiB
Python
from __future__ import annotations
|
|
|
|
import json
|
|
|
|
import pytest
|
|
from fastapi import HTTPException
|
|
|
|
from shunyunbaoerp import api
|
|
|
|
from test_normalizer import raw_result
|
|
|
|
|
|
VALID_KEY = "k" * 32
|
|
|
|
|
|
class FakeClient:
|
|
is_logged_in = True
|
|
token_expires_at = None
|
|
|
|
def get_freight_details(self, order_number: str) -> dict:
|
|
assert order_number == "SOURCE-12"
|
|
return raw_result()
|
|
|
|
def get_freight_details_by_created_range(
|
|
self,
|
|
created_from: str,
|
|
created_to: str,
|
|
) -> dict:
|
|
assert (created_from, created_to) == ("2026-07-22", "2026-07-28")
|
|
result = raw_result()
|
|
result["query"] = {
|
|
"mode": "CREATED_RANGE",
|
|
"createdFrom": created_from,
|
|
"createdTo": created_to,
|
|
}
|
|
return result
|
|
|
|
|
|
def test_query_requires_configured_service_key(monkeypatch) -> None:
|
|
monkeypatch.delenv("SHUNYUNBAO_SERVICE_API_KEY", raising=False)
|
|
|
|
with pytest.raises(HTTPException) as raised:
|
|
api.require_api_key(VALID_KEY)
|
|
|
|
assert raised.value.status_code == 503
|
|
assert raised.value.detail == "CONNECTOR_API_KEY_NOT_CONFIGURED"
|
|
|
|
|
|
def test_query_rejects_wrong_service_key(monkeypatch) -> None:
|
|
monkeypatch.setenv("SHUNYUNBAO_SERVICE_API_KEY", VALID_KEY)
|
|
|
|
with pytest.raises(HTTPException) as raised:
|
|
api.require_api_key("x" * 32)
|
|
|
|
assert raised.value.status_code == 401
|
|
assert raised.value.detail == "CONNECTOR_API_KEY_INVALID"
|
|
|
|
|
|
def test_query_returns_only_normalized_fields(monkeypatch) -> None:
|
|
monkeypatch.setenv("SHUNYUNBAO_SERVICE_API_KEY", VALID_KEY)
|
|
monkeypatch.setattr(api, "get_client", lambda: FakeClient())
|
|
api.require_api_key(VALID_KEY)
|
|
response = api.query_freight(
|
|
api.FreightQueryRequest(order_number="SOURCE-12"),
|
|
None,
|
|
)
|
|
|
|
assert len(response["orders"][0]["items"]) == 2
|
|
encoded = json.dumps(response, ensure_ascii=False)
|
|
assert "receiverTel" not in encoded
|
|
assert "receiverAddr" not in encoded
|
|
assert "PRIVATE-QUERY" not in encoded
|
|
|
|
|
|
def test_created_range_query_returns_allowlisted_range(monkeypatch) -> None:
|
|
monkeypatch.setenv("SHUNYUNBAO_SERVICE_API_KEY", VALID_KEY)
|
|
monkeypatch.setattr(api, "get_client", lambda: FakeClient())
|
|
|
|
response = api.query_freight(
|
|
api.FreightQueryRequest(
|
|
mode="CREATED_RANGE",
|
|
created_from="2026-07-22",
|
|
created_to="2026-07-28",
|
|
),
|
|
None,
|
|
)
|
|
|
|
assert response["query"] == {
|
|
"mode": "CREATED_RANGE",
|
|
"created_from": "2026-07-22",
|
|
"created_to": "2026-07-28",
|
|
}
|
|
|
|
|
|
def test_created_range_rejects_mixed_mode_parameters(monkeypatch) -> None:
|
|
monkeypatch.setenv("SHUNYUNBAO_SERVICE_API_KEY", VALID_KEY)
|
|
monkeypatch.setattr(api, "get_client", lambda: FakeClient())
|
|
|
|
with pytest.raises(HTTPException) as raised:
|
|
api.query_freight(
|
|
api.FreightQueryRequest(
|
|
mode="CREATED_RANGE",
|
|
order_number="SOURCE-12",
|
|
created_from="2026-07-22",
|
|
created_to="2026-07-28",
|
|
),
|
|
None,
|
|
)
|
|
|
|
assert raised.value.status_code == 422
|
|
assert raised.value.detail == "ERP_QUERY_INVALID"
|