rmi-backend/tests/unit/test_social_engineering_detector.py

167 lines
5.5 KiB
Python

"""
Tests for Social Engineering & Identity Fraud Detector
=======================================================
"""
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parent.parent))
from app.social_engineering_detector import (
analyze_domain,
analyze_profile_photo,
analyze_social_presence,
analyze_whitepaper_content,
)
class TestDomainAnalysis:
"""Domain analysis tests."""
def test_no_domain(self):
result = analyze_domain(None)
assert result["risk_score"] >= 20
assert result["has_domain"] is False
def test_suspicious_tld(self):
result = analyze_domain("https://example.xyz")
assert result["risk_score"] >= 15
def test_clean_domain(self):
result = analyze_domain("example.com")
assert result["risk_score"] <= 10
def test_keyword_stuffed(self):
result = analyze_domain("crypto-token-finance-swap.xyz")
# 15 (suspicious TLD) + 10 (keyword match) = 25
assert result["risk_score"] >= 25
def test_homoglyph_detection(self):
result = analyze_domain("app1e-f1n4nc3.io")
assert result["risk_score"] >= 20
class TestProfilePhoto:
"""Profile photo analysis tests."""
def test_no_photo(self):
result = analyze_profile_photo(None, "John Doe")
assert result["has_photo"] is False
assert result["risk_score"] == 15
def test_stock_photo(self):
result = analyze_profile_photo("https://shutterstock.com/photo/12345", "Alice")
assert result["risk_score"] >= 25
assert any("stock" in f.lower() for f in result["flags"])
def test_ai_generated(self):
result = analyze_profile_photo("https://thispersondoesnotexist.com/image.jpg", "Bob")
assert result["risk_score"] >= 40
def test_normal_photo(self):
result = analyze_profile_photo("https://media.licdn.com/photo.jpg", "Charlie")
assert result["has_photo"] is True
assert result["risk_score"] == 0 # No flags
class TestSocialPresence:
"""Social media presence tests."""
def test_no_social(self):
result = analyze_social_presence(None)
assert result["risk_score"] >= 30
assert result["platform_count"] == 0
def test_minimal_social(self):
result = analyze_social_presence(["https://twitter.com/abc"])
assert result["risk_score"] >= 25
def test_complete_social(self):
result = analyze_social_presence(
[
"https://twitter.com/legit_project",
"https://github.com/legit_project",
"https://medium.com/@legit_project",
"https://t.me/legit_project",
]
)
assert result["risk_score"] <= 15
def test_short_username(self):
result = analyze_social_presence(["https://twitter.com/ab"])
assert any("short" in f.lower() for f in result["flags"])
def test_private_telegram(self):
result = analyze_social_presence(
[
"https://twitter.com/project",
"https://t.me/+abc123def456",
]
)
assert any("private" in f.lower() for f in result["flags"])
class TestWhitepaperContent:
"""Whitepaper/content authenticity tests."""
def test_no_content(self):
result = analyze_whitepaper_content(None)
assert result["risk_score"] >= 20
assert result["has_content"] is False
def test_ai_generated(self):
content = """
# Introduction
As an AI language model, I cannot provide specific investment advice.
I apologize, but as a language model, I don't have access to real-time data.
This appears to be a revolutionary paradigm shift in the crypto space.
## Tokenomics
[To be announced]
## Roadmap
Q1 2025 - Coming soon
Lorem ipsum dolor sit amet.
"""
result = analyze_whitepaper_content(content)
assert result["risk_score"] >= 40
def test_clean_whitepaper(self):
content = """
# Project Overview
We are building a decentralized exchange for cross-chain swaps.
Our platform uses atomic swaps to enable trustless trading
between Ethereum, Solana, and BSC.
## Token Distribution
- 40% Public Sale
- 20% Team (vested 2 years)
- 20% Development Fund
- 20% Ecosystem Growth
## Roadmap
Q1 2025: Mainnet launch
Q2 2025: Mobile app release
"""
result = analyze_whitepaper_content(content)
assert result["has_content"] is True
# Should still flag some things (generic roadmap) but not extreme
assert result["risk_score"] < 60
def test_hype_keywords(self):
content = (
"This revolutionary game-changing paradigm shift will moon and lambo. "
"Wen ser? Based. NGMI if you sleep on this revolutionary next-gen project. "
"This is the most revolutionary project ever created. Game-changing technology. "
"A paradigm shift in DeFi. Moon soon. Lambo by EOY. Wen listing? Ser, please. "
"This is based. Don't NGMI this opportunity. Revolutionary innovation. "
"Game-changing approach to decentralized finance. Next-gen protocol. "
"Moon or bust. Lambo or nothing. Wen airdrop? Ser, check the docs. "
"Based team. NGMI if you fade. Revolutionary technology stack. "
)
result = analyze_whitepaper_content(content)
assert any("hype" in f.lower() for f in result["flags"])