mirror of
https://github.com/kevinveenbirkenbach/computer-playbook.git
synced 2025-08-29 23:08:06 +02:00
Implemented new run_after logic
This commit is contained in:
85
tests/unit/test_generate_playbook.py
Normal file
85
tests/unit/test_generate_playbook.py
Normal file
@@ -0,0 +1,85 @@
|
||||
#!/usr/bin/env python3
|
||||
import os
|
||||
import sys
|
||||
import unittest
|
||||
import tempfile
|
||||
import shutil
|
||||
import yaml
|
||||
|
||||
# Adjust path to include cli/ folder
|
||||
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "../../..", "cli")))
|
||||
|
||||
from generate_playbook import build_dependency_graph, topological_sort, generate_playbook_entries
|
||||
|
||||
class TestGeneratePlaybook(unittest.TestCase):
|
||||
def setUp(self):
|
||||
# Create a temporary directory to simulate roles
|
||||
self.temp_dir = tempfile.mkdtemp()
|
||||
|
||||
# Define mock roles and dependencies
|
||||
self.roles = {
|
||||
'role-a': {'run_after': [], 'application_id': 'a'},
|
||||
'role-b': {'run_after': ['role-a'], 'application_id': 'b'},
|
||||
'role-c': {'run_after': ['role-b'], 'application_id': 'c'},
|
||||
'role-d': {'run_after': [], 'application_id': 'd'},
|
||||
}
|
||||
|
||||
for role_name, meta in self.roles.items():
|
||||
role_path = os.path.join(self.temp_dir, role_name)
|
||||
os.makedirs(os.path.join(role_path, 'meta'), exist_ok=True)
|
||||
os.makedirs(os.path.join(role_path, 'vars'), exist_ok=True)
|
||||
|
||||
meta_file = {
|
||||
'galaxy_info': {
|
||||
'run_after': meta['run_after']
|
||||
}
|
||||
}
|
||||
|
||||
vars_file = {
|
||||
'application_id': meta['application_id']
|
||||
}
|
||||
|
||||
with open(os.path.join(role_path, 'meta', 'main.yml'), 'w') as f:
|
||||
yaml.dump(meta_file, f)
|
||||
|
||||
with open(os.path.join(role_path, 'vars', 'main.yml'), 'w') as f:
|
||||
yaml.dump(vars_file, f)
|
||||
|
||||
def tearDown(self):
|
||||
# Clean up the temporary directory
|
||||
shutil.rmtree(self.temp_dir)
|
||||
|
||||
def test_dependency_graph_and_sort(self):
|
||||
graph, in_degree, roles = build_dependency_graph(self.temp_dir)
|
||||
|
||||
self.assertIn('role-a', graph)
|
||||
self.assertIn('role-b', graph)
|
||||
self.assertEqual(graph['role-a'], ['role-b'])
|
||||
self.assertEqual(graph['role-b'], ['role-c'])
|
||||
self.assertEqual(graph['role-c'], [])
|
||||
self.assertEqual(in_degree['role-c'], 1)
|
||||
self.assertEqual(in_degree['role-b'], 1)
|
||||
self.assertEqual(in_degree['role-a'], 0)
|
||||
self.assertEqual(in_degree['role-d'], 0)
|
||||
|
||||
sorted_roles = topological_sort(graph, in_degree)
|
||||
# The expected order must be a → b → c, d can be anywhere before or after
|
||||
self.assertTrue(sorted_roles.index('role-a') < sorted_roles.index('role-b') < sorted_roles.index('role-c'))
|
||||
|
||||
def test_generate_playbook_entries(self):
|
||||
entries = generate_playbook_entries(self.temp_dir)
|
||||
|
||||
text = ''.join(entries)
|
||||
self.assertIn("setup a", text)
|
||||
self.assertIn("setup b", text)
|
||||
self.assertIn("setup c", text)
|
||||
self.assertIn("setup d", text)
|
||||
|
||||
# Order must preserve run_after
|
||||
a_index = text.index("setup a")
|
||||
b_index = text.index("setup b")
|
||||
c_index = text.index("setup c")
|
||||
self.assertTrue(a_index < b_index < c_index)
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
Reference in New Issue
Block a user