From 85e4be96d81f4d137f1b239cde6c938d585cac2b Mon Sep 17 00:00:00 2001 From: GrownNed <46023721+GrownNed@users.noreply.github.com> Date: Mon, 9 May 2022 19:29:42 +0300 Subject: [PATCH] fix Message.to_dict mutating the underlying Message (#378) * [fix] to_dict modifies the underlying message (#151) * add test for mapmessage * fix for to_dict * formatting * Apply suggestions from code review Co-authored-by: Arun Babu Neelicattu * change to_json to to_dict Co-authored-by: Arun Babu Neelicattu --- src/betterproto/__init__.py | 5 +++-- tests/test_mapmessage.py | 18 ++++++++++++++++++ 2 files changed, 21 insertions(+), 2 deletions(-) create mode 100644 tests/test_mapmessage.py diff --git a/src/betterproto/__init__.py b/src/betterproto/__init__.py index dab33f1..a69efad 100644 --- a/src/betterproto/__init__.py +++ b/src/betterproto/__init__.py @@ -1123,12 +1123,13 @@ class Message(ABC): ): output[cased_name] = value.to_dict(casing, include_default_values) elif meta.proto_type == TYPE_MAP: + output_map = {**value} for k in value: if hasattr(value[k], "to_dict"): - value[k] = value[k].to_dict(casing, include_default_values) + output_map[k] = value[k].to_dict(casing, include_default_values) if value or include_default_values: - output[cased_name] = value + output[cased_name] = output_map elif ( value != self._get_field_default(field_name) or include_default_values diff --git a/tests/test_mapmessage.py b/tests/test_mapmessage.py new file mode 100644 index 0000000..16bd6ce --- /dev/null +++ b/tests/test_mapmessage.py @@ -0,0 +1,18 @@ +from tests.output_betterproto.mapmessage import ( + Nested, + Test, +) + + +def test_mapmessage_to_dict_preserves_message(): + message = Test( + items={ + "test": Nested( + count=1, + ) + } + ) + + message.to_dict() + + assert isinstance(message.items["test"], Nested), "Wrong nested type after to_dict"