mirror of
				https://github.com/kevinveenbirkenbach/computer-playbook.git
				synced 2025-11-03 19:58:14 +00: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