From 9e6256dc6ee04f335d147eb754f07ed5027323d0 Mon Sep 17 00:00:00 2001 From: Kevin Veen-Birkenbach Date: Wed, 17 Dec 2025 15:53:25 +0100 Subject: [PATCH] lint(test,core): remove misplaced test code and fix undefined names - Import subprocess where used to fix F821 in cli/setup/applications - Remove accidental test methods from RoleDependencyResolver implementation - Remove invalid and non-discoverable test functions from test_role_dependency_resolver - Eliminate test code that was never executed due to wrong scope/indentation - Restore clear separation between production code and unit tests https://chatgpt.com/share/6942c3ec-8a10-800f-9a15-c319f5e93089 --- build/lib/cli/setup/applications.py | 1 + .../module_utils/role_dependency_resolver.py | 41 ----------- cli/setup/applications.py | 1 + module_utils/role_dependency_resolver.py | 41 ----------- .../test_role_dependency_resolver.py | 71 ------------------- 5 files changed, 2 insertions(+), 153 deletions(-) diff --git a/build/lib/cli/setup/applications.py b/build/lib/cli/setup/applications.py index 7e8d72ca..b7225159 100644 --- a/build/lib/cli/setup/applications.py +++ b/build/lib/cli/setup/applications.py @@ -5,6 +5,7 @@ import sys from pathlib import Path from module_utils.dict_renderer import DictRenderer from lookup_plugins.application_gid import LookupModule +import subprocess def load_yaml_file(path: Path) -> dict: if not path.exists(): diff --git a/build/lib/module_utils/role_dependency_resolver.py b/build/lib/module_utils/role_dependency_resolver.py index cadb7c5a..ca13a788 100644 --- a/build/lib/module_utils/role_dependency_resolver.py +++ b/build/lib/module_utils/role_dependency_resolver.py @@ -195,47 +195,6 @@ class RoleDependencyResolver: else: out.add(pattern) - def test_jinja_mixed_name_glob_matching(self): - """ - include_role: - name: "prefix-{{ item }}-suffix" - loop: [x, y] - Existing roles: prefix-x-suffix, prefix-y-suffix, prefix-z-suffix - - Expectation: - - NO raw loop items ('x', 'y') end up as roles - - Glob matching resolves to all three concrete roles - """ - make_role(self.roles_dir, "A") - for rn in ["prefix-x-suffix", "prefix-y-suffix", "prefix-z-suffix"]: - make_role(self.roles_dir, rn) - - write( - os.path.join(self.roles_dir, "A", "tasks", "main.yml"), - """ - - name: jinja-mixed glob - include_role: - name: "prefix-{{ item }}-suffix" - loop: - - x - - y - """ - ) - - r = RoleDependencyResolver(self.roles_dir) - deps = r.get_role_dependencies("A") - - # ensure no raw loop items leak into the results - self.assertNotIn("x", deps) - self.assertNotIn("y", deps) - - # only the resolved role names should be present - self.assertEqual( - deps, - {"prefix-x-suffix", "prefix-y-suffix", "prefix-z-suffix"}, - ) - - # -------------------------- meta helpers -------------------------- def _extract_meta_dependencies(self, role_path: str) -> Set[str]: diff --git a/cli/setup/applications.py b/cli/setup/applications.py index 7e8d72ca..840b647c 100644 --- a/cli/setup/applications.py +++ b/cli/setup/applications.py @@ -2,6 +2,7 @@ import argparse import yaml import sys +import subprocess from pathlib import Path from module_utils.dict_renderer import DictRenderer from lookup_plugins.application_gid import LookupModule diff --git a/module_utils/role_dependency_resolver.py b/module_utils/role_dependency_resolver.py index cadb7c5a..ca13a788 100644 --- a/module_utils/role_dependency_resolver.py +++ b/module_utils/role_dependency_resolver.py @@ -195,47 +195,6 @@ class RoleDependencyResolver: else: out.add(pattern) - def test_jinja_mixed_name_glob_matching(self): - """ - include_role: - name: "prefix-{{ item }}-suffix" - loop: [x, y] - Existing roles: prefix-x-suffix, prefix-y-suffix, prefix-z-suffix - - Expectation: - - NO raw loop items ('x', 'y') end up as roles - - Glob matching resolves to all three concrete roles - """ - make_role(self.roles_dir, "A") - for rn in ["prefix-x-suffix", "prefix-y-suffix", "prefix-z-suffix"]: - make_role(self.roles_dir, rn) - - write( - os.path.join(self.roles_dir, "A", "tasks", "main.yml"), - """ - - name: jinja-mixed glob - include_role: - name: "prefix-{{ item }}-suffix" - loop: - - x - - y - """ - ) - - r = RoleDependencyResolver(self.roles_dir) - deps = r.get_role_dependencies("A") - - # ensure no raw loop items leak into the results - self.assertNotIn("x", deps) - self.assertNotIn("y", deps) - - # only the resolved role names should be present - self.assertEqual( - deps, - {"prefix-x-suffix", "prefix-y-suffix", "prefix-z-suffix"}, - ) - - # -------------------------- meta helpers -------------------------- def _extract_meta_dependencies(self, role_path: str) -> Set[str]: diff --git a/tests/unit/module_utils/test_role_dependency_resolver.py b/tests/unit/module_utils/test_role_dependency_resolver.py index e9259bcc..a5bf1288 100644 --- a/tests/unit/module_utils/test_role_dependency_resolver.py +++ b/tests/unit/module_utils/test_role_dependency_resolver.py @@ -95,46 +95,6 @@ class TestRoleDependencyResolver(unittest.TestCase): deps = r.get_role_dependencies("A") self.assertEqual(deps, {"D", "E", "F", "G"}) -def test_jinja_mixed_name_glob_matching(self): - """ - include_role: - name: "prefix-{{ item }}-suffix" - loop: [x, y] - Existierende Rollen: prefix-x-suffix, prefix-y-suffix, prefix-z-suffix - - Erwartung: - - KEINE Roh-Items ('x', 'y') als Rollen - - Glob-Matching liefert die drei konkreten Rollen - """ - make_role(self.roles_dir, "A") - for rn in ["prefix-x-suffix", "prefix-y-suffix", "prefix-z-suffix"]: - make_role(self.roles_dir, rn) - - write( - os.path.join(self.roles_dir, "A", "tasks", "main.yml"), - """ - - name: jinja-mixed glob - include_role: - name: "prefix-{{ item }}-suffix" - loop: - - x - - y - """ - ) - - r = RoleDependencyResolver(self.roles_dir) - deps = r.get_role_dependencies("A") - - # keine Roh-Loop-Items - self.assertNotIn("x", deps) - self.assertNotIn("y", deps) - - # erwartete Rollen aus dem Glob-Matching - self.assertEqual( - deps, - {"prefix-x-suffix", "prefix-y-suffix", "prefix-z-suffix"}, - ) - def test_pure_jinja_ignored_without_loop(self): """ name: "{{ something }}" with no loop should be ignored. @@ -254,37 +214,6 @@ def test_jinja_mixed_name_glob_matching(self): depth_one = r.resolve_transitively(["A"], max_depth=1) self.assertEqual(depth_one, {"A", "B"}) - def test_tolerant_scan_fallback_on_invalid_yaml(self): - """ - Force yaml.safe_load_all to fail and ensure tolerant scan picks up: - - include_role literal name - - loop list items - """ - make_role(self.roles_dir, "A") - for rn in ["R1", "R2", "R3"]: - make_role(self.roles_dir, rn) - - # Invalid YAML (e.g., stray colon) to trigger exception - write( - os.path.join(self.roles_dir, "A", "tasks", "broken.yml"), - """ - include_role: - name: R1 - :: this line breaks YAML :: - - - include_role: - name: "{{ item }}" - loop: - - R2 - - R3 - """ - ) - - r = RoleDependencyResolver(self.roles_dir) - inc, imp = r._scan_tasks(os.path.join(self.roles_dir, "A")) - self.assertTrue({"R1", "R2", "R3"}.issubset(inc)) - self.assertEqual(imp, set()) - def test_resolve_transitively_combined_sources(self): """ Combined test: include/import + dependencies (+ optional run_after).