"""Unit testcases for AdjustmentFileValidation processor.""" from unittest.mock import MagicMock, patch import pytest from adjustment_file_validation.processor import AdjustmentFileValidationProcessor @patch('adjustment_file_validation.processor.download_file') @patch('adjustment_file_validation.processor.get_statement_period_adjustment_file') def test_get_adjustment_file( mock_get_adjustment_file_adjustment_file, mock_download_s3_file, mock_event ): """Test get_adjustment_file method.""" mock_statement_period_adjustment_file = { 'valid_file_location': 's3://qa-abacus-adjustments/test.xlsx', 'statement_period_id': 282, 'statement_period_adjustment_file_id': 1, } mock_get_adjustment_file_adjustment_file.return_value = ( mock_statement_period_adjustment_file ) mock_download_s3_file.return_value = True adjustment = AdjustmentFileValidationProcessor(mock_event) adjustment._get_adjustment_file() mock_get_adjustment_file_adjustment_file.assert_called_once_with(1) mock_download_s3_file.assert_called_once_with('qa-abacus-adjustments', 'test.xlsx') @patch('adjustment_file_validation.processor.pathlib') def test_is_excel_file(mock_pathlib_method, mock_event): """Test is_excel_file method.""" file = 'test.xlsx' mock_pathlib_method.Path.return_value = MagicMock(suffix='.xlsx') adjustmentFileValidation = AdjustmentFileValidationProcessor(mock_event) result = adjustmentFileValidation._is_excel_file(file) assert result == file @patch('adjustment_file_validation.processor.pathlib') def test_is_excel_file_error(mock_pathlib_method, mock_event): """Test is_excel_file method throws an error if file is text file.""" file = 'test.txt' mock_pathlib_method.Path.return_value = MagicMock(suffix='.txt') with pytest.raises(Exception) as excinfo: adjustmentFileValidation = AdjustmentFileValidationProcessor(mock_event) adjustmentFileValidation._is_excel_file(file) assert 'Not a valid excel file' == str(excinfo.value) @patch('adjustment_file_validation.processor.update_statement_period_adjustment_file') @patch('adjustment_file_validation.processor.download_file') @patch('adjustment_file_validation.processor.AdjustmentFileValidation') @patch('adjustment_file_validation.processor.pathlib') def test_validate_adjustment_file( mock_pathlib_method, mock_adjustmentfileValidation, mock_download_s3_file, mock_update, mock_event, ): """Test _validate_adjustment_file method.""" file = 'test.xlsx' temp_file = '/tmp/tmpez56kjmd.xlsx' mock_pathlib_method.Path.return_value = MagicMock(suffix='.xlsx') mock_adjustmentfileValidation.return_value.read_and_validate_file.return_value = ( 2, 3, 4, 5, None, None, ) mock_download_s3_file.return_value = MagicMock(name=file) mock_update.return_value = True adjustment = AdjustmentFileValidationProcessor(mock_event) adjustment._validate_adjustment_file(temp_file) mock_adjustmentfileValidation.return_value.read_and_validate_file.assert_called_once() mock_update.assert_called_once() @patch('adjustment_file_validation.processor.update_statement_period_adjustment_file') @patch('adjustment_file_validation.processor.download_file') @patch('adjustment_file_validation.processor.AdjustmentFileValidation') @patch('adjustment_file_validation.processor.get_statement_period_adjustment_file') @patch('adjustment_file_validation.processor.os') @patch('adjustment_file_validation.processor.pathlib') def test_process_with_error( mock_pathlib_method, mock_os, mock_get_adjustment_file_adjustment_file, mock_adjustmentfileValidation, mock_download_s3_file, mock_update, mock_event, ): """Test process method when file has any validation error.""" file = 'file/test.xlsx' mock_statement_period_adjustment_file = { 'valid_file_location': 's3://qa-abacus-adjustments/test.xlsx', 'statement_period_id': 282, 'statement_period_adjustment_file_id': 1, } mock_os.remove.return_value = True mock_pathlib_method.PurePath.return_value.name = 'test.xlsx' mock_pathlib_method.Path.return_value = MagicMock(suffix='.xlsx') mock_adjustmentfileValidation.return_value.read_and_validate_file.return_value = ( 2, 3, 4, 5, 'error', 'Validation Error', ) mock_download_s3_file.return_value = MagicMock(name=file) mock_get_adjustment_file_adjustment_file.return_value = ( mock_statement_period_adjustment_file ) mock_update.return_value = True adjustment = AdjustmentFileValidationProcessor(mock_event) adjustment.process() mock_adjustmentfileValidation.return_value.read_and_validate_file.assert_called_once() mock_download_s3_file.assert_called_once_with('qa-abacus-adjustments', 'test.xlsx') mock_get_adjustment_file_adjustment_file.assert_called_once_with(1) mock_update.assert_called_once_with( { 'invalid_file_location': 's3://qa-abacus-adjustments/1/1-error.xlsx', 'valid_row_count': 2, 'invalid_row_count': 3, 'total_file_amount_multicurrency': '4', 'total_rounded_amount_multicurrency': '5', 'error_type': 'content_error', }, 282, 1, ) @patch('adjustment_file_validation.processor.update_statement_period_adjustment_file') @patch('adjustment_file_validation.processor.download_file') @patch('adjustment_file_validation.processor.AdjustmentFileValidation') @patch('adjustment_file_validation.processor.get_statement_period_adjustment_file') @patch('adjustment_file_validation.processor.os') @patch('adjustment_file_validation.processor.pathlib') def test_process_with_no_error( mock_pathlib_method, mock_os, mock_get_adjustment_file_adjustment_file, mock_adjustmentfileValidation, mock_download_s3_file, mock_update, mock_event, ): """Test process method when file has no validation error.""" file = 'file/test.xlsx' mock_statement_period_adjustment_file = { 'valid_file_location': 's3://qa-abacus-adjustments/test.xlsx', 'statement_period_id': 282, 'statement_period_adjustment_file_id': 1, } mock_os.remove.return_value = True mock_pathlib_method.PurePath.return_value.name = 'test.xlsx' mock_pathlib_method.Path.return_value = MagicMock(suffix='.xlsx') mock_adjustmentfileValidation.return_value.read_and_validate_file.return_value = ( 2, 0, '4.900000', '4.90', None, None, ) mock_download_s3_file.return_value = MagicMock(name=file) mock_get_adjustment_file_adjustment_file.return_value = ( mock_statement_period_adjustment_file ) mock_update.return_value = True adjustment = AdjustmentFileValidationProcessor(mock_event) adjustment.process() mock_adjustmentfileValidation.return_value.read_and_validate_file.assert_called_once() mock_download_s3_file.assert_called_once_with('qa-abacus-adjustments', 'test.xlsx') mock_get_adjustment_file_adjustment_file.assert_called_once_with(1) mock_update.assert_called_once_with( { 'valid_row_count': 2, 'invalid_row_count': 0, 'total_file_amount_multicurrency': '4.900000', 'total_rounded_amount_multicurrency': '4.90', }, 282, 1, ) @patch('adjustment_file_validation.processor.update_statement_period_adjustment_file') @patch('adjustment_file_validation.processor.download_file') @patch('adjustment_file_validation.processor.AdjustmentFileValidation') @patch('adjustment_file_validation.processor.get_statement_period_adjustment_file') @patch('adjustment_file_validation.processor.os') @patch('adjustment_file_validation.processor.pathlib') def test_process_with_empty_file_error( mock_pathlib_method, mock_os, mock_get_adjustment_file_adjustment_file, mock_adjustmentfileValidation, mock_download_s3_file, mock_update, mock_event, ): """Test process method when there is a no data in adjustment file.""" file = 'file/test.xlsx' mock_statement_period_adjustment_file = { 'valid_file_location': 's3://qa-abacus-adjustments/test.xlsx', 'statement_period_id': 282, 'statement_period_adjustment_file_id': 1, } mock_os.remove.return_value = True mock_pathlib_method.PurePath.return_value.name = 'test.xlsx' mock_pathlib_method.Path.return_value = MagicMock(suffix='.xlsx') mock_adjustmentfileValidation.return_value.read_and_validate_file.return_value = ( 2, 3, 4, 5, 'error', 'Empty File', ) mock_download_s3_file.return_value = MagicMock(name=file) mock_get_adjustment_file_adjustment_file.return_value = ( mock_statement_period_adjustment_file ) mock_update.return_value = True adjustment = AdjustmentFileValidationProcessor(mock_event) adjustment.process() mock_adjustmentfileValidation.return_value.read_and_validate_file.assert_called_once() mock_download_s3_file.assert_called_once_with('qa-abacus-adjustments', 'test.xlsx') mock_get_adjustment_file_adjustment_file.assert_called_once_with(1) mock_update.assert_called_once_with({'error_type': 'content_error'}, 282, 1) @patch('adjustment_file_validation.processor.update_statement_period_adjustment_file') @patch('adjustment_file_validation.processor.download_file') @patch('adjustment_file_validation.processor.AdjustmentFileValidation') @patch('adjustment_file_validation.processor.get_statement_period_adjustment_file') @patch('adjustment_file_validation.processor.os') @patch('adjustment_file_validation.processor.pathlib') def test_process_with_format_error( mock_pathlib_method, mock_os, mock_get_adjustment_file_adjustment_file, mock_adjustmentfileValidation, mock_download_s3_file, mock_update, mock_event, ): """Test process method when there is a format error in adjustment file.""" file = 'file/test.xlsx' mock_statement_period_adjustment_file = { 'valid_file_location': 's3://qa-abacus-adjustments/test.xlsx', 'statement_period_id': 282, 'statement_period_adjustment_file_id': 1, } mock_os.remove.return_value = True mock_pathlib_method.PurePath.return_value.name = 'test.xlsx' mock_pathlib_method.Path.return_value = MagicMock(suffix='.xlsx') mock_adjustmentfileValidation.return_value.read_and_validate_file.return_value = ( None, None, None, None, 'error', 'Format Error', ) mock_download_s3_file.return_value = MagicMock(name=file) mock_get_adjustment_file_adjustment_file.return_value = ( mock_statement_period_adjustment_file ) mock_update.return_value = True adjustment = AdjustmentFileValidationProcessor(mock_event) adjustment.process() mock_adjustmentfileValidation.return_value.read_and_validate_file.assert_called_once() mock_download_s3_file.assert_called_once_with('qa-abacus-adjustments', 'test.xlsx') mock_get_adjustment_file_adjustment_file.assert_called_once_with(1) mock_update.assert_called_once_with({'error_type': 'format_error'}, 282, 1) @patch( 'adjustment_file_validation.processor.update_statement_period_adjustment_file_state' ) @patch( 'adjustment_file_validation.processor.get_statement_period_adjustment_file_states' ) @patch('adjustment_file_validation.processor.update_statement_period_adjustment_file') @patch('adjustment_file_validation.processor.download_file') @patch('adjustment_file_validation.processor.AdjustmentFileValidation') @patch('adjustment_file_validation.processor.get_statement_period_adjustment_file') @patch('adjustment_file_validation.processor.os') @patch('adjustment_file_validation.processor.pathlib') def test_process_with_exception( mock_pathlib_method, mock_os, mock_get_adjustment_file_adjustment_file, mock_adjustmentfileValidation, mock_download_s3_file, mock_update, mock_get_statement_period_adjustment_file_states, mock_update_statement_period_adjustment_file_state, mock_event, mock_statement_period_adjustment_file_states, ): """Test process method when an exception is raised.""" file = 'file/test.xlsx' mock_statement_period_adjustment_file = { 'valid_file_location': 's3://qa-abacus-adjustments/test.xlsx', 'statement_period_id': 282, 'statement_period_adjustment_file_id': 1, } mock_os.remove.return_value = True mock_pathlib_method.PurePath.return_value.name = 'test.xlsx' mock_pathlib_method.Path.return_value = MagicMock(suffix='.xlsx') mock_adjustmentfileValidation.return_value.read_and_validate_file.side_effect = ( Exception('Validation Error') ) mock_download_s3_file.return_value = MagicMock(name=file) mock_get_adjustment_file_adjustment_file.return_value = ( mock_statement_period_adjustment_file ) mock_update.return_value = True mock_get_statement_period_adjustment_file_states.return_value = ( mock_statement_period_adjustment_file_states ) adjustment = AdjustmentFileValidationProcessor(mock_event) with pytest.raises(Exception): adjustment.process() mock_adjustmentfileValidation.return_value.read_and_validate_file.assert_called_once() mock_download_s3_file.assert_called_once_with('qa-abacus-adjustments', 'test.xlsx') mock_get_adjustment_file_adjustment_file.assert_called_once_with(1) mock_update_statement_period_adjustment_file_state.assert_called_once_with( 123, 'error' ) @patch( 'adjustment_file_validation.processor.update_statement_period_adjustment_file_state' ) @patch( 'adjustment_file_validation.processor.get_statement_period_adjustment_file_states' ) @patch('adjustment_file_validation.processor.update_statement_period_adjustment_file') @patch('adjustment_file_validation.processor.download_file') @patch('adjustment_file_validation.processor.AdjustmentFileValidation') @patch('adjustment_file_validation.processor.get_statement_period_adjustment_file') @patch('adjustment_file_validation.processor.os') @patch('adjustment_file_validation.processor.pathlib') def test_process_with_exception_ows_abacus_failure( mock_pathlib_method, mock_os, mock_get_adjustment_file_adjustment_file, mock_adjustmentfileValidation, mock_download_s3_file, mock_update, mock_get_statement_period_adjustment_file_states, mock_update_statement_period_adjustment_file_state, mock_event, ): """Test process method when an exception is raised and ows abacus state fails.""" file = 'file/test.xlsx' mock_statement_period_adjustment_file = { 'valid_file_location': 's3://qa-abacus-adjustments/test.xlsx', 'statement_period_id': 282, 'statement_period_adjustment_file_id': 1, } mock_os.remove.return_value = True mock_pathlib_method.PurePath.return_value.name = 'test.xlsx' mock_pathlib_method.Path.return_value = MagicMock(suffix='.xlsx') mock_adjustmentfileValidation.return_value.read_and_validate_file.side_effect = ( Exception('Validation Error') ) mock_download_s3_file.return_value = MagicMock(name=file) mock_get_adjustment_file_adjustment_file.return_value = ( mock_statement_period_adjustment_file ) mock_update.return_value = True mock_get_statement_period_adjustment_file_states.return_value = None adjustment = AdjustmentFileValidationProcessor(mock_event) with pytest.raises(Exception): adjustment.process() mock_adjustmentfileValidation.return_value.read_and_validate_file.assert_called_once() mock_download_s3_file.assert_called_once_with('qa-abacus-adjustments', 'test.xlsx') mock_get_adjustment_file_adjustment_file.assert_called_once_with(1) mock_update_statement_period_adjustment_file_state.assert_not_called()