| """ |
| 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") |
| |
| 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 |
|
|
|
|
| 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 |
| |
| 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"]) |
|
|