merge: chore/cleanup-remove-bloat-and-secrets into main
This commit is contained in:
commit
bde2f3a97d
1173 changed files with 437609 additions and 0 deletions
99
app/test_rug_pull_predictor.py
Normal file
99
app/test_rug_pull_predictor.py
Normal file
|
|
@ -0,0 +1,99 @@
|
|||
"""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!")
|
||||
Loading…
Add table
Add a link
Reference in a new issue