Expanded and increased strictness of the ansible.py tests

Where possible, the tests were adjusted to not only assert
on the last call made, but on it being a single call.

Closes-Bug: #1922726

Signed-off-by: Jiri Podivin <jpodivin@redhat.com>
Change-Id: I2cd15f3cdcd79705173ed48d555fec35e39b5b71
This commit is contained in:
Jiri Podivin 2021-02-23 11:22:03 +01:00
parent 73b8a373ad
commit 648c2d81c4
1 changed files with 138 additions and 2 deletions

View File

@ -34,16 +34,44 @@ except pkg_resources.DistributionNotFound:
class TestAnsible(TestCase):
def setUp(self):
"""
Initiates objects needed for testing. Most importantly the Ansible.
Also replaces Ansible.log with a MagicMock to check against.
"""
super(TestAnsible, self).setUp()
self.unlink_patch = mock.patch('os.unlink')
self.addCleanup(self.unlink_patch.stop)
self.unlink_patch.start()
self.run = Ansible()
self.run.log = mock.MagicMock()
@mock.patch('logging.getLogger')
def test_ansible_init(self, mock_logger):
"""
Test of Ansible init.
Verifies that uuid atribute is properly set and that
the logger has appropriate name assigned.
"""
fake_uuid = 'foo'
ansible = Ansible(fake_uuid)
mock_logger.assert_called_once_with(
'validations_libs.ansible.Ansible')
self.assertEqual(fake_uuid, ansible.uuid)
@mock.patch('os.path.exists', return_value=False)
@mock.patch('ansible_runner.utils.dump_artifact', autospec=True,
return_value="/foo/inventory.yaml")
def test_check_no_playbook(self, mock_dump_artifact, mock_exists):
"""
Checks if providing nonexistent playbook raises RuntimeError.
Checks if os.path.exists is called both with name of the play file
and with the path consisting of playbook and directory.
Insists on order of the calls.
Allows additional calls both before and after the required sequence.
"""
self.assertRaises(
RuntimeError,
self.run.run,
@ -51,7 +79,115 @@ class TestAnsible(TestCase):
'localhost,',
'/tmp'
)
mock_exists.assert_called_with('/tmp/non-existing.yaml')
exists_calls = [
mock.call('non-existing.yaml'),
mock.call('/tmp/non-existing.yaml')
]
mock_exists.assert_has_calls(exists_calls)
@mock.patch('os.path.abspath', return_value='/absolute/path/foo')
@mock.patch('os.path.exists', return_value=True)
def test_inventory_string_inventory(self, mock_exists, mock_abspath):
"""
This test verifies that Ansible._inventory method properly handles
valid inventory file paths.
"""
inventory = 'foo'
artifact_dir = 'bar'
self.assertEqual(
'/absolute/path/foo',
self.run._inventory(inventory, artifact_dir))
mock_exists.assert_called_once_with(inventory)
mock_abspath.assert_called_once_with(inventory)
@mock.patch('ansible_runner.utils.dump_artifact')
def test_inventory_wrong_inventory_path(self, mock_dump_artifact):
"""
Test verifies that Ansible._inventory method calls dump_artifact,
if supplied by path to a nonexistent inventory file.
"""
inventory = 'foo'
artifact_dir = 'bar'
self.run._inventory(inventory, artifact_dir)
mock_dump_artifact.assert_called_once_with(
inventory,
artifact_dir,
'hosts')
@mock.patch('ansible_runner.utils.dump_artifact')
@mock.patch('yaml.safe_dump', return_value='foobar')
def test_inventory_dict_inventory(self, mock_yaml_dump,
mock_dump_artifact):
"""
Test verifies that Ansible._inventory method properly handles
inventories provided as dict.
"""
inventory = {
'foo': 'bar'
}
artifact_dir = 'fizz'
self.run._inventory(inventory, artifact_dir)
mock_yaml_dump.assert_called_once_with(
inventory,
default_flow_style=False)
mock_dump_artifact.assert_called_once_with(
'foobar',
artifact_dir,
'hosts')
@mock.patch('os.makedirs')
@mock.patch('tempfile.gettempdir', return_value='/tmp')
def test_creates_ansible_fact_dir_success(self, mock_get_temp_dir,
mock_mkdirs):
full_tmp_path = '/tmp/foo/fact_cache'
self.assertEqual(
full_tmp_path,
self.run._creates_ansible_fact_dir('foo'))
mock_mkdirs.assert_called_once_with(full_tmp_path)
@mock.patch('os.makedirs', side_effect=FileExistsError())
@mock.patch('tempfile.gettempdir', return_value='/tmp')
def test_creates_ansible_fact_dir_exception(self, mock_get_temp_dir,
mock_mkdirs):
self.run._creates_ansible_fact_dir('foo')
self.run.log.debug.assert_called_once_with(
'Directory "{}" was not created because it'
' already exists.'.format(
'/tmp/foo/fact_cache'
))
def test_get_extra_vars_dict(self):
extra_vars = {
'foo': 'bar'
}
self.assertEqual(extra_vars, self.run._get_extra_vars(extra_vars))
@mock.patch('yaml.safe_load', return_value={'fizz': 'buzz'})
@mock.patch('builtins.open', spec=open)
@mock.patch('os.path.exists', return_value=True)
@mock.patch('os.path.isfile', return_value=True)
def test_get_extra_vars_path(self, mock_isfile,
mock_exists,
mock_open,
mock_yaml_load):
self.assertEqual(
{'fizz': 'buzz'},
self.run._get_extra_vars('/foo/bar'))
mock_open.assert_called_once_with('/foo/bar')
@mock.patch('six.moves.builtins.open')
@mock.patch('os.path.exists', return_value=True)
@ -203,4 +339,4 @@ class TestAnsible(TestCase):
'fact_cache_type': 'jsonfile'
})
mock_config.assert_called_with(**opt)
mock_config.assert_called_once_with(**opt)