import pytest from engine.signal import SignalEngine @pytest.fixture def engine(): return SignalEngine() def test_compute_score_default_weights(engine): score = engine.compute_score(80, 60, 70, 50) assert score == 72.0 def test_classify_buy(engine): assert engine.classify(75) == "BUY" def test_classify_hold(engine): assert engine.classify(55) == "HOLD" def test_classify_sell(engine): assert engine.classify(30) == "SELL" def test_custom_weights(engine): engine.set_weights({"technical": 0.4, "news": 0.3, "social": 0.2, "ai": 0.1}) score = engine.compute_score(80, 60, 70, 50) assert score == 69.0 def test_weights_must_sum_to_one(engine): with pytest.raises(ValueError): engine.set_weights({"technical": 0.5, "news": 0.3, "social": 0.1, "ai": 0.2}) def test_rank_coins(engine): coins = { "BTC": {"technical": 80, "news": 70, "social": 60, "ai": 75}, "ETH": {"technical": 90, "news": 80, "social": 70, "ai": 85}, "DOGE": {"technical": 30, "news": 25, "social": 40, "ai": 20}, } ranked = engine.rank_coins(coins) assert ranked[0]["symbol"] == "ETH" assert ranked[-1]["symbol"] == "DOGE" assert ranked[-1]["signal"] == "SELL"