167 lines
5.5 KiB
Python
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"])
|