from unittest import mock import httpx import pytest from fansifter_common.auth.account import Account from fansifter_common.auth.exceptions import InvalidAccountError from fansifter_common.auth.validators import AccountValidator from tests.factories import SubaccountFactory, VendorFactory @pytest.fixture def account_validator(ows_account_client_mock: mock.MagicMock) -> AccountValidator: return AccountValidator(ows_account_client=ows_account_client_mock) def test_validate_account_without_subaccount( account_validator: AccountValidator, ows_account_client_mock: mock.MagicMock ) -> None: vendor = VendorFactory.build() account = Account(vendor_id=vendor.vendor_id, subaccount_id=0) ows_account_client_mock.get_vendor.return_value = vendor result = account_validator.validate_account(account) assert result == vendor def test_validate_account_without_subaccount_http_error( account_validator: AccountValidator, ows_account_client_mock: mock.MagicMock ) -> None: vendor = VendorFactory.build() account = Account(vendor_id=vendor.vendor_id, subaccount_id=0) ows_account_client_mock.get_vendor.side_effect = httpx.HTTPError("Error") with pytest.raises(InvalidAccountError, match="Invalid vendor_id"): account_validator.validate_account(account) def test_validate_account_with_subaccount( account_validator: AccountValidator, ows_account_client_mock: mock.MagicMock ) -> None: subaccount = SubaccountFactory.build() account = Account( vendor_id=subaccount.vendor_id, subaccount_id=subaccount.subaccount_id ) ows_account_client_mock.get_subaccount.return_value = subaccount result = account_validator.validate_account(account) assert result == subaccount def test_validate_account_with_subaccount_not_allowed( account_validator: AccountValidator, ows_account_client_mock: mock.MagicMock ) -> None: subaccount = SubaccountFactory.build() account = Account( vendor_id=subaccount.vendor_id, subaccount_id=subaccount.subaccount_id ) with pytest.raises(InvalidAccountError, match="Subaccount not allowed"): account_validator.validate_account(account, allow_subaccount=False) def test_validate_account_with_subaccount_invalid_vendor_id( account_validator: AccountValidator, ows_account_client_mock: mock.MagicMock ) -> None: subaccount = SubaccountFactory.build() account = Account( vendor_id=subaccount.vendor_id + 1, subaccount_id=subaccount.subaccount_id, ) ows_account_client_mock.get_subaccount.return_value = subaccount with pytest.raises(InvalidAccountError, match="Invalid vendor_id"): account_validator.validate_account(account) def test_validate_account_with_subaccount_http_error( account_validator: AccountValidator, ows_account_client_mock: mock.MagicMock ) -> None: subaccount = SubaccountFactory.build() account = Account( vendor_id=subaccount.vendor_id + 1, subaccount_id=subaccount.subaccount_id, ) ows_account_client_mock.get_subaccount.side_effect = httpx.HTTPError("Error") with pytest.raises(InvalidAccountError, match="Invalid subaccount_id"): account_validator.validate_account(account)