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
This commit is contained in:
2025-12-17 15:53:25 +01:00
parent c549febe8a
commit 9e6256dc6e
5 changed files with 2 additions and 153 deletions

View File

@@ -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():

View File

@@ -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]:

View File

@@ -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

View File

@@ -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]:

View File

@@ -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).