syntaxis/tests/provisioning/test-presets.nu

229 lines
7.4 KiB
Plaintext
Raw Permalink Normal View History

#!/usr/bin/env nu
# test-presets.nu - Tests for installation presets
#
# Tests validate that all presets are properly configured and valid
# Test 1: Load configuration file
def test_load_config [] {
let config = (try {
open "configs/installation.toml"
} catch {
error make { msg: "Failed to load configs/installation.toml" }
})
assert ($config | type) == "record"
print "✓ test_load_config passed"
}
# Test 2: All required presets exist
def test_all_required_presets_exist [] {
let config = (open "configs/installation.toml")
let presets = ($config | get preset | keys)
let required = ["local", "minimal", "dev", "staging", "production", "custom"]
for required_preset in $required {
assert ($presets | contains [$required_preset]) $"Missing preset: ($required_preset)"
}
print "✓ test_all_required_presets_exist passed"
}
# Test 3: Preset structure validation
def test_preset_structure [] {
let config = (open "configs/installation.toml")
let presets = ($config | get preset)
for preset_name in ($presets | keys) {
let preset = ($presets | get $preset_name)
# Required fields
assert ($preset | has "name") $"Preset ($preset_name) missing 'name'"
assert ($preset | has "description") $"Preset ($preset_name) missing 'description'"
assert ($preset | has "database_backend") $"Preset ($preset_name) missing 'database_backend'"
# Validate types
assert (($preset.name | type) == "string") $"Preset ($preset_name) 'name' not string"
assert (($preset.description | type) == "string") $"Preset ($preset_name) 'description' not string"
}
print "✓ test_preset_structure passed"
}
# Test 4: Database backend validation
def test_database_backends [] {
let config = (open "configs/installation.toml")
let presets = ($config | get preset)
let valid_backends = ["sqlite", "surrealdb", "none"]
for preset_name in ($presets | keys) {
let backend = ($presets | get $preset_name | get database_backend)
assert ($valid_backends | contains [$backend]) $"Invalid database backend for ($preset_name): ($backend)"
}
print "✓ test_database_backends passed"
}
# Test 5: Services configuration for each preset
def test_services_configuration [] {
let config = (open "configs/installation.toml")
let presets = ($config | get preset)
for preset_name in ($presets | keys) {
let preset = ($presets | get $preset_name)
if ($preset | has "services") {
let services = ($preset.services)
# Each service should be a record with enabled field
for service_name in ($services | keys) {
let service = ($services | get $service_name)
assert ($service | has "enabled") $"Service ($service_name) in preset ($preset_name) missing 'enabled' field"
}
}
}
print "✓ test_services_configuration passed"
}
# Test 6: provctl configuration
def test_provctl_configuration [] {
let config = (open "configs/installation.toml")
let presets = ($config | get preset)
let valid_modes = ["auto", "required", "disabled"]
for preset_name in ($presets | keys) {
let preset = ($presets | get $preset_name)
if ($preset | has "provctl_required") {
let required = ($preset.provctl_required)
assert (($required | type) == "bool") $"provctl_required in ($preset_name) is not bool"
}
if ($preset | has "provctl_recommended") {
let recommended = ($preset.provctl_recommended)
assert (($recommended | type) == "bool") $"provctl_recommended in ($preset_name) is not bool"
}
}
print "✓ test_provctl_configuration passed"
}
# Test 7: Database configuration exists for each used backend
def test_database_config_completeness [] {
let config = (open "configs/installation.toml")
let presets = ($config | get preset)
let databases = ($config | get database)
let used_backends = (
$presets
| values
| map { |p| $p.database_backend }
| unique
| where { |b| $b != "none" }
)
for backend in $used_backends {
if ($backend == "sqlite") {
assert ($databases | has "sqlite") "sqlite database config missing"
} else if ($backend == "surrealdb") {
# SurrealDB config might be under subkeys
# Just verify databases exists
assert ($databases | keys | any { |k| $k | str contains "surrealdb" }) "No surrealdb database config found"
}
}
print "✓ test_database_config_completeness passed"
}
# Test 8: Service definitions file existence
def test_service_definitions_exist [] {
let required_services = ["surrealdb", "nats", "syntaxis-api"]
for service in $required_services {
let config_path = $"configs/provisioning/services/($service).toml"
assert ($config_path | path exists) $"Service definition missing: ($config_path)"
}
print "✓ test_service_definitions_exist passed"
}
# Test 9: Service definitions are valid TOML
def test_service_definitions_valid_toml [] {
let services = ["surrealdb", "nats", "syntaxis-api"]
for service in $services {
let config_path = $"configs/provisioning/services/($service).toml"
try {
let _ = (open $config_path)
} catch { |err|
error make { msg: $"Invalid TOML in ($config_path): ($err)" }
}
}
print "✓ test_service_definitions_valid_toml passed"
}
# Test 10: Service definitions have required fields
def test_service_definitions_structure [] {
let services = ["surrealdb", "nats", "syntaxis-api"]
for service in $services {
let config_path = $"configs/provisioning/services/($service).toml"
let config = (open $config_path)
assert ($config | has "service") $"($service).toml missing 'service' section"
assert ($config.service | has "name") $"($service).toml service missing 'name'"
assert ($config.service | has "description") $"($service).toml service missing 'description'"
# Optional but common fields
if ($config | has "health_check") {
assert ($config.health_check | has "type") $"($service).toml health_check missing 'type'"
}
}
print "✓ test_service_definitions_structure passed"
}
# Main test runner
def main [] {
print ""
print "Running preset validation tests..."
print "────────────────────────────────"
try {
test_load_config
test_all_required_presets_exist
test_preset_structure
test_database_backends
test_services_configuration
test_provctl_configuration
test_database_config_completeness
test_service_definitions_exist
test_service_definitions_valid_toml
test_service_definitions_structure
print "────────────────────────────────"
print "✓ All preset tests passed!"
print ""
} catch { |err|
print ""
print $"✗ Test failed: ($err)"
print ""
exit 1
}
}
# Helper: Simple assertion
def assert [condition: bool, message: string = "Assertion failed"] {
if not $condition {
error make { msg: $message }
}
}
if ($nu.invocation-dir == (pwd)) {
main
}