from dataclasses import dataclass import pytest from fansifter_common.auth.account import Account, AccountAccess @dataclass class Target: vendor_id: int subaccount_id: int @property def account(self) -> Account: return Account(vendor_id=self.vendor_id, subaccount_id=self.subaccount_id) def test_account_access_get_allowed_vendor_ids_for() -> None: accounts = [ Account(vendor_id=1, subaccount_id=0), Account(vendor_id=2, subaccount_id=0), Account(vendor_id=3, subaccount_id=0), Account(vendor_id=4, subaccount_id=0), Account(vendor_id=5, subaccount_id=0), ] account_access = AccountAccess(accounts=accounts) assert account_access.get_allowed_vendor_ids_for([2, 3, 6]) == [2, 3] def test_account_access_get_allowed_subaccount_ids_for() -> None: accounts = [ Account(vendor_id=1, subaccount_id=10), Account(vendor_id=1, subaccount_id=20), Account(vendor_id=2, subaccount_id=30), Account(vendor_id=3, subaccount_id=40), ] account_access = AccountAccess(accounts=accounts) assert account_access.get_allowed_subaccount_ids_for([10, 20, 50]) == [10, 20] @pytest.mark.parametrize( "accounts, vendor_id, expected", [ pytest.param([], 100, False, id="no resources"), pytest.param( [ Account(vendor_id=100, subaccount_id=0), Account(vendor_id=200, subaccount_id=0), ], 100, True, id="has direct access to the Vendor", ), pytest.param( [ Account(vendor_id=200, subaccount_id=0), Account(vendor_id=300, subaccount_id=0), ], 100, False, id="does not have direct access to the Vendor", ), ], ) def test_account_access_has_access_to_vendor( accounts: list[Account], vendor_id: int, expected: bool ) -> None: account_access = AccountAccess(accounts=accounts) actual = account_access.has_access_to_vendor(vendor_id=vendor_id) assert actual == expected @pytest.mark.parametrize( "accounts, subaccount_id, expected", [ pytest.param([], 1000, False, id="no resources"), pytest.param( [ Account(vendor_id=100, subaccount_id=1000), Account(vendor_id=200, subaccount_id=2000), ], 1000, True, id="has direct access to the Subaccount", ), pytest.param( [ Account(vendor_id=200, subaccount_id=2000), Account(vendor_id=300, subaccount_id=3000), ], 1000, False, id="does not have direct access to the Subaccount", ), ], ) def test_account_access_has_access_to_subaccount( accounts: list[Account], subaccount_id: int, expected: bool ) -> None: account_access = AccountAccess(accounts=accounts) actual = account_access.has_access_to_subaccount(subaccount_id) assert actual == expected @pytest.mark.parametrize( "accounts, label_id, expected", [ ([], Account(vendor_id=100, subaccount_id=0), False), ( [ Account(vendor_id=100, subaccount_id=0), ], Account(vendor_id=100, subaccount_id=0), True, ), ( [ Account(vendor_id=100, subaccount_id=0), ], Account(vendor_id=100, subaccount_id=1000), True, ), ( [ Account(vendor_id=100, subaccount_id=1000), ], Account(vendor_id=100, subaccount_id=1000), True, ), ( [ Account(vendor_id=100, subaccount_id=2000), ], Account(vendor_id=100, subaccount_id=1000), False, ), ], ) def test_account_access_has_access( accounts: list[Account], label_id: Account, expected: bool ) -> None: account_access = AccountAccess(accounts=accounts) actual = account_access.has_access(account=label_id) assert actual == expected @pytest.mark.parametrize( ("accounts", "label_id", "expected"), [ ( [], Account(vendor_id=100, subaccount_id=0), False, ), ( [Account(vendor_id=100, subaccount_id=0)], Account(vendor_id=100, subaccount_id=0), True, ), ( [Account(vendor_id=100, subaccount_id=0)], Account(vendor_id=200, subaccount_id=0), False, ), ], ) def test_account_access_allowed_for( accounts: list[Account], label_id: Account, expected: bool ) -> None: account_access = AccountAccess(accounts=accounts) target = Target( vendor_id=label_id.vendor_id, subaccount_id=label_id.subaccount_id, ) assert account_access.allowed_for(target) is expected @pytest.mark.parametrize( ("accounts", "authorized"), [ [[], False], [[Account(vendor_id=1, subaccount_id=0)], True], ], ) def test_authorize_account_access(accounts: list[Account], authorized: bool) -> None: account_access = AccountAccess(accounts=accounts) assert account_access.authorized == authorized