rmi-backend/app/test_rug_pull_predictor.py

99 lines
2.9 KiB
Python

"""Tests for rug_pull_predictor - Exit Scam Forecaster."""
import asyncio
import os
import sys
sys.path.insert(0, os.path.join(os.path.dirname(__file__), ".."))
from app.rug_pull_predictor import (
RiskLevel,
SignalResult,
analyze,
is_valid_address,
predict_rug_pull,
)
def test_validator() -> None:
"""Address validation works correctly."""
assert is_valid_address("0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2") is True
assert is_valid_address("So11111111111111111111111111111111111111112") is True
assert is_valid_address("not-an-address") is False
assert is_valid_address("") is False
def test_risk_level_enum() -> None:
"""RiskLevel enum has all expected values."""
assert RiskLevel.SAFE.value == "safe"
assert RiskLevel.LOW.value == "low"
assert RiskLevel.MEDIUM.value == "medium"
assert RiskLevel.HIGH.value == "high"
assert RiskLevel.CRITICAL.value == "critical"
def test_signal_weighted_score() -> None:
"""SignalResult weighted_score calculation is correct."""
s = SignalResult(signal="test", score=80.0, weight=0.25)
assert s.weighted_score == 20.0 # 80 * 0.25
assert s.level == RiskLevel.CRITICAL # 80 >= 80 threshold
s2 = SignalResult(signal="test2", score=79.9, weight=0.5)
assert s2.level == RiskLevel.HIGH
def test_analyze_structure() -> None:
"""Analyze returns expected dict structure."""
result = analyze(
"So11111111111111111111111111111111111111112",
chain="solana",
)
assert isinstance(result, dict)
assert "rug_score" in result
assert "risk_level" in result
assert "signals" in result
assert "summary" in result
assert "recommendations" in result
assert isinstance(result["rug_score"], float)
assert 0 <= result["rug_score"] <= 100
def test_analyze_live() -> None:
"""End-to-end test with real data (WSOL)."""
result = analyze(
"So11111111111111111111111111111111111111112",
chain="solana",
)
print(f"\nWSOL Rug Score: {result['rug_score']} ({result['risk_level']})")
print(f"Signals: {len(result['signals'])}")
for sig in result["signals"]:
print(f" {sig['name']}: {sig['score']} ({sig['level']})")
# WSOL should be low risk
assert result["risk_level"] in ("safe", "low")
def test_invalid_address() -> None:
"""Invalid address raises ValueError."""
try:
asyncio.run(predict_rug_pull("not-an-address"))
raise AssertionError("Should have raised ValueError")
except ValueError:
pass
def test_analyze_exported() -> None:
"""analyze is exported in __all__."""
from app.rug_pull_predictor import __all__
assert "analyze" in __all__
if __name__ == "__main__":
test_validator()
test_risk_level_enum()
test_signal_weighted_score()
test_invalid_address()
test_analyze_exported()
test_analyze_structure()
test_analyze_live()
print("\nAll tests passed!")