"""Test graphql connector.""" from unittest.mock import patch import pytest from src.connector.graphql import execute_graphql_query, graphql from config import OA_USER DUMMY_QUERY = 'query { dummyField }' DUMMY_VARIABLES = {'key': 'value'} @pytest.mark.parametrize( ( 'user_id', 'additional_headers', 'execute_return_value', 'execute_side_effect', 'expected_result', 'expected_exception', 'expected_log', 'expected_log_func', ), [ pytest.param( None, None, {'data': {'result': 'success'}}, None, {'result': 'success'}, None, None, None, id='default_success' ), pytest.param( 'custom_user', None, {'data': {'result': 'user_id_test'}}, None, {'result': 'user_id_test'}, None, None, None, id='custom_user_id' ), pytest.param( None, {'X-Custom-Header': 'custom-value'}, {'data': {'result': 'header_test'}}, None, {'result': 'header_test'}, None, None, None, id='additional_headers' ), pytest.param( None, None, None, graphql.GraphQLError([ { 'message': 'Something went wrong', 'path': ['dummyField'], 'extensions': { 'code': 'INTERNAL_SERVER_ERROR', 'response': {'status': 500, 'body': {'error': 'internal'}}, 'exception': {'stacktrace': ['line 1', 'line 2']} } } ]), None, graphql.GraphQLError, ( "Something went wrong - ['dummyField'] INTERNAL_SERVER_ERROR " "{'status': 500, 'body': {'error': 'internal'}}" ), 'error', id='graphql_error' ), pytest.param( None, None, None, RuntimeError('Unexpected failure'), None, RuntimeError, 'Unexpected error during GraphQL execution', 'exception', id='unexpected_exception' ), ] ) @patch('src.connector.graphql.graphql_router.execute') @patch('src.connector.graphql.graphql_router.set_headers') @patch('src.connector.graphql.logger.error') @patch('src.connector.graphql.logger.exception') def test_execute_graphql_query( mock_logger_exception, mock_logger_error, mock_set_headers, mock_execute, user_id, additional_headers, execute_return_value, execute_side_effect, expected_result, expected_exception, expected_log, expected_log_func ): """Parametrized test for execute_graphql_query.""" mock_execute.return_value = execute_return_value if execute_side_effect: mock_execute.side_effect = execute_side_effect if expected_exception: with pytest.raises(expected_exception): execute_graphql_query( DUMMY_QUERY, DUMMY_VARIABLES, user_id=user_id, additional_headers=additional_headers ) else: result = execute_graphql_query( DUMMY_QUERY, DUMMY_VARIABLES, user_id=user_id, additional_headers=additional_headers ) assert result == expected_result # Header validation mock_set_headers.assert_called_once() headers = mock_set_headers.call_args[0][0] assert headers.get('Orchard-User-Id') == (user_id or OA_USER) if additional_headers: for k, v in additional_headers.items(): assert headers.get(k) == v assert 'Correlation-Id' in headers # Execute call validation if not expected_exception: mock_execute.assert_called_once_with(DUMMY_QUERY, DUMMY_VARIABLES) # Log validation if expected_log: log_mock = mock_logger_error if expected_log_func == 'error' else mock_logger_exception log_mock.assert_called_once() assert expected_log in log_mock.call_args[0][0]