mirror of
https://github.com/kevinveenbirkenbach/computer-playbook.git
synced 2025-12-19 07:13:06 +00:00
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:
@@ -5,6 +5,7 @@ import sys
|
|||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from module_utils.dict_renderer import DictRenderer
|
from module_utils.dict_renderer import DictRenderer
|
||||||
from lookup_plugins.application_gid import LookupModule
|
from lookup_plugins.application_gid import LookupModule
|
||||||
|
import subprocess
|
||||||
|
|
||||||
def load_yaml_file(path: Path) -> dict:
|
def load_yaml_file(path: Path) -> dict:
|
||||||
if not path.exists():
|
if not path.exists():
|
||||||
|
|||||||
@@ -195,47 +195,6 @@ class RoleDependencyResolver:
|
|||||||
else:
|
else:
|
||||||
out.add(pattern)
|
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 --------------------------
|
# -------------------------- meta helpers --------------------------
|
||||||
|
|
||||||
def _extract_meta_dependencies(self, role_path: str) -> Set[str]:
|
def _extract_meta_dependencies(self, role_path: str) -> Set[str]:
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
import argparse
|
import argparse
|
||||||
import yaml
|
import yaml
|
||||||
import sys
|
import sys
|
||||||
|
import subprocess
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from module_utils.dict_renderer import DictRenderer
|
from module_utils.dict_renderer import DictRenderer
|
||||||
from lookup_plugins.application_gid import LookupModule
|
from lookup_plugins.application_gid import LookupModule
|
||||||
|
|||||||
@@ -195,47 +195,6 @@ class RoleDependencyResolver:
|
|||||||
else:
|
else:
|
||||||
out.add(pattern)
|
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 --------------------------
|
# -------------------------- meta helpers --------------------------
|
||||||
|
|
||||||
def _extract_meta_dependencies(self, role_path: str) -> Set[str]:
|
def _extract_meta_dependencies(self, role_path: str) -> Set[str]:
|
||||||
|
|||||||
@@ -95,46 +95,6 @@ class TestRoleDependencyResolver(unittest.TestCase):
|
|||||||
deps = r.get_role_dependencies("A")
|
deps = r.get_role_dependencies("A")
|
||||||
self.assertEqual(deps, {"D", "E", "F", "G"})
|
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):
|
def test_pure_jinja_ignored_without_loop(self):
|
||||||
"""
|
"""
|
||||||
name: "{{ something }}" with no loop should be ignored.
|
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)
|
depth_one = r.resolve_transitively(["A"], max_depth=1)
|
||||||
self.assertEqual(depth_one, {"A", "B"})
|
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):
|
def test_resolve_transitively_combined_sources(self):
|
||||||
"""
|
"""
|
||||||
Combined test: include/import + dependencies (+ optional run_after).
|
Combined test: include/import + dependencies (+ optional run_after).
|
||||||
|
|||||||
Reference in New Issue
Block a user