230 lines
		
	
	
	
		
			7.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			230 lines
		
	
	
	
		
			7.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| # Copyright 2015 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.
 | |
| 
 | |
| import unittest2
 | |
| 
 | |
| 
 | |
| class Test_ClientFactoryMixin(unittest2.TestCase):
 | |
| 
 | |
|     def _getTargetClass(self):
 | |
|         from gcloud.client import _ClientFactoryMixin
 | |
|         return _ClientFactoryMixin
 | |
| 
 | |
|     def test_virtual(self):
 | |
|         klass = self._getTargetClass()
 | |
|         self.assertFalse('__init__' in klass.__dict__)
 | |
| 
 | |
| 
 | |
| class TestClient(unittest2.TestCase):
 | |
| 
 | |
|     def setUp(self):
 | |
|         KLASS = self._getTargetClass()
 | |
|         self.original_cnxn_class = KLASS._connection_class
 | |
|         KLASS._connection_class = _MockConnection
 | |
| 
 | |
|     def tearDown(self):
 | |
|         KLASS = self._getTargetClass()
 | |
|         KLASS._connection_class = self.original_cnxn_class
 | |
| 
 | |
|     def _getTargetClass(self):
 | |
|         from gcloud.client import Client
 | |
|         return Client
 | |
| 
 | |
|     def _makeOne(self, *args, **kw):
 | |
|         return self._getTargetClass()(*args, **kw)
 | |
| 
 | |
|     def test_ctor_defaults(self):
 | |
|         from gcloud._testing import _Monkey
 | |
|         from gcloud import client
 | |
| 
 | |
|         CREDENTIALS = object()
 | |
|         FUNC_CALLS = []
 | |
| 
 | |
|         def mock_get_credentials():
 | |
|             FUNC_CALLS.append('get_credentials')
 | |
|             return CREDENTIALS
 | |
| 
 | |
|         with _Monkey(client, get_credentials=mock_get_credentials):
 | |
|             client_obj = self._makeOne()
 | |
| 
 | |
|         self.assertTrue(isinstance(client_obj.connection, _MockConnection))
 | |
|         self.assertTrue(client_obj.connection.credentials is CREDENTIALS)
 | |
|         self.assertEqual(FUNC_CALLS, ['get_credentials'])
 | |
| 
 | |
|     def test_ctor_explicit(self):
 | |
|         CREDENTIALS = object()
 | |
|         HTTP = object()
 | |
|         client_obj = self._makeOne(credentials=CREDENTIALS, http=HTTP)
 | |
| 
 | |
|         self.assertTrue(isinstance(client_obj.connection, _MockConnection))
 | |
|         self.assertTrue(client_obj.connection.credentials is CREDENTIALS)
 | |
|         self.assertTrue(client_obj.connection.http is HTTP)
 | |
| 
 | |
|     def test_from_service_account_json(self):
 | |
|         from gcloud._testing import _Monkey
 | |
|         from gcloud import client
 | |
| 
 | |
|         KLASS = self._getTargetClass()
 | |
|         MOCK_FILENAME = 'foo.path'
 | |
|         mock_creds = _MockServiceAccountCredentials()
 | |
|         with _Monkey(client, ServiceAccountCredentials=mock_creds):
 | |
|             client_obj = KLASS.from_service_account_json(MOCK_FILENAME)
 | |
| 
 | |
|         self.assertTrue(client_obj.connection.credentials is
 | |
|                         mock_creds._result)
 | |
|         self.assertEqual(mock_creds.json_called, [MOCK_FILENAME])
 | |
| 
 | |
|     def test_from_service_account_json_fail(self):
 | |
|         KLASS = self._getTargetClass()
 | |
|         CREDENTIALS = object()
 | |
|         self.assertRaises(TypeError, KLASS.from_service_account_json, None,
 | |
|                           credentials=CREDENTIALS)
 | |
| 
 | |
|     def test_from_service_account_p12(self):
 | |
|         from gcloud._testing import _Monkey
 | |
|         from gcloud import client
 | |
| 
 | |
|         KLASS = self._getTargetClass()
 | |
|         CLIENT_EMAIL = 'phred@example.com'
 | |
|         MOCK_FILENAME = 'foo.path'
 | |
|         mock_creds = _MockServiceAccountCredentials()
 | |
|         with _Monkey(client, ServiceAccountCredentials=mock_creds):
 | |
|             client_obj = KLASS.from_service_account_p12(CLIENT_EMAIL,
 | |
|                                                         MOCK_FILENAME)
 | |
| 
 | |
|         self.assertTrue(client_obj.connection.credentials is
 | |
|                         mock_creds._result)
 | |
|         self.assertEqual(mock_creds.p12_called,
 | |
|                          [(CLIENT_EMAIL, MOCK_FILENAME)])
 | |
| 
 | |
|     def test_from_service_account_p12_fail(self):
 | |
|         KLASS = self._getTargetClass()
 | |
|         CREDENTIALS = object()
 | |
|         self.assertRaises(TypeError, KLASS.from_service_account_p12, None,
 | |
|                           None, credentials=CREDENTIALS)
 | |
