Fail safed more parts of the code

This commit is contained in:
2025-07-12 21:35:33 +02:00
parent 066b4d59d6
commit ead60dab84
24 changed files with 493 additions and 102 deletions

View File

@@ -0,0 +1,55 @@
import unittest
import tempfile
import os
import yaml
from filter_plugins.get_all_application_ids import get_all_application_ids
class TestGetAllApplicationIds(unittest.TestCase):
def setUp(self):
# Create a temporary directory to act as the roles base
self.tmpdir = tempfile.TemporaryDirectory()
self.roles_dir = os.path.join(self.tmpdir.name, 'roles')
os.makedirs(self.roles_dir)
def tearDown(self):
# Clean up temporary directory
self.tmpdir.cleanup()
def create_role(self, role_name, data):
# Helper to create roles/<role_name>/vars/main.yml with given dict
path = os.path.join(self.roles_dir, role_name, 'vars')
os.makedirs(path, exist_ok=True)
with open(os.path.join(path, 'main.yml'), 'w', encoding='utf-8') as f:
yaml.safe_dump(data, f)
def test_single_application_id(self):
self.create_role('role1', {'application_id': 'app1'})
result = get_all_application_ids(self.roles_dir)
self.assertEqual(result, ['app1'])
def test_multiple_application_ids(self):
self.create_role('role1', {'application_id': 'app1'})
self.create_role('role2', {'application_id': 'app2'})
result = get_all_application_ids(self.roles_dir)
self.assertEqual(sorted(result), ['app1', 'app2'])
def test_duplicate_application_ids(self):
self.create_role('role1', {'application_id': 'app1'})
self.create_role('role2', {'application_id': 'app1'})
result = get_all_application_ids(self.roles_dir)
self.assertEqual(result, ['app1'])
def test_missing_application_id(self):
self.create_role('role1', {'other_key': 'value'})
result = get_all_application_ids(self.roles_dir)
self.assertEqual(result, [])
def test_no_roles_directory(self):
# Point to a non-existent directory
empty_dir = os.path.join(self.tmpdir.name, 'no_roles_here')
result = get_all_application_ids(empty_dir)
self.assertEqual(result, [])
if __name__ == '__main__':
unittest.main()

View File

@@ -0,0 +1,63 @@
# tests/unit/filter_plugins/test_get_application_id.py
import unittest
import os
import tempfile
import shutil
import yaml
from ansible.errors import AnsibleFilterError
from filter_plugins.get_application_id import get_application_id
class TestGetApplicationIdFilter(unittest.TestCase):
def setUp(self):
# Create a temporary project directory and switch to it
self.tmpdir = tempfile.mkdtemp()
self.original_cwd = os.getcwd()
os.chdir(self.tmpdir)
# Create the roles/testrole/vars directory structure
self.role_name = 'testrole'
self.vars_dir = os.path.join('roles', self.role_name, 'vars')
os.makedirs(self.vars_dir)
self.vars_file = os.path.join(self.vars_dir, 'main.yml')
def tearDown(self):
# Return to original cwd and remove temp directory
os.chdir(self.original_cwd)
shutil.rmtree(self.tmpdir)
def write_vars_file(self, content):
with open(self.vars_file, 'w') as f:
yaml.dump(content, f)
def test_returns_application_id(self):
# Given a valid vars file with application_id
expected_id = '12345'
self.write_vars_file({'application_id': expected_id})
# When
result = get_application_id(self.role_name)
# Then
self.assertEqual(result, expected_id)
def test_file_not_found_raises_error(self):
# Given no vars file for a nonexistent role
with self.assertRaises(AnsibleFilterError) as cm:
get_application_id('nonexistent_role')
self.assertIn("Vars file not found", str(cm.exception))
def test_missing_key_raises_error(self):
# Given a vars file without application_id
self.write_vars_file({'other_key': 'value'})
with self.assertRaises(AnsibleFilterError) as cm:
get_application_id(self.role_name)
self.assertIn("Key 'application_id' not found", str(cm.exception))
def test_invalid_yaml_raises_error(self):
# Write invalid YAML content
with open(self.vars_file, 'w') as f:
f.write(":::not a yaml:::")
with self.assertRaises(AnsibleFilterError) as cm:
get_application_id(self.role_name)
self.assertIn("Error reading YAML", str(cm.exception))
if __name__ == '__main__':
unittest.main()

