"""Unit tests for WorksheetAccountContractTaxableRevenue API.""" from decimal import Decimal from unittest.mock import call, patch from urllib.parse import urlencode from payment.constants import constants from payment.logic.exceptions import LogicError @patch('payment.blueprints.worksheet_account_contract_taxable_revenue.logic') def test_bulk_create_worksheet_account_contract_taxable_revenue_success( mock_logic, fixture_client ): """Test for bulk_create_worksheet_account_contract_taxable_revenue endpoint.""" event_id = 1 exp_data = ( { 'contract_id': 1, 'account_id': 1, 'statement_period_id': 1, 'reference_payment_entity_id': 1, 'amount': Decimal(10.00), 'currency_code': 'USD', 'is_us_revenue': False, 'revenue_transaction_type': 'digital', }, { 'contract_id': 2, 'account_id': 2, 'statement_period_id': 2, 'reference_payment_entity_id': 1, 'amount': Decimal(20.00), 'currency_code': 'USD', 'is_us_revenue': True, 'revenue_transaction_type': 'closing_balance', }, ) post_body = [{**item, 'amount': str(item['amount'])} for item in exp_data] res = fixture_client.post( f'/worksheet-account-contract-taxable-revenue/event/{event_id}/bulk', json=post_body, # noqa: E501 ) assert res.status_code == 201 assert res.json == constants.BULK_ENDPOINT_SUCCESS_RESPONSE assert mock_logic.bulk_create.call_args_list == [call(event_id, exp_data)] @patch('payment.blueprints.worksheet_account_contract_taxable_revenue.logic') def test_bulk_create_worksheet_account_contract_taxable_revenue_failure_validation( mock_logic, fixture_client ): """Test for bulk_create_worksheet_account_contract_taxable_revenue endpoint failure validation.""" # noqa: E501 event_id = 1 post_data = ( { 'account_id': 1, 'statement_period_id': 1, 'reference_payment_entity_id': 1, 'amount': '10.00', 'currency_code': 'USD', 'is_us_revenue': False, 'revenue_transaction_type': 'digital', }, { 'contract_id': 2, 'statement_period_id': 2, 'reference_payment_entity_id': 1, 'amount': '20.00', 'currency_code': 'USD', 'is_us_revenue': True, 'revenue_transaction_type': 'closing_balance', }, ) mock_logic.bulk_create.side_effect = LogicError('Error text') res = fixture_client.post( f'/worksheet-account-contract-taxable-revenue/event/{event_id}/bulk', json=post_data, # noqa: E501 ) assert res.status_code == 400 assert res.json == { 'code': 'error', 'message': { 'json': { '0': {'contract_id': ['Must be specified.']}, '1': {'account_id': ['Must be specified.']}, } }, } assert not mock_logic.bulk_create.called @patch('payment.blueprints.worksheet_account_contract_taxable_revenue.logic') def test_bulk_create_worksheet_account_contract_taxable_revenue_failure_logic( mock_logic, fixture_client ): """Test for bulk_create_worksheet_account_contract_taxable_revenue endpoint failure logic.""" # noqa: E501 event_id = 1 exp_data = ( { 'contract_id': 1, 'account_id': 1, 'statement_period_id': 1, 'reference_payment_entity_id': 1, 'amount': Decimal(10.00), 'currency_code': 'USD', 'is_us_revenue': False, 'revenue_transaction_type': 'digital', }, { 'contract_id': 2, 'account_id': 2, 'statement_period_id': 2, 'reference_payment_entity_id': 1, 'amount': Decimal(20.00), 'currency_code': 'USD', 'is_us_revenue': True, 'revenue_transaction_type': 'closing_balance', }, ) post_body = [{**item, 'amount': str(item['amount'])} for item in exp_data] mock_logic.bulk_create.side_effect = LogicError('Error text') res = fixture_client.post( f'/worksheet-account-contract-taxable-revenue/event/{event_id}/bulk', json=post_body, # noqa: E501 ) assert res.status_code == 400 assert res.json == {'code': 'error', 'message': 'Error text'} assert mock_logic.bulk_create.call_args_list == [call(event_id, exp_data)] @patch('payment.blueprints.worksheet_account_contract_taxable_revenue.logic') def test_bulk_delete_worksheet_account_contract_taxable_revenue( mock_logic, fixture_client, faker ): """Test bulk_delete_worksheet_account_contract_taxable_revenue endpoint.""" event_id = faker.pyint() res = fixture_client.delete( f'/worksheet-account-contract-taxable-revenue' f'/event/{event_id}/' ) assert res.status_code == 204, res.text assert mock_logic.bulk_delete.call_args_list == [call(event_id)] @patch('payment.blueprints.worksheet_account_contract_taxable_revenue.logic') def test_get_worksheet_account_contract_taxable_revenue_list_success( mock_logic, fixture_client, faker ): """Test for get_worksheet_account_contract_taxable_revenue_list endpoint.""" statement_period_id = faker.pyint() contract_ids = faker.pylist(value_types=[int]) closing_balance_ids = faker.pylist(value_types=[int]) limit = faker.pyint(min_value=1, max_value=300) offset = faker.pyint() params = { 'limit': limit, 'offset': offset, } body = { 'filters': { 'contract_ids': contract_ids, 'closing_balance_ids': closing_balance_ids, } } mock_worksheets = [ { 'account_contract_taxable_revenue_id': 1, 'contract_id': 1, 'account_id': 1, 'reference_payment_entity_id': 1, 'statement_period_id': 1, 'amount': '10.00', 'currency_code': 'GBP', 'revenue_transaction_type': 'digital', 'is_us_revenue': False, }, { 'account_contract_taxable_revenue_id': 2, 'contract_id': 2, 'account_id': 2, 'reference_payment_entity_id': 2, 'statement_period_id': 2, 'amount': '20.00', 'currency_code': 'USD', 'revenue_transaction_type': 'physical', 'is_us_revenue': True, }, ] mock_result = {'items': mock_worksheets, 'total_count': len(mock_worksheets)} mock_logic.get_list.return_value = mock_result res = fixture_client.post( f'/worksheet-account-contract-taxable-revenue/statement-period' f'/{statement_period_id}/?{urlencode(params)}', json=body, ) assert res.status_code == 200, res.text assert res.json == mock_result assert mock_logic.get_list.call_args_list == [ call( statement_period_id=statement_period_id, limit=limit, offset=offset, **body['filters'], ) ] mock_logic.get_list.reset_mock() res = fixture_client.post( f'/worksheet-account-contract-taxable-revenue/statement-period' f'/{statement_period_id}/', ) assert res.status_code == 200, res.text assert res.json == mock_result assert mock_logic.get_list.call_args_list == [ call( statement_period_id=statement_period_id, limit=constants.DEFAULT_PAGE_LIMIT, offset=constants.DEFAULT_PAGE_OFFSET, ) ] @patch('payment.blueprints.worksheet_account_contract_taxable_revenue.logic') def test_get_tax_corrections_failure(mock_logic, fixture_client, faker): """Test for get_worksheet_account_contract_taxable_revenue_list endpoint failure validation.""" statement_period_id = faker.pyint() contract_ids = ['noint'] closing_balance_ids = ['noint'] limit = 'noint' offset = 'noint' params = { 'limit': limit, 'offset': offset, } body = { 'filters': { 'contract_ids': contract_ids, 'closing_balance_ids': closing_balance_ids, } } res = fixture_client.post( f'/worksheet-account-contract-taxable-revenue/statement-period' f'/{statement_period_id}/?{urlencode(params)}', ) assert res.status_code == 400, res.text assert res.json == { 'code': 'error', 'message': { 'query': { 'limit': ['Not a valid integer.'], 'offset': ['Not a valid integer.'], } }, } assert not mock_logic.get_list.called res = fixture_client.post( f'/worksheet-account-contract-taxable-revenue/statement-period' f'/{statement_period_id}/', json=body, ) assert res.status_code == 400, res.text assert res.json == { 'code': 'error', 'message': { 'json': { 'filters': { 'contract_ids': { '0': ['Must be an integer greater or ' 'equal to 0.'] }, 'closing_balance_ids': { '0': ['Must be an integer greater or ' 'equal to 0.'] }, } } }, } assert not mock_logic.get_list.called @patch('payment.blueprints.worksheet_account_contract_taxable_revenue.logic') def test_get_catchup_taxable_revenue_list_success(mock_logic, fixture_client, faker): """Test for get_catchup_taxable_revenue_list endpoint.""" account_ids = faker.pylist(value_types=[int]) limit = faker.pyint(min_value=1, max_value=300) offset = faker.pyint() params = { 'limit': limit, 'offset': offset, } body = { 'filters': { 'account_ids': account_ids, } } mock_worksheets = [ { 'account_contract_taxable_revenue_id': 1, 'contract_id': 1, 'account_id': 1, 'reference_payment_entity_id': 1, 'statement_period_id': 1, 'amount': '10.00', 'currency_code': 'GBP', 'revenue_transaction_type': 'digital', 'is_us_revenue': False, }, { 'account_contract_taxable_revenue_id': 2, 'contract_id': 2, 'account_id': 2, 'reference_payment_entity_id': 2, 'statement_period_id': 2, 'amount': '20.00', 'currency_code': 'USD', 'revenue_transaction_type': 'physical', 'is_us_revenue': True, }, ] mock_result = {'items': mock_worksheets, 'total_count': len(mock_worksheets)} mock_logic.catchup_taxable_revenue.return_value = mock_result res = fixture_client.post( f'/worksheet-account-contract-taxable-revenue/catchup/?{urlencode(params)}', json=body, ) assert res.status_code == 200, res.text assert res.json == mock_result assert mock_logic.catchup_taxable_revenue.call_args_list == [ call( limit=limit, offset=offset, **body['filters'], ) ] mock_logic.catchup_taxable_revenue.reset_mock() res = fixture_client.post('/worksheet-account-contract-taxable-revenue/catchup') assert res.status_code == 200, res.text assert res.json == mock_result assert mock_logic.catchup_taxable_revenue.call_args_list == [ call( limit=constants.DEFAULT_PAGE_LIMIT, offset=constants.DEFAULT_PAGE_OFFSET, ) ] @patch('payment.blueprints.worksheet_account_contract_taxable_revenue.logic') def test_get_catchup_taxable_revenue_list_failure(mock_logic, fixture_client, faker): """Test for get_catchup_taxable_revenue_list endpoint failure validation.""" account_ids = ['noint'] limit = 'noint' offset = 'noint' params = { 'limit': limit, 'offset': offset, } body = { 'filters': { 'account_ids': account_ids, } } res = fixture_client.post( f'/worksheet-account-contract-taxable-revenue/catchup' f'/?{urlencode(params)}' ) assert res.status_code == 400, res.text assert res.json == { 'code': 'error', 'message': { 'query': { 'limit': ['Not a valid integer.'], 'offset': ['Not a valid integer.'], } }, } assert not mock_logic.catchup_taxable_revenue.called res = fixture_client.post( '/worksheet-account-contract-taxable-revenue/catchup', json=body, ) assert res.status_code == 400, res.text assert res.json == { 'code': 'error', 'message': { 'json': { 'filters': { 'account_ids': { '0': ['Must be an integer greater or ' 'equal to 0.'] }, } } }, } assert not mock_logic.catchup_taxable_revenue.called