231 lines
7.6 KiB
Python
231 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
|