mirror of
https://github.com/kevinveenbirkenbach/computer-playbook.git
synced 2025-09-07 18:57:12 +02:00
Optimized test for tree creation
This commit is contained in:
@@ -6,23 +6,23 @@ import shutil
|
|||||||
import unittest
|
import unittest
|
||||||
from unittest.mock import patch
|
from unittest.mock import patch
|
||||||
|
|
||||||
# Import the script as a module (assumes the script is named tree.py)
|
# Absolute path to the tree.py script
|
||||||
SCRIPT_PATH = os.path.abspath(
|
SCRIPT_PATH = os.path.abspath(
|
||||||
os.path.join(os.path.dirname(__file__), "../../../../cli/build/tree.py")
|
os.path.join(os.path.dirname(__file__), "../../../../cli/build/tree.py")
|
||||||
)
|
)
|
||||||
|
|
||||||
class TestTreeShadowFolder(unittest.TestCase):
|
class TestTreeShadowFolder(unittest.TestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
# Create temp roles dir and a dummy role
|
# Create a temporary roles directory and a dummy role
|
||||||
self.roles_dir = tempfile.mkdtemp()
|
self.roles_dir = tempfile.mkdtemp()
|
||||||
self.role_name = "dummyrole"
|
self.role_name = "dummyrole"
|
||||||
self.role_path = os.path.join(self.roles_dir, self.role_name)
|
self.role_path = os.path.join(self.roles_dir, self.role_name)
|
||||||
os.makedirs(os.path.join(self.role_path, "meta"))
|
os.makedirs(os.path.join(self.role_path, "meta"))
|
||||||
|
|
||||||
# Prepare shadow dir
|
# Create a temporary shadow folder
|
||||||
self.shadow_dir = tempfile.mkdtemp()
|
self.shadow_dir = tempfile.mkdtemp()
|
||||||
|
|
||||||
# Patch sys.argv for the script
|
# Patch sys.argv so the script picks up our dirs
|
||||||
self.orig_argv = sys.argv[:]
|
self.orig_argv = sys.argv[:]
|
||||||
sys.argv = [
|
sys.argv = [
|
||||||
SCRIPT_PATH,
|
SCRIPT_PATH,
|
||||||
@@ -31,7 +31,15 @@ class TestTreeShadowFolder(unittest.TestCase):
|
|||||||
"-o", "json"
|
"-o", "json"
|
||||||
]
|
]
|
||||||
|
|
||||||
|
# Ensure project root is on sys.path so `import cli.build.tree` works
|
||||||
|
project_root = os.path.abspath(
|
||||||
|
os.path.join(os.path.dirname(__file__), "../../../../")
|
||||||
|
)
|
||||||
|
if project_root not in sys.path:
|
||||||
|
sys.path.insert(0, project_root)
|
||||||
|
|
||||||
def tearDown(self):
|
def tearDown(self):
|
||||||
|
# Restore original argv and clean up
|
||||||
sys.argv = self.orig_argv
|
sys.argv = self.orig_argv
|
||||||
shutil.rmtree(self.roles_dir)
|
shutil.rmtree(self.roles_dir)
|
||||||
shutil.rmtree(self.shadow_dir)
|
shutil.rmtree(self.shadow_dir)
|
||||||
@@ -39,28 +47,35 @@ class TestTreeShadowFolder(unittest.TestCase):
|
|||||||
@patch("cli.build.tree.build_mappings")
|
@patch("cli.build.tree.build_mappings")
|
||||||
@patch("cli.build.tree.output_graph")
|
@patch("cli.build.tree.output_graph")
|
||||||
def test_tree_json_written_to_shadow_folder(self, mock_output_graph, mock_build_mappings):
|
def test_tree_json_written_to_shadow_folder(self, mock_output_graph, mock_build_mappings):
|
||||||
# Prepare dummy graph
|
# Prepare the dummy graph that build_mappings should return
|
||||||
dummy_graph = {"dummy": {"test": 42}}
|
dummy_graph = {"dummy": {"test": 42}}
|
||||||
mock_build_mappings.return_value = dummy_graph
|
mock_build_mappings.return_value = dummy_graph
|
||||||
|
|
||||||
# Run the script (as __main__)
|
# Import the script module by name (so our @patch applies) and call main()
|
||||||
import runpy
|
import importlib
|
||||||
runpy.run_path(SCRIPT_PATH, run_name="__main__")
|
tree_mod = importlib.import_module("cli.build.tree")
|
||||||
|
tree_mod.main()
|
||||||
|
|
||||||
# Check file in shadow folder
|
# Verify that tree.json was written into the shadow folder
|
||||||
expected_tree_path = os.path.join(
|
expected_tree_path = os.path.join(
|
||||||
self.shadow_dir, self.role_name, "meta", "tree.json"
|
self.shadow_dir, self.role_name, "meta", "tree.json"
|
||||||
)
|
)
|
||||||
self.assertTrue(os.path.isfile(expected_tree_path), "tree.json not found in shadow folder")
|
self.assertTrue(
|
||||||
|
os.path.isfile(expected_tree_path),
|
||||||
|
f"tree.json not found at {expected_tree_path}"
|
||||||
|
)
|
||||||
|
|
||||||
# Check contents
|
# Verify contents match our dummy_graph
|
||||||
with open(expected_tree_path) as f:
|
with open(expected_tree_path, 'r') as f:
|
||||||
data = json.load(f)
|
data = json.load(f)
|
||||||
self.assertEqual(data, dummy_graph, "tree.json content mismatch")
|
self.assertEqual(data, dummy_graph, "tree.json content mismatch")
|
||||||
|
|
||||||
# Ensure nothing was written to original meta/
|
# Ensure that no tree.json was written to the real meta/ folder
|
||||||
original_tree_path = os.path.join(self.role_path, "meta", "tree.json")
|
original_tree_path = os.path.join(self.role_path, "meta", "tree.json")
|
||||||
self.assertFalse(os.path.isfile(original_tree_path), "tree.json should NOT be in role's meta/")
|
self.assertFalse(
|
||||||
|
os.path.exists(original_tree_path),
|
||||||
|
"tree.json should NOT be written to the real meta/ folder"
|
||||||
|
)
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
unittest.main()
|
unittest.main()
|
||||||
|
Reference in New Issue
Block a user