"""Shared validation logic.""" from unittest.mock import MagicMock from abacus_state.constants.constants import VENDOR_RESOURCE_NAME from abacus_state.models.account_payee import AccountPayee from abacus_state.utils.permissions import validate_record_owner_access_checks from abacus_state.utils.validation_access_checks import ( ResourceAccessCheck, _combine_access_checks_by_type, build_resource_access_check, ) vendor_id = 3 profile_id_header = 1234 profile_type_header = 'DocumentsProfile' def _build_account_payee_access_checks(account_payee_ids): return [ build_resource_access_check( parent_table_name='account_payee', parent_table_id=account_payee_id ) for account_payee_id in account_payee_ids ] def test_validate_record_owner( mocker, account_fixtures, payoneer_program_fixtures, account_payee_fixtures ): """Test request owner validation of the request and payee record. Success validation. """ account_payee_ids = [1] account_id = 1 account = AccountPayee.get_payees_by_ids(account_payee_ids)[0] mocker.patch( 'abacus_state.utils.validation_access_checks.AccountPayee.get_payees_by_ids', return_value=[account], ) mocker.patch( 'abacus_state.utils.validation_access_checks.flask_request.get_profile_headers', return_value=('DocumentsProfile', 1234), ) mock_perm_resp = mocker.Mock( return_value={'items': [{'type': VENDOR_RESOURCE_NAME, 'vendorId': account_id}]} ) ows_permissions_response_mock = MagicMock(json=mock_perm_resp, status_code=200) mocker.patch( 'abacus_state.utils.validation_access_checks.requests.process', side_effect=[ows_permissions_response_mock], ) result = validate_record_owner_access_checks( _build_account_payee_access_checks(account_payee_ids) ) assert result def test_validate_record_owner_multiple_users_success( mocker, account_fixtures, payoneer_program_fixtures, account_payee_fixtures ): """Test request owner validation of the request and payee record. Success validation. """ account_payee_ids = [1, 2] account_id_1 = 1 account_id_2 = 2 account_1, account_2 = AccountPayee.get_payees_by_ids(account_payee_ids) mocker.patch( 'abacus_state.utils.validation_access_checks.AccountPayee.get_payees_by_ids', return_value=[account_1, account_2], ) mocker.patch( 'abacus_state.utils.validation_access_checks.flask_request.get_profile_headers', return_value=('DocumentsProfile', 1234), ) mock_perm_resp = mocker.Mock( return_value={ 'items': [ {'type': VENDOR_RESOURCE_NAME, 'vendorId': account_id_1}, {'type': VENDOR_RESOURCE_NAME, 'vendorId': account_id_2}, ] } ) ows_permissions_response_mock = MagicMock(json=mock_perm_resp, status_code=200) mocker.patch( 'abacus_state.utils.validation_access_checks.requests.process', side_effect=[ows_permissions_response_mock], ) result = validate_record_owner_access_checks( _build_account_payee_access_checks(account_payee_ids) ) assert result def test_validate_record_owner_multiple_users_failure( mocker, account_fixtures, payoneer_program_fixtures, account_payee_fixtures ): """Test request owner validation of the request and payee record. Failure validation. """ account_payee_ids = [1, 2] account_id_1 = 1 account_1, account_2 = AccountPayee.get_payees_by_ids(account_payee_ids) mocker.patch( 'abacus_state.utils.validation_access_checks.AccountPayee.get_payees_by_ids', return_value=[account_1, account_2], ) mocker.patch( 'abacus_state.utils.validation_access_checks.flask_request.get_profile_headers', return_value=('DocumentsProfile', 1234), ) mock_perm_resp = mocker.Mock( return_value={ 'items': [{'type': VENDOR_RESOURCE_NAME, 'vendorId': account_id_1}] } ) ows_permissions_response_mock = MagicMock(json=mock_perm_resp, status_code=200) mocker.patch( 'abacus_state.utils.validation_access_checks.requests.process', side_effect=[ows_permissions_response_mock], ) result = validate_record_owner_access_checks( _build_account_payee_access_checks(account_payee_ids) ) assert not result def test_validate_record_owner_no_accounts( mocker, account_fixtures, payoneer_program_fixtures ): """Test request owner validation of the request and payee record. Failure validation. """ account_payee_ids = [1] mocker.patch( 'abacus_state.utils.validation_access_checks.AccountPayee.get_payees_by_ids', return_value=[], ) result = validate_record_owner_access_checks( _build_account_payee_access_checks(account_payee_ids) ) assert not result def test_validate_record_owner_no_headers( mocker, account_fixtures, payoneer_program_fixtures, account_payee_fixtures ): """Test request owner validation of the request and payee record. Failure validation. """ account_payee_ids = [1] account = AccountPayee.get_payees_by_ids(account_payee_ids)[0] mocker.patch( 'abacus_state.utils.validation_access_checks.AccountPayee.get_payees_by_ids', return_value=[account], ) mocker.patch( 'abacus_state.utils.validation_access_checks.flask_request.get_profile_headers', return_value=(None, None), ) result = validate_record_owner_access_checks( _build_account_payee_access_checks(account_payee_ids) ) assert not result def test_validate_record_owner_no_permissions( mocker, account_fixtures, payoneer_program_fixtures, account_payee_fixtures ): """Test request owner validation of the request and payee record. Failure validation. """ account_payee_ids = [1] account = AccountPayee.get_payees_by_ids(account_payee_ids)[0] mocker.patch( 'abacus_state.utils.validation_access_checks.AccountPayee.get_payees_by_ids', return_value=[account], ) mocker.patch( 'abacus_state.utils.validation_access_checks.flask_request.get_profile_headers', return_value=('DocumentsProfile', 1234), ) mock_perm_resp = mocker.Mock(return_value={}) ows_permissions_response_mock = MagicMock(json=mock_perm_resp, status_code=200) mocker.patch( 'abacus_state.utils.validation_access_checks.requests.process', side_effect=[ows_permissions_response_mock], ) result = validate_record_owner_access_checks( _build_account_payee_access_checks(account_payee_ids) ) assert not result def test_combine_access_checks_by_type( mocker, ): """Test combine access checks by type logic.""" combined = _combine_access_checks_by_type( [ ResourceAccessCheck( resource_type='A', ids=[1, 2], ), ResourceAccessCheck( resource_type='A', ids=[2, 3], ), ResourceAccessCheck( resource_type='B', ids=[4, 5], ), ] ) assert combined == [ ResourceAccessCheck( resource_type='A', ids=[1, 2, 3], ), ResourceAccessCheck( resource_type='B', ids=[4, 5], ), ]