"""Tests for the Elasticsearch connector.""" from typing import Any from unittest.mock import MagicMock, patch import pytest from aws_requests_auth import boto_utils from flask.ctx import AppContext from opensearchpy import RequestsHttpConnection from vectororder.connectors import elasticsearch @pytest.mark.parametrize( "host, port, timeout", [ ("example.com", 42, 10), ("127.0.0.1", 50000, 20), ], ) @patch("vectororder.connectors.elasticsearch.OpenSearch") @patch("vectororder.connectors.elasticsearch.config") def test_elasticsearch_get_os_client( mock_config: MagicMock, mock_os_client: MagicMock, host: str, port: int, timeout: int, ) -> None: """Test Elasticsearch client is created using expected configuration.""" os_client = "os_client" mock_config.OPENSEARCH_HOST = host mock_config.OPENSEARCH_PORT = port mock_config.OPENSEARCH_DEFAULT_TIMEOUT = timeout mock_os_client.return_value = os_client os_client_instance = elasticsearch.get_os_client() assert not mock_os_client.call_args[0] call_kwargs = mock_os_client.call_args[1] assert call_kwargs["hosts"][0]["host"] == host assert call_kwargs["hosts"][0]["port"] == int(port) assert len(call_kwargs) == 6 assert call_kwargs["connection_class"] is RequestsHttpConnection assert isinstance(call_kwargs["http_auth"], boto_utils.BotoAWSRequestsAuth) assert str(os_client_instance) == os_client @pytest.mark.parametrize( "host, port", ( # All possible invalid combinations of config.py variables: ("", None), # host (None, 0), # port ), ) @patch("vectororder.connectors.elasticsearch.config") def test_elasticsearch_get_os_client_not_configured( mock_config: MagicMock, host: Any, port: Any ) -> None: """Test Elasticsearch client helper raises on misconfiguration.""" mock_config.OPENSEARCH_HOST = host mock_config.OPENSEARCH_PORT = port assert elasticsearch.get_os_client() is None @patch("vectororder.connectors.elasticsearch.get_os_client") @patch("vectororder.connectors.elasticsearch.config") def test_elasticsearch_get_client( mock_config: MagicMock, mock_os_client: MagicMock, app_context: AppContext, ) -> None: """Test Elasticsearch client is created using expected configuration.""" mock_config.OPENSEARCH_HOST = "os-host" mock_config.OPENSEARCH_PORT = 443 mock_config.OPENSEARCH_DEFAULT_TIMEOUT = 60 # reset with the mock instances not what was on module load. elasticsearch.os_client = elasticsearch.get_os_client() client_instance = elasticsearch.get_client() assert client_instance == mock_os_client() @patch("vectororder.connectors.elasticsearch.search") def test_elasticsearch_get_index_name( mock_config: MagicMock, app_context: AppContext, ) -> None: """Test Elasticsearch client is created using expected configuration.""" mock_config.OS_VO_DETAIL_INDEX_NAME = "os-host" client_instance = elasticsearch.get_index_name() assert client_instance == "os-host"