View File

@@ -5,7 +5,7 @@ import unittest
import yaml
from ansible.errors import AnsibleFilterError
from filter_plugins.get_role_folder import get_role_folder
from filter_plugins.get_role import get_role
class TestGetRoleFolder(unittest.TestCase):
def setUp(self):
@@ -35,20 +35,20 @@ class TestGetRoleFolder(unittest.TestCase):
def test_find_existing_role(self):
# Should find role1 for application_id 'app-123'
result = get_role_folder('app-123', roles_path=self.roles_dir)
result = get_role('app-123', roles_path=self.roles_dir)
self.assertEqual(result, 'role1')
def test_no_match_raises(self):
# No role has application_id 'nonexistent'
with self.assertRaises(AnsibleFilterError) as cm:
get_role_folder('nonexistent', roles_path=self.roles_dir)
get_role('nonexistent', roles_path=self.roles_dir)
self.assertIn("No role found with application_id 'nonexistent'", str(cm.exception))
def test_missing_roles_path(self):
# Path does not exist
invalid_path = os.path.join(self.tempdir, 'invalid')
with self.assertRaises(AnsibleFilterError) as cm:
get_role_folder('any', roles_path=invalid_path)
get_role('any', roles_path=invalid_path)
self.assertIn(f"Roles path not found: {invalid_path}", str(cm.exception))
def test_invalid_yaml_raises(self):
@@ -59,7 +59,7 @@ class TestGetRoleFolder(unittest.TestCase):
f.write("::: invalid yaml :::")
with self.assertRaises(AnsibleFilterError) as cm:
get_role_folder('app-123', roles_path=self.roles_dir)
get_role('app-123', roles_path=self.roles_dir)
self.assertIn('Failed to load', str(cm.exception))
if __name__ == '__main__':

View File

@@ -1,3 +1,5 @@
# tests/unit/lookup_plugins/test_docker_cards.py
import os
import sys
import tempfile
@@ -9,14 +11,22 @@ sys.path.insert(0, os.path.join(os.path.dirname(__file__), '../../../roles/web-a
from docker_cards import LookupModule
class TestDockerCardsLookup(unittest.TestCase):
def setUp(self):
# Create a temporary directory to simulate the roles directory.
self.test_roles_dir = tempfile.mkdtemp(prefix="test_roles_")
# Create a sample role "web-app-port-ui".
# Create a sample role "web-app-port-ui" under that directory.
self.role_name = "web-app-port-ui"
self.role_dir = os.path.join(self.test_roles_dir, self.role_name)
os.makedirs(os.path.join(self.role_dir, "meta"))
os.makedirs(os.path.join(self.role_dir, "vars"))
# Create vars/main.yml so get_application_id() can find the application_id.
vars_main = os.path.join(self.role_dir, "vars", "main.yml")
with open(vars_main, "w", encoding="utf-8") as f:
f.write("application_id: portfolio\n")
# Create a sample README.md with a H1 line for the title.
readme_path = os.path.join(self.role_dir, "README.md")
@@ -54,11 +64,11 @@ galaxy_info:
"group_names": ["portfolio"]
}
result = lookup_module.run([self.test_roles_dir], variables=fake_variables)
# The result is a list containing one list of card dictionaries.
self.assertIsInstance(result, list)
self.assertEqual(len(result), 1)
cards = result[0]
self.assertIsInstance(cards, list)
# Since "portfolio" is in group_names, one card should be present.
@@ -80,21 +90,22 @@ galaxy_info:
"applications": {
"portfolio": {
"features": {
"iframe": True
"portfolio_iframe": True
}
}
},
"group_names": [] # Not including "portfolio"
}
result = lookup_module.run([self.test_roles_dir], variables=fake_variables)
# Since the application_id is not in group_names, no card should be added.
self.assertIsInstance(result, list)
self.assertEqual(len(result), 1)
cards = result[0]
self.assertIsInstance(cards, list)
self.assertEqual(len(cards), 0)
if __name__ == "__main__":
unittest.main()