406 lines
11 KiB
Bash
406 lines
11 KiB
Bash
![]() |
#!/bin/bash
|
||
|
|
||
|
# Configuration Test Script for Rustelo
|
||
|
# Tests the configuration building and validation system
|
||
|
# Usage: ./test-config.sh
|
||
|
|
||
|
set -e
|
||
|
|
||
|
# Script configuration
|
||
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||
|
CONFIG_DIR="$(dirname "$SCRIPT_DIR")"
|
||
|
PROJECT_ROOT="$(dirname "$CONFIG_DIR")"
|
||
|
TEST_OUTPUT_DIR="$CONFIG_DIR/test_outputs"
|
||
|
ENVIRONMENTS=("dev" "prod" "example")
|
||
|
|
||
|
# Colors for output
|
||
|
RED='\033[0;31m'
|
||
|
GREEN='\033[0;32m'
|
||
|
YELLOW='\033[1;33m'
|
||
|
BLUE='\033[0;34m'
|
||
|
PURPLE='\033[0;35m'
|
||
|
NC='\033[0m' # No Color
|
||
|
|
||
|
# Test counters
|
||
|
TESTS_PASSED=0
|
||
|
TESTS_FAILED=0
|
||
|
TESTS_TOTAL=0
|
||
|
|
||
|
# Logging functions
|
||
|
log_info() {
|
||
|
echo -e "${BLUE}[INFO]${NC} $1"
|
||
|
}
|
||
|
|
||
|
log_success() {
|
||
|
echo -e "${GREEN}[SUCCESS]${NC} $1"
|
||
|
}
|
||
|
|
||
|
log_warning() {
|
||
|
echo -e "${YELLOW}[WARNING]${NC} $1"
|
||
|
}
|
||
|
|
||
|
log_error() {
|
||
|
echo -e "${RED}[ERROR]${NC} $1"
|
||
|
}
|
||
|
|
||
|
log_test() {
|
||
|
echo -e "${PURPLE}[TEST]${NC} $1"
|
||
|
}
|
||
|
|
||
|
# Test result functions
|
||
|
test_passed() {
|
||
|
local test_name="$1"
|
||
|
TESTS_PASSED=$((TESTS_PASSED + 1))
|
||
|
TESTS_TOTAL=$((TESTS_TOTAL + 1))
|
||
|
log_success "✓ $test_name"
|
||
|
}
|
||
|
|
||
|
test_failed() {
|
||
|
local test_name="$1"
|
||
|
local error_msg="$2"
|
||
|
TESTS_FAILED=$((TESTS_FAILED + 1))
|
||
|
TESTS_TOTAL=$((TESTS_TOTAL + 1))
|
||
|
log_error "✗ $test_name"
|
||
|
if [ -n "$error_msg" ]; then
|
||
|
log_error " Error: $error_msg"
|
||
|
fi
|
||
|
}
|
||
|
|
||
|
# Setup test environment
|
||
|
setup_test_environment() {
|
||
|
log_info "Setting up test environment..."
|
||
|
|
||
|
# Create test output directory
|
||
|
rm -rf "$TEST_OUTPUT_DIR"
|
||
|
mkdir -p "$TEST_OUTPUT_DIR"
|
||
|
|
||
|
# Check if required scripts exist
|
||
|
if [ ! -f "$SCRIPT_DIR/build-config.sh" ]; then
|
||
|
log_error "build-config.sh not found"
|
||
|
exit 1
|
||
|
fi
|
||
|
|
||
|
if [ ! -f "$SCRIPT_DIR/manage-config.sh" ]; then
|
||
|
log_error "manage-config.sh not found"
|
||
|
exit 1
|
||
|
fi
|
||
|
|
||
|
# Check if scripts are executable
|
||
|
if [ ! -x "$SCRIPT_DIR/build-config.sh" ]; then
|
||
|
chmod +x "$SCRIPT_DIR/build-config.sh"
|
||
|
fi
|
||
|
|
||
|
if [ ! -x "$SCRIPT_DIR/manage-config.sh" ]; then
|
||
|
chmod +x "$SCRIPT_DIR/manage-config.sh"
|
||
|
fi
|
||
|
|
||
|
log_success "Test environment setup complete"
|
||
|
}
|
||
|
|
||
|
# Test configuration building
|
||
|
test_build_configurations() {
|
||
|
log_info "Testing configuration building..."
|
||
|
|
||
|
for env in "${ENVIRONMENTS[@]}"; do
|
||
|
log_test "Building configuration for $env environment"
|
||
|
|
||
|
local output_file="$TEST_OUTPUT_DIR/config_${env}_test.toml"
|
||
|
|
||
|
if "$SCRIPT_DIR/build-config.sh" "$env" "$output_file" > /dev/null 2>&1; then
|
||
|
if [ -f "$output_file" ]; then
|
||
|
test_passed "Build $env configuration"
|
||
|
else
|
||
|
test_failed "Build $env configuration" "Output file not created"
|
||
|
fi
|
||
|
else
|
||
|
test_failed "Build $env configuration" "Build script failed"
|
||
|
fi
|
||
|
done
|
||
|
}
|
||
|
|
||
|
# Test configuration validation
|
||
|
test_validate_configurations() {
|
||
|
log_info "Testing configuration validation..."
|
||
|
|
||
|
for env in "${ENVIRONMENTS[@]}"; do
|
||
|
log_test "Validating configuration for $env environment"
|
||
|
|
||
|
if "$SCRIPT_DIR/manage-config.sh" validate "$env" > /dev/null 2>&1; then
|
||
|
test_passed "Validate $env configuration"
|
||
|
else
|
||
|
test_failed "Validate $env configuration" "Validation failed"
|
||
|
fi
|
||
|
done
|
||
|
}
|
||
|
|
||
|
# Test configuration file structure
|
||
|
test_configuration_structure() {
|
||
|
log_info "Testing configuration file structure..."
|
||
|
|
||
|
for env in "${ENVIRONMENTS[@]}"; do
|
||
|
log_test "Checking structure of $env configuration"
|
||
|
|
||
|
local config_file="$TEST_OUTPUT_DIR/config_${env}_test.toml"
|
||
|
|
||
|
if [ ! -f "$config_file" ]; then
|
||
|
test_failed "Check $env structure" "Configuration file not found"
|
||
|
continue
|
||
|
fi
|
||
|
|
||
|
# Check for required sections
|
||
|
local required_sections=("server" "database" "app" "build_info")
|
||
|
local missing_sections=()
|
||
|
|
||
|
for section in "${required_sections[@]}"; do
|
||
|
if ! grep -q "^\[${section}\]" "$config_file"; then
|
||
|
missing_sections+=("$section")
|
||
|
fi
|
||
|
done
|
||
|
|
||
|
if [ ${#missing_sections[@]} -eq 0 ]; then
|
||
|
test_passed "Check $env structure"
|
||
|
else
|
||
|
test_failed "Check $env structure" "Missing sections: ${missing_sections[*]}"
|
||
|
fi
|
||
|
done
|
||
|
}
|
||
|
|
||
|
# Test feature configurations
|
||
|
test_feature_configurations() {
|
||
|
log_info "Testing feature configurations..."
|
||
|
|
||
|
local features_dir="$CONFIG_DIR/features"
|
||
|
|
||
|
if [ ! -d "$features_dir" ]; then
|
||
|
test_failed "Check features directory" "Features directory not found"
|
||
|
return
|
||
|
fi
|
||
|
|
||
|
# Check if features directory has subdirectories
|
||
|
local feature_count=0
|
||
|
for feature_dir in "$features_dir"/*; do
|
||
|
if [ -d "$feature_dir" ]; then
|
||
|
feature_count=$((feature_count + 1))
|
||
|
local feature_name=$(basename "$feature_dir")
|
||
|
log_test "Checking feature: $feature_name"
|
||
|
|
||
|
# Check if feature has environment configs
|
||
|
local env_configs=0
|
||
|
for env in "${ENVIRONMENTS[@]}"; do
|
||
|
if [ -f "$feature_dir/$env.toml" ]; then
|
||
|
env_configs=$((env_configs + 1))
|
||
|
fi
|
||
|
done
|
||
|
|
||
|
if [ $env_configs -gt 0 ]; then
|
||
|
test_passed "Feature $feature_name has environment configs"
|
||
|
else
|
||
|
test_failed "Feature $feature_name has environment configs" "No environment configs found"
|
||
|
fi
|
||
|
fi
|
||
|
done
|
||
|
|
||
|
if [ $feature_count -gt 0 ]; then
|
||
|
test_passed "Features directory structure"
|
||
|
else
|
||
|
test_failed "Features directory structure" "No features found"
|
||
|
fi
|
||
|
}
|
||
|
|
||
|
# Test base configurations
|
||
|
test_base_configurations() {
|
||
|
log_info "Testing base configurations..."
|
||
|
|
||
|
local base_dir="$CONFIG_DIR/base"
|
||
|
|
||
|
if [ ! -d "$base_dir" ]; then
|
||
|
test_failed "Check base directory" "Base directory not found"
|
||
|
return
|
||
|
fi
|
||
|
|
||
|
for env in "${ENVIRONMENTS[@]}"; do
|
||
|
log_test "Checking base configuration for $env"
|
||
|
|
||
|
local base_file="$base_dir/$env.toml"
|
||
|
|
||
|
if [ -f "$base_file" ]; then
|
||
|
# Check if file is valid TOML (basic check)
|
||
|
if grep -q "^\[.*\]" "$base_file"; then
|
||
|
test_passed "Base $env configuration exists and has sections"
|
||
|
else
|
||
|
test_failed "Base $env configuration exists and has sections" "No TOML sections found"
|
||
|
fi
|
||
|
else
|
||
|
test_failed "Base $env configuration exists" "File not found"
|
||
|
fi
|
||
|
done
|
||
|
}
|
||
|
|
||
|
# Test management script commands
|
||
|
test_management_commands() {
|
||
|
log_info "Testing management script commands..."
|
||
|
|
||
|
# Test list-features command
|
||
|
log_test "Testing list-features command"
|
||
|
if "$SCRIPT_DIR/manage-config.sh" list-features > /dev/null 2>&1; then
|
||
|
test_passed "list-features command"
|
||
|
else
|
||
|
test_failed "list-features command" "Command failed"
|
||
|
fi
|
||
|
|
||
|
# Test list-environments command
|
||
|
log_test "Testing list-environments command"
|
||
|
if "$SCRIPT_DIR/manage-config.sh" list-environments > /dev/null 2>&1; then
|
||
|
test_passed "list-environments command"
|
||
|
else
|
||
|
test_failed "list-environments command" "Command failed"
|
||
|
fi
|
||
|
|
||
|
# Test status command
|
||
|
log_test "Testing status command"
|
||
|
if "$SCRIPT_DIR/manage-config.sh" status > /dev/null 2>&1; then
|
||
|
test_passed "status command"
|
||
|
else
|
||
|
test_failed "status command" "Command failed"
|
||
|
fi
|
||
|
}
|
||
|
|
||
|
# Test Python configuration builder (if available)
|
||
|
test_python_builder() {
|
||
|
log_info "Testing shell configuration builder (Python builder removed)..."
|
||
|
test_skipped "Python builder" "Python builder has been removed from the project"
|
||
|
}
|
||
|
|
||
|
# Test configuration comparison
|
||
|
test_configuration_comparison() {
|
||
|
log_info "Testing configuration comparison..."
|
||
|
|
||
|
log_test "Testing configuration diff between dev and prod"
|
||
|
if "$SCRIPT_DIR/manage-config.sh" diff dev prod > /dev/null 2>&1; then
|
||
|
test_passed "Configuration diff"
|
||
|
else
|
||
|
test_failed "Configuration diff" "Diff command failed"
|
||
|
fi
|
||
|
}
|
||
|
|
||
|
# Test backup and restore functionality
|
||
|
test_backup_restore() {
|
||
|
log_info "Testing backup and restore functionality..."
|
||
|
|
||
|
# Create a test config file
|
||
|
local test_config="$TEST_OUTPUT_DIR/test_config.toml"
|
||
|
echo "[test]" > "$test_config"
|
||
|
echo "value = \"test\"" >> "$test_config"
|
||
|
|
||
|
# Change to test directory
|
||
|
cd "$TEST_OUTPUT_DIR"
|
||
|
cp "$test_config" "config.toml"
|
||
|
|
||
|
log_test "Testing backup creation"
|
||
|
if "$SCRIPT_DIR/manage-config.sh" backup dev > /dev/null 2>&1; then
|
||
|
test_passed "Backup creation"
|
||
|
else
|
||
|
test_failed "Backup creation" "Backup command failed"
|
||
|
fi
|
||
|
|
||
|
# Return to original directory
|
||
|
cd - > /dev/null
|
||
|
}
|
||
|
|
||
|
# Test error handling
|
||
|
test_error_handling() {
|
||
|
log_info "Testing error handling..."
|
||
|
|
||
|
# Test invalid environment
|
||
|
log_test "Testing invalid environment handling"
|
||
|
if ! "$SCRIPT_DIR/build-config.sh" "invalid_env" "/tmp/test.toml" > /dev/null 2>&1; then
|
||
|
test_passed "Invalid environment handling"
|
||
|
else
|
||
|
test_failed "Invalid environment handling" "Should have failed with invalid environment"
|
||
|
fi
|
||
|
|
||
|
# Test missing base config
|
||
|
log_test "Testing missing base config handling"
|
||
|
local backup_base="$CONFIG_DIR/base/dev.toml.backup"
|
||
|
if [ -f "$CONFIG_DIR/base/dev.toml" ]; then
|
||
|
mv "$CONFIG_DIR/base/dev.toml" "$backup_base"
|
||
|
|
||
|
if ! "$SCRIPT_DIR/build-config.sh" "dev" "/tmp/test.toml" > /dev/null 2>&1; then
|
||
|
test_passed "Missing base config handling"
|
||
|
else
|
||
|
test_failed "Missing base config handling" "Should have failed with missing base config"
|
||
|
fi
|
||
|
|
||
|
# Restore backup
|
||
|
mv "$backup_base" "$CONFIG_DIR/base/dev.toml"
|
||
|
else
|
||
|
test_failed "Missing base config handling" "Base config already missing"
|
||
|
fi
|
||
|
}
|
||
|
|
||
|
# Cleanup test environment
|
||
|
cleanup_test_environment() {
|
||
|
log_info "Cleaning up test environment..."
|
||
|
|
||
|
# Remove test output directory
|
||
|
if [ -d "$TEST_OUTPUT_DIR" ]; then
|
||
|
rm -rf "$TEST_OUTPUT_DIR"
|
||
|
fi
|
||
|
|
||
|
log_success "Test environment cleanup complete"
|
||
|
}
|
||
|
|
||
|
# Show test summary
|
||
|
show_test_summary() {
|
||
|
echo ""
|
||
|
echo "========================================"
|
||
|
echo "Configuration Test Summary"
|
||
|
echo "========================================"
|
||
|
echo "Total Tests: $TESTS_TOTAL"
|
||
|
echo "Passed: $TESTS_PASSED"
|
||
|
echo "Failed: $TESTS_FAILED"
|
||
|
|
||
|
if [ $TESTS_FAILED -eq 0 ]; then
|
||
|
log_success "All tests passed! ✓"
|
||
|
echo ""
|
||
|
echo "The configuration system is working correctly."
|
||
|
else
|
||
|
log_error "Some tests failed! ✗"
|
||
|
echo ""
|
||
|
echo "Please review the failed tests and fix any issues."
|
||
|
exit 1
|
||
|
fi
|
||
|
}
|
||
|
|
||
|
# Main function
|
||
|
main() {
|
||
|
echo "========================================"
|
||
|
echo "Rustelo Configuration System Test Suite"
|
||
|
echo "========================================"
|
||
|
echo ""
|
||
|
|
||
|
# Check if we're in the right directory
|
||
|
if [ ! -d "$CONFIG_DIR" ]; then
|
||
|
log_error "Configuration directory not found: $CONFIG_DIR"
|
||
|
exit 1
|
||
|
fi
|
||
|
|
||
|
# Run tests
|
||
|
setup_test_environment
|
||
|
test_base_configurations
|
||
|
test_feature_configurations
|
||
|
test_build_configurations
|
||
|
test_validate_configurations
|
||
|
test_configuration_structure
|
||
|
test_management_commands
|
||
|
test_python_builder
|
||
|
test_configuration_comparison
|
||
|
test_backup_restore
|
||
|
test_error_handling
|
||
|
cleanup_test_environment
|
||
|
show_test_summary
|
||
|
}
|
||
|
|
||
|
# Run main function
|
||
|
main "$@"
|