monasca-agent/tests/test_keystone.py
Sean McGinnis 1d4e926076
Use unittest.mock instead of third party mock
Now that we no longer support py27, we can use the standard library
unittest.mock module instead of the third party mock lib.

Change-Id: I1dca4b2c7eccf1b19482dde60b88a132935b48b8
Signed-off-by: Sean McGinnis <sean.mcginnis@gmail.com>
2020-04-18 11:54:36 -05:00

184 lines
6.7 KiB
Python

# Copyright 2017 FUJITSU LIMITED
#
# 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 random
from unittest import mock
from oslotest import base
from monasca_agent.common import keystone
from tests.common import base_config
class TestUtils(base.BaseTestCase):
def test_should_sanitize_config(self):
config_keys = [
'keystone_url', 'username', 'password', 'project_name',
'service_type', 'url', 'endpoint_type', 'region_name'
]
config = {c: mock.NonCallableMock() for c in config_keys}
random_key_for_no_value = random.choice(config_keys)
config[random_key_for_no_value] = None
clean = keystone.get_args(config)
self.assertNotIn(random_key_for_no_value, clean)
@mock.patch('monasca_agent.common.keystone.discover.Discover')
@mock.patch('monasca_agent.common.keystone.get_session')
def test_get_client_should_use_existing_session_if_present(self,
get_session,
_):
sess = mock.Mock()
sess.auth = mock.PropertyMock()
sess.auth.get_auth_ref = mock.Mock()
config = {
'session': sess
}
keystone.get_client(**config)
get_session.assert_not_called()
@mock.patch('monasca_agent.common.keystone.discover.Discover')
@mock.patch('monasca_agent.common.keystone.get_session')
def test_get_client_should_create_session_if_missing(self,
get_session,
_):
sess = mock.Mock()
sess.auth = mock.PropertyMock()
sess.auth.get_auth_ref = mock.Mock()
config = {
'username': __name__,
'password': str(random.randint(10, 20))
}
keystone.get_client(**config)
get_session.assert_called_once_with(**config)
class TestKeystone(base.BaseTestCase):
default_endpoint_type = mock.NonCallableMock()
default_service_type = mock.NonCallableMock()
default_region_name = mock.NonCallableMock()
def test_keystone_should_be_singleton(self):
keystone_1 = keystone.Keystone({})
keystone_2 = keystone.Keystone({})
keystone_3 = keystone.Keystone({})
self.assertTrue(keystone_1 is keystone_2)
self.assertTrue(keystone_1 is keystone_3)
def test_should_call_service_catalog_for_endpoint(self):
keystone.Keystone.instance = None
with mock.patch('keystoneauth1.identity.Password') as password, \
mock.patch('keystoneauth1.session.Session') as session, \
mock.patch('keystoneclient.discover.Discover') as discover:
client = mock.Mock()
discover.return_value = d = mock.Mock()
d.create_client = mock.Mock(return_value=client)
config = base_config.get_config('Api')
config.update({
'url': None,
'service_type': self.default_service_type,
'endpoint_type': self.default_endpoint_type,
'region_name': self.default_region_name
})
k = keystone.Keystone(config)
k.get_monasca_url()
password.assert_called_once()
session.assert_called_once()
discover.assert_called_once()
client.auth_ref.service_catalog.url_for.assert_called_once_with(**{
'service_type': self.default_service_type,
'interface': self.default_endpoint_type,
'region_name': self.default_region_name
})
def test_should_use_url_from_config_catalog_config_present(self):
keystone.Keystone.instance = None
with mock.patch('keystoneauth1.identity.Password') as password, \
mock.patch('keystoneauth1.session.Session') as session, \
mock.patch('keystoneclient.discover.Discover') as discover:
client = mock.Mock()
discover.return_value = d = mock.Mock()
d.create_client = mock.Mock(return_value=client)
monasca_url = mock.NonCallableMock()
config = base_config.get_config('Api')
config.update({
'url': monasca_url,
'service_type': self.default_service_type,
'endpoint_type': self.default_endpoint_type,
'region_name': self.default_region_name
})
k = keystone.Keystone(config)
k.get_monasca_url()
password.assert_not_called()
session.assert_not_called()
discover.assert_not_called()
client.auth_ref.service_catalog.url_for.assert_not_called()
def test_should_use_url_from_config_if_catalog_config_missing(self):
keystone.Keystone.instance = None
with mock.patch('keystoneauth1.identity.Password') as password, \
mock.patch('keystoneauth1.session.Session') as session, \
mock.patch('keystoneclient.discover.Discover') as discover:
client = mock.Mock()
discover.return_value = d = mock.Mock()
d.create_client = mock.Mock(return_value=client)
monasca_url = mock.NonCallableMock()
config = base_config.get_config('Api')
config.update({
'url': monasca_url,
'service_type': None,
'endpoint_type': None,
'region_name': None
})
k = keystone.Keystone(config)
k.get_monasca_url()
password.assert_not_called()
session.assert_not_called()
discover.assert_not_called()
client.auth_ref.service_catalog.url_for.assert_not_called()
def test_should_init_client_just_once(self):
keystone.Keystone.instance = None
k = keystone.Keystone(config=base_config.get_config('Api'))
client = mock.Mock()
with mock.patch('monasca_agent.common.keystone.get_client') as gc:
gc.return_value = client
for _ in range(random.randint(5, 50)):
k._init_client()
self.assertIsNotNone(k._keystone_client)
self.assertEqual(client, k._keystone_client)
gc.assert_called_once()