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"