computer-playbook/tests/integration/disabled_test_readme_schema.py

73 lines
2.8 KiB
Python

import unittest
import re
import yaml
from pathlib import Path
# Define the required schema headings
REQUIRED_HEADINGS = [
"Description",
"Overview",
"Features",
"Further Resources",
]
class TestReadmeSchema(unittest.TestCase):
def test_readme_has_required_sections_and_title(self):
"""
Integration test that verifies each role's README.md contains all required sections
and, if vars/main.yml exists, that the title contains the application_id (case-insensitive).
"""
# Determine the roles directory (two levels up from current file)
roles_dir = Path(__file__).parents[2] / 'roles'
self.assertTrue(roles_dir.exists(), f"Roles directory not found at {roles_dir}")
for role_dir in roles_dir.iterdir():
if not role_dir.is_dir():
continue
with self.subTest(role=role_dir.name):
# Check README.md exists
readme_path = role_dir / 'README.md'
self.assertTrue(
readme_path.exists(),
f"Role '{role_dir.name}' is missing a README.md"
)
content = readme_path.read_text(encoding='utf-8')
# Verify required headings are present (multiline)
for heading in REQUIRED_HEADINGS:
pattern = rf"(?m)^##\s+{re.escape(heading)}"
self.assertRegex(
content,
pattern,
f"README.md for role '{role_dir.name}' is missing required section: '{heading}'"
)
# If vars/main.yml exists, check application_id and title
vars_path = role_dir / 'vars' / 'main.yml'
if vars_path.exists():
vars_content = vars_path.read_text(encoding='utf-8')
try:
data = yaml.safe_load(vars_content)
except Exception as e:
self.fail(f"Failed to parse YAML for role '{role_dir.name}': {e}")
app_id = data.get('application_id')
self.assertIsNotNone(
app_id,
f"application_id not found in {vars_path} for role '{role_dir.name}'"
)
# Verify README title contains application_id (case-insensitive, multiline)
title_regex = re.compile(
rf"(?mi)^#.*{re.escape(str(app_id))}.*"
)
self.assertRegex(
content,
title_regex,
f"README.md title does not contain application_id '{app_id}' for role '{role_dir.name}'"
)
if __name__ == '__main__':
unittest.main()