"""Tests for Consensus (ensemble) strategy."""

import pytest
from decimal import Decimal
from src.strategies.ensemble.consensus_strategy import ConsensusStrategy
from src.strategies.base import SignalType


class TestConsensusStrategy:
    """Tests for ConsensusStrategy."""
    
    @pytest.fixture
    def strategy(self):
        """Create Consensus strategy instance."""
        return ConsensusStrategy(
            name="test_consensus",
            parameters={
                'strategy_names': ['rsi', 'macd'],
                'min_consensus': 2,
                'use_weights': True,
                'min_weight': 0.3,
                'exclude_strategies': []
            }
        )
    
    def test_initialization(self, strategy):
        """Test strategy initialization."""
        assert strategy.min_consensus == 2
        assert strategy.use_weights is True
        assert strategy.min_weight == 0.3
    
    def test_on_tick_no_strategies(self, strategy):
        """Test that strategy handles empty strategy list."""
        # Strategy should handle cases where no strategies are available
        signal = strategy.on_tick(
            symbol="BTC/USD",
            price=Decimal("50000"),
            timeframe="1h",
            data={'volume': 1000}
        )
        # May return None if no strategies available or no consensus
        assert signal is None or isinstance(signal, (type(None), object))
    
    def test_strategy_metadata(self, strategy):
        """Test strategy metadata."""
        assert strategy.name == "test_consensus"
        assert strategy.enabled is False
    
    def test_consensus_calculation(self, strategy):
        """Test consensus calculation parameters."""
        assert strategy.min_consensus == 2
        assert strategy.use_weights is True

