"""Functional tests for account_payee.""" from unittest.mock import MagicMock, patch from abacus_common_logic.test_utils.helpers import get_json_body from abacus_common_logic.utils.dates import safe_format_date from flask.testing import FlaskClient import pytest from abacus_account.constants import error from tests.utils.factories import ( AccountFactory, AccountPayeeFactory, AccountPaymentTermFactory, PaymentEntityPayoneerProgramFactory, ) def test_create_account_payee(fixture_client): """Test to create an account payee.""" account = AccountFactory.create() post_body = { 'account_id': account.account_id, 'payoneer_payee_id': 1, 'payoneer_payee_name': 'Captain Payoneer', 'payoneer_iframe_url': 'payoneer.com/iframe', 'payoneer_iframe_url_date': '2022-03-01', 'payoneer_session_id': '2000', 'sap_vendor_id': 100 } res = fixture_client.post('/account-payee/', json=post_body) assert res.status_code == 201 response_data = get_json_body(res) assert response_data == { **post_body, 'reference_payment_type_id': None, 'payoneer_program_id': None, 'account_payee_id': response_data['account_payee_id'], 'last_modified': response_data['last_modified'], 'payment_description': '', } def test_create_account_payee_with_payment_type(fixture_client): """Test to create an account payee.""" account = AccountFactory.create() post_body = { 'account_id': account.account_id, 'payoneer_payee_id': 1, 'payoneer_payee_name': 'Captain Payoneer', 'payoneer_iframe_url': 'payoneer.com/iframe', 'payoneer_iframe_url_date': '2022-03-01', 'payoneer_session_id': '2000', 'sap_vendor_id': 100, 'reference_payment_type_id': 7, 'payment_description': '', } res = fixture_client.post('/account-payee/', json=post_body) assert res.status_code == 201 response_data = get_json_body(res) assert response_data == { **post_body, 'payoneer_program_id': None, 'account_payee_id': response_data['account_payee_id'], 'last_modified': response_data['last_modified'], 'payment_description': '', } def test_create_account_payee_does_not_accept_program_id(fixture_client): """Test error when creating account_payee with a payoneer_program_id.""" account = AccountFactory.create() post_body = { 'account_id': account.account_id, 'payoneer_program_id': 4444, 'payoneer_payee_id': 1, 'payoneer_payee_name': 'Captain Payoneer', 'payoneer_iframe_url': 'payoneer.com/iframe', 'payoneer_iframe_url_date': '2022-03-01', 'payoneer_session_id': '2000', 'sap_vendor_id': 100 } res = fixture_client.post('/account-payee/', json=post_body) assert res.status_code == 400 response_data = get_json_body(res) assert response_data == { 'code': 'error', 'message': {'payoneer_program_id': ['Unknown field.']} } def test_update_account_payee(fixture_client): """Test to update an account payee.""" account_payee = AccountPayeeFactory.create() account_payee_id = account_payee.account_payee_id payoneer_payee_name = 'Joe Payee' res = fixture_client.put( f'/account-payee/{account_payee_id}', json=dict( payoneer_payee_name=payoneer_payee_name ) ) assert res.status_code == 200 response_data = get_json_body(res) assert response_data == { 'account_payee_id': account_payee_id, 'payoneer_program_id': account_payee.payoneer_program_id, 'payoneer_payee_name': payoneer_payee_name, 'account_id': account_payee.account_id, 'payoneer_payee_id': account_payee.payoneer_payee_id, 'payoneer_iframe_url': account_payee.payoneer_iframe_url, 'payoneer_iframe_url_date': safe_format_date(account_payee.payoneer_iframe_url_date), 'payoneer_session_id': account_payee.payoneer_session_id, 'last_modified': safe_format_date(account_payee.last_modified), 'sap_vendor_id': account_payee.sap_vendor_id, 'reference_payment_type_id': 7, 'payment_description': '', } def test_update_account_payee_with_payment_type(fixture_client): """Test to update an account payee.""" account_payee = AccountPayeeFactory.create() account_payee_id = account_payee.account_payee_id res = fixture_client.put( f'/account-payee/{account_payee_id}', json=dict(reference_payment_type_id=7), ) assert res.status_code == 200 response_data = get_json_body(res) assert response_data == { 'account_payee_id': account_payee_id, 'payoneer_program_id': account_payee.payoneer_program_id, 'payoneer_payee_name': account_payee.payoneer_payee_name, 'account_id': account_payee.account_id, 'payoneer_payee_id': account_payee.payoneer_payee_id, 'payoneer_iframe_url': account_payee.payoneer_iframe_url, 'payoneer_iframe_url_date': safe_format_date(account_payee.payoneer_iframe_url_date), 'payoneer_session_id': account_payee.payoneer_session_id, 'last_modified': safe_format_date(account_payee.last_modified), 'sap_vendor_id': account_payee.sap_vendor_id, 'reference_payment_type_id': 7, 'payment_description': '', } def test_update_account_payee_error(fixture_client): """Test to update an account payee that doesn't exist.""" account_payee_id = 1 payoneer_payee_name = 'Joe Payee' res = fixture_client.put( f'/account-payee/{account_payee_id}', json=dict(payoneer_payee_name=payoneer_payee_name) ) assert res.status_code == 404 assert res.json['message'] == \ error.ERROR_ENTITY_DOES_NOT_EXIST.format( object_type='AccountPayee', object_id=account_payee_id ) def test_update_account_payee_error_validation_payment_term(fixture_client): """Test to update an account payee where account_payment_tern doesn't exist.""" account_payee = AccountPayeeFactory.create() account_payee_id = account_payee.account_payee_id res = fixture_client.put( f'/account-payee/{account_payee_id}', json=dict(payoneer_program_id=1) ) assert res.status_code == 400 assert res.json['message'] == error.ERROR_PAYMENT_TERM_NOT_EXISTS.format( account_id=account_payee.account_id ) def test_update_account_payee_error_validation_agreement( reference_payment_entity_fixture, fixture_client ): """Test to update an account payee where account_payment_tern doesn't exist.""" account_payee = AccountPayeeFactory.create() payment_term = AccountPaymentTermFactory( account=account_payee.account ) account_payee_id = account_payee.account_payee_id res = fixture_client.put( f'/account-payee/{account_payee_id}', json=dict(payoneer_program_id=1) ) assert res.status_code == 400 assert res.json['message'] == error.ERROR_PAYONEER_PROGRAM_BY_PARAMS_NOT_EXISTS\ .format( currency=payment_term.currency_code, agreement_type=payment_term.agreement_type_id, payment_entity=5) def test_update_account_payee_error_validation_payoneer_program_mismatch( reference_payment_entity_fixture, fixture_client): """Test to update an account payee where account_payment_tern doesn't exist.""" account_payee = AccountPayeeFactory.create() payment_term = AccountPaymentTermFactory( account=account_payee.account, payment_entity_id=5 ) payee_payoneer_program_id = account_payee.reference_payoneer_program.\ payoneer_program_id PaymentEntityPayoneerProgramFactory( payment_currency=payment_term.currency_code, reference_payment_entity_id=5, agreement_type_id=payment_term.agreement_type_id, payoneer_program_id=payee_payoneer_program_id ) request_payoneer_program_id = 999 account_payee_id = account_payee.account_payee_id res = fixture_client.put( f'/account-payee/{account_payee_id}', json=dict(payoneer_program_id=request_payoneer_program_id) ) assert res.status_code == 400 assert res.json['message'] == error.ERROR_INPUT_PAYONEER_PROGRAM_MISMATCH.format( request_pp_id=request_payoneer_program_id, payment_term_pp_id=payee_payoneer_program_id, ) def test_update_account_payee_with_null_payoneer_program( reference_payment_entity_fixture, fixture_client ): """Test to update an account payee with payoneer_program_id null.""" account_payee = AccountPayeeFactory.create() payment_term = AccountPaymentTermFactory( account=account_payee.account ) payee_payoneer_program_id = account_payee.reference_payoneer_program.\ payoneer_program_id PaymentEntityPayoneerProgramFactory( payment_currency=payment_term.currency_code, reference_payment_entity_id=5, agreement_type_id=payment_term.agreement_type_id, payoneer_program_id=payee_payoneer_program_id ) account_payee_id = account_payee.account_payee_id res = fixture_client.put( f'/account-payee/{account_payee_id}', json=dict(payoneer_program_id=None) ) response_data = res.json assert res.status_code == 200 assert response_data == { 'account_payee_id': account_payee_id, 'payoneer_program_id': None, 'payoneer_payee_name': account_payee.payoneer_payee_name, 'account_id': account_payee.account_id, 'payoneer_payee_id': account_payee.payoneer_payee_id, 'payoneer_iframe_url': account_payee.payoneer_iframe_url, 'payoneer_iframe_url_date': safe_format_date(account_payee.payoneer_iframe_url_date), 'payoneer_session_id': account_payee.payoneer_session_id, 'last_modified': safe_format_date(account_payee.last_modified), 'sap_vendor_id': account_payee.sap_vendor_id, 'reference_payment_type_id': 7, 'payment_description': '', } def test_get_account_payee_by_account_id(fixture_client): """Test to get an account payee by an account_id.""" account_payee = AccountPayeeFactory.create() account_id = account_payee.account_id res = fixture_client.get(f'/account/{account_id}/account-payee/') assert res.status_code == 200 response_data = get_json_body(res) assert response_data == { 'account_payee_id': account_payee.account_payee_id, 'account_id': account_id, 'payoneer_program_id': account_payee.payoneer_program_id, 'payoneer_payee_name': account_payee.payoneer_payee_name, 'payoneer_payee_id': account_payee.payoneer_payee_id, 'payoneer_iframe_url': account_payee.payoneer_iframe_url, 'payoneer_iframe_url_date': safe_format_date(account_payee.payoneer_iframe_url_date), 'payoneer_session_id': account_payee.payoneer_session_id, 'last_modified': safe_format_date(account_payee.last_modified), 'sap_vendor_id': account_payee.sap_vendor_id, 'reference_payment_type_id': 7, 'payment_description': '', } def test_get_account_payee_by_account_payee_id(fixture_client): """Test to get an account payee by an account_payee_id.""" account_payee = AccountPayeeFactory.create(reference_payment_type_id=7) account_payee_id = account_payee.account_payee_id res = fixture_client.get(f'/account-payee/{account_payee_id}/') assert res.status_code == 200 response_data = get_json_body(res) assert response_data == { 'account_id': account_payee.account_id, 'account_payee_id': account_payee.account_payee_id, 'last_modified': safe_format_date(account_payee.last_modified), 'payoneer_program_id': account_payee.payoneer_program_id, 'payoneer_payee_name': account_payee.payoneer_payee_name, 'payoneer_payee_id': account_payee.payoneer_payee_id, 'payoneer_iframe_url': account_payee.payoneer_iframe_url, 'payoneer_iframe_url_date': safe_format_date(account_payee.payoneer_iframe_url_date), 'payoneer_session_id': account_payee.payoneer_session_id, 'sap_vendor_id': account_payee.sap_vendor_id, 'reference_payment_type_id': 7, 'payment_description': '', } def test_get_account_payee_by_account_payee_error(fixture_client): """Test to get an account payee by an account_payee_id that doesn't exist.""" account_payee_id = 1342 res = fixture_client.get(f'/account-payee/{account_payee_id}/') assert res.status_code == 404 assert res.json['message'] == \ error.ERROR_ENTITY_DOES_NOT_EXIST.format( object_type='AccountPayee', object_id=account_payee_id ) @pytest.mark.parametrize( ( 'authorize_many_accounts_return', 'profile_type', 'profile_role', 'expected_status_code', ), [ pytest.param( None, 'AbacusProfile', 'administrator', 200, id='standlone check passes' ), pytest.param( True, 'Account360Profile', 'account360', 200, id='pdp check authorized' ), pytest.param( False, 'Account360Profile', 'account360', 403, id='pdp check not authorized' ) ] ) @patch('abacus_account.blueprints.account_payee.authorize_many_accounts') def test_get_account_payees_dataloaded( mock_authorize_many_accounts: MagicMock, fixture_client: FlaskClient, authorize_many_accounts_return: bool, profile_type: str, profile_role: str, expected_status_code: int): """Test to get a list of account payees by account ids.""" account = AccountFactory.create() account_payee = AccountPayeeFactory.create( reference_payment_type_id=7, account=account) mock_authorize_many_accounts.return_value = authorize_many_accounts_return res = fixture_client.post( '/account-payee/dataloader/account', json=[account.account_id], headers={ 'Content-Type': 'application/json', 'Orchard-Identity-Id': 'd5ca8ac3-7e51-4793-8775-50d11282504c', 'Orchard-Profile-Id': '35109', 'Orchard-Profile-Type': profile_type, 'Orchard-Roles': profile_role, 'Orchard-Requestor-Service': 'graphql-abacus' }) assert res.status_code == expected_status_code if expected_status_code == 403: assert res.json['message'] == 'Unauthorized' assert res.json['code'] == error.ERROR_CODE_AUTHORIZATION else: response_data = get_json_body(res) assert response_data == { 'items': [{ 'data': { 'account_id': account_payee.account_id, 'account_payee_id': account_payee.account_payee_id, 'last_modified': safe_format_date(account_payee.last_modified), 'payoneer_program_id': account_payee.payoneer_program_id, 'payoneer_payee_name': account_payee.payoneer_payee_name, 'payoneer_payee_id': account_payee.payoneer_payee_id, 'payoneer_iframe_url': account_payee.payoneer_iframe_url, 'payoneer_iframe_url_date': safe_format_date(account_payee.payoneer_iframe_url_date), 'payoneer_session_id': account_payee.payoneer_session_id, 'sap_vendor_id': account_payee.sap_vendor_id, 'reference_payment_type_id': 7, 'payment_description': '', } }] }