"""Shared validation logic unit tests.""" from unittest.mock import MagicMock, patch from payee.blueprints.tax_details import validate_multiple_record_owner from payee.constants.constants import ( EMPLOYEE_ALL_VENDORS_MARK, LABEL_RESOURCE_NAME, VENDOR_RESOURCE_NAME, ) from payee.utils.permissions import ResourceAccessCheck, validate_record_owner from tests.utils.factories import AccountPayeeFactory account_payee_id = 1 account_id = 2 vendor_id = 3 profile_id_header = 1234 profile_type_header = 'DocumentsProfile' def test_validate_multiple_record_owner_error_on_profile_headers(mocker): """ Test request owner validation of the request and payee record. Error on getting Orchard headers. """ mocker.patch( 'payee.utils.validations.flask_request.get_profile_headers', return_value=(None, None), ) result = validate_multiple_record_owner([account_payee_id])[account_payee_id] assert not result def test_validate_multiple_record_owner_error_on_profile_type_header(mocker): """ Test request owner validation of the request and payee record. Error on getting Orchard-Profile-Type header. """ mocker.patch( 'payee.utils.validations.flask_request.get_profile_headers', return_value=(None, profile_id_header), ) result = validate_multiple_record_owner([account_payee_id])[account_payee_id] assert not result def test_validate_multiple_record_owner_error_on_profile_id_header(mocker): """ Test request owner validation of the request and payee record. Error on getting Orchard-Profile-Id header. """ mocker.patch( 'payee.utils.validations.flask_request.get_profile_headers', return_value=(profile_type_header, None), ) result = validate_multiple_record_owner([account_payee_id])[account_payee_id] assert not result def test_validate_multiple_record_owner_error_on_ows_abacus_account_error(mocker): """ Test request owner validation of the request and payee record. Error on ows-abacus-account request. """ mocker.patch( 'payee.utils.validations.flask_request.get_profile_headers', return_value=('DocumentsProfile', 1234), ) ows_abacus_response_mock = MagicMock(json_data={}, status_code=403) mocker.patch( 'payee.utils.validations.ows_client', return_value=ows_abacus_response_mock ) result = validate_multiple_record_owner([account_payee_id])[account_payee_id] assert not result def test_validate_multiple_record_owner_error_on_ows_permissions_error(mocker): """ Test request owner validation of the request and payee record. Error on ows-permissions request. """ mocker.patch( 'payee.utils.validations.flask_request.get_profile_headers', return_value=('DocumentsProfile', 1234), ) mock_abacus_resp = mocker.Mock( return_value={ 'items': [ { 'data': { 'account_payee_id': account_payee_id, 'account_id': account_id, } } ] } ) ows_abacus_response_mock = MagicMock(json=mock_abacus_resp, status_code=200) ows_permissions_response_mock = MagicMock(json={}, status_code=404) mocker.patch( 'payee.utils.validations.ows_client.get', side_effect=[ows_abacus_response_mock, ows_permissions_response_mock], ) result = validate_multiple_record_owner([account_payee_id])[account_payee_id] assert not result @patch('payee.utils.validations.AccountPayee') def test_validate_multiple_record_owner_success(mock_payee, mocker): """ Test request owner validation of the request and payee record when getting account data via account_payee table. Success validation. """ mocker.patch( 'payee.utils.validations.flask_request.get_profile_headers', return_value=('DocumentsProfile', 1234), ) payee = AccountPayeeFactory( account_payee_id=account_payee_id, account_id=account_id ) mock_payee.get_payees_by_ids.return_value = [payee] 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( 'payee.utils.validations.ows_client.get', side_effect=[ows_permissions_response_mock], ) result = validate_multiple_record_owner([account_payee_id])[account_payee_id] assert result @patch('payee.utils.validations.AccountPayee') def test_validate_multiple_record_owner_no_payees(mock_payee, mocker): """ Test request owner validation of the request and payee record when payee data not found via account_payee table. Failure validation. """ mocker.patch( 'payee.utils.validations.flask_request.get_profile_headers', return_value=('DocumentsProfile', 1234), ) mock_payee.get_payees_by_ids.return_value = [] result = validate_multiple_record_owner([account_payee_id])[account_payee_id] assert result is False @patch('payee.utils.validations.AccountPayee') def test_validate_multiple_record_owner_no_permission(mock_payee, mocker): """ Test request owner validation of the request and payee record when getting account data via account_payee table. Failure validation. """ mocker.patch( 'payee.utils.validations.flask_request.get_profile_headers', return_value=('DocumentsProfile', 1234), ) payee = AccountPayeeFactory( account_payee_id=account_payee_id, account_id=account_id ) mock_payee.get_payees_by_ids.return_value = [payee] mock_perm_resp = mocker.Mock( return_value={'items': [{'type': VENDOR_RESOURCE_NAME, 'vendorId': 3}]} ) ows_permissions_response_mock = MagicMock(json=mock_perm_resp, status_code=200) mocker.patch( 'payee.utils.validations.ows_client.get', side_effect=[ows_permissions_response_mock], ) result = validate_multiple_record_owner([account_payee_id])[account_payee_id] assert result is False def test_validate_record_owner(mocker): """ Test request owner validation of the request and payee record. Success validation. """ account = AccountPayeeFactory(account_id=account_id) mocker.patch( 'payee.utils.validations.AccountPayee.get_payees_by_ids', return_value=[account] ) mocker.patch( 'payee.utils.validations.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( 'payee.utils.validations.ows_client.get', side_effect=[ows_permissions_response_mock], ) result = validate_record_owner( ResourceAccessCheck(type=LABEL_RESOURCE_NAME, ids=[account_id]) ) assert result def test_validate_record_owner_no_account(mocker): """ Test request owner validation of the request and payee record. Failure validation. """ mocker.patch( 'payee.utils.validations.AccountPayee.get_payees_by_ids', return_value=[] ) result = validate_record_owner( ResourceAccessCheck(type=LABEL_RESOURCE_NAME, ids=[account_id]) ) assert not result def test_validate_record_owner_no_headers(mocker): """ Test request owner validation of the request and payee record. Failure validation. """ account = AccountPayeeFactory(account_id=account_id) mocker.patch( 'payee.utils.validations.AccountPayee.get_payees_by_ids', return_value=[account] ) mocker.patch( 'payee.utils.validations.flask_request.get_profile_headers', return_value=(None, None), ) result = validate_record_owner( ResourceAccessCheck(type=LABEL_RESOURCE_NAME, ids=[account_id]) ) assert not result def test_validate_record_owner_no_permissions(mocker): """ Test request owner validation of the request and payee record. Failure validation. """ account = AccountPayeeFactory(account_id=account_id) mocker.patch( 'payee.utils.validations.AccountPayee.get_payees_by_ids', return_value=[account] ) mocker.patch( 'payee.utils.validations.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( 'payee.utils.validations.ows_client.get', side_effect=[ows_permissions_response_mock], ) result = validate_record_owner( ResourceAccessCheck(type=LABEL_RESOURCE_NAME, ids=[account_id]) ) assert not result def test_get_vendor_ids(mocker): """ Test getting vendor ids from the response. Success validation. """ mock_perm_resp = mocker.Mock( return_value={ 'items': [ {'type': VENDOR_RESOURCE_NAME, 'vendorId': account_id}, {'type': 'Other', 'vendorId': 4}, ] } ) ows_permissions_response_mock = MagicMock(json=mock_perm_resp, status_code=200) mocker.patch( 'payee.utils.validations.ows_client.get', side_effect=[ows_permissions_response_mock], ) mocker.patch( 'payee.utils.validations.flask_request.get_profile_headers', return_value=('DocumentsProfile', 1234), ) result = validate_record_owner( ResourceAccessCheck(type=LABEL_RESOURCE_NAME, ids=[account_id]) ) assert result def test_get_vendor_ids_no_items(mocker): """ Test getting vendor ids from the response. No items in the response. """ mock_perm_resp = mocker.Mock(return_value={}) ows_permissions_response_mock = MagicMock(json=mock_perm_resp, status_code=200) mocker.patch( 'payee.utils.validations.ows_client.get', side_effect=[ows_permissions_response_mock], ) mocker.patch( 'payee.utils.validations.flask_request.get_profile_headers', return_value=('DocumentsProfile', 1234), ) result = validate_record_owner( ResourceAccessCheck(type=LABEL_RESOURCE_NAME, ids=[account_id]) ) assert not result def test_get_vendor_ids_no_vendor_items(mocker): """ Test getting vendor ids from the response. No vendor items in the response. """ mock_perm_resp = mocker.Mock( return_value={'items': [{'type': 'Other', 'vendorId': 4}]} ) ows_permissions_response_mock = MagicMock(json=mock_perm_resp, status_code=200) mocker.patch( 'payee.utils.validations.ows_client.get', side_effect=[ows_permissions_response_mock], ) mocker.patch( 'payee.utils.validations.flask_request.get_profile_headers', return_value=('DocumentsProfile', 1234), ) result = validate_record_owner( ResourceAccessCheck(type=LABEL_RESOURCE_NAME, ids=[account_id]) ) assert not result