"""Tests for validation module.""" import json from typing import Any from unittest import mock import pytest from flask import Request, Response from assets.constants import error, field_const from assets.validation import json_schema def fixture_function(request: Request) -> Response: """Function to mock real endpoint handler.""" @json_schema.validate_headers(request) def function() -> Response: return Response("test_result") return function() def fixture_function_headers_not_required(request: Request) -> Response: """Function to mock real endpoint handler.""" @json_schema.validate_headers(request, required=False) def function() -> Response: return Response("test_result") return function() def test_validate_oa_headers_success(valid_oa_headers: dict[str, Any]) -> None: """Assert that validate_headers succeeds when headers valid.""" request = mock.Mock() request.headers = valid_oa_headers assert "test_result" == fixture_function(request).data.decode() def test_validate_oa_headers_missing_correlation( valid_oa_headers: dict[str, Any], ) -> None: """Assert that validate_headers succeed when correlation id is missing.""" request = mock.Mock() del valid_oa_headers[field_const.CORRELATION_ID] request.headers = valid_oa_headers assert "test_result" == fixture_function(request).data.decode() def test_validate_oa_headers_missing_user_id(valid_oa_headers: dict[str, Any]) -> None: """Assert that validate_headers fails when orchard user id is missing.""" request = mock.Mock() del valid_oa_headers[field_const.ORCHARD_USER_ID] request.headers = valid_oa_headers response = fixture_function(request) assert response.status_code == 400 response_json = json.loads(response.data.decode()) assert response_json["code"] == error.ERROR_CODE_HEADER_VALIDATION def test_validate_alw_headers_success(valid_alw_headers: dict[str, Any]) -> None: """Assert that validate_headers succeeds when headers valid.""" request = mock.Mock() request.headers = valid_alw_headers assert "test_result" == fixture_function(request).data.decode() def test_validate_alw_headers_wrong_grass_account_type( valid_alw_headers: dict[str, Any], ) -> None: """Assert that validate_headers fails when grass account type is wrong.""" request = mock.Mock() valid_alw_headers[field_const.GRASS_ACCOUNT_TYPE] = "test" request.headers = valid_alw_headers response = fixture_function(request) assert response.status_code == 400 response_json = json.loads(response.data.decode()) assert response_json["code"] == error.ERROR_CODE_HEADER_VALIDATION @pytest.mark.parametrize( "missing_header,expected_status,expected_code", [ (field_const.GRASS_ACCOUNT_ID, 400, error.ERROR_CODE_HEADER_VALIDATION), (field_const.GRASS_ACCOUNT_TYPE, 400, error.ERROR_CODE_HEADER_VALIDATION), (field_const.ORCHARD_USER_ID, 400, error.ERROR_CODE_HEADER_VALIDATION), ], ) def test_validate_alw_headers_missing_header( valid_alw_headers: dict[str, Any], missing_header: str, expected_status: int, expected_code: str, ) -> None: """Assert that validate_headers fails when required headers is missing.""" request = mock.Mock() del valid_alw_headers[missing_header] request.headers = valid_alw_headers response = fixture_function(request) assert response.status_code == expected_status response_json = json.loads(response.data.decode()) assert response_json["code"] == expected_code def test_validate_headers_empty_not_required() -> None: """Test for failure with no handlers and no body.""" request = mock.Mock() request.headers = [] assert "test_result" == fixture_function_headers_not_required(request).data.decode()