"""Test generate payment summary report task.""" from unittest.mock import call, patch import pandas from lib.config import S3_PAYMENTS_BUCKET_NAME from lib.constants import ( ABACUS_STATE_STATUSES, PAYMENT_SUMMARY_HEADERS_MAP, PAYMENT_SUMMARY_HEADERS_MAP_CALCULATE_PAYMENTS ) from tasks.payments_generate_export import generate_summary_report as task @patch('tasks.payments_generate_export.generate_summary_report.pandas', wraps=pandas) @patch('tasks.payments_generate_export.generate_summary_report._get_payment_group_payment_details') # noqa: E501 @patch('tasks.payments_generate_export.generate_summary_report._get_report_data') @patch('tasks.payments_generate_export.generate_summary_report.helpers') @patch('tasks.payments_generate_export.generate_summary_report.ows') def test_generate_payment_summary_export_task_calc_payments_disabled( mock_ows, mock_helpers, mock_get_report_data, mock_get_payment_group_payment_details, mock_pandas, mock_payment_group_payment, mock_payment_group_payment_accounts, mock_payments_generate_export_dag_run, ): """Test generating a payment summary report and saving it on S3.""" payment_group_payment_id = mock_payment_group_payment['payment_group_payment_id'] file_path = \ f's3://{S3_PAYMENTS_BUCKET_NAME}/22-make-it-rain/summary/make-it-rain-summary.tsv' # noqa E501 mock_helpers.get_event_from_params.return_value.target_id = payment_group_payment_id mock_helpers.build_report_summary_location.return_value.url = file_path mock_helpers.get_abacus_state.side_effect = ValueError('State not found') mock_ows.get_payment_group_payment_details.return_value = mock_payment_group_payment mock_get_report_data.return_value = mock_payment_group_payment_accounts mock_get_payment_group_payment_details.return_value = [ 'Make It Rain', 'Statement Period June 2021 (270)', '2022-07-01', 'Test Payment Group', 'The Orchard', '30 days after quarter end' ] with patch('pandas.DataFrame.to_csv') as mock_to_csv: task.generate_payment_summary_export_task(mock_payments_generate_export_dag_run) mock_to_csv.assert_has_calls([ call(file_path, mode='w', index=False, header=False), call(file_path, mode='a', index=False, lineterminator='\n'), call(file_path, mode='a', index=False, sep='\t') ]) mock_helpers.get_event_from_params.assert_called_once_with( mock_payments_generate_export_dag_run ) mock_ows.get_payment_group_payment_details.assert_called_once_with( payment_group_payment_id ) mock_helpers.build_report_summary_location.assert_called_once_with( payment_group_payment_id, mock_payment_group_payment.get('payment_name') ) mock_get_report_data.assert_called_once_with(payment_group_payment_id) assert mock_pandas.DataFrame.mock_calls[1] == call( mock_payment_group_payment_accounts, columns=PAYMENT_SUMMARY_HEADERS_MAP.keys() ) @patch('tasks.payments_generate_export.generate_summary_report.pandas', wraps=pandas) @patch('tasks.payments_generate_export.generate_summary_report._get_payment_group_payment_details') # noqa: E501 @patch('tasks.payments_generate_export.generate_summary_report._get_report_data') @patch('tasks.payments_generate_export.generate_summary_report.helpers') @patch('tasks.payments_generate_export.generate_summary_report.ows') def test_generate_payment_summary_export_task_calc_payments_enabled( mock_ows, mock_helpers, mock_get_report_data, mock_get_payment_group_payment_details, mock_pandas, mock_payment_group_payment, mock_payment_group_payment_accounts, mock_payments_generate_export_dag_run, ): """Test generating a payment summary report and saving it on S3.""" payment_group_payment_id = mock_payment_group_payment['payment_group_payment_id'] file_path = \ f's3://{S3_PAYMENTS_BUCKET_NAME}/22-make-it-rain/summary/make-it-rain-summary.tsv' # noqa E501 mock_helpers.get_event_from_params.return_value.target_id = payment_group_payment_id mock_helpers.build_report_summary_location.return_value.url = file_path mock_helpers.get_abacus_state.return_value = ABACUS_STATE_STATUSES.COMPLETE mock_ows.get_payment_group_payment_details.return_value = mock_payment_group_payment mock_get_report_data.return_value = mock_payment_group_payment_accounts mock_get_payment_group_payment_details.return_value = [ 'Make It Rain', 'Statement Period June 2021 (270)', '2022-07-01', 'Test Payment Group', 'The Orchard', '30 days after quarter end' ] with patch('pandas.DataFrame.to_csv') as mock_to_csv: task.generate_payment_summary_export_task(mock_payments_generate_export_dag_run) mock_to_csv.assert_has_calls([ call(file_path, mode='w', index=False, header=False), call(file_path, mode='a', index=False, lineterminator='\n'), call(file_path, mode='a', index=False, sep='\t') ]) mock_helpers.get_event_from_params.assert_called_once_with( mock_payments_generate_export_dag_run ) mock_ows.get_payment_group_payment_details.assert_called_once_with( payment_group_payment_id ) mock_helpers.build_report_summary_location.assert_called_once_with( payment_group_payment_id, mock_payment_group_payment.get('payment_name') ) mock_get_report_data.assert_called_once_with(payment_group_payment_id) assert mock_pandas.DataFrame.mock_calls[1] == call( mock_payment_group_payment_accounts, columns=PAYMENT_SUMMARY_HEADERS_MAP_CALCULATE_PAYMENTS.keys() ) @patch('tasks.payments_generate_export.generate_summary_report.ows') def test_get_report_data(mock_ows, mock_payment_group_payment_accounts): """Test getting report data from ows-payment.""" payment_group_payment_id = \ mock_payment_group_payment_accounts[0]['payment_group_payment_id'] mock_ows.get_payment_group_payment_accounts.return_value = { 'items': mock_payment_group_payment_accounts, 'total_count': len(mock_payment_group_payment_accounts) } res = task._get_report_data(payment_group_payment_id) assert res == mock_payment_group_payment_accounts mock_ows.get_payment_group_payment_accounts.assert_called_once_with( payment_group_payment_id, 5000, 0, 'balance_after_tax', 'desc' ) @patch('tasks.payments_generate_export.generate_summary_report.ows') def test_get_report_data_batches(mock_ows, mock_payment_group_payment_accounts): """Test getting report data from ows-payment in batches.""" payment_group_payment_id = \ mock_payment_group_payment_accounts[0]['payment_group_payment_id'] mock_ows.get_payment_group_payment_accounts.return_value = { 'items': mock_payment_group_payment_accounts, 'total_count': 10000 } task._get_report_data(payment_group_payment_id) assert mock_ows.get_payment_group_payment_accounts.call_count == 2 mock_ows.get_payment_group_payment_accounts.assert_any_call( payment_group_payment_id, 5000, 0, 'balance_after_tax', 'desc' ) mock_ows.get_payment_group_payment_accounts.assert_called_with( payment_group_payment_id, 5000, 5000, 'balance_after_tax', 'desc' ) @patch('tasks.payments_generate_export.generate_summary_report.ows') def test_get_payment_group_payment_details( mock_ows, mock_payment_group, mock_payment_group_payment, mock_statement_period, mock_formatted_ref_payment_entities ): """Test getting payment-group-payment details.""" mock_ows.get_payment_group_details.return_value = mock_payment_group mock_ows.get_statement_period_details.return_value = mock_statement_period mock_ows.get_reference_payment_entities.return_value = mock_formatted_ref_payment_entities # noqa: E501 res = task._get_payment_group_payment_details(mock_payment_group_payment) assert res == [ 'Make It Rain', 'Statement Period June 2021 (270)', '2022-07-01', 'Test Payment Group', 'AWAL-UK', '30 days after quarter end' ] mock_ows.get_reference_payment_entities.assert_called_once() mock_ows.get_payment_group_details.assert_called_once_with( mock_payment_group['payment_group_id'] ) mock_ows.get_statement_period_details.assert_called_once_with( mock_statement_period['statement_period_id'] ) @patch('tasks.payments_generate_export.generate_summary_report.ows') def test_get_payment_group_payment_details_all_payment_schedules( mock_ows, mock_payment_group, mock_payment_group_payment, mock_statement_period, mock_formatted_ref_payment_entities ): """Test getting payment-group-payment details handles All payment schedules.""" mock_ows.get_payment_group_details.return_value = { 'payment_group_id': 11, 'is_reusable': True, 'group_name': 'Test Payment Group With All Payment Schedule', 'group_criteria': { 'payment_schedules': None, 'reference_payment_entities': [1], 'currency_codes': ['USD'] } } mock_ows.get_statement_period_details.return_value = mock_statement_period mock_ows.get_reference_payment_entities.return_value = mock_formatted_ref_payment_entities # noqa: E501 res = task._get_payment_group_payment_details(mock_payment_group_payment) assert res == [ 'Make It Rain', 'Statement Period June 2021 (270)', '2022-07-01', 'Test Payment Group With All Payment Schedule', 'AWAL-UK', 'All' ] mock_ows.get_reference_payment_entities.assert_called_once() mock_ows.get_payment_group_details.assert_called_once_with( mock_payment_group['payment_group_id'] ) mock_ows.get_statement_period_details.assert_called_once_with( mock_statement_period['statement_period_id'] ) @patch('tasks.payments_generate_export.generate_summary_report.ows') def test_get_payment_group_payment_details_single_account( mock_ows, mock_account_payment_term, mock_payment_group, mock_payment_group_payment, mock_statement_period, mock_formatted_ref_payment_entities ): """Test getting payment-group-payment details for single account group criteria.""" mock_ows.get_payment_group_details.return_value = { 'payment_group_id': 11, 'is_reusable': False, 'group_name': 'Account Specific Payment Group', 'group_criteria': { 'account_id': 1012 } } mock_ows.get_statement_period_details.return_value = mock_statement_period mock_ows.get_account_payment_term_by_account_id.return_value = \ mock_account_payment_term mock_ows.get_reference_payment_entities.return_value = mock_formatted_ref_payment_entities # noqa: E501 res = task._get_payment_group_payment_details(mock_payment_group_payment) assert res == [ 'Make It Rain', 'Statement Period June 2021 (270)', '2022-07-01', 'Account Specific Payment Group', 'AWAL-UK', '30 days after quarter end' ] mock_ows.get_reference_payment_entities.assert_called_once() mock_ows.get_payment_group_details.assert_called_once_with( mock_payment_group['payment_group_id'] ) mock_ows.get_statement_period_details.assert_called_once_with( mock_statement_period['statement_period_id'] )