"""Test ows-abacus-account requests.""" from http import HTTPStatus import re import httpx from owsclient.test import OwsClientMock import pytest from src import constants from src.exceptions import OwsAbacusAccountException from src.ows_abacus_account import ( get_payoneer_program, get_payoneer_program_move_type, is_payoneer_wire_program, ) def test_get_payoneer_program_success(ows_client_mock: OwsClientMock) -> None: """Test successfully getting a specific payoneer program by ID.""" program_id = 123 mock_program_response = { 'payoneer_program_id': 123, 'payoneer_program_name': 'AWAL Core - USD', 'funding_currency': 'GBP', 'reference_payment_type_id': 12, } ows_client_mock.get( 'ows-abacus-account', f'/payoneer-program/{program_id}', ).mock(return_value=httpx.Response(HTTPStatus.OK, json=mock_program_response)) result = get_payoneer_program(program_id) assert result.payoneer_program_id == 123 assert result.payoneer_program_name == 'AWAL Core - USD' assert result.funding_currency == 'GBP' assert result.reference_payment_type_id == 12 def test_get_payoneer_program_failure(ows_client_mock: OwsClientMock) -> None: """Test failure getting payoneer program.""" program_id = 999 ows_client_mock.get( 'ows-abacus-account', f'/payoneer-program/{program_id}', ).mock(return_value=httpx.Response(HTTPStatus.NOT_FOUND)) with pytest.raises( OwsAbacusAccountException, match=f'ERROR in GET /payoneer-program/{program_id}', ): get_payoneer_program(program_id) def test_is_payoneer_wire_program_true(ows_client_mock: OwsClientMock) -> None: """Test checking if a program is a wire program (returns True).""" program_id = 123 mock_program_response = { 'payoneer_program_id': 123, 'payoneer_program_name': 'Wire Transfer - USD', 'funding_currency': 'USD', 'reference_payment_type_id': constants.PAYONEER_WIRE_PAYMENT_TYPE_ID, } ows_client_mock.get( 'ows-abacus-account', f'/payoneer-program/{program_id}', ).mock(return_value=httpx.Response(HTTPStatus.OK, json=mock_program_response)) result = is_payoneer_wire_program(program_id) assert result is True def test_is_payoneer_wire_program_false(ows_client_mock: OwsClientMock) -> None: """Test checking if a program is a wire program (returns False).""" program_id = 456 mock_program_response = { 'payoneer_program_id': 456, 'payoneer_program_name': 'AWAL Core', 'funding_currency': 'EUR', 'reference_payment_type_id': 8, } ows_client_mock.get( 'ows-abacus-account', f'/payoneer-program/{program_id}', ).mock(return_value=httpx.Response(HTTPStatus.OK, json=mock_program_response)) result = is_payoneer_wire_program(program_id) assert result is False def test_is_payoneer_wire_program_not_found(ows_client_mock: OwsClientMock) -> None: """Test checking if a program is a wire program when program doesn't exist.""" program_id = 999 ows_client_mock.get( 'ows-abacus-account', f'/payoneer-program/{program_id}', ).mock(return_value=httpx.Response(HTTPStatus.NOT_FOUND)) with pytest.raises( OwsAbacusAccountException, match=f'ERROR in GET /payoneer-program/{program_id}', ): is_payoneer_wire_program(program_id) def test_get_payoneer_program_move_type_success(ows_client_mock: OwsClientMock) -> None: """Test successfully getting payoneer program move type.""" from_id = 1 to_id = 2 path = ( f'/payoneer-program-move-type?from_program_id={from_id}&to_program_id={to_id}' ) mock_response = { 'move_type': constants.PayoneerProgramMoveTypes.ADOPT_AND_RELEASE.value } ows_client_mock.get('ows-abacus-account', path).mock( return_value=httpx.Response(HTTPStatus.OK, json=mock_response) ) result = get_payoneer_program_move_type(from_id, to_id) assert result == constants.PayoneerProgramMoveTypes.ADOPT_AND_RELEASE def test_get_payoneer_program_move_type_failure(ows_client_mock: OwsClientMock) -> None: """Test failure when payoneer program move type endpoint returns not found.""" from_id = 99 to_id = 100 path = ( f'/payoneer-program-move-type?from_program_id={from_id}&to_program_id={to_id}' ) ows_client_mock.get('ows-abacus-account', path).mock( return_value=httpx.Response(HTTPStatus.NOT_FOUND) ) with pytest.raises( OwsAbacusAccountException, match=re.escape(f'ERROR in GET {path}') ): get_payoneer_program_move_type(from_id, to_id)