"""Test for the JWT Logic.""" from typing import Any, Dict, Optional import pytest from fastapi import HTTPException from pdp.config import IS_MACHINE, JWT_USER_METADATA from pdp.constants.constants import USER_TYPE_HUMAN, USER_TYPE_MACHINE from pdp.logic import jwt def test_get_identity_uuid( decoded_jwt: Dict[str, Any], identity_uuid: Optional[str] ) -> None: """Test getting a user's orchardIdentityId from a JWT.""" identity_uuid = jwt.get_identity_uuid(decoded_jwt) assert identity_uuid == identity_uuid def test_get_identity_uuid_none() -> None: """Test getting a user's orchardIdentityId from a JWT.""" identity_uuid = jwt.get_identity_uuid({}) assert identity_uuid is None def test_get_impersonated_by_identity_uuid( decoded_impersonated_jwt: Dict[str, Any], identity_uuid_two: Optional[str] ) -> None: """Test get_impersonated_by_identity_uuid from JWT.""" impersonated_by_identity_uuid = jwt.get_impersonated_by_identity_uuid( decoded_impersonated_jwt ) assert impersonated_by_identity_uuid == identity_uuid_two def test_get_impersonated_by_identity_uuid_missing_claim() -> None: """Test get_impersonated_by_identity_uuid when JWT does not contain the impersonatedBy claim""" # noqa: E501 impersonated_by_identity_uuid = jwt.get_impersonated_by_identity_uuid({}) assert impersonated_by_identity_uuid is None @pytest.mark.parametrize("null_value", [(0), (None), (""), (False)]) def test_get_impersonated_by_identity_uuid_when_null(null_value: Any) -> None: """Test getting an impersonated user's orchardIdentityId from a JWT raises an exception""" # noqa: E501 with pytest.raises(HTTPException) as exc_info: jwt.get_impersonated_by_identity_uuid( { "https://grass.theorchard.com/impersonated_by": null_value, } ) assert exc_info.value.status_code == 401 assert exc_info.value.detail == "Impersonated by Identity UUID is not valid" def test_get_user_type_human( decoded_jwt: Dict[str, Any], ) -> None: """Test getting a user's userType from a JWT.""" user_type = jwt.get_user_type(decoded_jwt) assert user_type == USER_TYPE_HUMAN decoded_jwt[JWT_USER_METADATA][IS_MACHINE] = False user_type = jwt.get_user_type(decoded_jwt) assert user_type == USER_TYPE_HUMAN decoded_jwt[JWT_USER_METADATA][IS_MACHINE] = None user_type = jwt.get_user_type(decoded_jwt) assert user_type == USER_TYPE_HUMAN def test_get_user_type_machine(decoded_jwt: Dict[str, Any]) -> None: """Test getting a user's userType from a JWT.""" decoded_jwt[JWT_USER_METADATA][IS_MACHINE] = True user_type = jwt.get_user_type(decoded_jwt) assert user_type == USER_TYPE_MACHINE