CalejoControl/tests/unit/test_dashboard_validation.py

165 lines
6.2 KiB
Python

"""
Tests for Dashboard configuration validation
"""
import pytest
from src.dashboard.api import (
SystemConfig,
DatabaseConfig,
OPCUAConfig,
ModbusConfig,
RESTAPIConfig,
MonitoringConfig,
SecurityConfig,
validate_configuration,
ValidationResult
)
class TestDashboardValidation:
"""Test dashboard configuration validation"""
def test_validate_configuration_valid(self):
"""Test validation with valid configuration"""
config = SystemConfig(
database=DatabaseConfig(
db_host="localhost",
db_port=5432,
db_name="calejo",
db_user="calejo",
db_password="secure_password"
),
opcua=OPCUAConfig(port=4840),
modbus=ModbusConfig(port=502),
rest_api=RESTAPIConfig(port=8080),
monitoring=MonitoringConfig(health_monitor_port=9090),
security=SecurityConfig()
)
result = validate_configuration(config)
assert result.valid == True
assert len(result.errors) == 0
assert len(result.warnings) == 0
def test_validate_configuration_missing_database_fields(self):
"""Test validation with missing database fields"""
config = SystemConfig(
database=DatabaseConfig(
db_host="", # Missing host
db_port=5432,
db_name="", # Missing database name
db_user="", # Missing user
db_password="password"
),
opcua=OPCUAConfig(),
modbus=ModbusConfig(),
rest_api=RESTAPIConfig(),
monitoring=MonitoringConfig(),
security=SecurityConfig()
)
result = validate_configuration(config)
assert result.valid == False
assert len(result.errors) == 3
assert "Database host is required" in result.errors
assert "Database name is required" in result.errors
assert "Database user is required" in result.errors
def test_validate_configuration_invalid_ports(self):
"""Test validation with invalid port numbers"""
config = SystemConfig(
database=DatabaseConfig(db_port=0), # Invalid port
opcua=OPCUAConfig(port=70000), # Invalid port
modbus=ModbusConfig(port=-1), # Invalid port
rest_api=RESTAPIConfig(port=65536), # Invalid port
monitoring=MonitoringConfig(health_monitor_port=0), # Invalid port
security=SecurityConfig()
)
result = validate_configuration(config)
assert result.valid == False
assert len(result.errors) == 5
assert "Database port must be between 1 and 65535" in result.errors
assert "OPC UA port must be between 1 and 65535" in result.errors
assert "Modbus port must be between 1 and 65535" in result.errors
assert "REST API port must be between 1 and 65535" in result.errors
assert "Health monitor port must be between 1 and 65535" in result.errors
def test_validate_configuration_default_credentials_warning(self):
"""Test validation with default credentials (warnings only)"""
config = SystemConfig(
database=DatabaseConfig(),
opcua=OPCUAConfig(),
modbus=ModbusConfig(),
rest_api=RESTAPIConfig(),
monitoring=MonitoringConfig(),
security=SecurityConfig(
jwt_secret_key="your-secret-key-change-in-production",
api_key="your-api-key-here"
)
)
result = validate_configuration(config)
assert result.valid == True # Should still be valid (just warnings)
assert len(result.warnings) == 2
assert "Default JWT secret key detected" in result.warnings[0]
assert "Default API key detected" in result.warnings[1]
def test_validate_configuration_valid_port_boundaries(self):
"""Test validation with valid port boundary values"""
config = SystemConfig(
database=DatabaseConfig(db_port=1), # Minimum valid port
opcua=OPCUAConfig(port=65535), # Maximum valid port
modbus=ModbusConfig(port=1024), # Valid port
rest_api=RESTAPIConfig(port=8080), # Valid port
monitoring=MonitoringConfig(health_monitor_port=9090), # Valid port
security=SecurityConfig()
)
result = validate_configuration(config)
assert result.valid == True
assert len(result.errors) == 0
def test_validate_configuration_partial_errors(self):
"""Test validation with some valid and some invalid fields"""
config = SystemConfig(
database=DatabaseConfig(
db_host="localhost", # Valid
db_port=5432, # Valid
db_name="", # Invalid - missing
db_user="calejo", # Valid
db_password="password" # Valid
),
opcua=OPCUAConfig(port=70000), # Invalid port
modbus=ModbusConfig(port=502), # Valid
rest_api=RESTAPIConfig(port=8080), # Valid
monitoring=MonitoringConfig(health_monitor_port=9090), # Valid
security=SecurityConfig()
)
result = validate_configuration(config)
assert result.valid == False
assert len(result.errors) == 2
assert "Database name is required" in result.errors
assert "OPC UA port must be between 1 and 65535" in result.errors
def test_validation_result_structure(self):
"""Test ValidationResult structure"""
result = ValidationResult(
valid=True,
errors=["error1", "error2"],
warnings=["warning1"]
)
assert result.valid == True
assert result.errors == ["error1", "error2"]
assert result.warnings == ["warning1"]
def test_validation_result_defaults(self):
"""Test ValidationResult with default values"""
result = ValidationResult(valid=True)
assert result.valid == True
assert result.errors == []
assert result.warnings == []