"""Test cases for payment_holds logic class.""" from unittest.mock import MagicMock from owsresponse import response from ows_accounting.constants import payment_holds as constants from ows_accounting.logic import payment_holds from ows_accounting.models import ows_account from ows_accounting.models import vendor_payment_hold def test_get_all_active_holds(monkeypatch, hold_active_fixture): """Test get_all_active_holds.""" data = [hold_active_fixture] monkeypatch.setattr( vendor_payment_hold, 'count_holds_by_status', MagicMock(return_value=response.Response(message=2))) monkeypatch.setattr( vendor_payment_hold, 'get_all_holds_by_status', MagicMock(return_value=response.Response(message=data))) result = payment_holds.get_all_active_holds() assert result assert result.message['items'] == data assert result.message['pagination']['total_records'] == len(data) vendor_payment_hold.get_all_holds_by_status.assert_called_with( status='active', limit=None, offset=None, vendor_ids=None) assert vendor_payment_hold.get_all_holds_by_status.call_count == 1 def test_get_all_active_holds_no_data(monkeypatch): """Test get_all_active_holds with no data.""" monkeypatch.setattr( vendor_payment_hold, 'count_holds_by_status', MagicMock(return_value=response.Response(message=0))) monkeypatch.setattr( vendor_payment_hold, 'get_all_holds_by_status', MagicMock(return_value=response.Response(message=[]))) result = payment_holds.get_all_active_holds() assert result assert result.message['items'] == [] vendor_payment_hold.get_all_holds_by_status.assert_not_called() def test_get_all_active_holds_with_vendor(monkeypatch, hold_active_fixture): """Test get_all_active_holds with vendor_ids.""" data = [hold_active_fixture] monkeypatch.setattr( vendor_payment_hold, 'count_holds_by_status', MagicMock(return_value=response.Response(message=1))) monkeypatch.setattr( vendor_payment_hold, 'get_all_holds_by_status', MagicMock(return_value=response.Response(message=data))) result = payment_holds.get_all_active_holds(vendor_ids={7123}) assert result vendor_payment_hold.count_holds_by_status.assert_called_with( status='active', vendor_ids={7123}) vendor_payment_hold.get_all_holds_by_status.assert_called_with( status='active', limit=None, offset=None, vendor_ids={7123}) assert vendor_payment_hold.get_all_holds_by_status.call_count == 1 def test_format_list_response(monkeypatch, hold_active_fixture): """Test get_all_active_holds regular.""" data = [hold_active_fixture] result = payment_holds._format_list_response(data) assert result assert result.message['pagination'] == { 'type': 'none', 'total_records': len(data) } def test_format_list_response_limit(monkeypatch, hold_active_fixture): """Test get_all_active_holds with limit.""" data = [hold_active_fixture] result = payment_holds._format_list_response(data, 50, 5) assert result assert result.message['pagination'] == { 'type': 'standard', 'offset': 0, 'limit': 5, 'total_records': 50} def test_format_list_response_limit_offset(monkeypatch, hold_active_fixture): """Test get_all_active_holds with limit & offset.""" data = [hold_active_fixture] result = payment_holds._format_list_response(data, 50, 5, 15) assert result assert result.message['pagination'] == { 'type': 'standard', 'offset': 15, 'limit': 5, 'total_records': 50} def test_update_hold_by_id(monkeypatch, hold_active_fixture): """Test update_hold_by_id succeed.""" monkeypatch.setattr( vendor_payment_hold, 'update_hold_by_id', MagicMock(return_value=response.Response(message=hold_active_fixture))) result = payment_holds.update_hold_by_id(1, 'oa:555', 'active', 'new desc') assert result assert result.message == hold_active_fixture vendor_payment_hold.update_hold_by_id.assert_called_with( description='new desc', hold_id=1, editor_id='oa:555', status='active') assert vendor_payment_hold.update_hold_by_id.call_count == 1 def test_update_hold_by_id_missing_status(monkeypatch, hold_active_fixture): """Test update_hold_by_id missing required required status.""" monkeypatch.setattr( vendor_payment_hold, 'update_hold_by_id', MagicMock(return_value=response.Response(message=hold_active_fixture))) result = payment_holds.update_hold_by_id(1, 'oa:555', None, 'new desc') assert not result assert result.status == 400 vendor_payment_hold.update_hold_by_id.assert_not_called() def test_update_hold_by_id_missing_desc(monkeypatch, hold_active_fixture): """Test update_hold_by_id missing optional description.""" monkeypatch.setattr( vendor_payment_hold, 'update_hold_by_id', MagicMock(return_value=response.Response(message=hold_active_fixture))) result = payment_holds.update_hold_by_id(1, 'oa:555', 'active', None) assert result assert result.message == hold_active_fixture vendor_payment_hold.update_hold_by_id.assert_called_with( description=None, hold_id=1, editor_id='oa:555', status='active') assert vendor_payment_hold.update_hold_by_id.call_count == 1 def test_update_hold_by_id_invalid_hold(monkeypatch, hold_active_fixture): """Test update_hold_by_id with invalid hold id.""" monkeypatch.setattr( vendor_payment_hold, 'update_hold_by_id', MagicMock(return_value=response.create_not_found_response( 'Invalid hold.'))) result = payment_holds.update_hold_by_id( 1234567, 'oa:555', 'active', 'new desc') assert not result assert result.status == 404 vendor_payment_hold.update_hold_by_id.assert_called_with( description='new desc', hold_id=1234567, editor_id='oa:555', status='active') assert vendor_payment_hold.update_hold_by_id.call_count == 1 def test_get_holds_by_id(monkeypatch, hold_active_fixture): """Test get_holds_by_id.""" monkeypatch.setattr( vendor_payment_hold, 'get_hold_by_id', MagicMock(return_value=response.Response(message=hold_active_fixture))) result = payment_holds.get_holds_by_id(11) assert result assert result.message == hold_active_fixture vendor_payment_hold.get_hold_by_id.assert_called_with(11) assert vendor_payment_hold.get_hold_by_id.call_count == 1 def test_get_holds_by_id_invalid_id(monkeypatch): """Test get_holds_by_id when hold_id is invalid.""" monkeypatch.setattr( vendor_payment_hold, 'get_hold_by_id', MagicMock(return_value=response.create_not_found_response( 'No hold found with this id.'))) result = payment_holds.get_holds_by_id(11233243) assert result.status == 404 assert result.errors['message'] == 'No hold found with this id.' vendor_payment_hold.get_hold_by_id.assert_called_with(11233243) assert vendor_payment_hold.get_hold_by_id.call_count == 1 def test_get_holds_by_vendor_id(monkeypatch, hold_active_fixture): """Test get_holds_by_vendor_id.""" data = [hold_active_fixture] monkeypatch.setattr( ows_account, 'check_vendor_exists', MagicMock(return_value=response.Response(message=True))) monkeypatch.setattr( vendor_payment_hold, 'get_all_holds_by_vendor', MagicMock(return_value=response.Response(message=data))) result = payment_holds.get_holds_by_vendor_id(7123) assert result assert result.message['items'] == data assert result.message['pagination']['total_records'] == len(data) vendor_payment_hold.get_all_holds_by_vendor.assert_called_with(7123) assert vendor_payment_hold.get_all_holds_by_vendor.call_count == 1 def test_get_holds_by_vendor_id_no_data(monkeypatch): """Test get_holds_by_vendor_id with no data.""" monkeypatch.setattr( ows_account, 'check_vendor_exists', MagicMock(return_value=response.Response(message=True))) monkeypatch.setattr( vendor_payment_hold, 'get_all_holds_by_vendor', MagicMock(return_value=response.create_not_found_response( constants.NO_HOLDS_FOUND_FOR_VENDOR))) result = payment_holds.get_holds_by_vendor_id(8800) assert result assert result.message['items'] == [] vendor_payment_hold.get_all_holds_by_vendor.assert_called_with(8800) assert vendor_payment_hold.get_all_holds_by_vendor.call_count == 1 def test_get_holds_by_vendor_id_invalid_vendor(monkeypatch): """Test get_holds_by_vendor_id when vendor_id is invalid.""" monkeypatch.setattr( ows_account, 'check_vendor_exists', MagicMock(return_value=response.create_not_found_response( message='No vendor exist with this id.'))) result = payment_holds.get_holds_by_vendor_id(1223344344) assert not result assert result.status == 404 def test_create_hold_for_vendor(monkeypatch, hold_active_fixture): """Test create_hold_for_vendor with all valid data.""" monkeypatch.setattr( ows_account, 'check_vendor_exists', MagicMock(return_value=response.Response(message=True))) monkeypatch.setattr( vendor_payment_hold, 'get_active_holds_for_vendor', MagicMock(return_value=response.create_not_found_response())) monkeypatch.setattr( vendor_payment_hold, 'create_hold_for_vendor', MagicMock(return_value=response.Response(message=hold_active_fixture))) result = payment_holds.create_hold_for_vendor( 7123, 'oa:123', 'active', 'test desc') assert result assert result.message == hold_active_fixture vendor_payment_hold.create_hold_for_vendor.assert_called_with( vendor_id=7123, creator_id='oa:123', status='active', description='test desc') assert vendor_payment_hold.create_hold_for_vendor.call_count == 1 def test_create_hold_with_invalid_vendor(monkeypatch, hold_active_fixture): """Test create_hold_for_vendor with invalid vendor.""" monkeypatch.setattr( ows_account, 'check_vendor_exists', MagicMock(return_value=response.create_not_found_response())) monkeypatch.setattr( vendor_payment_hold, 'create_hold_for_vendor', MagicMock(return_value=response.Response(message=hold_active_fixture))) result = payment_holds.create_hold_for_vendor( 7123, 'oa:123', 'active', 'test desc') assert result.status == 404 vendor_payment_hold.create_hold_for_vendor.assert_not_called() def test_create_hold_with_active_hold(monkeypatch, hold_active_fixture): """Test create_hold_for_vendor for vendor with active hold.""" monkeypatch.setattr( ows_account, 'check_vendor_exists', MagicMock(return_value=response.Response(message=True))) monkeypatch.setattr( vendor_payment_hold, 'get_active_holds_for_vendor', MagicMock(return_value=response.Response(message=True))) monkeypatch.setattr( vendor_payment_hold, 'create_hold_for_vendor', MagicMock(return_value=response.Response(message=hold_active_fixture))) result = payment_holds.create_hold_for_vendor( 7123, 'oa:123', 'active', 'test desc') assert result.status == 400 assert result.errors['message'] == constants.EXISTING_ACTIVE_HOLD vendor_payment_hold.create_hold_for_vendor.assert_not_called() def test_create_hold_create_failed(monkeypatch, hold_active_fixture): """Test create_hold_for_vendor with DB error.""" monkeypatch.setattr( ows_account, 'check_vendor_exists', MagicMock(return_value=response.Response(message=True))) monkeypatch.setattr( vendor_payment_hold, 'get_active_holds_for_vendor', MagicMock(return_value=response.create_not_found_response())) monkeypatch.setattr( vendor_payment_hold, 'create_hold_for_vendor', MagicMock(return_value=response.create_fatal_response())) result = payment_holds.create_hold_for_vendor( 7123, 'oa:123', 'active', 'test desc') assert result.status == 500 vendor_payment_hold.create_hold_for_vendor.assert_called_with( vendor_id=7123, creator_id='oa:123', status='active', description='test desc') assert vendor_payment_hold.create_hold_for_vendor.call_count == 1