mirror of
https://github.com/kevinveenbirkenbach/computer-playbook.git
synced 2025-07-18 22:44:24 +02:00
38 lines
1.3 KiB
Python
38 lines
1.3 KiB
Python
import unittest
|
||
import re
|
||
from pathlib import Path
|
||
|
||
# Regex:
|
||
# - one or more lowercase letters, digits or hyphens
|
||
# - optionally exactly one '_' followed by one or more lowercase letters, digits or hyphens
|
||
ROLE_NAME_PATTERN = re.compile(r'^[a-z0-9-]+(?:_[a-z0-9-]+)?$')
|
||
|
||
class TestRoleNames(unittest.TestCase):
|
||
def test_role_names_follow_naming_convention(self):
|
||
# go up from tests/integration/test_roles_naming.py to project root, then into roles/
|
||
roles_dir = Path(__file__).resolve().parents[2] / "roles"
|
||
self.assertTrue(
|
||
roles_dir.is_dir(),
|
||
f"'roles/' directory not found at {roles_dir}"
|
||
)
|
||
|
||
invalid_names = []
|
||
for role_path in roles_dir.iterdir():
|
||
if not role_path.is_dir():
|
||
# skip non-directories
|
||
continue
|
||
|
||
name = role_path.name
|
||
if not ROLE_NAME_PATTERN.fullmatch(name):
|
||
invalid_names.append(name)
|
||
|
||
self.assertFalse(
|
||
invalid_names,
|
||
"The following role directory names violate the naming convention "
|
||
"(only a–z, 0–9, '-', max one '_', and '_' must be followed by at least one character):\n"
|
||
+ "\n".join(f"- {n}" for n in invalid_names)
|
||
)
|
||
|
||
if __name__ == "__main__":
|
||
unittest.main()
|