From e2684bd12079dacdfce590d4653230f10ca2d840 Mon Sep 17 00:00:00 2001 From: MorganaFuture Date: Sun, 24 Aug 2025 21:37:23 +0300 Subject: [PATCH] fix: remove hardcoded API token from SimulationsManager - Use API key from environment variable FLUIDIZE_API_KEY - Support passing FluidizeSDK as adapter directly - Add proper error handling for missing API key - Update tests to handle new configuration logic --- fluidize/managers/simulations.py | 19 +++++++++- tests/integration/test_simulations_manager.py | 18 ++++++++- tests/unit/managers/test_simulation.py | 38 +++++++++++++++++-- 3 files changed, 68 insertions(+), 7 deletions(-) diff --git a/fluidize/managers/simulations.py b/fluidize/managers/simulations.py index e6f3ed5..0c4ca10 100644 --- a/fluidize/managers/simulations.py +++ b/fluidize/managers/simulations.py @@ -2,6 +2,7 @@ from fluidize_sdk import FluidizeSDK +from fluidize.config import config from fluidize.core.types.node import nodeMetadata_simulation @@ -16,8 +17,22 @@ def __init__(self, adapter: Any) -> None: adapter: adapter (FluidizeSDK or LocalAdapter) """ self._adapter = adapter - # TODO: Fix hardcoding of api_token and remove type ignore - self.fluidize_sdk = FluidizeSDK(api_token="placeholder") # noqa: S106 + + # Use the adapter if it's already a FluidizeSDK instance, otherwise create one + if ( + hasattr(adapter, "api_token") + and hasattr(adapter, "simulation") + and adapter.api_token is not None + and adapter.simulation is not None + ): + # Assume it's already a FluidizeSDK instance + self.fluidize_sdk = adapter + else: + # Create FluidizeSDK with proper API key from config + if not config.api_key: + msg = "API key is required. Set the FLUIDIZE_API_KEY environment variable." + raise ValueError(msg) + self.fluidize_sdk = FluidizeSDK(api_token=config.api_key) def list_simulations(self) -> list[Any]: """ diff --git a/tests/integration/test_simulations_manager.py b/tests/integration/test_simulations_manager.py index 43ef738..b0380d5 100644 --- a/tests/integration/test_simulations_manager.py +++ b/tests/integration/test_simulations_manager.py @@ -1,5 +1,8 @@ """Integration tests for SimulationsManager - tests real API connectivity.""" +import os +from unittest.mock import Mock, patch + import pytest from fluidize.managers.simulations import SimulationsManager @@ -11,11 +14,10 @@ class TestSimulationsManagerIntegration: @pytest.fixture def mock_adapter(self): """Create a mock adapter for testing.""" - from unittest.mock import Mock - adapter = Mock() return adapter + @pytest.mark.skipif(not os.getenv("FLUIDIZE_API_KEY"), reason="FLUIDIZE_API_KEY environment variable not set") def test_list_simulations_integration(self, mock_adapter): """Integration test that actually calls the API and prints output.""" @@ -38,3 +40,15 @@ def test_list_simulations_integration(self, mock_adapter): print(f" Description: {sim.description}") print(f" Version: {sim.version}") print("\n") + + def test_list_simulations_without_api_key(self, mock_adapter): + """Test behavior when no API key is available.""" + # Ensure mock_adapter doesn't have SDK attributes so new SDK creation is attempted + mock_adapter.api_token = None + mock_adapter.simulation = None + + with patch("fluidize.managers.simulations.config") as mock_config: + mock_config.api_key = None + + with pytest.raises(ValueError, match="API key is required"): + SimulationsManager(mock_adapter) diff --git a/tests/unit/managers/test_simulation.py b/tests/unit/managers/test_simulation.py index 7137e98..32e2e07 100644 --- a/tests/unit/managers/test_simulation.py +++ b/tests/unit/managers/test_simulation.py @@ -19,17 +19,49 @@ def mock_adapter(self): @pytest.fixture def simulations_manager(self, mock_adapter): """Create a SimulationsManager instance for testing.""" - with patch("fluidize.managers.simulations.FluidizeSDK"): + with ( + patch("fluidize.managers.simulations.FluidizeSDK"), + patch("fluidize.managers.simulations.config") as mock_config, + ): + mock_config.api_key = "test-api-key" return SimulationsManager(mock_adapter) @patch("fluidize.managers.simulations.FluidizeSDK") - def test_init(self, mock_sdk_class, mock_adapter): + @patch("fluidize.managers.simulations.config") + def test_init(self, mock_config, mock_sdk_class, mock_adapter): """Test SimulationsManager initialization.""" + mock_config.api_key = "test-api-key" + # Ensure mock_adapter doesn't have SDK attributes so new SDK is created + mock_adapter.api_token = None + mock_adapter.simulation = None + manager = SimulationsManager(mock_adapter) assert manager._adapter is mock_adapter assert manager.fluidize_sdk is not None - mock_sdk_class.assert_called_once() + mock_sdk_class.assert_called_once_with(api_token="test-api-key") # noqa: S106 + + def test_init_with_fluidize_sdk_adapter(self): + """Test SimulationsManager initialization when adapter is already FluidizeSDK.""" + mock_sdk_adapter = Mock() + mock_sdk_adapter.api_token = "existing-token" # noqa: S105 + mock_sdk_adapter.simulation = Mock() + + manager = SimulationsManager(mock_sdk_adapter) + + assert manager._adapter is mock_sdk_adapter + assert manager.fluidize_sdk is mock_sdk_adapter + + @patch("fluidize.managers.simulations.config") + def test_init_without_api_key_raises_error(self, mock_config, mock_adapter): + """Test that initialization raises error when no API key is available.""" + mock_config.api_key = None + # Ensure mock_adapter doesn't have SDK attributes so new SDK creation is attempted + mock_adapter.api_token = None + mock_adapter.simulation = None + + with pytest.raises(ValueError, match="API key is required"): + SimulationsManager(mock_adapter) @patch("fluidize.managers.simulations.FluidizeSDK") def test_list_simulations_returns_list(self, mock_sdk_class, simulations_manager):