@@ -57,6 +57,32 @@ def test_method_signature():
5757 assert tuple (signature .fields .keys ()) == ('int_field' , 'float_field' )
5858
5959
60+ def test_method_signature_nested ():
61+ # Set up a meaningful input message.
62+ inner_msg = make_message (name = 'Inner' , fields = (
63+ make_field ('int_field' , type = 5 ),
64+ make_field ('bool_field' , type = 8 ),
65+ make_field ('float_field' , type = 2 ),
66+ ))
67+ outer_msg = make_message (name = 'Outer' , fields = (
68+ make_field ('inner' , type = 9 , message = inner_msg ),
69+ ))
70+
71+ # Create the method.
72+ method = make_method ('SendStuff' , input_message = outer_msg )
73+
74+ # Edit the underlying method pb2 post-hoc to add the appropriate annotation
75+ # (google.api.signature).
76+ method .options .Extensions [annotations_pb2 .method_signature ].MergeFrom (
77+ signature_pb2 .MethodSignature (fields = ['inner.int_field' ])
78+ )
79+
80+ # We should get back just those two fields as part of the signature.
81+ assert len (method .signatures ) == 1
82+ signature = method .signatures [0 ]
83+ assert tuple (signature .fields .keys ()) == ('int_field' ,)
84+
85+
6086def test_method_no_signature ():
6187 assert len (make_method ('Ping' ).signatures ) == 0
6288
@@ -149,13 +175,16 @@ def make_message(name: str, package: str = 'foo.bar.v1', module: str = 'baz',
149175
150176
151177def make_field (name : str , repeated : bool = False ,
152- meta : metadata .Metadata = None , ** kwargs ) -> wrappers .Method :
178+ meta : metadata .Metadata = None ,
179+ message : wrappers .MessageType = None ,
180+ ** kwargs ) -> wrappers .Method :
153181 field_pb = descriptor_pb2 .FieldDescriptorProto (
154182 name = name ,
155183 label = 3 if repeated else 1 ,
156184 ** kwargs
157185 )
158186 return wrappers .Field (
159187 field_pb = field_pb ,
188+ message = message ,
160189 meta = meta or metadata .Metadata (),
161190 )
0 commit comments