Tests for the 'verify_profiles' module.

Signed-off-by: Jiri Podivin <jpodivin@redhat.com>
Change-Id: I95b5289efbe0db43968d4e5da557fe255a2dae19
This commit is contained in:
Jiri Podivin 2021-06-08 13:53:55 +02:00
parent 26159d9d78
commit f687689e35
2 changed files with 196 additions and 0 deletions

View File

@ -99,3 +99,30 @@ MOCK_FLAVORS_CHECK_EXPECTED = {
]
)
}
MOCK_NODES = [
{
'uuid': 'foo123',
'provision_state': 'active',
'properties': {
'capabilities': {
'foocap': 'foocapdesc'
}
}
},
{
'uuid': 'bar123',
'provision_state': 'active',
'properties': {
'capabilities': {
'barcap': 'bcapdesc'
}
}
}
]
MOCK_PROFILE_FLAVORS = {
'fooflavor': (MOCK_FLAVORS['ok'], 1),
}

View File

@ -0,0 +1,169 @@
# -*- coding: utf-8 -*-
# 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.
"""
test_verify_profiles
----------------------------------
Tests for `verify_profiles` module.
"""
try:
from unittest import mock
except ImportError:
import mock
from logging import warning
from tripleo_validations.tests import base
from tripleo_validations.tests import fakes
import library.verify_profiles as validation
class TestVerifyProfiles(base.TestCase):
def setUp(self):
self.tested_module = validation
return super().setUp()
def test_module_init(self):
module_attributes = dir(self.tested_module)
required_attributes = [
'DOCUMENTATION',
'EXAMPLES']
self.assertTrue(set(required_attributes).issubset(module_attributes))
def test_caps_to_dict(self):
"""Test various use cases of the '_capabilities_to_dict' function.
"""
test_dict = {"foo": "bar", "fizz": "buzz"}
#Test None => dict "conversion"
self.assertEqual({}, self.tested_module._capabilities_to_dict(None))
#Test dict => dict. This isn't a conversion at all, but an identity op
self.assertEqual(
test_dict,
self.tested_module._capabilities_to_dict(test_dict))
self.assertEqual(
test_dict,
self.tested_module._capabilities_to_dict('foo:bar,fizz:buzz'))
@mock.patch('library.verify_profiles._capabilities_to_dict')
def test_node_get_capabilities(self, mock_dict_conv):
"""Test 'node_get_capabilities' function.
Not much to test, just a call to the '_capabilities_to_dict'.
"""
self.tested_module._node_get_capabilities(fakes.MOCK_NODES[0])
mock_dict_conv.assert_called_once_with(
fakes.MOCK_NODES[0]['properties']['capabilities'])
@mock.patch(
'library.verify_profiles.yaml_safe_load',
return_value={'options': 'foo'})
@mock.patch(
'library.verify_profiles.AnsibleModule')
@mock.patch(
'library.verify_profiles.verify_profiles',
return_value=(None, None))
def test_main_success(self, mock_verify, mock_module, mock_yaml):
"""Test if the module properly sends information about successful run,
to the 'exit_json' method of the 'AnsibleModule' object.
"""
returned_module = mock.MagicMock(
params={
'nodes': 'fizz',
'flavors': 'buzz'})
mock_module.return_value = returned_module
self.tested_module.main()
mock_yaml.assert_called_once()
mock_verify.assert_called_once_with('fizz', 'buzz')
returned_module.assert_has_calls([
mock.call.exit_json(msg="No profile errors detected.")])
@mock.patch(
'library.verify_profiles.yaml_safe_load',
return_value={'options': 'foo'})
@mock.patch(
'library.verify_profiles.AnsibleModule')
@mock.patch(
'library.verify_profiles.verify_profiles',
return_value=(None, ['HCF']))
def test_main_errors(self, mock_verify, mock_module, mock_yaml):
"""Test if the module properly sends information about error,
such as the catastrophic temperature increase, to the 'fail_json'
method of the 'AnsibleModule' object.
"""
returned_module = mock.MagicMock(
params={
'nodes': 'fizz',
'flavors': 'buzz'})
mock_module.return_value = returned_module
self.tested_module.main()
mock_yaml.assert_called_once()
mock_verify.assert_called_once_with('fizz', 'buzz')
returned_module.assert_has_calls([
mock.call.fail_json(msg="HCF")])
@mock.patch(
'library.verify_profiles.yaml_safe_load',
return_value={'options': 'foo'})
@mock.patch(
'library.verify_profiles.AnsibleModule')
@mock.patch(
'library.verify_profiles.verify_profiles',
return_value=(['HCF imminent'], None))
def test_main_warnings(self, mock_verify, mock_module, mock_yaml):
"""Test if the module properly sends information about warning,
such as incoming catastrophic temperature increase,
to the 'exit_json' method of the 'AnsibleModule' object.
"""
returned_module = mock.MagicMock(
params={
'nodes': 'fizz',
'flavors': 'buzz'})
mock_module.return_value = returned_module
self.tested_module.main()
mock_yaml.assert_called_once()
mock_verify.assert_called_once_with('fizz', 'buzz')
returned_module.assert_has_calls([
mock.call.exit_json(warnings="HCF imminent")])
def test_verify_profiles_success(self):
return_value = self.tested_module.verify_profiles(
[fakes.MOCK_NODES[0]],
fakes.MOCK_PROFILE_FLAVORS)
self.assertEqual(return_value, ([], []))
def test_verify_profiles_warning_overcount(self):
warn_msg = "1 nodes with profile None won't be used for deployment now"
return_value = self.tested_module.verify_profiles(
fakes.MOCK_NODES,
fakes.MOCK_PROFILE_FLAVORS)
self.assertEqual(([warn_msg], []), return_value)