"""Unit tests for access layer.""" from unittest.mock import MagicMock, patch import pytest from owsrequest.access import ERROR_CODE_BAD_GRASS_REQUEST from owsrequest.constants import headers as owsrequest_headers from owsrequest.constants.errors import ERROR_MESSAGE_MISSING_GRASS_HEADERS import application from sound_recordings.constants.error import ( ERROR_CODE_AUTHORIZATION, ERROR_MESSAGE_FORBIDDEN_USER, ) from sound_recordings.validation import access MOCK_HANDLER = MagicMock() @pytest.fixture def has_analytics_access(): """Patch has_analytics to return True.""" with patch("sound_recordings.validation.access.has_analytics") as has_analytics: has_analytics.return_value = True yield has_analytics @pytest.fixture def not_has_analytics_access(): """Patch has_analytics to return False.""" with patch("sound_recordings.validation.access.has_analytics") as has_analytics: has_analytics.return_value = False yield has_analytics def _mock_handler(*args, **kwargs): """Mock handler.""" return MOCK_HANDLER def test_verify_grass_header_required(has_analytics_access): """Test decorated function w/ valid grass headers.""" test_header = { owsrequest_headers.GRASS_ACCOUNT_ID: 1234, owsrequest_headers.GRASS_ACCOUNT_TYPE: "vendor", owsrequest_headers.ORCHARD_USER_ID: "alw:1000", owsrequest_headers.ORCHARD_PROFILE_ID: None, owsrequest_headers.ORCHARD_PROFILE_TYPE: None, } with application.app.test_request_context(headers=test_header): response = access.verify()(_mock_handler)() assert response == MOCK_HANDLER def test_verify_grass_header_missing_required(mock_dev_auth): """Test decorated function w/o valid grass headers.""" test_header = {} with application.app.test_request_context(headers=test_header): response = access.verify()(_mock_handler)() assert response.status_code == 400 assert response.json == { "code": ERROR_CODE_BAD_GRASS_REQUEST, "message": ERROR_MESSAGE_MISSING_GRASS_HEADERS, } def test_has_analytics(has_analytics_access): """Test verify_access_to_analytics success.""" test_header = { owsrequest_headers.GRASS_ACCOUNT_ID: 1234, owsrequest_headers.GRASS_ACCOUNT_TYPE: "vendor", owsrequest_headers.ORCHARD_USER_ID: "alw:1000", } with application.app.test_request_context(headers=test_header): response = access.verify()(_mock_handler)() assert response == MOCK_HANDLER def test_does_not_have_analytics(not_has_analytics_access): """Test verify_access_to_analytics forbidden response.""" test_header = { owsrequest_headers.GRASS_ACCOUNT_ID: 1234, owsrequest_headers.GRASS_ACCOUNT_TYPE: "vendor", owsrequest_headers.ORCHARD_USER_ID: "alw:1000", } with application.app.test_request_context(headers=test_header): response = access.verify()(_mock_handler)() assert response.status_code == 403 assert response.json == { "code": ERROR_CODE_AUTHORIZATION, "message": ERROR_MESSAGE_FORBIDDEN_USER, }