"""Unit testcases for EarningsTransfer bulk update logic.""" from unittest.mock import patch from abacus_contract.tests.utils.factories import ContractFactory from royalties.logic import earnings_transfer as logic from royalties.tests.utils.factories import EarningsTransferFactory @patch('royalties.logic.earnings_transfer.db.session') @patch('royalties.logic.earnings_transfer.validate_contracts') @patch('royalties.logic.earnings_transfer.EarningsTransfer') def test_bulk_update_earnings_transfers_success( mock_earnings_transfer_model, mock_validate_contracts, mock_session, test_app_in_context, ): """Test successful bulk update of earnings transfers.""" et1 = EarningsTransferFactory.create( earnings_transfer_id=1, rate_type='percent', transfer_amount=10, comment='old comment', ) et2 = EarningsTransferFactory.create( earnings_transfer_id=2, rate_type='percent', transfer_amount=10, comment='another old comment', ) mock_earnings_transfer_model.query.filter.return_value.all.return_value = [et1, et2] mock_validate_contracts.return_value = True request_body = [ { 'earnings_transfer_id': 1, 'comment': 'new comment', 'transfer_amount': 100, }, {'earnings_transfer_id': 2, 'active': False}, ] result = logic.bulk_update_earnings_transfers(request_body) assert result.status == 200 assert et1.comment == 'new comment' assert et1.transfer_amount == 100 assert et2.active is False mock_session.commit.assert_called_once() @patch('royalties.logic.earnings_transfer.EarningsTransfer') def test_bulk_update_earnings_transfers_not_found( mock_earnings_transfer_model, test_app_in_context ): """Test bulk update when some IDs are not found.""" et1 = EarningsTransferFactory.create(earnings_transfer_id=1) mock_earnings_transfer_model.query.filter.return_value.all.return_value = [et1] request_body = [ {'earnings_transfer_id': 1, 'comment': 'update'}, {'earnings_transfer_id': 2, 'comment': 'update'}, ] result = logic.bulk_update_earnings_transfers(request_body) assert result.status == 400 assert ( 'The following earnings transfer IDs do not exist: [2]' in result.errors['message'] ) @patch('royalties.logic.earnings_transfer.EarningsTransfer') def test_bulk_update_earnings_transfers_same_contract( mock_earnings_transfer_model, test_app_in_context ): """Test bulk update when from and to contracts are the same.""" contract_10 = ContractFactory.create(contract_id=10) contract_20 = ContractFactory.create(contract_id=20) et1 = EarningsTransferFactory.create( earnings_transfer_id=1, from_contract=contract_10, to_contract=contract_20 ) mock_earnings_transfer_model.query.filter.return_value.all.return_value = [et1] request_body = [{'earnings_transfer_id': 1, 'to_contract_id': 10}] result = logic.bulk_update_earnings_transfers(request_body) print(result.message) assert result.status == 400 assert ( 'Source and destination contracts must be different for ID [1].' in result.errors['message'] ) @patch('royalties.logic.earnings_transfer.EarningsTransfer') def test_bulk_update_earnings_transfers_invalid_amount( mock_earnings_transfer_model, test_app_in_context ): """Test bulk update when without changing the rate type amount gets invalid.""" contract_10 = ContractFactory.create(contract_id=10) contract_20 = ContractFactory.create(contract_id=20) et1 = EarningsTransferFactory.create( earnings_transfer_id=1, rate_type='percent', transfer_amount='10', from_contract=contract_10, to_contract=contract_20, ) mock_earnings_transfer_model.query.filter.return_value.all.return_value = [et1] request_body = [{'earnings_transfer_id': 1, 'transfer_amount': 200}] result = logic.bulk_update_earnings_transfers(request_body) print(result.message) assert result.status == 400 assert ( 'Transfer amount must be between 0 and 100 when rate type is percent.' in result.errors['message'] )