# Module: Configuration Testing Utilities # Purpose: Provides testing infrastructure for configuration loading, interpolation, and validation. # Dependencies: interpolators, validators # Configuration Loader - Testing and Interpolation Functions # Provides testing utilities for configuration loading and interpolation # Selective imports (ADR-025 Phase 3 Layer 2). # config/interpolators star-import was dead โ€” dropped. use domain/config/validators.nu [validate-interpolation] # Test interpolation with sample data export def test-interpolation [ --sample: string = "basic" # Sample test data: basic, advanced, all ] { print "๐Ÿงช Testing Enhanced Interpolation System" print "" # Define test configurations based on sample type let test_config = match $sample { "basic" => { paths: { base: "/usr/local/provisioning" } test_patterns: { simple_path: "{{paths.base}}/config" env_home: "{{env.HOME}}/configs" current_date: "backup-{{now.date}}" } } "advanced" => { paths: { base: "/usr/local/provisioning" } providers: { aws: { region: "us-west-2" }, default: "aws" } sops: { key_file: "{{env.HOME}}/.age/key.txt" } test_patterns: { complex_path: "{{path.join(paths.base, \"custom\")}}" provider_ref: "Region: {{providers.aws.region}}" git_info: "Build: {{git.branch}}-{{git.commit}}" conditional: "{{env.HOME || \"/tmp\"}}/cache" } } _ => { paths: { base: "/usr/local/provisioning" } providers: { aws: { region: "us-west-2" }, default: "aws" } sops: { key_file: "{{env.HOME}}/.age/key.txt", config_path: "/etc/sops.yaml" } current_environment: "test" test_patterns: { all_patterns: "{{paths.base}}/{{env.USER}}/{{now.date}}/{{git.branch}}/{{providers.default}}" function_call: "{{path.join(paths.base, \"providers\")}}" sops_refs: "Key: {{sops.key_file}}, Config: {{sops.config_path}}" datetime: "{{now.date}} at {{now.timestamp}}" } } } # Test interpolation print $"Testing with ($sample) sample configuration..." print "" let base_path = "/usr/local/provisioning" let interpolated_config = (interpolate-all-paths $test_config $base_path) # Show results print "๐Ÿ“‹ Original patterns:" for key in ($test_config.test_patterns | columns) { let original = ($test_config.test_patterns | get $key) print $" ($key): ($original)" } print "" print "โœจ Interpolated results:" for key in ($interpolated_config.test_patterns | columns) { let interpolated = ($interpolated_config.test_patterns | get $key) print $" ($key): ($interpolated)" } print "" # Validate interpolation let validation = (validate-interpolation $test_config --detailed true) if $validation.valid { print "โœ… Interpolation validation passed" } else { print "โŒ Interpolation validation failed:" for error in $validation.errors { print $" Error: ($error.message)" } } if ($validation.warnings | length) > 0 { print "โš ๏ธ Warnings:" for warning in $validation.warnings { print $" Warning: ($warning.message)" } } print "" print $"๐Ÿ“Š Summary: ($validation.summary.interpolation_patterns_detected) interpolation patterns processed" $interpolated_config } # Create comprehensive interpolation test suite export def create-interpolation-test-suite [ --output-file: string = "interpolation_test_results.json" ] { print "๐Ÿงช Creating Comprehensive Interpolation Test Suite" print "==================================================" print "" mut test_results = [] # Test 1: Basic patterns print "๐Ÿ” Test 1: Basic Interpolation Patterns" let basic_test = (run-interpolation-test "basic") $test_results = ($test_results | append { test_name: "basic_patterns" passed: $basic_test.passed details: $basic_test.details timestamp: (date now | format date "%Y-%m-%d %H:%M:%S") }) # Test 2: Environment variables print "๐Ÿ” Test 2: Environment Variable Interpolation" let env_test = (run-interpolation-test "environment") $test_results = ($test_results | append { test_name: "environment_variables" passed: $env_test.passed details: $env_test.details timestamp: (date now | format date "%Y-%m-%d %H:%M:%S") }) # Test 3: Security validation print "๐Ÿ” Test 3: Security Validation" let security_test = (run-security-test) $test_results = ($test_results | append { test_name: "security_validation" passed: $security_test.passed details: $security_test.details timestamp: (date now | format date "%Y-%m-%d %H:%M:%S") }) # Test 4: Advanced patterns print "๐Ÿ” Test 4: Advanced Interpolation Features" let advanced_test = (run-interpolation-test "advanced") $test_results = ($test_results | append { test_name: "advanced_patterns" passed: $advanced_test.passed details: $advanced_test.details timestamp: (date now | format date "%Y-%m-%d %H:%M:%S") }) # Save results $test_results | to json | save --force $output_file # Summary let total_tests = ($test_results | length) let passed_tests = ($test_results | where passed == true | length) let failed_tests = ($total_tests - $passed_tests) print "" print "๐Ÿ“Š Test Suite Summary" print "====================" print $" Total tests: ($total_tests)" print $" Passed: ($passed_tests)" print $" Failed: ($failed_tests)" print "" if $failed_tests == 0 { print "โœ… All interpolation tests passed!" } else { print "โŒ Some interpolation tests failed!" print "" print "Failed tests:" for test in ($test_results | where passed == false) { print $" โ€ข ($test.test_name): ($test.details.error)" } } print "" print $"๐Ÿ“„ Detailed results saved to: ($output_file)" { total: $total_tests passed: $passed_tests failed: $failed_tests success_rate: (($passed_tests * 100) / $total_tests) results: $test_results } } # Run individual interpolation test def run-interpolation-test [ test_type: string ] { let test_result = (do { match $test_type { "basic" => { let test_config = { paths: { base: "/test/path" } test_value: "{{paths.base}}/config" } let result = (interpolate-all-paths $test_config "/test/path") let expected = "/test/path/config" let actual = ($result.test_value) if $actual == $expected { { passed: true, details: { expected: $expected, actual: $actual } } } else { { passed: false, details: { expected: $expected, actual: $actual, error: "Value mismatch" } } } } "environment" => { let test_config = { paths: { base: "/test/path" } test_value: "{{env.USER}}/config" } let result = (interpolate-all-paths $test_config "/test/path") let expected_pattern = ".*/config" # USER should be replaced with something if ($result.test_value | str contains "/config") and not ($result.test_value | str contains "{{env.USER}}") { { passed: true, details: { pattern: $expected_pattern, actual: $result.test_value } } } else { { passed: false, details: { pattern: $expected_pattern, actual: $result.test_value, error: "Environment variable not interpolated" } } } } "advanced" => { let test_config = { paths: { base: "/test/path" } current_environment: "test" test_values: { date_test: "backup-{{now.date}}" git_test: "build-{{git.branch}}" } } let result = (interpolate-all-paths $test_config "/test/path") # Check if date was interpolated (should not contain {{now.date}}) let date_ok = not ($result.test_values.date_test | str contains "{{now.date}}") # Check if git was interpolated (should not contain {{git.branch}}) let git_ok = not ($result.test_values.git_test | str contains "{{git.branch}}") if $date_ok and $git_ok { { passed: true, details: { date_result: $result.test_values.date_test, git_result: $result.test_values.git_test } } } else { { passed: false, details: { date_result: $result.test_values.date_test, git_result: $result.test_values.git_test, error: "Advanced patterns not interpolated" } } } } _ => { { passed: false, details: { error: $"Unknown test type: ($test_type)" } } } } } | complete) if $test_result.exit_code != 0 { { passed: false, details: { error: $"Test execution failed: ($test_result.stderr)" } } } else { $test_result.stdout } } # Run security validation test def run-security-test [] { let security_result = (do { # Test 1: Safe configuration should pass let safe_config = { paths: { base: "/safe/path" } test_value: "{{env.HOME}}/config" } let safe_result = (validate-interpolation-security $safe_config false) # Test 2: Unsafe configuration should fail let unsafe_config = { paths: { base: "/unsafe/path" } test_value: "{{env.PATH}}/config" # PATH is considered unsafe } let unsafe_result = (validate-interpolation-security $unsafe_config false) if $safe_result.valid and (not $unsafe_result.valid) { { passed: true, details: { safe_passed: $safe_result.valid, unsafe_blocked: (not $unsafe_result.valid) } } } else { { passed: false, details: { safe_passed: $safe_result.valid, unsafe_blocked: (not $unsafe_result.valid), error: "Security validation not working correctly" } } } } | complete) if $security_result.exit_code != 0 { { passed: false, details: { error: $"Security test execution failed: ($security_result.stderr)" } } } else { $security_result.stdout } }