Index: third_party/google-endpoints/endpoints/test/discovery_generator_test.py |
diff --git a/third_party/google-endpoints/endpoints/test/discovery_generator_test.py b/third_party/google-endpoints/endpoints/test/discovery_generator_test.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..46238a0f20ab4fcd3f88317a9da3789d1622fd9d |
--- /dev/null |
+++ b/third_party/google-endpoints/endpoints/test/discovery_generator_test.py |
@@ -0,0 +1,219 @@ |
+# Copyright 2016 Google Inc. All Rights Reserved. |
+# |
+# Licensed under the Apache License, Version 2.0 (the "License"); |
+# you may not use this file except in compliance with the License. |
+# You may obtain a copy of the License at |
+# |
+# http://www.apache.org/licenses/LICENSE-2.0 |
+# |
+# Unless required by applicable law or agreed to in writing, software |
+# distributed under the License is distributed on an "AS IS" BASIS, |
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
+# See the License for the specific language governing permissions and |
+# limitations under the License. |
+ |
+"""Tests for endpoints.discovery_generator.""" |
+ |
+import json |
+import os |
+import unittest |
+ |
+import endpoints.api_config as api_config |
+ |
+from protorpc import message_types |
+from protorpc import messages |
+from protorpc import remote |
+ |
+import endpoints.resource_container as resource_container |
+import endpoints.discovery_generator as discovery_generator |
+import test_util |
+ |
+ |
+package = 'DiscoveryGeneratorTest' |
+ |
+ |
+class Nested(messages.Message): |
+ """Message class to be used in a message field.""" |
+ int_value = messages.IntegerField(1) |
+ string_value = messages.StringField(2) |
+ |
+ |
+class SimpleEnum(messages.Enum): |
+ """Simple enumeration type.""" |
+ VAL1 = 1 |
+ VAL2 = 2 |
+ |
+ |
+class AllFields(messages.Message): |
+ """Contains all field types.""" |
+ |
+ bool_value = messages.BooleanField(1, variant=messages.Variant.BOOL) |
+ bytes_value = messages.BytesField(2, variant=messages.Variant.BYTES) |
+ double_value = messages.FloatField(3, variant=messages.Variant.DOUBLE) |
+ enum_value = messages.EnumField(SimpleEnum, 4) |
+ float_value = messages.FloatField(5, variant=messages.Variant.FLOAT) |
+ int32_value = messages.IntegerField(6, variant=messages.Variant.INT32) |
+ int64_value = messages.IntegerField(7, variant=messages.Variant.INT64) |
+ string_value = messages.StringField(8, variant=messages.Variant.STRING) |
+ uint32_value = messages.IntegerField(9, variant=messages.Variant.UINT32) |
+ uint64_value = messages.IntegerField(10, variant=messages.Variant.UINT64) |
+ sint32_value = messages.IntegerField(11, variant=messages.Variant.SINT32) |
+ sint64_value = messages.IntegerField(12, variant=messages.Variant.SINT64) |
+ message_field_value = messages.MessageField(Nested, 13) |
+ datetime_value = message_types.DateTimeField(14) |
+ |
+ |
+# This is used test "all fields" as query parameters instead of the body |
+# in a request. |
+ALL_FIELDS_AS_PARAMETERS = resource_container.ResourceContainer( |
+ **{field.name: field for field in AllFields.all_fields()}) |
+ |
+ |
+class BaseDiscoveryGeneratorTest(unittest.TestCase): |
+ |
+ @classmethod |
+ def setUpClass(cls): |
+ cls.maxDiff = None |
+ |
+ def setUp(self): |
+ self.generator = discovery_generator.DiscoveryGenerator() |
+ |
+ def _def_path(self, path): |
+ return '#/definitions/' + path |
+ |
+ |
+class DiscoveryGeneratorTest(BaseDiscoveryGeneratorTest): |
+ |
+ def testAllFieldTypes(self): |
+ |
+ class PutRequest(messages.Message): |
+ """Message with just a body field.""" |
+ body = messages.MessageField(AllFields, 1) |
+ |
+ # pylint: disable=invalid-name |
+ class ItemsPutRequest(messages.Message): |
+ """Message with path params and a body field.""" |
+ body = messages.MessageField(AllFields, 1) |
+ entryId = messages.StringField(2, required=True) |
+ |
+ class ItemsPutRequestForContainer(messages.Message): |
+ """Message with path params and a body field.""" |
+ body = messages.MessageField(AllFields, 1) |
+ |
+ items_put_request_container = resource_container.ResourceContainer( |
+ ItemsPutRequestForContainer, |
+ entryId=messages.StringField(2, required=True)) |
+ |
+ # pylint: disable=invalid-name |
+ class EntryPublishRequest(messages.Message): |
+ """Message with two required params, one in path, one in body.""" |
+ title = messages.StringField(1, required=True) |
+ entryId = messages.StringField(2, required=True) |
+ |
+ class EntryPublishRequestForContainer(messages.Message): |
+ """Message with two required params, one in path, one in body.""" |
+ title = messages.StringField(1, required=True) |
+ |
+ entry_publish_request_container = resource_container.ResourceContainer( |
+ EntryPublishRequestForContainer, |
+ entryId=messages.StringField(2, required=True)) |
+ |
+ class BooleanMessageResponse(messages.Message): |
+ result = messages.BooleanField(1, required=True) |
+ |
+ @api_config.api(name='root', hostname='example.appspot.com', version='v1', |
+ description='This is an API') |
+ class MyService(remote.Service): |
+ """Describes MyService.""" |
+ |
+ @api_config.method(message_types.VoidMessage, BooleanMessageResponse, |
+ path ='toplevel:withcolon', http_method='GET', |
+ name='toplevelwithcolon') |
+ def toplevel(self, unused_request): |
+ return BooleanMessageResponse(result=True) |
+ |
+ @api_config.method(AllFields, message_types.VoidMessage, path='entries', |
+ http_method='GET', name='entries.get') |
+ def entries_get(self, unused_request): |
+ """All field types in the query parameters.""" |
+ return message_types.VoidMessage() |
+ |
+ @api_config.method(ALL_FIELDS_AS_PARAMETERS, message_types.VoidMessage, |
+ path='entries/container', http_method='GET', |
+ name='entries.getContainer') |
+ def entries_get_container(self, unused_request): |
+ """All field types in the query parameters.""" |
+ return message_types.VoidMessage() |
+ |
+ @api_config.method(PutRequest, BooleanMessageResponse, path='entries', |
+ name='entries.put') |
+ def entries_put(self, unused_request): |
+ """Request body is in the body field.""" |
+ return BooleanMessageResponse(result=True) |
+ |
+ @api_config.method(AllFields, message_types.VoidMessage, path='process', |
+ name='entries.process') |
+ def entries_process(self, unused_request): |
+ """Message is the request body.""" |
+ return message_types.VoidMessage() |
+ |
+ @api_config.method(message_types.VoidMessage, message_types.VoidMessage, |
+ name='entries.nested.collection.action', |
+ path='nested') |
+ def entries_nested_collection_action(self, unused_request): |
+ """A VoidMessage for a request body.""" |
+ return message_types.VoidMessage() |
+ |
+ @api_config.method(AllFields, AllFields, name='entries.roundtrip', |
+ path='roundtrip') |
+ def entries_roundtrip(self, unused_request): |
+ """All field types in the request and response.""" |
+ pass |
+ |
+ # Test a method with a required parameter in the request body. |
+ @api_config.method(EntryPublishRequest, message_types.VoidMessage, |
+ path='entries/{entryId}/publish', |
+ name='entries.publish') |
+ def entries_publish(self, unused_request): |
+ """Path has a parameter and request body has a required param.""" |
+ return message_types.VoidMessage() |
+ |
+ @api_config.method(entry_publish_request_container, |
+ message_types.VoidMessage, |
+ path='entries/container/{entryId}/publish', |
+ name='entries.publishContainer') |
+ def entries_publish_container(self, unused_request): |
+ """Path has a parameter and request body has a required param.""" |
+ return message_types.VoidMessage() |
+ |
+ # Test a method with a parameter in the path and a request body. |
+ @api_config.method(ItemsPutRequest, message_types.VoidMessage, |
+ path='entries/{entryId}/items', |
+ name='entries.items.put') |
+ def items_put(self, unused_request): |
+ """Path has a parameter and request body is in the body field.""" |
+ return message_types.VoidMessage() |
+ |
+ @api_config.method(items_put_request_container, message_types.VoidMessage, |
+ path='entries/container/{entryId}/items', |
+ name='entries.items.putContainer') |
+ def items_put_container(self, unused_request): |
+ """Path has a parameter and request body is in the body field.""" |
+ return message_types.VoidMessage() |
+ |
+ api = json.loads(self.generator.pretty_print_config_to_json(MyService)) |
+ |
+ try: |
+ pwd = os.path.dirname(os.path.realpath(__file__)) |
+ test_file = os.path.join(pwd, 'testdata', 'discovery', 'allfields.json') |
+ with open(test_file) as f: |
+ expected_discovery = json.loads(f.read()) |
+ except IOError as e: |
+ print 'Could not find expected output file ' + test_file |
+ raise e |
+ |
+ test_util.AssertDictEqual(expected_discovery, api, self) |
+ |
+ |
+if __name__ == '__main__': |
+ unittest.main() |