From c50d9e2fdcb6c7aa3592c40fc9971ce08a67dc6a Mon Sep 17 00:00:00 2001 From: boukeversteegh Date: Sun, 24 May 2020 14:48:39 +0200 Subject: [PATCH] Add test for generating embedded wellknown types in outputs. --- .../googletypes_response.proto | 2 +- .../googletypes_response_embedded.proto | 24 ++++++++++++ .../test_googletypes_response_embedded.py | 39 +++++++++++++++++++ betterproto/tests/mocks.py | 4 +- betterproto/tests/test_inputs.py | 6 ++- 5 files changed, 71 insertions(+), 4 deletions(-) create mode 100644 betterproto/tests/inputs/googletypes_response_embedded/googletypes_response_embedded.proto create mode 100644 betterproto/tests/inputs/googletypes_response_embedded/test_googletypes_response_embedded.py diff --git a/betterproto/tests/inputs/googletypes_response/googletypes_response.proto b/betterproto/tests/inputs/googletypes_response/googletypes_response.proto index ee8dbbd..9b0be5c 100644 --- a/betterproto/tests/inputs/googletypes_response/googletypes_response.proto +++ b/betterproto/tests/inputs/googletypes_response/googletypes_response.proto @@ -2,7 +2,7 @@ syntax = "proto3"; import "google/protobuf/wrappers.proto"; -// Tests that wrapped return values can be used +// Tests that wrapped values can be used directly as return values service Test { rpc GetDouble (Input) returns (google.protobuf.DoubleValue); diff --git a/betterproto/tests/inputs/googletypes_response_embedded/googletypes_response_embedded.proto b/betterproto/tests/inputs/googletypes_response_embedded/googletypes_response_embedded.proto new file mode 100644 index 0000000..89ae4cc --- /dev/null +++ b/betterproto/tests/inputs/googletypes_response_embedded/googletypes_response_embedded.proto @@ -0,0 +1,24 @@ +syntax = "proto3"; + +import "google/protobuf/wrappers.proto"; + +// Tests that wrapped values are supported as part of output message +service Test { + rpc getOutput (Input) returns (Output); +} + +message Input { + +} + +message Output { + google.protobuf.DoubleValue double_value = 1; + google.protobuf.FloatValue float_value = 2; + google.protobuf.Int64Value int64_value = 3; + google.protobuf.UInt64Value uint64_value = 4; + google.protobuf.Int32Value int32_value = 5; + google.protobuf.UInt32Value uint32_value = 6; + google.protobuf.BoolValue bool_value = 7; + google.protobuf.StringValue string_value = 8; + google.protobuf.BytesValue bytes_value = 9; +} diff --git a/betterproto/tests/inputs/googletypes_response_embedded/test_googletypes_response_embedded.py b/betterproto/tests/inputs/googletypes_response_embedded/test_googletypes_response_embedded.py new file mode 100644 index 0000000..00b980a --- /dev/null +++ b/betterproto/tests/inputs/googletypes_response_embedded/test_googletypes_response_embedded.py @@ -0,0 +1,39 @@ +import pytest + +from betterproto.tests.mocks import MockChannel +from betterproto.tests.output_betterproto.googletypes_response_embedded.googletypes_response_embedded import ( + Output, + TestStub, +) + + +@pytest.mark.asyncio +async def test_service_passes_through_unwrapped_values_embedded_in_response(): + """ + We do not not need to implement value unwrapping for embedded well-known types, + as this is already handled by grpclib. This test merely shows that this is the case. + """ + output = Output( + double_value=10.0, + float_value=12.0, + int64_value=-13, + uint64_value=14, + int32_value=-15, + uint32_value=16, + bool_value=True, + string_value="string", + bytes_value=bytes(0xFF)[0:4], + ) + + service = TestStub(MockChannel(responses=[output])) + response = await service.get_output() + + assert response.double_value == 10.0 + assert response.float_value == 12.0 + assert response.int64_value == -13 + assert response.uint64_value == 14 + assert response.int32_value == -15 + assert response.uint32_value == 16 + assert response.bool_value + assert response.string_value == "string" + assert response.bytes_value == bytes(0xFF)[0:4] diff --git a/betterproto/tests/mocks.py b/betterproto/tests/mocks.py index 287a58f..326b892 100644 --- a/betterproto/tests/mocks.py +++ b/betterproto/tests/mocks.py @@ -27,7 +27,7 @@ class MockStream: self.responses = responses async def recv_message(self): - return next(self.responses) + return self.responses.pop(0) async def send_message(self, *args, **kwargs): pass @@ -36,4 +36,4 @@ class MockStream: return True async def __aenter__(self): - return True + return self diff --git a/betterproto/tests/test_inputs.py b/betterproto/tests/test_inputs.py index c8fb7d3..b1041e5 100644 --- a/betterproto/tests/test_inputs.py +++ b/betterproto/tests/test_inputs.py @@ -15,7 +15,11 @@ from google.protobuf.descriptor_pool import DescriptorPool from google.protobuf.json_format import Parse -excluded_test_cases = {"googletypes_response", "service"} +excluded_test_cases = { + "googletypes_response", + "googletypes_response_embedded", + "service", +} test_case_names = {*get_directories(inputs_path)} - excluded_test_cases plugin_output_package = "betterproto.tests.output_betterproto"