| 
 | |
| 
 | |
| class TestJSONClient(unittest2.TestCase):
 | |
| 
 | |
|     def setUp(self):
 | |
|         KLASS = self._getTargetClass()
 | |
|         self.original_cnxn_class = KLASS._connection_class
 | |
|         KLASS._connection_class = _MockConnection
 | |
| 
 | |
|     def tearDown(self):
 | |
|         KLASS = self._getTargetClass()
 | |
|         KLASS._connection_class = self.original_cnxn_class
 | |
| 
 | |
|     def _getTargetClass(self):
 | |
|         from gcloud.client import JSONClient
 | |
|         return JSONClient
 | |
| 
 | |
|     def _makeOne(self, *args, **kw):
 | |
|         return self._getTargetClass()(*args, **kw)
 | |
| 
 | |
|     def test_ctor_defaults(self):
 | |
|         from gcloud._testing import _Monkey
 | |
|         from gcloud import client
 | |
| 
 | |
|         PROJECT = 'PROJECT'
 | |
|         CREDENTIALS = object()
 | |
|         FUNC_CALLS = []
 | |
| 
 | |
|         def mock_determine_proj(project):
 | |
|             FUNC_CALLS.append((project, '_determine_default_project'))
 | |
|             return PROJECT
 | |
| 
 | |
|         def mock_get_credentials():
 | |
|             FUNC_CALLS.append('get_credentials')
 | |
|             return CREDENTIALS
 | |
| 
 | |
|         with _Monkey(client, get_credentials=mock_get_credentials,
 | |
|                      _determine_default_project=mock_determine_proj):
 | |
|             client_obj = self._makeOne()
 | |
| 
 | |
|         self.assertEqual(client_obj.project, PROJECT)
 | |
|         self.assertTrue(isinstance(client_obj.connection, _MockConnection))
 | |
|         self.assertTrue(client_obj.connection.credentials is CREDENTIALS)
 | |
|         self.assertEqual(
 | |
|             FUNC_CALLS,
 | |
|             [(None, '_determine_default_project'), 'get_credentials'])
 | |
| 
 | |
|     def test_ctor_missing_project(self):
 | |
|         from gcloud._testing import _Monkey
 | |
|         from gcloud import client
 | |
| 
 | |
|         FUNC_CALLS = []
 | |
| 
 | |
|         def mock_determine_proj(project):
 | |
|             FUNC_CALLS.append((project, '_determine_default_project'))
 | |
|             return None
 | |
| 
 | |
|         with _Monkey(client, _determine_default_project=mock_determine_proj):
 | |
|             self.assertRaises(EnvironmentError, self._makeOne)
 | |
| 
 | |
|         self.assertEqual(FUNC_CALLS, [(None, '_determine_default_project')])
 | |
| 
 | |
|     def test_ctor_w_invalid_project(self):
 | |
|         CREDENTIALS = object()
 | |
|         HTTP = object()
 | |
|         with self.assertRaises(ValueError):
 | |
|             self._makeOne(project=object(), credentials=CREDENTIALS, http=HTTP)
 | |
| 
 | |
|     def _explicit_ctor_helper(self, project):
 | |
|         import six
 | |
| 
 | |
|         CREDENTIALS = object()
 | |
|         HTTP = object()
 | |
| 
 | |
|         client_obj = self._makeOne(project=project, credentials=CREDENTIALS,
 | |
|                                    http=HTTP)
 | |
| 
 | |
|         if isinstance(project, six.binary_type):
 | |
|             self.assertEqual(client_obj.project, project.decode('utf-8'))
 | |
|         else:
 | |
|             self.assertEqual(client_obj.project, project)
 | |
|         self.assertTrue(isinstance(client_obj.connection, _MockConnection))
 | |
|         self.assertTrue(client_obj.connection.credentials is CREDENTIALS)
 | |
|         self.assertTrue(client_obj.connection.http is HTTP)
 | |
| 
 | |
|     def test_ctor_explicit_bytes(self):
 | |
|         PROJECT = b'PROJECT'
 | |
|         self._explicit_ctor_helper(PROJECT)
 | |
| 
 | |
|     def test_ctor_explicit_unicode(self):
 | |
|         PROJECT = u'PROJECT'
 | |
|         self._explicit_ctor_helper(PROJECT)
 | |
| 
 | |
| 
 | |
| class _MockConnection(object):
 | |
| 
 | |
|     def __init__(self, credentials=None, http=None):
 | |
|         self.credentials = credentials
 | |
|         self.http = http
 | |
| 
 | |
| 
 | |
| class _MockServiceAccountCredentials(object):
 | |
| 
 | |
|     def __init__(self):
 | |
|         self.p12_called = []
 | |
|         self.json_called = []
 | |
|         self._result = object()
 | |
| 
 | |
|     def from_p12_keyfile(self, email, path):
 | |
|         self.p12_called.append((email, path))
 | |
|         return self._result
 | |
| 
 | |
|     def from_json_keyfile_name(self, path):
 | |
|         self.json_called.append(path)
 | |
|         return self._result
 |