mirror of
https://github.com/kevinveenbirkenbach/computer-playbook.git
synced 2025-07-05 08:23:08 +02:00
135 lines
4.1 KiB
Python
135 lines
4.1 KiB
Python
import unittest
|
|
import tempfile
|
|
import shutil
|
|
import os
|
|
from pathlib import Path
|
|
import subprocess
|
|
import sys
|
|
import yaml
|
|
|
|
SCRIPT_PATH = os.path.abspath(os.path.join(os.path.dirname(__file__), "../../../cli/validate_inventory.py"))
|
|
|
|
class TestValidateInventory(unittest.TestCase):
|
|
def setUp(self):
|
|
self.temp_dir = tempfile.mkdtemp()
|
|
self.group_vars_all = Path(self.temp_dir) / "group_vars" / "all"
|
|
self.group_vars_all.mkdir(parents=True)
|
|
|
|
self.inventory_dir = Path(self.temp_dir) / "inventory"
|
|
self.inventory_dir.mkdir()
|
|
|
|
# Create default applications file
|
|
self.default_applications = {
|
|
"defaults_applications": {
|
|
"app1": {
|
|
"port": 8080,
|
|
"enabled": True,
|
|
"settings": {
|
|
"theme": "dark"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
(self.group_vars_all / "01_applications.yml").write_text(
|
|
yaml.dump(self.default_applications), encoding="utf-8"
|
|
)
|
|
|
|
# Create default users file
|
|
self.default_users = {
|
|
"default_users": {
|
|
"alice": {
|
|
"email": "alice@example.com",
|
|
"role": "admin"
|
|
}
|
|
}
|
|
}
|
|
(self.group_vars_all / "01_users.yml").write_text(
|
|
yaml.dump(self.default_users), encoding="utf-8"
|
|
)
|
|
|
|
def tearDown(self):
|
|
shutil.rmtree(self.temp_dir)
|
|
|
|
def run_script(self, expected_code=0):
|
|
result = subprocess.run(
|
|
[sys.executable, SCRIPT_PATH, str(self.inventory_dir)],
|
|
stdout=subprocess.PIPE,
|
|
stderr=subprocess.PIPE,
|
|
encoding="utf-8",
|
|
cwd=self.temp_dir
|
|
)
|
|
if result.returncode != expected_code:
|
|
print("STDOUT:", result.stdout)
|
|
print("STDERR:", result.stderr)
|
|
return result
|
|
|
|
def test_valid_inventory(self):
|
|
(self.inventory_dir / "group_vars.yml").write_text(yaml.dump({
|
|
"applications": {
|
|
"app1": {
|
|
"port": 8080,
|
|
"enabled": True,
|
|
"settings": {
|
|
"theme": "dark"
|
|
}
|
|
}
|
|
},
|
|
"users": {
|
|
"alice": {
|
|
"email": "alice@example.com",
|
|
"role": "admin",
|
|
"password": "secret"
|
|
}
|
|
}
|
|
}), encoding="utf-8")
|
|
|
|
result = self.run_script(expected_code=0)
|
|
self.assertIn("Inventory directory is valid against defaults", result.stdout)
|
|
|
|
def test_unknown_user_warning(self):
|
|
(self.inventory_dir / "invalid_users.yml").write_text(yaml.dump({
|
|
"users": {
|
|
"bob": {
|
|
"email": "bob@example.com",
|
|
"role": "user"
|
|
}
|
|
}
|
|
}), encoding="utf-8")
|
|
|
|
result = self.run_script(expected_code=0)
|
|
self.assertIn("Warning", result.stderr)
|
|
|
|
def test_missing_user_key_fails(self):
|
|
(self.inventory_dir / "invalid_key.yml").write_text(yaml.dump({
|
|
"users": {
|
|
"alice": {
|
|
"email": "alice@example.com",
|
|
"role": "admin",
|
|
"extra": "unexpected"
|
|
}
|
|
}
|
|
}), encoding="utf-8")
|
|
|
|
result = self.run_script(expected_code=1)
|
|
self.assertIn("Missing default for user 'alice': key 'extra'", result.stderr)
|
|
|
|
def test_missing_application_key_fails(self):
|
|
(self.inventory_dir / "missing_key.yml").write_text(yaml.dump({
|
|
"applications": {
|
|
"app1": {
|
|
"port": 8080,
|
|
"enabled": True,
|
|
"settings": {
|
|
"theme": "dark"
|
|
},
|
|
"extra_setting": True
|
|
}
|
|
}
|
|
}), encoding="utf-8")
|
|
|
|
result = self.run_script(expected_code=1)
|
|
self.assertIn("Missing default for app1: extra_setting", result.stdout)
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|