"""Functional tests for Payoneer status endpoint.""" from http import HTTPStatus from unittest.mock import patch import pytest from payee.constants.constants import ( PAYONEER_SERVICE_STATUSES, PAYONEER_STATUS_CODE, PAYONEER_STATUS_DESC, ) @pytest.mark.parametrize( 'indicator,expected_status_code', [ ('none', PAYONEER_STATUS_CODE[PAYONEER_SERVICE_STATUSES.OPERATIONAL]), ('minor', PAYONEER_STATUS_CODE[PAYONEER_SERVICE_STATUSES.OUTAGE]), ('major', PAYONEER_STATUS_CODE[PAYONEER_SERVICE_STATUSES.OUTAGE]), ('critical', PAYONEER_STATUS_CODE[PAYONEER_SERVICE_STATUSES.OUTAGE]), ], ) def test_get_payoneer_status_endpoint_with_indicators( fixture_client, indicator, expected_status_code ): """Test GET /payoneer_status returns correct status based on indicator.""" with patch('payee.logic.payoneer.get') as mock_get: mock_response = mock_get.return_value mock_response.json.return_value = {'status': {'indicator': indicator}} response = fixture_client.get('/payoneer_status') assert response.status_code == HTTPStatus.OK assert response.content_type == 'application/json' assert response.json == { 'status_code': expected_status_code, 'status_desc': PAYONEER_STATUS_DESC.get(expected_status_code), } @pytest.mark.parametrize( 'mock_response_data', [ {'status': {'indicator': ''}}, # Empty indicator {'status': {'indicator': None}}, # Null indicator {}, # Missing status key {'status': {}}, # Missing indicator key ], ) def test_get_payoneer_status_endpoint_unknown(fixture_client, mock_response_data): """Test GET /payoneer_status returns unknown status for edge cases.""" with patch('payee.logic.payoneer.get') as mock_get: mock_response = mock_get.return_value mock_response.json.return_value = mock_response_data response = fixture_client.get('/payoneer_status') assert response.status_code == HTTPStatus.OK expected_status_code = PAYONEER_STATUS_CODE[PAYONEER_SERVICE_STATUSES.UNKNOWN] assert response.json == { 'status_code': expected_status_code, 'status_desc': PAYONEER_STATUS_DESC.get(expected_status_code), } @pytest.mark.parametrize( 'side_effect', [ Exception('Connection error'), # Generic API error ValueError('Invalid JSON'), # JSON parsing error ], ) def test_get_payoneer_status_endpoint_errors(fixture_client, side_effect): """Test GET /payoneer_status returns unknown status when errors occur.""" with patch('payee.logic.payoneer.get') as mock_get: if isinstance(side_effect, ValueError): # Mock JSON parsing error mock_response = mock_get.return_value mock_response.json.side_effect = side_effect else: # Mock HTTP error mock_get.side_effect = side_effect response = fixture_client.get('/payoneer_status') assert response.status_code == HTTPStatus.OK expected_status_code = PAYONEER_STATUS_CODE[PAYONEER_SERVICE_STATUSES.UNKNOWN] assert response.json == { 'status_code': expected_status_code, 'status_desc': PAYONEER_STATUS_DESC.get(expected_status_code), } @pytest.mark.parametrize('method', ['post', 'put', 'delete']) def test_get_payoneer_status_endpoint_method_not_allowed(fixture_client, method): """Test that only GET method is allowed on /payoneer_status.""" response = getattr(fixture_client, method)('/payoneer_status') assert response.status_code == HTTPStatus.METHOD_NOT_ALLOWED