diff --git a/src/neris_api_client/client.py b/src/neris_api_client/client.py index 0c4b63d..814db66 100644 --- a/src/neris_api_client/client.py +++ b/src/neris_api_client/client.py @@ -182,6 +182,8 @@ def _call( data = model.model_validate_json(data).model_dump(mode="json", by_alias=True) if isinstance(data, dict): data = model.model_validate(data).model_dump(mode="json", by_alias=True) + elif isinstance(data, str): + data = json.loads(data) res = getattr(self._session, method)( f"{self.config.base_url}{path}", json=data, params=params diff --git a/tests/test_payload_serialization.py b/tests/test_payload_serialization.py new file mode 100644 index 0000000..acbeaf6 --- /dev/null +++ b/tests/test_payload_serialization.py @@ -0,0 +1,40 @@ +from datetime import datetime +from types import SimpleNamespace +import unittest + +from neris_api_client.client import _NerisApiClient + + +class Response: + def raise_for_status(self): + pass + + def json(self): + return {} + + +class Session: + def __init__(self): + self.headers = {} + self.kwargs = None + + def post(self, *args, **kwargs): + self.kwargs = kwargs + return Response() + + +class PayloadSerializationTests(unittest.TestCase): + def test_json_string_payload_is_sent_as_a_json_object_without_validation(self): + client = object.__new__(_NerisApiClient) + client.config = SimpleNamespace(base_url="https://api.example.test", debug=False, validate=False) + client.tokens = SimpleNamespace(access_token="token", expires_at=datetime.max) + client._session = Session() + client._update_auth = lambda: None + + client._call("post", "/entity", data='{"name": "Example Fire Department"}') + + self.assertEqual(client._session.kwargs["json"], {"name": "Example Fire Department"}) + + +if __name__ == "__main__": + unittest.main()