From fcbd8a37597df2afc6013de0b083edbc07562619 Mon Sep 17 00:00:00 2001 From: Nick DeRobertis Date: Sun, 28 May 2023 12:47:52 -0400 Subject: [PATCH] Fix pydict serialization for optional fields (#495) --- src/betterproto/__init__.py | 3 +++ tests/test_features.py | 26 ++++++++++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/src/betterproto/__init__.py b/src/betterproto/__init__.py index 82a5b14..40be27f 100644 --- a/src/betterproto/__init__.py +++ b/src/betterproto/__init__.py @@ -1373,6 +1373,9 @@ class Message(ABC): value = [i.to_pydict(casing, include_default_values) for i in value] if value or include_default_values: output[cased_name] = value + elif value is None: + if include_default_values: + output[cased_name] = None elif ( value._serialized_on_wire or include_default_values diff --git a/tests/test_features.py b/tests/test_features.py index 2deef2b..940cd51 100644 --- a/tests/test_features.py +++ b/tests/test_features.py @@ -265,6 +265,32 @@ def test_optional_flag(): assert Request().parse(b"\n\x00").flag is False +def test_optional_datetime_to_dict(): + @dataclass + class Request(betterproto.Message): + date: Optional[datetime] = betterproto.message_field(1, optional=True) + + # Check dict serialization + assert Request().to_dict() == {} + assert Request().to_dict(include_default_values=True) == {"date": None} + assert Request(date=datetime(2020, 1, 1)).to_dict() == { + "date": "2020-01-01T00:00:00Z" + } + assert Request(date=datetime(2020, 1, 1)).to_dict(include_default_values=True) == { + "date": "2020-01-01T00:00:00Z" + } + + # Check pydict serialization + assert Request().to_pydict() == {} + assert Request().to_pydict(include_default_values=True) == {"date": None} + assert Request(date=datetime(2020, 1, 1)).to_pydict() == { + "date": datetime(2020, 1, 1) + } + assert Request(date=datetime(2020, 1, 1)).to_pydict( + include_default_values=True + ) == {"date": datetime(2020, 1, 1)} + + def test_to_json_default_values(): @dataclass class TestMessage(betterproto.Message):