"""Test Auth0 functions.""" from typing import Any from unittest.mock import patch import httpx import pytest import respx from src.auth0 import generate_auth_token, OAUTH_TOKEN_ENDPOINT from src.exceptions.auth0_token_exception import Auth0TokenException from src.models import ClientCredentials, OAuthToken @patch("src.auth0.AUTH0_URL", "https://auth.example.com") @pytest.mark.respx(base_url="https://auth.example.com") def test_generate_auth_token_success( respx_mock: respx.router.MockRouter, mock_valid_client_credentials: ClientCredentials, mock_valid_auth0_response: dict[str, Any], ) -> None: """Test generate_auth_token returns an OAuthToken.""" respx_mock.post( OAUTH_TOKEN_ENDPOINT, json=mock_valid_client_credentials.model_dump(), name="generate_auth_token", ).mock(return_value=httpx.Response(200, json=mock_valid_auth0_response)) result = generate_auth_token(mock_valid_client_credentials) assert isinstance(result, OAuthToken) assert result.access_token == "some_token" assert result.expires_in == 36000 assert result.token_type == "Bearer" assert respx_mock["generate_auth_token"].called @patch("src.auth0.AUTH0_URL", "https://auth.example.com") @pytest.mark.respx(base_url="https://auth.example.com") def test_generate_auth_token_throw_error( respx_mock: respx.router.MockRouter, mock_valid_client_credentials: ClientCredentials, ) -> None: """Test generate_auth_token throws an error.""" respx_mock.post( OAUTH_TOKEN_ENDPOINT, json=mock_valid_client_credentials.model_dump(), name="generate_auth_token", ).mock(return_value=httpx.Response(400)) with pytest.raises(Auth0TokenException): generate_auth_token(mock_valid_client_credentials) assert respx_mock["generate_auth_token"].called @patch("src.auth0.AUTH0_URL", "https://auth.example.com") @pytest.mark.respx(base_url="https://auth.example.com") def test_generate_auth_token_oauth_timeout( respx_mock: respx.router.MockRouter, mock_valid_client_credentials: ClientCredentials, ) -> None: """Test generate_auth_token raises exception on timeout.""" respx_mock.post( OAUTH_TOKEN_ENDPOINT, json=mock_valid_client_credentials.model_dump(), name="generate_auth_token", ).mock(side_effect=httpx.TimeoutException) with pytest.raises(httpx.TimeoutException): generate_auth_token(mock_valid_client_credentials) assert respx_mock["generate_auth_token"].called @patch("src.auth0.AUTH0_URL", "https://auth.example.com") @pytest.mark.respx(base_url="https://auth.example.com") def test_generate_auth_token_oauth_incomplete_response( respx_mock: respx.router.MockRouter, mock_valid_client_credentials: ClientCredentials, ) -> None: """Test generate_auth_token raises error on incomplete response.""" incomplete_response = {"expires_in": 3600, "token_type": "Bearer"} respx_mock.post( OAUTH_TOKEN_ENDPOINT, json=mock_valid_client_credentials.model_dump(), name="generate_auth_token", ).mock(return_value=httpx.Response(200, json=incomplete_response)) with pytest.raises(ValueError): generate_auth_token(mock_valid_client_credentials) assert respx_mock["generate_auth_token"].called @patch("src.auth0.AUTH0_URL", "https://auth.example.com") @pytest.mark.respx(base_url="https://auth.example.com") def test_generate_auth_token_oauth_empty_response( respx_mock: respx.router.MockRouter, mock_valid_client_credentials: ClientCredentials, ) -> None: """Test generate_auth_token raises error on empty response.""" respx_mock.post( OAUTH_TOKEN_ENDPOINT, json=mock_valid_client_credentials.model_dump(), name="generate_auth_token", ).mock(return_value=httpx.Response(200, json={})) with pytest.raises(ValueError): generate_auth_token(mock_valid_client_credentials) assert respx_mock["generate_auth_token"].called @patch("src.auth0.AUTH0_URL", "https://auth.example.com") @pytest.mark.respx(base_url="https://auth.example.com") def test_generate_auth_token_oauth_expired_token_response( respx_mock: respx.router.MockRouter, mock_valid_client_credentials: ClientCredentials, ) -> None: expired_response = { "access_token": "some_token", "expires_in": 0, "token_type": "Bearer", } """Test generate_auth_token raises error on empty response.""" respx_mock.post( OAUTH_TOKEN_ENDPOINT, json=mock_valid_client_credentials.model_dump(), name="generate_auth_token", ).mock(return_value=httpx.Response(200, json=expired_response)) with pytest.raises(ValueError): generate_auth_token(mock_valid_client_credentials)