Merge _configs/ into config/ for single configuration directory. Update all path references. Changes: - Move _configs/* to config/ - Update .gitignore for new patterns - No code references to _configs/ found Impact: -1 root directory (layout_conventions.md compliance)
229 lines
7.4 KiB
Plaintext
229 lines
7.4 KiB
Plaintext
#!/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
|
|
}
|