Files
openapi-mock-generator/tests/test_validator.py
7000pctAUTO 59c0699a59
Some checks failed
CI / test (push) Failing after 13s
Add test files: server, fuzzer, validator tests
2026-02-02 19:59:31 +00:00

153 lines
4.6 KiB
Python

"""Tests for Request Validator."""
import pytest
from src.core.validator import RequestValidator, ValidationFailure
class TestRequestValidator:
"""Tests for RequestValidator class."""
@pytest.fixture
def spec(self, sample_openapi_yaml):
"""Create a parser and return the spec."""
import yaml
return yaml.safe_load(sample_openapi_yaml)
def test_validate_headers_success(self, spec):
"""Test successful header validation."""
validator = RequestValidator(spec)
headers = {
"content-type": "application/json",
"accept": "application/json"
}
result = validator.validate_headers(headers)
assert result is None
def test_validate_query_params_success(self, spec):
"""Test successful query parameter validation."""
validator = RequestValidator(spec)
params = {"page": "1", "limit": "10"}
param_schemas = {
"page": {"type": "string"},
"limit": {"type": "string"}
}
result = validator.validate_query_params(params, param_schemas)
assert result is None
def test_validate_path_params_success(self, spec):
"""Test successful path parameter validation."""
validator = RequestValidator(spec)
params = {"userId": "123"}
param_schemas = {
"userId": {"type": "integer"}
}
result = validator.validate_path_params(params, param_schemas)
assert result is None
def test_validate_path_params_missing(self, spec):
"""Test path parameter validation with missing param."""
validator = RequestValidator(spec)
params = {}
param_schemas = {
"userId": {"type": "integer"}
}
result = validator.validate_path_params(params, param_schemas)
assert result is not None
assert isinstance(result, ValidationFailure)
def test_validate_body_success(self, spec):
"""Test successful body validation."""
validator = RequestValidator(spec)
body = {"name": "Test User", "email": "test@example.com"}
schema = {
"type": "object",
"properties": {
"name": {"type": "string"},
"email": {"type": "string", "format": "email"}
},
"required": ["name"]
}
result = validator.validate_body(body, schema)
assert result is None
def test_validate_body_missing_required(self, spec):
"""Test body validation with missing required field."""
validator = RequestValidator(spec)
body = {"email": "test@example.com"}
schema = {
"type": "object",
"properties": {
"name": {"type": "string"},
"email": {"type": "string"}
},
"required": ["name"]
}
result = validator.validate_body(body, schema)
assert result is not None
assert isinstance(result, ValidationFailure)
def test_validate_body_no_schema(self, spec):
"""Test body validation with no schema."""
validator = RequestValidator(spec)
body = {"any": "data"}
result = validator.validate_body(body, None)
assert result is None
def test_validate_body_empty(self, spec):
"""Test body validation with empty body."""
validator = RequestValidator(spec)
result = validator.validate_body(None, None)
assert result is None
def test_format_validation_errors(self, spec):
"""Test formatting validation errors."""
from jsonschema import ValidationError
validator = RequestValidator(spec)
errors = [
ValidationError("Field is required", path=["name"]),
ValidationError("Invalid email format", path=["email"])
]
formatted = validator.format_validation_errors(errors)
assert len(formatted) == 2
assert formatted[0]["message"] == "Field is required"
assert formatted[1]["message"] == "Invalid email format"
def test_create_error_response(self, spec):
"""Test creating error response from validation failure."""
from jsonschema import ValidationError
validator = RequestValidator(spec)
errors = [ValidationError("Test error")]
failure = ValidationFailure("Validation failed", errors)
response = validator.create_error_response(failure)
assert response["status_code"] == 400
assert response["body"]["error"]["type"] == "Validation Error"
assert "details" in response["body"]["error"]