"""Tests for RSI strategy.""" import pytest import pandas as pd from src.strategies.technical.rsi_strategy import RSIStrategy class TestRSIStrategy: """Tests for RSIStrategy.""" @pytest.fixture def strategy(self): """Create RSI strategy instance.""" return RSIStrategy( strategy_id=1, name="test_rsi", symbol="BTC/USD", timeframe="1h", parameters={ "rsi_period": 14, "overbought": 70, "oversold": 30 } ) @pytest.fixture def sample_data(self): """Create sample price data.""" dates = pd.date_range(start='2025-01-01', periods=50, freq='1H') # Create data with clear trend for RSI calculation prices = [100 - i * 0.5 for i in range(50)] # Downward trend return pd.DataFrame({ 'timestamp': dates, 'open': prices, 'high': [p + 1 for p in prices], 'low': [p - 1 for p in prices], 'close': prices, 'volume': [1000.0] * 50 }) @pytest.mark.asyncio async def test_rsi_strategy_initialization(self, strategy): """Test RSI strategy initialization.""" assert strategy.rsi_period == 14 assert strategy.overbought == 70 assert strategy.oversold == 30 @pytest.mark.asyncio async def test_on_data(self, strategy, sample_data): """Test on_data method.""" await strategy.on_data(sample_data) assert len(strategy.current_data) > 0 @pytest.mark.asyncio async def test_generate_signal_oversold(self, strategy, sample_data): """Test signal generation for oversold condition.""" await strategy.on_data(sample_data) # Calculate RSI - should be low for downward trend from src.data.indicators import get_indicators indicators = get_indicators() rsi = indicators.rsi(strategy.current_data['close'], period=14) # If RSI is low, should generate buy signal signal = await strategy.generate_signal() assert "signal" in signal assert signal["signal"] in ["buy", "sell", "hold"]