| Index: third_party/google-endpoints/apitools/base/py/base_api_test.py
|
| diff --git a/third_party/google-endpoints/apitools/base/py/base_api_test.py b/third_party/google-endpoints/apitools/base/py/base_api_test.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..eb8f6dc7e9c31afbf1bb20e8dac7d5bbed02f802
|
| --- /dev/null
|
| +++ b/third_party/google-endpoints/apitools/base/py/base_api_test.py
|
| @@ -0,0 +1,270 @@
|
| +#
|
| +# Copyright 2015 Google Inc.
|
| +#
|
| +# 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.
|
| +
|
| +import base64
|
| +import datetime
|
| +import sys
|
| +import contextlib
|
| +
|
| +import six
|
| +from six.moves import urllib_parse
|
| +import unittest2
|
| +
|
| +from apitools.base.protorpclite import message_types
|
| +from apitools.base.protorpclite import messages
|
| +from apitools.base.py import base_api
|
| +from apitools.base.py import encoding
|
| +from apitools.base.py import http_wrapper
|
| +
|
| +
|
| +@contextlib.contextmanager
|
| +def mock(module, fn_name, patch):
|
| + unpatch = getattr(module, fn_name)
|
| + setattr(module, fn_name, patch)
|
| + try:
|
| + yield
|
| + finally:
|
| + setattr(module, fn_name, unpatch)
|
| +
|
| +
|
| +class SimpleMessage(messages.Message):
|
| + field = messages.StringField(1)
|
| + bytes_field = messages.BytesField(2)
|
| +
|
| +
|
| +class MessageWithTime(messages.Message):
|
| + timestamp = message_types.DateTimeField(1)
|
| +
|
| +
|
| +class MessageWithRemappings(messages.Message):
|
| +
|
| + class AnEnum(messages.Enum):
|
| + value_one = 1
|
| + value_two = 2
|
| +
|
| + str_field = messages.StringField(1)
|
| + enum_field = messages.EnumField('AnEnum', 2)
|
| +
|
| +
|
| +encoding.AddCustomJsonFieldMapping(
|
| + MessageWithRemappings, 'str_field', 'remapped_field')
|
| +encoding.AddCustomJsonEnumMapping(
|
| + MessageWithRemappings.AnEnum, 'value_one', 'ONE/TWO')
|
| +
|
| +
|
| +class StandardQueryParameters(messages.Message):
|
| + field = messages.StringField(1)
|
| + prettyPrint = messages.BooleanField(
|
| + 5, default=True) # pylint: disable=invalid-name
|
| + pp = messages.BooleanField(6, default=True)
|
| + nextPageToken = messages.BytesField(7) # pylint:disable=invalid-name
|
| +
|
| +
|
| +class FakeCredentials(object):
|
| +
|
| + def authorize(self, _): # pylint: disable=invalid-name
|
| + return None
|
| +
|
| +
|
| +class FakeClient(base_api.BaseApiClient):
|
| + MESSAGES_MODULE = sys.modules[__name__]
|
| + _PACKAGE = 'package'
|
| + _SCOPES = ['scope1']
|
| + _CLIENT_ID = 'client_id'
|
| + _CLIENT_SECRET = 'client_secret'
|
| +
|
| +
|
| +class FakeService(base_api.BaseApiService):
|
| +
|
| + def __init__(self, client=None):
|
| + client = client or FakeClient(
|
| + 'http://www.example.com/', credentials=FakeCredentials())
|
| + super(FakeService, self).__init__(client)
|
| +
|
| +
|
| +class BaseApiTest(unittest2.TestCase):
|
| +
|
| + def __GetFakeClient(self):
|
| + return FakeClient('', credentials=FakeCredentials())
|
| +
|
| + def testUrlNormalization(self):
|
| + client = FakeClient('http://www.googleapis.com', get_credentials=False)
|
| + self.assertTrue(client.url.endswith('/'))
|
| +
|
| + def testNoCredentials(self):
|
| + client = FakeClient('', get_credentials=False)
|
| + self.assertIsNotNone(client)
|
| + self.assertIsNone(client._credentials)
|
| +
|
| + def testIncludeEmptyFieldsClient(self):
|
| + msg = SimpleMessage()
|
| + client = self.__GetFakeClient()
|
| + self.assertEqual('{}', client.SerializeMessage(msg))
|
| + with client.IncludeFields(('field',)):
|
| + self.assertEqual('{"field": null}', client.SerializeMessage(msg))
|
| +
|
| + def testJsonResponse(self):
|
| + method_config = base_api.ApiMethodInfo(
|
| + response_type_name='SimpleMessage')
|
| + service = FakeService()
|
| + http_response = http_wrapper.Response(
|
| + info={'status': '200'}, content='{"field": "abc"}',
|
| + request_url='http://www.google.com')
|
| + response_message = SimpleMessage(field='abc')
|
| + self.assertEqual(response_message, service.ProcessHttpResponse(
|
| + method_config, http_response))
|
| + with service.client.JsonResponseModel():
|
| + self.assertEqual(
|
| + http_response.content,
|
| + service.ProcessHttpResponse(method_config, http_response))
|
| +
|
| + def testAdditionalHeaders(self):
|
| + additional_headers = {'Request-Is-Awesome': '1'}
|
| + client = self.__GetFakeClient()
|
| +
|
| + # No headers to start
|
| + http_request = http_wrapper.Request('http://www.example.com')
|
| + new_request = client.ProcessHttpRequest(http_request)
|
| + self.assertFalse('Request-Is-Awesome' in new_request.headers)
|
| +
|
| + # Add a new header and ensure it's added to the request.
|
| + client.additional_http_headers = additional_headers
|
| + http_request = http_wrapper.Request('http://www.example.com')
|
| + new_request = client.ProcessHttpRequest(http_request)
|
| + self.assertTrue('Request-Is-Awesome' in new_request.headers)
|
| +
|
| + def testCustomCheckResponse(self):
|
| + def check_response():
|
| + pass
|
| +
|
| + def fakeMakeRequest(*_, **kwargs):
|
| + self.assertEqual(check_response, kwargs['check_response_func'])
|
| + return http_wrapper.Response(
|
| + info={'status': '200'}, content='{"field": "abc"}',
|
| + request_url='http://www.google.com')
|
| + http_wrapper.MakeRequest = fakeMakeRequest
|
| + method_config = base_api.ApiMethodInfo(
|
| + request_type_name='SimpleMessage',
|
| + response_type_name='SimpleMessage')
|
| + client = self.__GetFakeClient()
|
| + client.check_response_func = check_response
|
| + service = FakeService(client=client)
|
| + request = SimpleMessage()
|
| + with mock(base_api.http_wrapper, 'MakeRequest', fakeMakeRequest):
|
| + service._RunMethod(method_config, request)
|
| +
|
| + def testQueryEncoding(self):
|
| + method_config = base_api.ApiMethodInfo(
|
| + request_type_name='MessageWithTime', query_params=['timestamp'])
|
| + service = FakeService()
|
| + request = MessageWithTime(
|
| + timestamp=datetime.datetime(2014, 10, 0o7, 12, 53, 13))
|
| + http_request = service.PrepareHttpRequest(method_config, request)
|
| +
|
| + url_timestamp = urllib_parse.quote(request.timestamp.isoformat())
|
| + self.assertTrue(http_request.url.endswith(url_timestamp))
|
| +
|
| + def testPrettyPrintEncoding(self):
|
| + method_config = base_api.ApiMethodInfo(
|
| + request_type_name='MessageWithTime', query_params=['timestamp'])
|
| + service = FakeService()
|
| + request = MessageWithTime(
|
| + timestamp=datetime.datetime(2014, 10, 0o7, 12, 53, 13))
|
| +
|
| + global_params = StandardQueryParameters()
|
| + http_request = service.PrepareHttpRequest(method_config, request,
|
| + global_params=global_params)
|
| + self.assertFalse('prettyPrint' in http_request.url)
|
| + self.assertFalse('pp' in http_request.url)
|
| +
|
| + global_params.prettyPrint = False # pylint: disable=invalid-name
|
| + global_params.pp = False
|
| +
|
| + http_request = service.PrepareHttpRequest(method_config, request,
|
| + global_params=global_params)
|
| + self.assertTrue('prettyPrint=0' in http_request.url)
|
| + self.assertTrue('pp=0' in http_request.url)
|
| +
|
| + def testQueryBytesRequest(self):
|
| + method_config = base_api.ApiMethodInfo(
|
| + request_type_name='SimpleMessage', query_params=['bytes_field'])
|
| + service = FakeService()
|
| + non_unicode_message = b''.join((six.int2byte(100),
|
| + six.int2byte(200)))
|
| + request = SimpleMessage(bytes_field=non_unicode_message)
|
| + global_params = StandardQueryParameters()
|
| + http_request = service.PrepareHttpRequest(method_config, request,
|
| + global_params=global_params)
|
| + want = urllib_parse.urlencode({
|
| + 'bytes_field': base64.urlsafe_b64encode(non_unicode_message),
|
| + })
|
| + self.assertIn(want, http_request.url)
|
| +
|
| + def testQueryBytesGlobalParams(self):
|
| + method_config = base_api.ApiMethodInfo(
|
| + request_type_name='SimpleMessage', query_params=['bytes_field'])
|
| + service = FakeService()
|
| + non_unicode_message = b''.join((six.int2byte(100),
|
| + six.int2byte(200)))
|
| + request = SimpleMessage()
|
| + global_params = StandardQueryParameters(
|
| + nextPageToken=non_unicode_message)
|
| + http_request = service.PrepareHttpRequest(method_config, request,
|
| + global_params=global_params)
|
| + want = urllib_parse.urlencode({
|
| + 'nextPageToken': base64.urlsafe_b64encode(non_unicode_message),
|
| + })
|
| + self.assertIn(want, http_request.url)
|
| +
|
| + def testQueryRemapping(self):
|
| + method_config = base_api.ApiMethodInfo(
|
| + request_type_name='MessageWithRemappings',
|
| + query_params=['remapped_field', 'enum_field'])
|
| + request = MessageWithRemappings(
|
| + str_field='foo', enum_field=MessageWithRemappings.AnEnum.value_one)
|
| + http_request = FakeService().PrepareHttpRequest(method_config, request)
|
| + result_params = urllib_parse.parse_qs(
|
| + urllib_parse.urlparse(http_request.url).query)
|
| + expected_params = {'enum_field': 'ONE%2FTWO', 'remapped_field': 'foo'}
|
| + self.assertTrue(expected_params, result_params)
|
| +
|
| + def testPathRemapping(self):
|
| + method_config = base_api.ApiMethodInfo(
|
| + relative_path='parameters/{remapped_field}/remap/{enum_field}',
|
| + request_type_name='MessageWithRemappings',
|
| + path_params=['remapped_field', 'enum_field'])
|
| + request = MessageWithRemappings(
|
| + str_field='gonna',
|
| + enum_field=MessageWithRemappings.AnEnum.value_one)
|
| + service = FakeService()
|
| + expected_url = service.client.url + 'parameters/gonna/remap/ONE%2FTWO'
|
| + http_request = service.PrepareHttpRequest(method_config, request)
|
| + self.assertEqual(expected_url, http_request.url)
|
| +
|
| + method_config.relative_path = (
|
| + 'parameters/{+remapped_field}/remap/{+enum_field}')
|
| + expected_url = service.client.url + 'parameters/gonna/remap/ONE/TWO'
|
| + http_request = service.PrepareHttpRequest(method_config, request)
|
| + self.assertEqual(expected_url, http_request.url)
|
| +
|
| + def testColonInRelativePath(self):
|
| + method_config = base_api.ApiMethodInfo(
|
| + relative_path='path:withJustColon',
|
| + request_type_name='SimpleMessage')
|
| + service = FakeService()
|
| + request = SimpleMessage()
|
| + http_request = service.PrepareHttpRequest(method_config, request)
|
| + self.assertEqual('http://www.example.com/path:withJustColon',
|
| + http_request.url)
|
|
|