"""Unit tests for access layer.""" from unittest.mock import MagicMock import pytest from oto import response as oto_response from owsrequest.constants import headers as owsrequest_headers import application from analytics.connectors.redis import client from analytics.permissions.analytics import has_analytics from analytics.services import ows_account, ows_users MOCK_HANDLER = MagicMock() account_id = "1234" user_id = "alw:1000" @pytest.fixture def mock_services(monkeypatch): """Fixture patching Redis and ows services.""" monkeypatch.setattr(client, "get", MagicMock(return_value=None)) ows_users_mock = MagicMock(return_value=oto_response.Response(message=True)) monkeypatch.setattr(ows_users, "user_has_access", ows_users_mock) ows_account_mock = MagicMock(return_value=oto_response.Response(message=True)) monkeypatch.setattr(ows_account, "vendor_has_access", ows_account_mock) return ows_users_mock, ows_account_mock @pytest.fixture def mock_request_context(): """Mock a request context.""" test_header = { owsrequest_headers.GRASS_ACCOUNT_ID: account_id, owsrequest_headers.GRASS_ACCOUNT_TYPE: owsrequest_headers.GRASS_ACCOUNT_TYPE_VENDOR, # noqa owsrequest_headers.ORCHARD_USER_ID: user_id, } with application.app.test_request_context(headers=test_header): yield def test_has_analytics_true(mock_dev_auth, mock_request_context, mock_services): """Test has_analytics success.""" ows_users_mock, ows_account_mock = mock_services assert ( has_analytics(owsrequest_headers.GRASS_ACCOUNT_TYPE_VENDOR, account_id, user_id) is True ) assert ows_account_mock.call_count == 1 assert ows_users_mock.call_count == 1 def test_has_analytics_true_subaccount( monkeypatch, mock_dev_auth, mock_request_context, mock_services ): """Test has_analytics success path for a subaccount.""" get_vendor_id_mock = MagicMock(return_value=oto_response.Response(message=100500)) monkeypatch.setattr(ows_account, "get_vendor_id", get_vendor_id_mock) ows_users_mock, ows_account_mock = mock_services assert ( has_analytics( owsrequest_headers.GRASS_ACCOUNT_TYPE_SUBACCOUNT, account_id, user_id ) is True ) get_vendor_id_mock.assert_called_with(account_id) ows_account_mock.assert_called_with(100500) assert ows_users_mock.call_count == 1 def test_has_analytics_true_cached( mock_dev_auth, monkeypatch, mock_services, mock_request_context ): """Test has_analytics success cached.""" monkeypatch.setattr(client, "get", MagicMock(return_value=b"True")) ows_users_mock, ows_account_mock = mock_services assert ( has_analytics(owsrequest_headers.GRASS_ACCOUNT_TYPE_VENDOR, account_id, user_id) is True ) assert ows_account_mock.call_count == 0 assert ows_account_mock.call_count == 0 def test_has_analytics_false(mock_dev_auth, mock_request_context, mock_services): """Test verify_access_to_analytics forbidden response.""" ows_users_mock, ows_account_mock = mock_services ows_users_mock.return_value = oto_response.Response(message=False) ows_account_mock.return_value = oto_response.Response(message=False) assert ( has_analytics(owsrequest_headers.GRASS_ACCOUNT_TYPE_VENDOR, account_id, user_id) is False ) assert ows_account_mock.call_count == 1 assert ows_users_mock.call_count == 1 def test_has_analytics_false_cached( mock_dev_auth, monkeypatch, mock_services, mock_request_context ): """Test has_analytics success cached.""" monkeypatch.setattr(client, "get", MagicMock(return_value=b"False")) ows_users_mock, ows_account_mock = mock_services assert ( has_analytics(owsrequest_headers.GRASS_ACCOUNT_TYPE_VENDOR, account_id, user_id) is False ) assert ows_account_mock.call_count == 0 assert ows_account_mock.call_count == 0