import re import sys import unittest from . import PROJECT_ROOT ROOT = str(PROJECT_ROOT) sys.path.insert(0, ROOT) from cli.meta.roles.applications.all import find_application_ids # noqa: E402 from utils.cache.files import iter_project_files_with_content # noqa: E402 class TestValidApplicationUsage(unittest.TestCase): """ Integration test to ensure that only valid application IDs are used in all .yml, .yaml, .yml.j2, .yaml.j2, and .py files. It detects: - lookup('applications', 'name') (canonical applications lookup) - get_domain('name') (filter helper for domain resolution) Dynamic calls such as lookup('applications', application_id) are not validated here, because the app ID is a runtime variable. """ LOOKUP_APPLICATIONS_RE = re.compile( r"lookup\(\s*['\"]applications['\"]\s*,\s*['\"](?P[^'\"]+)['\"]" ) APPLICATION_DOMAIN_RE = re.compile( r"get_domain\(\s*['\"](?P[^'\"]+)['\"]\s*\)" ) @staticmethod def _line_no_and_col(content: str, index: int) -> tuple[int, int]: """ Return 1-based (line_no, col) for a 0-based absolute index into content. """ line_no = content.count("\n", 0, index) + 1 line_start = content.rfind("\n", 0, index) + 1 col = (index - line_start) + 1 return line_no, col def test_application_references_use_valid_ids(self): valid_apps = find_application_ids() patterns = ( self.LOOKUP_APPLICATIONS_RE, self.APPLICATION_DOMAIN_RE, ) for filepath, content in iter_project_files_with_content( extensions=(".yml", ".yaml", ".yml.j2", ".yaml.j2", ".py"), exclude_tests=True, ): for pattern in patterns: for match in pattern.finditer(content): start = match.start() line_start = content.rfind("\n", 0, start) + 1 line_end = content.find("\n", start) line = content[line_start : line_end if line_end != -1 else None] if line.strip().startswith(("import ", "from ")): continue name = match.group("name") line_no, col = self._line_no_and_col(content, start) self.assertIn( name, valid_apps, msg=( f"{filepath}: reference to application '{name}' is invalid.\n" f"Location: line {line_no}, col {col}\n" f"Line: {line.rstrip()}\n" f"Known IDs: {sorted(valid_apps)}" ), ) if __name__ == "__main__": unittest.main()