"""Test tenant-related schemas.""" from typing import Any, Dict, Optional import pytest from pdp.constants.constants import TenantType from pdp.fastapi.schemas.tenant import ( IdToUuidExchangeTenant, IdToUuidExchangeTenantResourceAttributes, ) ID_TO_UUID_EXCHANGE_TENANT_ACCOUNT_1 = IdToUuidExchangeTenant( tenant_type=TenantType.TENANT_TYPE_ACCOUNT, tenant_id=11117, ) ID_TO_UUID_EXCHANGE_TENANT_ACCOUNT_1_VARIANT = IdToUuidExchangeTenant( tenant_type=TenantType.TENANT_TYPE_ACCOUNT, tenant_id="11117", ) ID_TO_UUID_EXCHANGE_TENANT_ACCOUNT_2 = IdToUuidExchangeTenant( tenant_type=TenantType.TENANT_TYPE_ACCOUNT, tenant_id=22227, ) ID_TO_UUID_EXCHANGE_TENANT_SUBACCOUNT = IdToUuidExchangeTenant( tenant_type=TenantType.TENANT_TYPE_SUBACCOUNT, tenant_id=668894, ) ID_TO_UUID_EXCHANGE_TENANT_COMPANY_BRAND = IdToUuidExchangeTenant( tenant_type=TenantType.TENANT_TYPE_COMPANY_BRAND, tenant_id=99456, ) ID_TO_UUID_EXCHANGE_TENANT_SUBACCOUNT_SAME_ID_AS_ACCOUNT_1 = IdToUuidExchangeTenant( # noqa: E501 tenant_type=TenantType.TENANT_TYPE_SUBACCOUNT, tenant_id=11117, ) ID_TO_UUID_EXCHANGE_TENANT_LP = IdToUuidExchangeTenant( tenant_type=TenantType.TENANT_TYPE_LABEL_PARTICIPANT, tenant_id=str("cfe6d118-51e9-4f4d-8796-279bbe5e8f90"), ) @pytest.mark.parametrize( "exchange_tenant, expected", [ ( ID_TO_UUID_EXCHANGE_TENANT_ACCOUNT_1, "TenantType.TENANT_TYPE_ACCOUNT#11117", ), ( ID_TO_UUID_EXCHANGE_TENANT_ACCOUNT_1_VARIANT, "TenantType.TENANT_TYPE_ACCOUNT#11117", ), ( ID_TO_UUID_EXCHANGE_TENANT_ACCOUNT_2, "TenantType.TENANT_TYPE_ACCOUNT#22227", ), ( ID_TO_UUID_EXCHANGE_TENANT_COMPANY_BRAND, "TenantType.TENANT_TYPE_COMPANY_BRAND#99456", ), ( ID_TO_UUID_EXCHANGE_TENANT_SUBACCOUNT, "TenantType.TENANT_TYPE_SUBACCOUNT#668894", ), ( ID_TO_UUID_EXCHANGE_TENANT_SUBACCOUNT_SAME_ID_AS_ACCOUNT_1, "TenantType.TENANT_TYPE_SUBACCOUNT#11117", ), ], ) def test_id_to_uuid_exchange_tenant_repr( exchange_tenant: IdToUuidExchangeTenant, expected: str ) -> None: """Test __repr__.""" assert repr(exchange_tenant) == expected @pytest.mark.parametrize( "exchange_tenant_1, exchange_tenant_2, expected, description", [ ( ID_TO_UUID_EXCHANGE_TENANT_ACCOUNT_1, ID_TO_UUID_EXCHANGE_TENANT_ACCOUNT_1, False, "the same tenant is not less than itself", ), ( ID_TO_UUID_EXCHANGE_TENANT_ACCOUNT_1, ID_TO_UUID_EXCHANGE_TENANT_ACCOUNT_1_VARIANT, False, "the same tenant is not less than itself, regardless of int/str id", ), ( ID_TO_UUID_EXCHANGE_TENANT_ACCOUNT_1, ID_TO_UUID_EXCHANGE_TENANT_ACCOUNT_2, True, "exchange tenant account 1 is less than tenant account 2", ), ( ID_TO_UUID_EXCHANGE_TENANT_ACCOUNT_2, ID_TO_UUID_EXCHANGE_TENANT_ACCOUNT_1, False, "exchange tenant account 2 is not less than exchange tenant account 1", ), ( ID_TO_UUID_EXCHANGE_TENANT_ACCOUNT_1, ID_TO_UUID_EXCHANGE_TENANT_COMPANY_BRAND, True, "exchange tenant account 1 is less than company brand", ), ( ID_TO_UUID_EXCHANGE_TENANT_COMPANY_BRAND, ID_TO_UUID_EXCHANGE_TENANT_ACCOUNT_1, False, "exchange tenant company brand is not less than exchange account 1", ), ( ID_TO_UUID_EXCHANGE_TENANT_ACCOUNT_1, ID_TO_UUID_EXCHANGE_TENANT_SUBACCOUNT, True, "exchange tenant account 1 is less than subaccount", ), ( ID_TO_UUID_EXCHANGE_TENANT_SUBACCOUNT, ID_TO_UUID_EXCHANGE_TENANT_ACCOUNT_1, False, "exchange tenant subaccount is not less than account 1", ), ], ) def test_id_to_uuid_exchange_tenant_lt( exchange_tenant_1: IdToUuidExchangeTenant, exchange_tenant_2: IdToUuidExchangeTenant, expected: bool, description: str, ) -> None: """Test __lt__ operation.""" assert (exchange_tenant_1 < exchange_tenant_2) == expected, description @pytest.mark.parametrize( "exchange_tenant_1, exchange_tenant_2, expected, description", [ ( ID_TO_UUID_EXCHANGE_TENANT_ACCOUNT_1, ID_TO_UUID_EXCHANGE_TENANT_ACCOUNT_1, True, "the same tenant is less than or equal", ), ( ID_TO_UUID_EXCHANGE_TENANT_ACCOUNT_1, ID_TO_UUID_EXCHANGE_TENANT_ACCOUNT_1_VARIANT, True, "the same tenant is less than or equal, regardless of int/str id", ), ( ID_TO_UUID_EXCHANGE_TENANT_ACCOUNT_1, ID_TO_UUID_EXCHANGE_TENANT_ACCOUNT_2, True, "exchange tenant account 1 is less than or equal to account 2", ), ( ID_TO_UUID_EXCHANGE_TENANT_ACCOUNT_2, ID_TO_UUID_EXCHANGE_TENANT_ACCOUNT_1, False, "exchange tenant account 2 is not less than or equal to tenant account 1", ), ( ID_TO_UUID_EXCHANGE_TENANT_ACCOUNT_1, ID_TO_UUID_EXCHANGE_TENANT_COMPANY_BRAND, True, "exchange tenant account 1 is less than or equal to company brand", ), ( ID_TO_UUID_EXCHANGE_TENANT_COMPANY_BRAND, ID_TO_UUID_EXCHANGE_TENANT_ACCOUNT_1, False, "exchange tenant company brand is not less than or equal to account 1", ), ( ID_TO_UUID_EXCHANGE_TENANT_ACCOUNT_1, ID_TO_UUID_EXCHANGE_TENANT_SUBACCOUNT, True, "exchange tenant account 1 is less than or equal to subaccount", ), ( ID_TO_UUID_EXCHANGE_TENANT_SUBACCOUNT, ID_TO_UUID_EXCHANGE_TENANT_ACCOUNT_1, False, "exchange tenant subaccount is not less than or equal to account", ), ( ID_TO_UUID_EXCHANGE_TENANT_ACCOUNT_1, ID_TO_UUID_EXCHANGE_TENANT_SUBACCOUNT_SAME_ID_AS_ACCOUNT_1, True, "subaccount with same id is less than or equal to account", ), ], ) def test_id_to_uuid_exchange_tenant_lte( exchange_tenant_1: IdToUuidExchangeTenant, exchange_tenant_2: IdToUuidExchangeTenant, expected: bool, description: str, ) -> None: """Test __le__ operation.""" assert (exchange_tenant_1 <= exchange_tenant_2) == expected, description @pytest.mark.parametrize( "exchange_tenant_1, exchange_tenant_2, expected, description", [ ( ID_TO_UUID_EXCHANGE_TENANT_ACCOUNT_1, ID_TO_UUID_EXCHANGE_TENANT_ACCOUNT_1, True, "the same exchange tenant is equal", ), ( ID_TO_UUID_EXCHANGE_TENANT_ACCOUNT_1, ID_TO_UUID_EXCHANGE_TENANT_ACCOUNT_1_VARIANT, True, "the same tenant is equal, regardless of int/str id", ), ( ID_TO_UUID_EXCHANGE_TENANT_ACCOUNT_1, ID_TO_UUID_EXCHANGE_TENANT_ACCOUNT_2, False, "exchange tenant account 1 is not equal to tenant account 2", ), ( ID_TO_UUID_EXCHANGE_TENANT_ACCOUNT_1, ID_TO_UUID_EXCHANGE_TENANT_COMPANY_BRAND, False, "exchange tenant account 1 is not equal to company brand", ), ( ID_TO_UUID_EXCHANGE_TENANT_COMPANY_BRAND, ID_TO_UUID_EXCHANGE_TENANT_ACCOUNT_1, False, "company brand is not equal to exchange tenant account 1", ), ( ID_TO_UUID_EXCHANGE_TENANT_ACCOUNT_1, ID_TO_UUID_EXCHANGE_TENANT_SUBACCOUNT, False, "exchange tenant account 1 is not equal to subaccount", ), ( ID_TO_UUID_EXCHANGE_TENANT_ACCOUNT_1, ID_TO_UUID_EXCHANGE_TENANT_SUBACCOUNT_SAME_ID_AS_ACCOUNT_1, False, "subaccount with same id is not equal to account", ), ], ) def test_id_to_uuid_exchange_tenant_eq( exchange_tenant_1: IdToUuidExchangeTenant, exchange_tenant_2: IdToUuidExchangeTenant, expected: bool, description: str, ) -> None: """Test __eq__ operation.""" assert (exchange_tenant_1 == exchange_tenant_2) == expected, description @pytest.mark.parametrize( "exchange_tenant_1, exchange_tenant_2, expected, description", [ ( ID_TO_UUID_EXCHANGE_TENANT_ACCOUNT_1, ID_TO_UUID_EXCHANGE_TENANT_ACCOUNT_1, False, "the same tenant is equal", ), ( ID_TO_UUID_EXCHANGE_TENANT_ACCOUNT_1, ID_TO_UUID_EXCHANGE_TENANT_ACCOUNT_1_VARIANT, False, "the same tenant is equal, regardless of int/str id", ), ( ID_TO_UUID_EXCHANGE_TENANT_ACCOUNT_1, ID_TO_UUID_EXCHANGE_TENANT_ACCOUNT_2, True, "exchange tenant account 1 is not equal to tenant account 2", ), ( ID_TO_UUID_EXCHANGE_TENANT_ACCOUNT_1, ID_TO_UUID_EXCHANGE_TENANT_COMPANY_BRAND, True, "exchange tenant account 1 is not equal to company brand", ), ( ID_TO_UUID_EXCHANGE_TENANT_COMPANY_BRAND, ID_TO_UUID_EXCHANGE_TENANT_ACCOUNT_1, True, "company brand is not equal to tenant account 1", ), ( ID_TO_UUID_EXCHANGE_TENANT_ACCOUNT_1, ID_TO_UUID_EXCHANGE_TENANT_SUBACCOUNT, True, "exchange tenant account 1 is not equal to subaccount", ), ( ID_TO_UUID_EXCHANGE_TENANT_ACCOUNT_1, ID_TO_UUID_EXCHANGE_TENANT_SUBACCOUNT_SAME_ID_AS_ACCOUNT_1, True, "subaccount with same id is not equal to account", ), ], ) def test_id_to_uuid_exchange_tenant_ne( exchange_tenant_1: IdToUuidExchangeTenant, exchange_tenant_2: IdToUuidExchangeTenant, expected: bool, description: str, ) -> None: """Test __ne__ operation.""" assert (exchange_tenant_1 != exchange_tenant_2) == expected, description @pytest.mark.parametrize( "exchange_tenant_1, exchange_tenant_2, expected, description", [ ( ID_TO_UUID_EXCHANGE_TENANT_ACCOUNT_1, ID_TO_UUID_EXCHANGE_TENANT_ACCOUNT_1, False, "the same exchange tenant is not greater than", ), ( ID_TO_UUID_EXCHANGE_TENANT_ACCOUNT_1, ID_TO_UUID_EXCHANGE_TENANT_ACCOUNT_1_VARIANT, False, "the same tenant is not greater than, regardless of int/str id", ), ( ID_TO_UUID_EXCHANGE_TENANT_ACCOUNT_1, ID_TO_UUID_EXCHANGE_TENANT_ACCOUNT_2, False, "exchange tenant account 1 is not greater than exchange tenant account 2", ), ( ID_TO_UUID_EXCHANGE_TENANT_ACCOUNT_2, ID_TO_UUID_EXCHANGE_TENANT_ACCOUNT_1, True, "exchange tenant account 2 is greater than exchange tenant account 1", ), ( ID_TO_UUID_EXCHANGE_TENANT_ACCOUNT_1, ID_TO_UUID_EXCHANGE_TENANT_COMPANY_BRAND, False, "exchange tenant account 1 is not greater than company brand", ), ( ID_TO_UUID_EXCHANGE_TENANT_COMPANY_BRAND, ID_TO_UUID_EXCHANGE_TENANT_ACCOUNT_1, True, "exchange tenant company brand is greater than account 1", ), ( ID_TO_UUID_EXCHANGE_TENANT_ACCOUNT_1, ID_TO_UUID_EXCHANGE_TENANT_SUBACCOUNT, False, "exchange tenant account 1 is not greater than subaccount", ), ( ID_TO_UUID_EXCHANGE_TENANT_SUBACCOUNT, ID_TO_UUID_EXCHANGE_TENANT_ACCOUNT_1, True, "exchange tenant subaccount is greater than account 1", ), ( ID_TO_UUID_EXCHANGE_TENANT_ACCOUNT_1, ID_TO_UUID_EXCHANGE_TENANT_SUBACCOUNT_SAME_ID_AS_ACCOUNT_1, False, "subaccount with same id is not greater than account", ), ], ) def test_id_to_uuid_exchange_tenant_gt( exchange_tenant_1: IdToUuidExchangeTenant, exchange_tenant_2: IdToUuidExchangeTenant, expected: bool, description: str, ) -> None: """Test __gt__ operation.""" assert (exchange_tenant_1 > exchange_tenant_2) == expected, description @pytest.mark.parametrize( "exchange_tenant_1, exchange_tenant_2, expected, description", [ ( ID_TO_UUID_EXCHANGE_TENANT_ACCOUNT_1, ID_TO_UUID_EXCHANGE_TENANT_ACCOUNT_1, True, "the same exchange tenant is greater than or equal", ), ( ID_TO_UUID_EXCHANGE_TENANT_ACCOUNT_1, ID_TO_UUID_EXCHANGE_TENANT_ACCOUNT_1_VARIANT, True, "the same tenant is greater than or equal, regardless of int/str id", ), ( ID_TO_UUID_EXCHANGE_TENANT_ACCOUNT_1, ID_TO_UUID_EXCHANGE_TENANT_ACCOUNT_2, False, "exchange tenant account 1 is not greater than or equal to tenant account 2", # noqa: E501 ), ( ID_TO_UUID_EXCHANGE_TENANT_ACCOUNT_2, ID_TO_UUID_EXCHANGE_TENANT_ACCOUNT_1, True, "exchange tenant account 2 is greater than or equal to exchange tenant account 1", # noqa: E501 ), ( ID_TO_UUID_EXCHANGE_TENANT_ACCOUNT_1, ID_TO_UUID_EXCHANGE_TENANT_COMPANY_BRAND, False, "exchange tenant account 1 is not greater than or equal to company brand", ), ( ID_TO_UUID_EXCHANGE_TENANT_COMPANY_BRAND, ID_TO_UUID_EXCHANGE_TENANT_ACCOUNT_1, True, "exchange tenant company brand is greater than or equal to account 1", ), ( ID_TO_UUID_EXCHANGE_TENANT_ACCOUNT_1, ID_TO_UUID_EXCHANGE_TENANT_SUBACCOUNT, False, "exchange tenant account 1 is not greater than or equal to subaccount", ), ( ID_TO_UUID_EXCHANGE_TENANT_SUBACCOUNT, ID_TO_UUID_EXCHANGE_TENANT_ACCOUNT_1, True, "exchange tenant subaccount is greater than or equal to account 1", ), ( ID_TO_UUID_EXCHANGE_TENANT_ACCOUNT_1, ID_TO_UUID_EXCHANGE_TENANT_SUBACCOUNT_SAME_ID_AS_ACCOUNT_1, False, "subaccount with same id is not greater than or equal to account", ), ], ) def test_id_to_uuid_exchange_tenant_gte( exchange_tenant_1: IdToUuidExchangeTenant, exchange_tenant_2: IdToUuidExchangeTenant, expected: bool, description: str, ) -> None: """Test __ge__ operation.""" assert (exchange_tenant_1 >= exchange_tenant_2) == expected, description def test_id_to_uuid_exchange_tenant_hash() -> None: """Test __hash__ operation.""" assert hash(ID_TO_UUID_EXCHANGE_TENANT_ACCOUNT_1) == hash( ID_TO_UUID_EXCHANGE_TENANT_ACCOUNT_1_VARIANT ) assert hash(ID_TO_UUID_EXCHANGE_TENANT_ACCOUNT_1) != hash( ID_TO_UUID_EXCHANGE_TENANT_ACCOUNT_2 ) def test_id_exchange_tenant_hierarchy_to_key_vals_tuple() -> None: """Test to_key_vals_tuple.""" obj = IdToUuidExchangeTenant.model_validate( { "tenant_id": 1, "tenant_type": "account", } ) assert obj.to_key_vals_tuple() == [ ("tenant_id", "1"), ("tenant_type", "account"), ("tenant_uuid", "*"), ] @pytest.mark.parametrize( "payload, expect_exception, expected", [ pytest.param( { "id_to_uuid_exchange_tenant": { "tenant_type": "account", "tenant_id": 7123, }, }, False, { "id_to_uuid_exchange_tenant": { "tenant_type": "account", "tenant_id": 7123, }, }, id="happy path", ), pytest.param({}, True, {}, id="id_to_uuid_exchange_tenant is not present"), pytest.param( { "id_to_uuid_exchange_tenant": { "tenant_type": "account", "tenant_id": 7123, "ignores": "this", }, "tenant": { "tenant_type": "account", "tenant_uuid": "89b79b52-de18-4644-bd2b-bd28fdbeebaa", }, }, False, { "id_to_uuid_exchange_tenant": { "tenant_type": "account", "tenant_id": 7123, }, }, id="other attributes are allowed, just disregarded", ), ], ) def test_id_to_uuid_exchange_tenant_resource_attrs( payload: Optional[IdToUuidExchangeTenant], expect_exception: bool, expected: Dict[str, Any], ) -> None: """Test IdToUuidExchangeTenantResourceAttributes model.""" if expect_exception: with pytest.raises(Exception): IdToUuidExchangeTenantResourceAttributes.model_validate(payload) else: actual = IdToUuidExchangeTenantResourceAttributes.model_validate(payload) assert actual == IdToUuidExchangeTenantResourceAttributes(**expected) def test_id_to_uuid_exchange_tenant_to_cache_key() -> None: """Test to_cache_key.""" obj = IdToUuidExchangeTenant.model_validate( { "tenant_id": 1, "tenant_type": "account", } ) assert obj.to_cache_key() == "tenant_hierarchy@tenant_id#1|tenant_type#account"