# tests/integration/test_central_database_config.py import unittest from pathlib import Path import yaml def load_yaml(path: Path): """Load a YAML file and return dict ({} if missing/empty).""" if not path.exists(): return {} with path.open("r", encoding="utf-8") as f: return yaml.safe_load(f) or {} class TestCentralDatabaseConfig(unittest.TestCase): def test_central_database_feature_requires_database_service(self): """ If features.central_database is defined in either vars/main.yml or config/main.yml, then config/main.yml must define docker.services.database. """ repo_root = Path(__file__).resolve().parents[2] roles_dir = repo_root / "roles" violations = [] for role_dir in sorted(roles_dir.glob("*")): if not role_dir.is_dir(): continue vars_file = role_dir / "vars" / "main.yml" cfg_file = role_dir / "config" / "main.yml" vars_data = load_yaml(vars_file) cfg_data = load_yaml(cfg_file) # Check if the feature key is defined in either file (value is irrelevant). vars_features = vars_data.get("features", {}) if isinstance(vars_data.get("features"), dict) else {} cfg_features = cfg_data.get("features", {}) if isinstance(cfg_data.get("features"), dict) else {} central_defined = ("central_database" in vars_features) or ("central_database" in cfg_features) if not central_defined: continue # Require docker.services.database in config/main.yml docker = cfg_data.get("docker", {}) services = docker.get("services", {}) if isinstance(docker, dict) else {} if "database" not in services: violations.append(role_dir.name) if violations: self.fail( "The 'central_database' feature is only available if 'docker.services.database' " "is defined in config/main.yml. Missing in roles:\n" + "\n".join(f"- {name}" for name in violations) ) if __name__ == "__main__": unittest.main()