Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package python-google-auth-httplib2 for openSUSE:Factory checked in at 2021-08-26 23:15:19 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-google-auth-httplib2 (Old) and /work/SRC/openSUSE:Factory/.python-google-auth-httplib2.new.1899 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-google-auth-httplib2" Thu Aug 26 23:15:19 2021 rev:2 rq:914433 version:0.1.0 Changes: -------- --- /work/SRC/openSUSE:Factory/python-google-auth-httplib2/python-google-auth-httplib2.changes 2019-03-14 22:43:05.266625557 +0100 +++ /work/SRC/openSUSE:Factory/.python-google-auth-httplib2.new.1899/python-google-auth-httplib2.changes 2021-08-26 23:16:44.184176864 +0200 @@ -1,0 +2,18 @@ +Mon Aug 23 11:45:51 UTC 2021 - John Paul Adrian Glaubitz <adrian.glaub...@suse.com> + +- Update to version 0.1.0 + * chore: release 0.1.0 (#22) + * feat: add close method (#14) + * build: migrate to flakybot (#21) + * chore: use nox and kokoro (#16) + * Add renovate.json (#15) + * Fix the signature of AuthorizedHttp.request to match + the signature of the request in httplib2 (#13) + * Expose redirect_codes on AuthorizedHttp. (#12) +- from version 0.0.4 + * Release 0.0.4 (#11) + * feat: expose a few httplib2 properties and a method (#9) + * Bug: Catch any underlying exceptions from http.HTTPException (#7) +- Update BuildRequires and Requires from setup.py + +------------------------------------------------------------------- Old: ---- google-auth-httplib2-0.0.3.tar.gz New: ---- google-auth-httplib2-0.1.0.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-google-auth-httplib2.spec ++++++ --- /var/tmp/diff_new_pack.Ne1ycB/_old 2021-08-26 23:16:44.628176447 +0200 +++ /var/tmp/diff_new_pack.Ne1ycB/_new 2021-08-26 23:16:44.632176444 +0200 @@ -1,7 +1,7 @@ # # spec file for package python-google-auth-httplib2 # -# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany. +# Copyright (c) 2021 SUSE LLC # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -18,7 +18,7 @@ %{?!python_module:%define python_module() python-%{**} python3-%{**}} Name: python-google-auth-httplib2 -Version: 0.0.3 +Version: 0.1.0 Release: 0 Summary: Google Authentication Library: httplib2 transport License: Apache-2.0 @@ -27,7 +27,7 @@ Source: https://files.pythonhosted.org/packages/source/g/google-auth-httplib2/google-auth-httplib2-%{version}.tar.gz BuildRequires: %{python_module Flask} BuildRequires: %{python_module google-auth} -BuildRequires: %{python_module httplib2 >= 0.9.1} +BuildRequires: %{python_module httplib2 >= 0.15.0} BuildRequires: %{python_module mock} BuildRequires: %{python_module pytest-localserver} BuildRequires: %{python_module pytest} @@ -36,7 +36,7 @@ BuildRequires: fdupes BuildRequires: python-rpm-macros Requires: python-google-auth -Requires: python-httplib2 >= 0.9.1 +Requires: python-httplib2 >= 0.15.0 Requires: python-six BuildArch: noarch %python_subpackages ++++++ google-auth-httplib2-0.0.3.tar.gz -> google-auth-httplib2-0.1.0.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/google-auth-httplib2-0.0.3/PKG-INFO new/google-auth-httplib2-0.1.0/PKG-INFO --- old/google-auth-httplib2-0.0.3/PKG-INFO 2017-11-14 18:37:50.000000000 +0100 +++ new/google-auth-httplib2-0.1.0/PKG-INFO 2021-03-04 19:27:18.528247000 +0100 @@ -1,12 +1,11 @@ Metadata-Version: 1.1 Name: google-auth-httplib2 -Version: 0.0.3 +Version: 0.1.0 Summary: Google Authentication Library: httplib2 transport Home-page: https://github.com/GoogleCloudPlatform/google-auth-library-python-httplib2 Author: Google Cloud Platform -Author-email: jonwayne+google-a...@google.com +Author-email: googleapis-packa...@google.com License: Apache 2.0 -Description-Content-Type: UNKNOWN Description: ``httplib2`` Transport for Google Auth ====================================== @@ -46,9 +45,10 @@ Classifier: Programming Language :: Python :: 2 Classifier: Programming Language :: Python :: 2.7 Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.4 Classifier: Programming Language :: Python :: 3.5 Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: 3.8 Classifier: Development Status :: 3 - Alpha Classifier: Intended Audience :: Developers Classifier: License :: OSI Approved :: Apache Software License diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/google-auth-httplib2-0.0.3/google_auth_httplib2.egg-info/PKG-INFO new/google-auth-httplib2-0.1.0/google_auth_httplib2.egg-info/PKG-INFO --- old/google-auth-httplib2-0.0.3/google_auth_httplib2.egg-info/PKG-INFO 2017-11-14 18:37:50.000000000 +0100 +++ new/google-auth-httplib2-0.1.0/google_auth_httplib2.egg-info/PKG-INFO 2021-03-04 19:27:18.000000000 +0100 @@ -1,12 +1,11 @@ Metadata-Version: 1.1 Name: google-auth-httplib2 -Version: 0.0.3 +Version: 0.1.0 Summary: Google Authentication Library: httplib2 transport Home-page: https://github.com/GoogleCloudPlatform/google-auth-library-python-httplib2 Author: Google Cloud Platform -Author-email: jonwayne+google-a...@google.com +Author-email: googleapis-packa...@google.com License: Apache 2.0 -Description-Content-Type: UNKNOWN Description: ``httplib2`` Transport for Google Auth ====================================== @@ -46,9 +45,10 @@ Classifier: Programming Language :: Python :: 2 Classifier: Programming Language :: Python :: 2.7 Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.4 Classifier: Programming Language :: Python :: 3.5 Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: 3.8 Classifier: Development Status :: 3 - Alpha Classifier: Intended Audience :: Developers Classifier: License :: OSI Approved :: Apache Software License diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/google-auth-httplib2-0.0.3/google_auth_httplib2.egg-info/requires.txt new/google-auth-httplib2-0.1.0/google_auth_httplib2.egg-info/requires.txt --- old/google-auth-httplib2-0.0.3/google_auth_httplib2.egg-info/requires.txt 2017-11-14 18:37:50.000000000 +0100 +++ new/google-auth-httplib2-0.1.0/google_auth_httplib2.egg-info/requires.txt 2021-03-04 19:27:18.000000000 +0100 @@ -1,2 +1,3 @@ google-auth -httplib2>=0.9.1 +httplib2>=0.15.0 +six diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/google-auth-httplib2-0.0.3/google_auth_httplib2.py new/google-auth-httplib2-0.1.0/google_auth_httplib2.py --- old/google-auth-httplib2-0.0.3/google_auth_httplib2.py 2017-11-14 18:30:12.000000000 +0100 +++ new/google-auth-httplib2-0.1.0/google_auth_httplib2.py 2021-03-04 19:24:25.000000000 +0100 @@ -21,11 +21,12 @@ from google.auth import exceptions from google.auth import transport import httplib2 +from six.moves import http_client _LOGGER = logging.getLogger(__name__) # Properties present in file-like streams / buffers. -_STREAM_PROPERTIES = ('read', 'seek', 'tell') +_STREAM_PROPERTIES = ("read", "seek", "tell") class _Response(transport.Response): @@ -35,6 +36,7 @@ response (httplib2.Response): The raw httplib2 response. data (bytes): The response body. """ + def __init__(self, response, data): self._response = response self._data = data @@ -79,11 +81,13 @@ .. automethod:: __call__ """ + def __init__(self, http): self.http = http - def __call__(self, url, method='GET', body=None, headers=None, - timeout=None, **kwargs): + def __call__( + self, url, method="GET", body=None, headers=None, timeout=None, **kwargs + ): """Make an HTTP request using httplib2. Args: @@ -106,16 +110,19 @@ """ if timeout is not None: _LOGGER.warning( - 'httplib2 transport does not support per-request timeout. ' - 'Set the timeout when constructing the httplib2.Http instance.' + "httplib2 transport does not support per-request timeout. " + "Set the timeout when constructing the httplib2.Http instance." ) try: - _LOGGER.debug('Making request: %s %s', method, url) + _LOGGER.debug("Making request: %s %s", method, url) response, data = self.http.request( - url, method=method, body=body, headers=headers, **kwargs) + url, method=method, body=body, headers=headers, **kwargs + ) return _Response(response, data) - except httplib2.HttpLib2Error as exc: + # httplib2 should catch the lower http error, this is a bug and + # needs to be fixed there. Catch the error for the meanwhile. + except (httplib2.HttpLib2Error, http_client.HTTPException) as exc: raise exceptions.TransportError(exc) @@ -144,9 +151,14 @@ The underlying :meth:`request` implementation handles adding the credentials' headers to the request and refreshing credentials as needed. """ - def __init__(self, credentials, http=None, - refresh_status_codes=transport.DEFAULT_REFRESH_STATUS_CODES, - max_refresh_attempts=transport.DEFAULT_MAX_REFRESH_ATTEMPTS): + + def __init__( + self, + credentials, + http=None, + refresh_status_codes=transport.DEFAULT_REFRESH_STATUS_CODES, + max_refresh_attempts=transport.DEFAULT_MAX_REFRESH_ATTEMPTS, + ): """ Args: credentials (google.auth.credentials.Credentials): The credentials @@ -172,43 +184,63 @@ # credentials.refresh). self._request = Request(self.http) - def request(self, uri, method='GET', body=None, headers=None, - **kwargs): + def close(self): + """Calls httplib2's Http.close""" + self.http.close() + + def request( + self, + uri, + method="GET", + body=None, + headers=None, + redirections=httplib2.DEFAULT_MAX_REDIRECTS, + connection_type=None, + **kwargs + ): """Implementation of httplib2's Http.request.""" - _credential_refresh_attempt = kwargs.pop( - '_credential_refresh_attempt', 0) + _credential_refresh_attempt = kwargs.pop("_credential_refresh_attempt", 0) # Make a copy of the headers. They will be modified by the credentials # and we want to pass the original headers if we recurse. request_headers = headers.copy() if headers is not None else {} - self.credentials.before_request( - self._request, method, uri, request_headers) + self.credentials.before_request(self._request, method, uri, request_headers) # Check if the body is a file-like stream, and if so, save the body # stream position so that it can be restored in case of refresh. body_stream_position = None - if all(getattr(body, stream_prop, None) for stream_prop in - _STREAM_PROPERTIES): + if all(getattr(body, stream_prop, None) for stream_prop in _STREAM_PROPERTIES): body_stream_position = body.tell() # Make the request. response, content = self.http.request( - uri, method, body=body, headers=request_headers, **kwargs) + uri, + method, + body=body, + headers=request_headers, + redirections=redirections, + connection_type=connection_type, + **kwargs + ) # If the response indicated that the credentials needed to be # refreshed, then refresh the credentials and re-attempt the # request. # A stored token may expire between the time it is retrieved and # the time the request is made, so we may need to try twice. - if (response.status in self._refresh_status_codes - and _credential_refresh_attempt < self._max_refresh_attempts): + if ( + response.status in self._refresh_status_codes + and _credential_refresh_attempt < self._max_refresh_attempts + ): _LOGGER.info( - 'Refreshing credentials due to a %s response. Attempt %s/%s.', - response.status, _credential_refresh_attempt + 1, - self._max_refresh_attempts) + "Refreshing credentials due to a %s response. Attempt %s/%s.", + response.status, + _credential_refresh_attempt + 1, + self._max_refresh_attempts, + ) self.credentials.refresh(self._request) @@ -218,12 +250,22 @@ # Recurse. Pass in the original headers, not our modified set. return self.request( - uri, method, body=body, headers=headers, + uri, + method, + body=body, + headers=headers, + redirections=redirections, + connection_type=connection_type, _credential_refresh_attempt=_credential_refresh_attempt + 1, - **kwargs) + **kwargs + ) return response, content + def add_certificate(self, key, cert, domain, password=None): + """Proxy to httplib2.Http.add_certificate.""" + self.http.add_certificate(key, cert, domain, password=password) + @property def connections(self): """Proxy to httplib2.Http.connections.""" @@ -233,3 +275,33 @@ def connections(self, value): """Proxy to httplib2.Http.connections.""" self.http.connections = value + + @property + def follow_redirects(self): + """Proxy to httplib2.Http.follow_redirects.""" + return self.http.follow_redirects + + @follow_redirects.setter + def follow_redirects(self, value): + """Proxy to httplib2.Http.follow_redirects.""" + self.http.follow_redirects = value + + @property + def timeout(self): + """Proxy to httplib2.Http.timeout.""" + return self.http.timeout + + @timeout.setter + def timeout(self, value): + """Proxy to httplib2.Http.timeout.""" + self.http.timeout = value + + @property + def redirect_codes(self): + """Proxy to httplib2.Http.redirect_codes.""" + return self.http.redirect_codes + + @redirect_codes.setter + def redirect_codes(self, value): + """Proxy to httplib2.Http.redirect_codes.""" + self.http.redirect_codes = value diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/google-auth-httplib2-0.0.3/setup.py new/google-auth-httplib2-0.1.0/setup.py --- old/google-auth-httplib2-0.0.3/setup.py 2017-11-14 18:37:42.000000000 +0100 +++ new/google-auth-httplib2-0.1.0/setup.py 2021-03-04 19:24:25.000000000 +0100 @@ -16,43 +16,42 @@ from setuptools import setup +version = "0.1.0" -DEPENDENCIES = ( - 'google-auth', - 'httplib2 >= 0.9.1', -) +DEPENDENCIES = ["google-auth", "httplib2 >= 0.15.0", "six"] -with io.open('README.rst', 'r') as fh: +with io.open("README.rst", "r") as fh: long_description = fh.read() setup( - name='google-auth-httplib2', - version='0.0.3', - author='Google Cloud Platform', - author_email='jonwayne+google-a...@google.com', - description='Google Authentication Library: httplib2 transport', + name="google-auth-httplib2", + version=version, + author="Google Cloud Platform", + author_email="googleapis-packa...@google.com", + description="Google Authentication Library: httplib2 transport", long_description=long_description, - url='https://github.com/GoogleCloudPlatform/google-auth-library-python-httplib2', - py_modules=['google_auth_httplib2'], + url="https://github.com/GoogleCloudPlatform/google-auth-library-python-httplib2", + py_modules=["google_auth_httplib2"], install_requires=DEPENDENCIES, - license='Apache 2.0', - keywords='google auth oauth client', - classifiers=( - 'Programming Language :: Python :: 2', - 'Programming Language :: Python :: 2.7', - 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.4', - 'Programming Language :: Python :: 3.5', - 'Programming Language :: Python :: 3.6', - 'Development Status :: 3 - Alpha', - 'Intended Audience :: Developers', - 'License :: OSI Approved :: Apache Software License', - 'Operating System :: POSIX', - 'Operating System :: Microsoft :: Windows', - 'Operating System :: MacOS :: MacOS X', - 'Operating System :: OS Independent', - 'Topic :: Internet :: WWW/HTTP', - ), + license="Apache 2.0", + keywords="google auth oauth client", + classifiers=[ + "Programming Language :: Python :: 2", + "Programming Language :: Python :: 2.7", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.5", + "Programming Language :: Python :: 3.6", + "Programming Language :: Python :: 3.7", + "Programming Language :: Python :: 3.8", + "Development Status :: 3 - Alpha", + "Intended Audience :: Developers", + "License :: OSI Approved :: Apache Software License", + "Operating System :: POSIX", + "Operating System :: Microsoft :: Windows", + "Operating System :: MacOS :: MacOS X", + "Operating System :: OS Independent", + "Topic :: Internet :: WWW/HTTP", + ], ) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/google-auth-httplib2-0.0.3/tests/compliance.py new/google-auth-httplib2-0.1.0/tests/compliance.py --- old/google-auth-httplib2-0.0.3/tests/compliance.py 2017-03-22 21:06:35.000000000 +0100 +++ new/google-auth-httplib2-0.1.0/tests/compliance.py 2021-03-04 19:24:25.000000000 +0100 @@ -19,12 +19,11 @@ from six.moves import http_client # .invalid will never resolve, see https://tools.ietf.org/html/rfc2606 -NXDOMAIN = 'test.invalid' +NXDOMAIN = "test.invalid" class RequestResponseTests(object): - - @pytest.fixture(scope='module') + @pytest.fixture(scope="module") def server(self): """Provides a test HTTP server. @@ -37,15 +36,16 @@ # pylint: disable=unused-variable # (pylint thinks the flask routes are unusued.) - @app.route('/basic') + @app.route("/basic") def index(): - header_value = flask.request.headers.get('x-test-header', 'value') - headers = {'X-Test-Header': header_value} - return 'Basic Content', http_client.OK, headers + header_value = flask.request.headers.get("x-test-header", "value") + headers = {"X-Test-Header": header_value} + return "Basic Content", http_client.OK, headers - @app.route('/server_error') + @app.route("/server_error") def server_error(): - return 'Error', http_client.INTERNAL_SERVER_ERROR + return "Error", http_client.INTERNAL_SERVER_ERROR + # pylint: enable=unused-variable server = WSGIServer(application=app.wsgi_app) @@ -55,38 +55,40 @@ def test_request_basic(self, server): request = self.make_request() - response = request(url=server.url + '/basic', method='GET') + response = request(url=server.url + "/basic", method="GET") assert response.status == http_client.OK - assert response.headers['x-test-header'] == 'value' - assert response.data == b'Basic Content' + assert response.headers["x-test-header"] == "value" + assert response.data == b"Basic Content" def test_request_timeout(self, server): request = self.make_request() - response = request(url=server.url + '/basic', method='GET', timeout=2) + response = request(url=server.url + "/basic", method="GET", timeout=2) assert response.status == http_client.OK - assert response.headers['x-test-header'] == 'value' - assert response.data == b'Basic Content' + assert response.headers["x-test-header"] == "value" + assert response.data == b"Basic Content" def test_request_headers(self, server): request = self.make_request() response = request( - url=server.url + '/basic', method='GET', headers={ - 'x-test-header': 'hello world'}) + url=server.url + "/basic", + method="GET", + headers={"x-test-header": "hello world"}, + ) assert response.status == http_client.OK - assert response.headers['x-test-header'] == 'hello world' - assert response.data == b'Basic Content' + assert response.headers["x-test-header"] == "hello world" + assert response.data == b"Basic Content" def test_request_error(self, server): request = self.make_request() - response = request(url=server.url + '/server_error', method='GET') + response = request(url=server.url + "/server_error", method="GET") assert response.status == http_client.INTERNAL_SERVER_ERROR - assert response.data == b'Error' + assert response.data == b"Error" def test_connection_error(self): request = self.make_request() with pytest.raises(exceptions.TransportError): - request(url='http://{}'.format(NXDOMAIN), method='GET') + request(url="http://{}".format(NXDOMAIN), method="GET") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/google-auth-httplib2-0.0.3/tests/test_google_auth_httplib2.py new/google-auth-httplib2-0.1.0/tests/test_google_auth_httplib2.py --- old/google-auth-httplib2-0.0.3/tests/test_google_auth_httplib2.py 2017-03-22 21:06:35.000000000 +0100 +++ new/google-auth-httplib2-0.1.0/tests/test_google_auth_httplib2.py 2021-03-04 19:24:25.000000000 +0100 @@ -26,14 +26,25 @@ self.responses = responses self.requests = [] self.headers = headers or {} + self.add_certificate = mock.Mock(return_value=None) - def request(self, url, method='GET', body=None, headers=None, **kwargs): - self.requests.append((method, url, body, headers, kwargs)) + def request( + self, + url, + method="GET", + body=None, + headers=None, + redirections=httplib2.DEFAULT_MAX_REDIRECTS, + connection_type=None, + ): + self.requests.append( + (method, url, body, headers, redirections, connection_type) + ) return self.responses.pop(0) class MockResponse(object): - def __init__(self, status=http_client.OK, data=b''): + def __init__(self, status=http_client.OK, data=b""): self.status = status self.data = data @@ -48,13 +59,19 @@ return google_auth_httplib2.Request(http) def test_timeout(self): - url = 'http://example.com' + url = "http://example.com" http = MockHttp(responses=[MockResponse()]) request = google_auth_httplib2.Request(http) - request(url=url, method='GET', timeout=5) + request(url=url, method="GET", timeout=5) assert http.requests[0] == ( - 'GET', url, None, None, {}) + "GET", + url, + None, + None, + httplib2.DEFAULT_MAX_REDIRECTS, + None, + ) def test__make_default_http(): @@ -63,45 +80,86 @@ class MockCredentials(object): - def __init__(self, token='token'): + def __init__(self, token="token"): self.token = token def apply(self, headers): - headers['authorization'] = self.token + headers["authorization"] = self.token def before_request(self, request, method, url, headers): self.apply(headers) def refresh(self, request): - self.token += '1' + self.token += "1" class TestAuthorizedHttp(object): - TEST_URL = 'http://example.com' + TEST_URL = "http://example.com" def test_authed_http_defaults(self): - authed_http = google_auth_httplib2.AuthorizedHttp( - mock.sentinel.credentials) + authed_http = google_auth_httplib2.AuthorizedHttp(mock.sentinel.credentials) assert authed_http.credentials == mock.sentinel.credentials assert isinstance(authed_http.http, httplib2.Http) + def test_close(self): + with mock.patch("httplib2.Http.close", autospec=True) as close: + authed_http = google_auth_httplib2.AuthorizedHttp(mock.sentinel.credentials) + authed_http.close() + + close.assert_called_once() + def test_connections(self): - authed_http = google_auth_httplib2.AuthorizedHttp( - mock.sentinel.credentials) + authed_http = google_auth_httplib2.AuthorizedHttp(mock.sentinel.credentials) assert authed_http.connections == authed_http.http.connections authed_http.connections = mock.sentinel.connections assert authed_http.http.connections == mock.sentinel.connections + def test_follow_redirects(self): + auth_http = google_auth_httplib2.AuthorizedHttp(mock.sentinel.credentials) + + assert auth_http.follow_redirects == auth_http.http.follow_redirects + + mock_follow_redirects = mock.sentinel.follow_redirects + auth_http.follow_redirects = mock_follow_redirects + assert auth_http.http.follow_redirects == mock_follow_redirects + + def test_timeout(self): + authed_http = google_auth_httplib2.AuthorizedHttp(mock.sentinel.credentials) + + assert authed_http.timeout == authed_http.http.timeout + + authed_http.timeout = mock.sentinel.timeout + assert authed_http.http.timeout == mock.sentinel.timeout + + def test_redirect_codes(self): + authed_http = google_auth_httplib2.AuthorizedHttp(mock.sentinel.credentials) + + assert authed_http.redirect_codes == authed_http.http.redirect_codes + + authed_http.redirect_codes = mock.sentinel.redirect_codes + assert authed_http.http.redirect_codes == mock.sentinel.redirect_codes + + def test_add_certificate(self): + authed_http = google_auth_httplib2.AuthorizedHttp( + mock.sentinel.credentials, http=MockHttp(MockResponse()) + ) + + authed_http.add_certificate("key", "cert", "domain", password="password") + authed_http.http.add_certificate.assert_called_once_with( + "key", "cert", "domain", password="password" + ) + def test_request_no_refresh(self): mock_credentials = mock.Mock(wraps=MockCredentials()) mock_response = MockResponse() mock_http = MockHttp([mock_response]) authed_http = google_auth_httplib2.AuthorizedHttp( - mock_credentials, http=mock_http) + mock_credentials, http=mock_http + ) response, data = authed_http.request(self.TEST_URL) @@ -110,18 +168,27 @@ assert mock_credentials.before_request.called assert not mock_credentials.refresh.called assert mock_http.requests == [ - ('GET', self.TEST_URL, None, {'authorization': 'token'}, {})] + ( + "GET", + self.TEST_URL, + None, + {"authorization": "token"}, + httplib2.DEFAULT_MAX_REDIRECTS, + None, + ) + ] def test_request_refresh(self): mock_credentials = mock.Mock(wraps=MockCredentials()) mock_final_response = MockResponse(status=http_client.OK) # First request will 401, second request will succeed. - mock_http = MockHttp([ - MockResponse(status=http_client.UNAUTHORIZED), - mock_final_response]) + mock_http = MockHttp( + [MockResponse(status=http_client.UNAUTHORIZED), mock_final_response] + ) authed_http = google_auth_httplib2.AuthorizedHttp( - mock_credentials, http=mock_http) + mock_credentials, http=mock_http + ) response, data = authed_http.request(self.TEST_URL) @@ -130,28 +197,87 @@ assert mock_credentials.before_request.call_count == 2 assert mock_credentials.refresh.called assert mock_http.requests == [ - ('GET', self.TEST_URL, None, {'authorization': 'token'}, {}), - ('GET', self.TEST_URL, None, {'authorization': 'token1'}, {})] + ( + "GET", + self.TEST_URL, + None, + {"authorization": "token"}, + httplib2.DEFAULT_MAX_REDIRECTS, + None, + ), + ( + "GET", + self.TEST_URL, + None, + {"authorization": "token1"}, + httplib2.DEFAULT_MAX_REDIRECTS, + None, + ), + ] def test_request_stream_body(self): mock_credentials = mock.Mock(wraps=MockCredentials()) mock_response = MockResponse() # Refresh is needed to cover the resetting of the body position. - mock_http = MockHttp([ - MockResponse(status=http_client.UNAUTHORIZED), - mock_response]) + mock_http = MockHttp( + [MockResponse(status=http_client.UNAUTHORIZED), mock_response] + ) - body = six.StringIO('body') + body = six.StringIO("body") body.seek(1) authed_http = google_auth_httplib2.AuthorizedHttp( - mock_credentials, http=mock_http) + mock_credentials, http=mock_http + ) + + response, data = authed_http.request(self.TEST_URL, method="POST", body=body) + + assert response == mock_response + assert data == mock_response.data + assert mock_http.requests == [ + ( + "POST", + self.TEST_URL, + body, + {"authorization": "token"}, + httplib2.DEFAULT_MAX_REDIRECTS, + None, + ), + ( + "POST", + self.TEST_URL, + body, + {"authorization": "token1"}, + httplib2.DEFAULT_MAX_REDIRECTS, + None, + ), + ] + + def test_request_positional_args(self): + """Verifies that clients can pass args to request as positioanls.""" + mock_credentials = mock.Mock(wraps=MockCredentials()) + mock_response = MockResponse() + mock_http = MockHttp([mock_response]) + + authed_http = google_auth_httplib2.AuthorizedHttp( + mock_credentials, http=mock_http + ) response, data = authed_http.request( - self.TEST_URL, method='POST', body=body) + self.TEST_URL, "GET", None, None, httplib2.DEFAULT_MAX_REDIRECTS, None + ) assert response == mock_response assert data == mock_response.data + assert mock_credentials.before_request.called + assert not mock_credentials.refresh.called assert mock_http.requests == [ - ('POST', self.TEST_URL, body, {'authorization': 'token'}, {}), - ('POST', self.TEST_URL, body, {'authorization': 'token1'}, {})] + ( + "GET", + self.TEST_URL, + None, + {"authorization": "token"}, + httplib2.DEFAULT_MAX_REDIRECTS, + None, + ) + ]