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"