"""Unit tests for the TokenManager class in the Marketing Cloud API module.""" from unittest.mock import MagicMock import pytest from src.marketing_cloud_api import token class TestTokenManager: """Unit tests for the TokenManager class responsible for Marketing Cloud API token management.""" @pytest.fixture(autouse=True) def reset_singleton(self): """Reset the TokenManager singleton instance before each test.""" token.TokenManager._instance = None @pytest.fixture def mock_redis(self, mocker): """Fixture to mock redis.StrictRedis used in TokenManager.""" return mocker.patch('src.marketing_cloud_api.token.redis.StrictRedis') @pytest.fixture def mock_request_new_token(self, mocker): """Fixture to mock the _request_new_token method of TokenManager.""" return mocker.patch.object(token.TokenManager, '_request_new_token') @pytest.fixture def mock_requests_post(self, mocker): """Fixture to mock requests.post used in token requests.""" return mocker.patch('src.marketing_cloud_api.token.requests.post') @pytest.fixture def mock_config(self, mocker): """Fixture to mock the configuration settings.""" return mocker.patch('src.marketing_cloud_api.token.config') def test_get_token_from_cache(self, mock_redis): """Test that get_token returns a cached token from Redis if available.""" mock_instance = MagicMock() mock_instance.get.return_value = 'cached_token' mock_redis.return_value = mock_instance manager = token.TokenManager() result = manager.get_token('bu_id') assert result == 'cached_token' mock_instance.get.assert_called_once_with('bu_id') mock_instance.setex.assert_not_called() def test_get_token_requests_new_token(self, mock_redis, mock_request_new_token): """Test that get_token requests a new token if not found in Redis and sets it with TTL.""" mock_instance = MagicMock() mock_instance.get.return_value = None mock_redis.return_value = mock_instance mock_request_new_token.return_value = ('new_token', 100) manager = token.TokenManager() result = manager.get_token('bu_id') assert result == 'new_token' mock_instance.setex.assert_called_once_with('bu_id', 100, 'new_token') def test_request_new_token_success(self, mock_config, mock_requests_post): """Test that _request_new_token successfully requests and returns a new token and expiry.""" mock_config.MARKETING_CLOUD_CLIENT_ID = 'id' mock_config.MARKETING_CLOUD_CLIENT_SECRET = 'secret' mock_config.MARKETING_CLOUD_TOKEN_API_URL = 'url' mock_response = MagicMock() mock_response.json.return_value = {'access_token': 'token', 'expires_in': 123} mock_response.raise_for_status.return_value = None mock_requests_post.return_value = mock_response manager = token.TokenManager() access_token, expires_in = manager._request_new_token('bu_id') assert access_token == 'token' assert expires_in == 123 mock_requests_post.assert_called_once()