"""Worksheet correction logic tests.""" from unittest.mock import patch from sqlalchemy.exc import DatabaseError from abacus_worksheet.constants import constants from abacus_worksheet.constants.error import ERROR_UNKNOWN_CURRENCY from abacus_worksheet.logic import worksheet_correction from tests.utils.factories import WorksheetCorrectionFactory @patch('abacus_worksheet.logic.worksheet_correction.db') @patch('abacus_worksheet.logic.worksheet_correction.WorksheetCorrection') def test_bulk_create(mock_model, mock_db, mock_worksheet_correction_data): """Test create worksheet corrections.""" alt_mock_worksheet_correction = mock_worksheet_correction_data.copy() alt_mock_worksheet_correction['account_id'] = 2 mock_request = [mock_worksheet_correction_data, alt_mock_worksheet_correction] mock_model.build.side_effect = [ WorksheetCorrectionFactory.create(**mock_worksheet_correction_data), WorksheetCorrectionFactory.create(**alt_mock_worksheet_correction), ] mock_db.session.return_value.commit.return_value = None response = worksheet_correction.bulk_create(mock_request) assert response.status == 201 mock_db.session.commit.assert_called_once() @patch('abacus_worksheet.logic.worksheet_correction.db.session.commit') @patch('abacus_worksheet.logic.worksheet_correction.WorksheetCorrection.build') def test_bulk_create_fails_currency( mock_build, mock_db, mock_worksheet_correction_data ): """Test create worksheet corrections fails currency check.""" currency_code = 'XYZ' alt_mock_worksheet_correction = mock_worksheet_correction_data.copy() alt_mock_worksheet_correction['currency_code'] = currency_code mock_build.return_value = WorksheetCorrectionFactory.create( **mock_worksheet_correction_data ) mock_db.return_value = None response = worksheet_correction.bulk_create([alt_mock_worksheet_correction]) mock_build.assert_not_called() mock_db.session.commit.assert_not_called() assert response.status == 400 assert response.errors['message'] == ERROR_UNKNOWN_CURRENCY.format( code=currency_code ) @patch('abacus_worksheet.logic.worksheet_correction.db.session.commit') @patch('abacus_worksheet.logic.worksheet_correction.WorksheetCorrection.build') def test_bulk_create_fails_account_not_found( mock_build, mock_db, mock_worksheet_correction_data ): """Test create worksheet corrections fails if the account isn't in the DB.""" alt_mock_worksheet_correction = mock_worksheet_correction_data.copy() alt_mock_worksheet_correction['account_id'] = 12345 mock_build.return_value = WorksheetCorrectionFactory.create( **mock_worksheet_correction_data ) mock_db.side_effect = DatabaseError('Some DB error', None, None) response = worksheet_correction.bulk_create([alt_mock_worksheet_correction]) mock_build.assert_called_once_with(**alt_mock_worksheet_correction) mock_db.session.commit.assert_not_called() assert response.status == 400 assert 'Some DB error' in response.errors['message'] @patch('abacus_worksheet.logic.worksheet_correction.WorksheetCorrection') def test_get_unapplied_worksheet_corrections(mock_model): """Test get_unapplied_worksheet_corrections function.""" statement_period_id = 1 correction_type = constants.CORRECTION_TYPES.ROYALTY_CORRECTION worksheet_corrections = WorksheetCorrectionFactory.create_batch(5) request_params = {'limit': 25, 'offset': 0} mock_model.get_unapplied_worksheet_corrections.return_value = ( worksheet_corrections, len(worksheet_corrections), ) res = worksheet_correction.get_unapplied_worksheet_corrections( statement_period_id, correction_type, request_params ) assert res.status == 200 assert res.message.get('items') assert res.message.get('total_count') == 5 mock_model.get_unapplied_worksheet_corrections.assert_called_once_with( statement_period_id, correction_type, **request_params ) @patch('abacus_worksheet.logic.worksheet_correction.db') @patch('abacus_worksheet.logic.worksheet_correction.WorksheetCorrection') def test_bulk_create_allow_multiple_corrections( mock_model, mock_db, mock_worksheet_correction_data ): """Test creating multiple worksheet corrections for the same account/contract.""" mock_worksheet_correction = mock_worksheet_correction_data.copy() WorksheetCorrectionFactory.create(**mock_worksheet_correction_data) mock_model.build.side_effect = [ WorksheetCorrectionFactory.create(**mock_worksheet_correction), ] mock_db.session.return_value.commit.return_value = None response = worksheet_correction.bulk_create([mock_worksheet_correction]) assert response.status == 201 mock_model.build.assert_called_once() mock_db.session.commit.assert_called_once()