40 lines
1.2 KiB
Python
40 lines
1.2 KiB
Python
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"
|