Files
computer-playbook/tests/integration/infrastructure/services/test_canonical.py
kevinveenbirkenbachandClaude Opus 4.7 4ac7a95ec6 refactor(tests): split overflowing folders into thematic subdirs
Reorganises four folders that exceeded the 12-item readability limit:

- tests/lint/repository/ (27 -> 11): structure/, naming/, documentation/,
  python/, dependencies/, shell/, yaml/, network/, settings/
- tests/integration/ (25 -> 7): ansible/, infrastructure/, iam/, meta/
  (24 sibling dirs grouped under 4 super-categories)
- tests/integration/roles/ (13 -> 10): naming/, playwright/, dashboard/
- tests/unit/utils/ (15 -> 12): certs/ for 3 cert/TLS test files

Renames 7 test files whose name duplicated the new folder name
(e.g. test_no_direct_yaml_calls.py -> yaml/test_no_direct_calls.py,
test_dashboard_integration_scope.py -> dashboard/test_integration_scope.py).

Adjusts parents[N] in moved __init__.py files, fixes __file__-based
path resolution in 8 tests, updates self-path whitelists, and uses
absolute imports for PROJECT_ROOT re-exports (ruff TID252).

Adds README.md to each new subfolder following the existing scope
template. Updates all docs links (suppression.md, base.md, email.md,
playwright spec/parity docs, 005-/019- requirements) to new paths.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-15 14:23:32 +02:00

78 lines
2.7 KiB
Python

import unittest
from collections import defaultdict
from utils.roles.applications.services.registry import (
build_service_registry_from_roles_dir,
)
from . import PROJECT_ROOT
class TestServicesCanonical(unittest.TestCase):
"""Discovered canonical aliases from role-local configs must be internally consistent."""
def setUp(self):
self.repo_root = PROJECT_ROOT
self.service_registry = build_service_registry_from_roles_dir(
self.repo_root / "roles"
)
self.assertGreater(
len(self.service_registry),
0,
"discovered service registry must not be empty",
)
self.role_to_keys = defaultdict(list)
for key, entry in self.service_registry.items():
role = entry.get("role")
if role:
self.role_to_keys[role].append(key)
def test_shared_roles_have_exactly_one_primary_key(self):
for role, keys in self.role_to_keys.items():
if len(keys) < 2:
continue
primaries = [k for k in keys if "canonical" not in self.service_registry[k]]
with self.subTest(role=role):
self.assertEqual(len(primaries), 1)
def test_canonical_target_exists(self):
for key, entry in self.service_registry.items():
canonical = entry.get("canonical")
if canonical is None:
continue
with self.subTest(key=key):
self.assertIn(canonical, self.service_registry)
def test_canonical_target_has_same_role(self):
for key, entry in self.service_registry.items():
canonical = entry.get("canonical")
if canonical is None:
continue
with self.subTest(key=key):
self.assertEqual(
entry.get("role"),
self.service_registry[canonical].get("role"),
)
def test_canonical_target_is_not_itself_an_alias(self):
for key, entry in self.service_registry.items():
canonical = entry.get("canonical")
if canonical is None:
continue
with self.subTest(key=key):
self.assertNotIn("canonical", self.service_registry[canonical])
def test_unique_roles_do_not_declare_canonical(self):
for key, entry in self.service_registry.items():
canonical = entry.get("canonical")
if canonical is None:
continue
role = entry.get("role")
with self.subTest(key=key):
self.assertGreater(len(self.role_to_keys.get(role, [])), 1)
if __name__ == "__main__":
unittest.main()