from typing import Any from unittest.mock import MagicMock, patch import pytest from jwtauth.exceptions import JWTAuthError from grass.logic.auth import validate_auth0_token @pytest.mark.parametrize( 'get_token_side_effect, expected_message, expected_status, expected_payload', [ pytest.param('a token', None, 200, 'a token', id='happy path'), pytest.param( JWTAuthError('some error'), 'Error with authentication token some error', 401, None, id='unhappy path because jwtauth error', ), pytest.param( Exception('some error'), 'Unable to parse authentication token some error', 401, None, id='unhappy path', ), ], ) @patch('grass.logic.auth.config') @patch('grass.logic.auth.jwt_auth_from_environment') def test_validate_auth0_token( mock_jwt_auth_from_environment: MagicMock, mock_config: MagicMock, get_token_side_effect: Any, expected_message: Any, expected_status: int, expected_payload: Any, ) -> None: """Test validate_auth0_token.""" mock_config.environment = 'some-env' mock_jwt_auth = MagicMock() mock_jwt_auth.audience = ['one', 'two'] mock_jwt_auth.get_token = MagicMock(side_effect=[get_token_side_effect]) mock_jwt_auth_from_environment.return_value = mock_jwt_auth actual_message, actual_status, actual_payload = validate_auth0_token('some_token') assert actual_message == expected_message assert actual_status == expected_status assert actual_payload == expected_payload mock_jwt_auth_from_environment.assert_called_once_with(environment='some-env') mock_jwt_auth.get_token.assert_called_once_with('some_token') assert mock_jwt_auth.audience == ['one', 'two'] @patch('grass.logic.auth.config') @patch('grass.logic.auth.jwt_auth_from_environment') def test_validate_auth0_token_overrides_audience( mock_jwt_auth_from_environment: MagicMock, mock_config: MagicMock, ) -> None: """Test validate_auth0_token uses any provided override_audience.""" mock_config.environment = 'some-env' mock_jwt_auth = MagicMock() mock_jwt_auth.audience = ['one', 'two'] mock_jwt_auth.get_token.return_value = 'good token' mock_jwt_auth_from_environment.return_value = mock_jwt_auth validate_auth0_token('some_token', ['three']) mock_jwt_auth.get_token.assert_called_once_with('some_token') assert mock_jwt_auth.audience == ['three']