rugmuncher-backend / backend /app /test_contract_scan.py
RMI Platform
feat: add contract_scan.py - Deep Contract Audit tool
84e366d
Raw
History Blame Contribute Delete
2.73 kB
"""
Tests for Contract Scanner
==========================
"""
import asyncio
import pytest
from app.contract_scan import ContractScanner, RiskLevel, FindingType
@pytest.mark.asyncio
async def test_scanner_init():
"""Test scanner initialization."""
scanner = ContractScanner()
assert scanner is not None
await scanner.close()
@pytest.mark.asyncio
async def test_scan_invalid_address():
"""Test that invalid addresses raise errors."""
scanner = ContractScanner()
try:
with pytest.raises(ValueError):
await scanner.scan("invalid", "ethereum")
finally:
await scanner.close()
@pytest.mark.asyncio
async def test_scan_unsupported_chain():
"""Test that unsupported chains raise errors."""
scanner = ContractScanner()
try:
with pytest.raises(ValueError):
await scanner.scan("0x1234567890123456789012345678901234567890", "invalid_chain")
finally:
await scanner.close()
@pytest.mark.asyncio
async def test_scan_valid_contract():
"""Test scanning a valid contract address."""
# USDC on Ethereum - well known, should be safe
scanner = ContractScanner()
try:
result = await scanner.scan(
"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606EB48",
"ethereum"
)
assert result.contract_address == "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606EB48"
assert result.chain == "ethereum"
assert result.score >= 0
assert result.risk_level in RiskLevel
assert isinstance(result.findings, list)
finally:
await scanner.close()
@pytest.mark.asyncio
async def test_findings_format():
"""Test that findings have correct format."""
scanner = ContractScanner()
try:
result = await scanner.scan(
"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606EB48",
"ethereum"
)
for finding in result.findings:
assert hasattr(finding, 'finding_type')
assert hasattr(finding, 'severity')
assert hasattr(finding, 'description')
assert isinstance(finding.to_dict(), dict)
finally:
await scanner.close()
@pytest.mark.asyncio
async def test_scanner_multiple_chains():
"""Test scanner works on multiple chains."""
scanner = ContractScanner()
try:
# Test different chains
for chain in ["base", "arbitrum", "bsc"]:
result = await scanner.scan(
"0x1234567890123456789012345678901234567890",
chain
)
assert result.chain == chain
finally:
await scanner.close()
if __name__ == "__main__":
asyncio.run(test_scan_valid_contract())
print("All tests passed!")