"""Integration tests for autopilot workflows.""" import pytest from unittest.mock import Mock, patch, AsyncMock from fastapi.testclient import TestClient from backend.main import app @pytest.fixture def client(): """Test client fixture.""" return TestClient(app) @pytest.fixture def mock_intelligent_autopilot(): """Mock intelligent autopilot.""" autopilot = Mock() autopilot.symbol = "BTC/USD" autopilot.is_running = False autopilot.enable_auto_execution = False autopilot.get_status.return_value = { "symbol": "BTC/USD", "timeframe": "1h", "running": False, "selected_strategy": None, "trades_today": 0, "max_trades_per_day": 10, "min_confidence_threshold": 0.75, "enable_auto_execution": False, "last_analysis": None, "model_info": {}, } return autopilot @pytest.mark.integration class TestAutopilotWorkflow: """Integration tests for autopilot workflows.""" @patch('backend.api.autopilot.get_intelligent_autopilot') def test_start_intelligent_mode_workflow( self, mock_get_intelligent, client, mock_intelligent_autopilot ): """Test complete workflow for starting intelligent mode autopilot.""" mock_get_intelligent.return_value = mock_intelligent_autopilot # Start autopilot response = client.post( "/api/autopilot/start-unified", json={ "symbol": "BTC/USD", "mode": "intelligent", "auto_execute": True, "exchange_id": 1, "timeframe": "1h", }, ) assert response.status_code == 200 assert mock_intelligent_autopilot.enable_auto_execution is True # Check status response = client.get( "/api/autopilot/status-unified/BTC/USD?mode=intelligent&timeframe=1h" ) assert response.status_code == 200 data = response.json() assert data["mode"] == "intelligent" # Stop autopilot response = client.post( "/api/autopilot/stop-unified?symbol=BTC/USD&mode=intelligent&timeframe=1h" ) assert response.status_code == 200 assert mock_intelligent_autopilot.stop.called @pytest.mark.integration class TestTrainingConfigWorkflow: """Integration tests for training configuration workflow.""" def test_configure_and_verify_bootstrap(self, client): """Test configuring bootstrap settings and verifying they persist.""" # Set custom config custom_config = { "days": 180, "timeframe": "4h", "min_samples_per_strategy": 25, "symbols": ["BTC/USD", "ETH/USD", "SOL/USD", "DOGE/USD"] } response = client.put("/api/autopilot/bootstrap-config", json=custom_config) assert response.status_code == 200 # Verify it was saved response = client.get("/api/autopilot/bootstrap-config") assert response.status_code == 200 data = response.json() assert data["days"] == 180 assert data["timeframe"] == "4h" assert data["min_samples_per_strategy"] == 25 assert len(data["symbols"]) == 4 assert "DOGE/USD" in data["symbols"] @patch('backend.api.autopilot.train_model_task') def test_training_uses_configured_symbols(self, mock_task, client): """Test that training uses the configured symbols.""" # Setup mock mock_result = Mock() mock_result.id = "test-task-123" mock_task.delay.return_value = mock_result # Configure with specific symbols config = { "days": 90, "timeframe": "1h", "min_samples_per_strategy": 10, "symbols": ["BTC/USD", "ETH/USD", "XRP/USD"] } client.put("/api/autopilot/bootstrap-config", json=config) # Trigger training response = client.post("/api/autopilot/intelligent/retrain") assert response.status_code == 200 # Verify the symbols were passed call_kwargs = mock_task.delay.call_args.kwargs assert call_kwargs["symbols"] == ["BTC/USD", "ETH/USD", "XRP/USD"] assert call_kwargs["days"] == 90 assert call_kwargs["timeframe"] == "1h" assert call_kwargs["min_samples_per_strategy"] == 10