"""Tests for ows-payee model.""" from unittest.mock import MagicMock, patch import pytest from collaborator.constants import error, service_name from collaborator.models.ows import ows_payee from collaborator.utils.error import OwsError SAMPLE_PAYMENTS = [ { "client_reference_id": "split:1:1", "payee_id": 123, "amount": 1500.0, "currency": "USD", "description": "John Doe", }, { "client_reference_id": "split:1:2", "payee_id": 456, "amount": 2750.5, "currency": "USD", "description": "Jane Smith", }, ] @patch("collaborator.models.ows.ows_payee.owsrequest.get_default_ows_headers") @patch("collaborator.models.ows.ows_payee.request") def test_create_mass_payouts_success(mock_request, mock_headers): """Test create_mass_payouts posts to the correct URL and returns response data.""" program_id = 100000 expected_response = {"batch_id": "batch-abc-123", "status": "submitted"} mock_headers.return_value = {} mock_response = MagicMock() mock_response.status_code = 200 mock_response.json.return_value = expected_response mock_response.text = "content" mock_request.post.return_value = mock_response result = ows_payee.create_mass_payouts(program_id, SAMPLE_PAYMENTS) assert result == expected_response mock_request.post.assert_called_once_with( service_name.OWS_PAYEE, f"/payoneer/programs/{program_id}/mass-payouts", headers={}, json=SAMPLE_PAYMENTS, ) @patch("collaborator.models.ows.ows_payee.owsrequest.get_default_ows_headers") @patch("collaborator.models.ows.ows_payee.request") def test_create_mass_payouts_uses_program_id_in_url(mock_request, mock_headers): """Test that each program_id produces a distinct URL path.""" program_id = 200000 mock_headers.return_value = {} mock_response = MagicMock() mock_response.status_code = 200 mock_response.json.return_value = {} mock_response.text = "content" mock_request.post.return_value = mock_response ows_payee.create_mass_payouts(program_id, SAMPLE_PAYMENTS) positional = mock_request.post.call_args.args # Second positional arg is the URL assert positional[1] == f"/payoneer/programs/{program_id}/mass-payouts" @patch("collaborator.models.ows.ows_payee.owsrequest.get_default_ows_headers") @patch("collaborator.models.ows.ows_payee.request") def test_create_mass_payouts_error(mock_request, mock_headers): """Test create_mass_payouts raises OwsError on a non-2xx response.""" program_id = 100000 mock_headers.return_value = {} mock_response = MagicMock() mock_response.status_code = 500 mock_response.json.return_value = { "code": error.ERROR_CODE_OWS_PAYEE, "message": "Internal server error", } mock_request.post.return_value = mock_response with pytest.raises(OwsError) as exc_info: ows_payee.create_mass_payouts(program_id, SAMPLE_PAYMENTS) assert exc_info.value.code == error.ERROR_CODE_OWS_PAYEE assert exc_info.value.message == "Internal server error" assert exc_info.value.status == 500 @patch("collaborator.models.ows.ows_payee.owsrequest.get_default_ows_headers") @patch("collaborator.models.ows.ows_payee.request") def test_create_mass_payouts_422_error(mock_request, mock_headers): """Test create_mass_payouts raises OwsError on a 422 response from ows-payee.""" program_id = 100000 mock_headers.return_value = {} mock_response = MagicMock() mock_response.status_code = 422 mock_response.json.return_value = { "code": error.ERROR_CODE_OWS_PAYEE, "message": "Unprocessable entity", } mock_request.post.return_value = mock_response with pytest.raises(OwsError) as exc_info: ows_payee.create_mass_payouts(program_id, SAMPLE_PAYMENTS) assert exc_info.value.code == error.ERROR_CODE_OWS_PAYEE assert exc_info.value.status == 422