diff --git a/tests/test_api_client/test_serializer.py b/tests/test_api_client/test_serializer.py index b190bf15..a8bd549c 100644 --- a/tests/test_api_client/test_serializer.py +++ b/tests/test_api_client/test_serializer.py @@ -3,6 +3,7 @@ from datetime import date, datetime, timedelta from decimal import Decimal from unittest import mock +from uuid import UUID import pytest from dateutil import tz @@ -389,3 +390,14 @@ def test_serialize_enum_model(value, expected): # then correct enum value expected assert isinstance(result, str) assert result == expected + + +# serialize UUID tests (regression for #161) +def test_serialize_uuid(): + # given a UUID value (e.g. an invoice id returned by the Xero API) + value = UUID("12345678-1234-5678-1234-567812345678") + # when serializing it + result = serialize(value) + # then it becomes the canonical hyphenated string, not a ValueError + assert isinstance(result, str) + assert result == "12345678-1234-5678-1234-567812345678" diff --git a/xero_python/api_client/serializer.py b/xero_python/api_client/serializer.py index cf508da9..f2cc2b3f 100644 --- a/xero_python/api_client/serializer.py +++ b/xero_python/api_client/serializer.py @@ -3,6 +3,7 @@ from datetime import datetime, time, date from enum import Enum from functools import singledispatch +from uuid import UUID from dateutil import tz @@ -221,3 +222,15 @@ def serialize_enum_model(model): :return: serialized object """ return model.value + + +@serialize_model.register(UUID) +def serialize_uuid_model(model): + """Serializes a UUID into a json serializable string. + + Uses the canonical 8-4-4-4-12 hyphenated form expected by the Xero API. + + :param model: UUID instance to serialize + :return: serialized object + """ + return str(model)