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 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