Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(183)

Side by Side Diff: third_party/google-endpoints/endpoints/test/discovery_generator_test.py

Issue 2666783008: Add google-endpoints to third_party/. (Closed)
Patch Set: Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 # Copyright 2016 Google Inc. All Rights Reserved.
2 #
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at
6 #
7 # http://www.apache.org/licenses/LICENSE-2.0
8 #
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 # See the License for the specific language governing permissions and
13 # limitations under the License.
14
15 """Tests for endpoints.discovery_generator."""
16
17 import json
18 import os
19 import unittest
20
21 import endpoints.api_config as api_config
22
23 from protorpc import message_types
24 from protorpc import messages
25 from protorpc import remote
26
27 import endpoints.resource_container as resource_container
28 import endpoints.discovery_generator as discovery_generator
29 import test_util
30
31
32 package = 'DiscoveryGeneratorTest'
33
34
35 class Nested(messages.Message):
36 """Message class to be used in a message field."""
37 int_value = messages.IntegerField(1)
38 string_value = messages.StringField(2)
39
40
41 class SimpleEnum(messages.Enum):
42 """Simple enumeration type."""
43 VAL1 = 1
44 VAL2 = 2
45
46
47 class AllFields(messages.Message):
48 """Contains all field types."""
49
50 bool_value = messages.BooleanField(1, variant=messages.Variant.BOOL)
51 bytes_value = messages.BytesField(2, variant=messages.Variant.BYTES)
52 double_value = messages.FloatField(3, variant=messages.Variant.DOUBLE)
53 enum_value = messages.EnumField(SimpleEnum, 4)
54 float_value = messages.FloatField(5, variant=messages.Variant.FLOAT)
55 int32_value = messages.IntegerField(6, variant=messages.Variant.INT32)
56 int64_value = messages.IntegerField(7, variant=messages.Variant.INT64)
57 string_value = messages.StringField(8, variant=messages.Variant.STRING)
58 uint32_value = messages.IntegerField(9, variant=messages.Variant.UINT32)
59 uint64_value = messages.IntegerField(10, variant=messages.Variant.UINT64)
60 sint32_value = messages.IntegerField(11, variant=messages.Variant.SINT32)
61 sint64_value = messages.IntegerField(12, variant=messages.Variant.SINT64)
62 message_field_value = messages.MessageField(Nested, 13)
63 datetime_value = message_types.DateTimeField(14)
64
65
66 # This is used test "all fields" as query parameters instead of the body
67 # in a request.
68 ALL_FIELDS_AS_PARAMETERS = resource_container.ResourceContainer(
69 **{field.name: field for field in AllFields.all_fields()})
70
71
72 class BaseDiscoveryGeneratorTest(unittest.TestCase):
73
74 @classmethod
75 def setUpClass(cls):
76 cls.maxDiff = None
77
78 def setUp(self):
79 self.generator = discovery_generator.DiscoveryGenerator()
80
81 def _def_path(self, path):
82 return '#/definitions/' + path
83
84
85 class DiscoveryGeneratorTest(BaseDiscoveryGeneratorTest):
86
87 def testAllFieldTypes(self):
88
89 class PutRequest(messages.Message):
90 """Message with just a body field."""
91 body = messages.MessageField(AllFields, 1)
92
93 # pylint: disable=invalid-name
94 class ItemsPutRequest(messages.Message):
95 """Message with path params and a body field."""
96 body = messages.MessageField(AllFields, 1)
97 entryId = messages.StringField(2, required=True)
98
99 class ItemsPutRequestForContainer(messages.Message):
100 """Message with path params and a body field."""
101 body = messages.MessageField(AllFields, 1)
102
103 items_put_request_container = resource_container.ResourceContainer(
104 ItemsPutRequestForContainer,
105 entryId=messages.StringField(2, required=True))
106
107 # pylint: disable=invalid-name
108 class EntryPublishRequest(messages.Message):
109 """Message with two required params, one in path, one in body."""
110 title = messages.StringField(1, required=True)
111 entryId = messages.StringField(2, required=True)
112
113 class EntryPublishRequestForContainer(messages.Message):
114 """Message with two required params, one in path, one in body."""
115 title = messages.StringField(1, required=True)
116
117 entry_publish_request_container = resource_container.ResourceContainer(
118 EntryPublishRequestForContainer,
119 entryId=messages.StringField(2, required=True))
120
121 class BooleanMessageResponse(messages.Message):
122 result = messages.BooleanField(1, required=True)
123
124 @api_config.api(name='root', hostname='example.appspot.com', version='v1',
125 description='This is an API')
126 class MyService(remote.Service):
127 """Describes MyService."""
128
129 @api_config.method(message_types.VoidMessage, BooleanMessageResponse,
130 path ='toplevel:withcolon', http_method='GET',
131 name='toplevelwithcolon')
132 def toplevel(self, unused_request):
133 return BooleanMessageResponse(result=True)
134
135 @api_config.method(AllFields, message_types.VoidMessage, path='entries',
136 http_method='GET', name='entries.get')
137 def entries_get(self, unused_request):
138 """All field types in the query parameters."""
139 return message_types.VoidMessage()
140
141 @api_config.method(ALL_FIELDS_AS_PARAMETERS, message_types.VoidMessage,
142 path='entries/container', http_method='GET',
143 name='entries.getContainer')
144 def entries_get_container(self, unused_request):
145 """All field types in the query parameters."""
146 return message_types.VoidMessage()
147
148 @api_config.method(PutRequest, BooleanMessageResponse, path='entries',
149 name='entries.put')
150 def entries_put(self, unused_request):
151 """Request body is in the body field."""
152 return BooleanMessageResponse(result=True)
153
154 @api_config.method(AllFields, message_types.VoidMessage, path='process',
155 name='entries.process')
156 def entries_process(self, unused_request):
157 """Message is the request body."""
158 return message_types.VoidMessage()
159
160 @api_config.method(message_types.VoidMessage, message_types.VoidMessage,
161 name='entries.nested.collection.action',
162 path='nested')
163 def entries_nested_collection_action(self, unused_request):
164 """A VoidMessage for a request body."""
165 return message_types.VoidMessage()
166
167 @api_config.method(AllFields, AllFields, name='entries.roundtrip',
168 path='roundtrip')
169 def entries_roundtrip(self, unused_request):
170 """All field types in the request and response."""
171 pass
172
173 # Test a method with a required parameter in the request body.
174 @api_config.method(EntryPublishRequest, message_types.VoidMessage,
175 path='entries/{entryId}/publish',
176 name='entries.publish')
177 def entries_publish(self, unused_request):
178 """Path has a parameter and request body has a required param."""
179 return message_types.VoidMessage()
180
181 @api_config.method(entry_publish_request_container,
182 message_types.VoidMessage,
183 path='entries/container/{entryId}/publish',
184 name='entries.publishContainer')
185 def entries_publish_container(self, unused_request):
186 """Path has a parameter and request body has a required param."""
187 return message_types.VoidMessage()
188
189 # Test a method with a parameter in the path and a request body.
190 @api_config.method(ItemsPutRequest, message_types.VoidMessage,
191 path='entries/{entryId}/items',
192 name='entries.items.put')
193 def items_put(self, unused_request):
194 """Path has a parameter and request body is in the body field."""
195 return message_types.VoidMessage()
196
197 @api_config.method(items_put_request_container, message_types.VoidMessage,
198 path='entries/container/{entryId}/items',
199 name='entries.items.putContainer')
200 def items_put_container(self, unused_request):
201 """Path has a parameter and request body is in the body field."""
202 return message_types.VoidMessage()
203
204 api = json.loads(self.generator.pretty_print_config_to_json(MyService))
205
206 try:
207 pwd = os.path.dirname(os.path.realpath(__file__))
208 test_file = os.path.join(pwd, 'testdata', 'discovery', 'allfields.json')
209 with open(test_file) as f:
210 expected_discovery = json.loads(f.read())
211 except IOError as e:
212 print 'Could not find expected output file ' + test_file
213 raise e
214
215 test_util.AssertDictEqual(expected_discovery, api, self)
216
217
218 if __name__ == '__main__':
219 unittest.main()
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698