Adding more unittests for the v2 role class

This commit is contained in:
James Cammarata 2014-10-28 10:24:33 -05:00
parent fe0ab8e750
commit bd203a44be
2 changed files with 58 additions and 16 deletions

View file

@ -41,6 +41,7 @@ __all__ = ['Role']
# will be based on the repr() of the dictionary object) # will be based on the repr() of the dictionary object)
_ROLE_CACHE = dict() _ROLE_CACHE = dict()
# The valid metadata keys for meta/main.yml files
_VALID_METADATA_KEYS = [ _VALID_METADATA_KEYS = [
'dependencies', 'dependencies',
'allow_duplicates', 'allow_duplicates',
@ -369,20 +370,30 @@ class Role(Base):
if parent_role not in self._parents: if parent_role not in self._parents:
self._parents.append(parent_role) self._parents.append(parent_role)
def get_variables(self): def get_parents(self):
# returns the merged variables for this role, including return self._parents
# recursively merging those of all child roles
return dict()
def get_immediate_dependencies(self): # FIXME: not yet used
return self._dependencies #def get_variables(self):
# # returns the merged variables for this role, including
# # recursively merging those of all child roles
# return dict()
def get_direct_dependencies(self):
return self._attributes['dependencies'][:]
def get_all_dependencies(self): def get_all_dependencies(self):
# returns a list built recursively, of all deps from # returns a list built recursively, of all deps from
# all child dependencies # all child dependencies
all_deps = []
for dep in self._dependencies: child_deps = []
list_union(all_deps, dep.get_all_dependencies()) direct_deps = self.get_direct_dependencies()
all_deps = list_union(all_deps, self.dependencies)
return all_deps for dep in direct_deps:
dep_deps = dep.get_all_dependencies()
for dep_dep in dep_deps:
if dep_dep not in child_deps:
child_deps.append(dep_dep)
return direct_deps + child_deps

View file

@ -22,7 +22,7 @@ __metaclass__ = type
from ansible.compat.tests import unittest from ansible.compat.tests import unittest
from ansible.compat.tests.mock import patch, MagicMock from ansible.compat.tests.mock import patch, MagicMock
from ansible.errors import AnsibleParserError from ansible.errors import AnsibleError, AnsibleParserError
from ansible.playbook.block import Block from ansible.playbook.block import Block
from ansible.playbook.role import Role from ansible.playbook.role import Role
from ansible.playbook.task import Task from ansible.playbook.task import Task
@ -124,16 +124,30 @@ class TestRole(unittest.TestCase):
return ('foo', '/etc/ansible/roles/foo') return ('foo', '/etc/ansible/roles/foo')
elif role == 'bar': elif role == 'bar':
return ('bar', '/etc/ansible/roles/bar') return ('bar', '/etc/ansible/roles/bar')
elif role == 'baz':
return ('baz', '/etc/ansible/roles/baz')
elif role == 'bam':
return ('bam', '/etc/ansible/roles/bam')
elif role == 'bad1': elif role == 'bad1':
return ('bad1', '/etc/ansible/roles/bad1') return ('bad1', '/etc/ansible/roles/bad1')
elif role == 'bad2': elif role == 'bad2':
return ('bad2', '/etc/ansible/roles/bad2') return ('bad2', '/etc/ansible/roles/bad2')
elif role == 'recursive1':
return ('recursive1', '/etc/ansible/roles/recursive1')
elif role == 'recursive2':
return ('recursive2', '/etc/ansible/roles/recursive2')
def fake_load_role_yaml(role_path, subdir): def fake_load_role_yaml(role_path, subdir):
if role_path == '/etc/ansible/roles/foo': if role_path == '/etc/ansible/roles/foo':
if subdir == 'meta': if subdir == 'meta':
return dict(dependencies=['bar'], allow_duplicates=True, galaxy_info=dict(a='1', b='2', c='3')) return dict(dependencies=['bar'], allow_duplicates=True, galaxy_info=dict(a='1', b='2', c='3'))
elif role_path == '/etc/ansible/roles/bar': elif role_path == '/etc/ansible/roles/bar':
if subdir == 'meta':
return dict(dependencies=['baz'])
elif role_path == '/etc/ansible/roles/baz':
if subdir == 'meta':
return dict(dependencies=['bam'])
elif role_path == '/etc/ansible/roles/bam':
if subdir == 'meta': if subdir == 'meta':
return dict() return dict()
elif role_path == '/etc/ansible/roles/bad1': elif role_path == '/etc/ansible/roles/bad1':
@ -142,21 +156,36 @@ class TestRole(unittest.TestCase):
elif role_path == '/etc/ansible/roles/bad2': elif role_path == '/etc/ansible/roles/bad2':
if subdir == 'meta': if subdir == 'meta':
return dict(foo='bar') return dict(foo='bar')
elif role_path == '/etc/ansible/roles/recursive1':
if subdir == 'meta':
return dict(dependencies=['recursive2'])
elif role_path == '/etc/ansible/roles/recursive2':
if subdir == 'meta':
return dict(dependencies=['recursive1'])
return None return None
_get_role_path.side_effect = fake_get_role_path _get_role_path.side_effect = fake_get_role_path
_load_role_yaml.side_effect = fake_load_role_yaml _load_role_yaml.side_effect = fake_load_role_yaml
r = Role.load('foo') r = Role.load('foo')
self.assertEqual(len(r.dependencies), 1) role_deps = r.get_direct_dependencies()
self.assertEqual(type(r.dependencies[0]), Role)
self.assertEqual(len(r.dependencies[0]._parents), 1) self.assertEqual(len(role_deps), 1)
self.assertEqual(r.dependencies[0]._parents[0], r) self.assertEqual(type(role_deps[0]), Role)
self.assertEqual(len(role_deps[0].get_parents()), 1)
self.assertEqual(role_deps[0].get_parents()[0], r)
self.assertEqual(r.allow_duplicates, True) self.assertEqual(r.allow_duplicates, True)
self.assertEqual(r.galaxy_info, dict(a='1', b='2', c='3')) self.assertEqual(r.galaxy_info, dict(a='1', b='2', c='3'))
all_deps = r.get_all_dependencies()
self.assertEqual(len(all_deps), 3)
self.assertEqual(all_deps[0].role_name, 'bar')
self.assertEqual(all_deps[1].role_name, 'baz')
self.assertEqual(all_deps[2].role_name, 'bam')
self.assertRaises(AnsibleParserError, Role.load, 'bad1') self.assertRaises(AnsibleParserError, Role.load, 'bad1')
self.assertRaises(AnsibleParserError, Role.load, 'bad2') self.assertRaises(AnsibleParserError, Role.load, 'bad2')
self.assertRaises(AnsibleError, Role.load, 'recursive1')
@patch.object(Role, '_get_role_path') @patch.object(Role, '_get_role_path')
@patch.object(Role, '_load_role_yaml') @patch.object(Role, '_load_role_yaml')
@ -174,4 +203,6 @@ class TestRole(unittest.TestCase):
r = Role.load(dict(role='foo')) r = Role.load(dict(role='foo'))
# FIXME: add tests for the more complex url-type
# constructions and tags/when statements