188 lines
5.9 KiB
Python
188 lines
5.9 KiB
Python
"""Unit tests for the validation engine."""
|
|
|
|
import pytest
|
|
|
|
from envschema.schema import Schema, EnvVar, EnvVarType
|
|
from envschema.core import ValidationEngine, ValidationResult
|
|
|
|
|
|
class TestValidationResult:
|
|
"""Tests for ValidationResult."""
|
|
|
|
def test_valid_result(self):
|
|
result = ValidationResult(is_valid=True)
|
|
assert result.is_valid is True
|
|
assert result.missing_required == []
|
|
assert result.type_errors == []
|
|
assert result.pattern_errors == []
|
|
assert result.warnings == []
|
|
|
|
def test_result_to_dict(self):
|
|
result = ValidationResult(is_valid=True)
|
|
d = result.to_dict()
|
|
assert d["is_valid"] is True
|
|
assert d["missing_required"] == []
|
|
|
|
|
|
class TestValidationEngine:
|
|
"""Tests for ValidationEngine."""
|
|
|
|
def test_validate_empty_env(self):
|
|
schema = Schema(envvars=[])
|
|
engine = ValidationEngine(schema)
|
|
result = engine.validate({})
|
|
assert result.is_valid is True
|
|
|
|
def test_validate_missing_required(self):
|
|
schema = Schema(
|
|
envvars=[
|
|
EnvVar(name="REQUIRED_VAR", required=True),
|
|
]
|
|
)
|
|
engine = ValidationEngine(schema)
|
|
result = engine.validate({})
|
|
assert result.is_valid is False
|
|
assert "REQUIRED_VAR" in result.missing_required
|
|
|
|
def test_validate_present_required(self):
|
|
schema = Schema(
|
|
envvars=[
|
|
EnvVar(name="REQUIRED_VAR", required=True),
|
|
]
|
|
)
|
|
engine = ValidationEngine(schema)
|
|
result = engine.validate({"REQUIRED_VAR": "value"})
|
|
assert result.is_valid is True
|
|
|
|
def test_validate_optional_missing(self):
|
|
schema = Schema(
|
|
envvars=[
|
|
EnvVar(name="OPTIONAL_VAR", required=False),
|
|
]
|
|
)
|
|
engine = ValidationEngine(schema)
|
|
result = engine.validate({})
|
|
assert result.is_valid is True
|
|
|
|
def test_validate_with_default(self):
|
|
schema = Schema(
|
|
envvars=[
|
|
EnvVar(name="VAR_WITH_DEFAULT", required=False, default="default_value"),
|
|
]
|
|
)
|
|
engine = ValidationEngine(schema)
|
|
result = engine.validate({})
|
|
assert result.is_valid is True
|
|
|
|
def test_validate_string_type(self):
|
|
schema = Schema(
|
|
envvars=[
|
|
EnvVar(name="STRING_VAR", type=EnvVarType.STRING),
|
|
]
|
|
)
|
|
engine = ValidationEngine(schema)
|
|
result = engine.validate({"STRING_VAR": "any value"})
|
|
assert result.is_valid is True
|
|
|
|
def test_validate_integer_type_valid(self):
|
|
schema = Schema(
|
|
envvars=[
|
|
EnvVar(name="INT_VAR", type=EnvVarType.INTEGER),
|
|
]
|
|
)
|
|
engine = ValidationEngine(schema)
|
|
result = engine.validate({"INT_VAR": "42"})
|
|
assert result.is_valid is True
|
|
|
|
def test_validate_integer_type_invalid(self):
|
|
schema = Schema(
|
|
envvars=[
|
|
EnvVar(name="INT_VAR", type=EnvVarType.INTEGER),
|
|
]
|
|
)
|
|
engine = ValidationEngine(schema)
|
|
result = engine.validate({"INT_VAR": "not_a_number"})
|
|
assert result.is_valid is False
|
|
assert len(result.type_errors) == 1
|
|
assert result.type_errors[0].var_name == "INT_VAR"
|
|
|
|
def test_validate_boolean_type_valid(self):
|
|
schema = Schema(
|
|
envvars=[
|
|
EnvVar(name="BOOL_VAR", type=EnvVarType.BOOLEAN),
|
|
]
|
|
)
|
|
engine = ValidationEngine(schema)
|
|
result = engine.validate({"BOOL_VAR": "true"})
|
|
assert result.is_valid is True
|
|
|
|
def test_validate_boolean_type_invalid(self):
|
|
schema = Schema(
|
|
envvars=[
|
|
EnvVar(name="BOOL_VAR", type=EnvVarType.BOOLEAN),
|
|
]
|
|
)
|
|
engine = ValidationEngine(schema)
|
|
result = engine.validate({"BOOL_VAR": "maybe"})
|
|
assert result.is_valid is False
|
|
|
|
def test_validate_list_type_valid(self):
|
|
schema = Schema(
|
|
envvars=[
|
|
EnvVar(name="LIST_VAR", type=EnvVarType.LIST),
|
|
]
|
|
)
|
|
engine = ValidationEngine(schema)
|
|
result = engine.validate({"LIST_VAR": "a,b,c"})
|
|
assert result.is_valid is True
|
|
|
|
def test_validate_list_type_invalid(self):
|
|
schema = Schema(
|
|
envvars=[
|
|
EnvVar(name="LIST_VAR", type=EnvVarType.LIST),
|
|
]
|
|
)
|
|
engine = ValidationEngine(schema)
|
|
result = engine.validate({"LIST_VAR": "single_value"})
|
|
assert result.is_valid is False
|
|
|
|
def test_validate_pattern_match(self):
|
|
schema = Schema(
|
|
envvars=[
|
|
EnvVar(name="PATTERN_VAR", type=EnvVarType.STRING, pattern=r"^[A-Z]+$"),
|
|
]
|
|
)
|
|
engine = ValidationEngine(schema)
|
|
result = engine.validate({"PATTERN_VAR": "VALID"})
|
|
assert result.is_valid is True
|
|
|
|
def test_validate_pattern_no_match(self):
|
|
schema = Schema(
|
|
envvars=[
|
|
EnvVar(name="PATTERN_VAR", type=EnvVarType.STRING, pattern=r"^[A-Z]+$"),
|
|
]
|
|
)
|
|
engine = ValidationEngine(schema)
|
|
result = engine.validate({"PATTERN_VAR": "invalid"})
|
|
assert result.is_valid is False
|
|
|
|
def test_validate_extra_var_warning(self):
|
|
schema = Schema(
|
|
envvars=[
|
|
EnvVar(name="KNOWN_VAR", type=EnvVarType.STRING),
|
|
]
|
|
)
|
|
engine = ValidationEngine(schema)
|
|
result = engine.validate({"KNOWN_VAR": "value", "UNKNOWN_VAR": "other"})
|
|
assert result.is_valid is True
|
|
assert "Unknown environment variable: UNKNOWN_VAR" in result.warnings
|
|
|
|
def test_validate_case_insensitive(self):
|
|
schema = Schema(
|
|
envvars=[
|
|
EnvVar(name="TEST_VAR", required=True),
|
|
]
|
|
)
|
|
engine = ValidationEngine(schema)
|
|
result = engine.validate({"test_var": "value"})
|
|
assert result.is_valid is True |