mirror of
https://github.com/kevinveenbirkenbach/computer-playbook.git
synced 2025-07-07 17:15:15 +02:00
73 lines
2.8 KiB
Python
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()
|