scope-bca-core 0.8.2

Scope Blockchain Analysis - Core library for blockchain data analysis
Documentation
#[cfg(test)]
mod tests {
    use super::*;

    #[tokio::test]
    async fn test_risk_assessment_low_risk() {
        let engine = RiskEngine::new();
        let assessment = engine.assess_address(
            "0x742d35Cc6634C0532925a3b844Bc9e7595f1b3c2",
            "ethereum"
        ).await.unwrap();
        
        assert_eq!(assessment.address, "0x742d35Cc6634C0532925a3b844Bc9e7595f1b3c2");
        assert_eq!(assessment.chain, "ethereum");
        assert!(assessment.overall_score >= 0.0 && assessment.overall_score <= 10.0);
        assert!(!assessment.factors.is_empty());
        assert!(!assessment.recommendations.is_empty());
    }

    #[test]
    fn test_risk_level_emojis() {
        assert_eq!(RiskLevel::Low.emoji(), "🟢");
        assert_eq!(RiskLevel::Medium.emoji(), "🟡");
        assert_eq!(RiskLevel::High.emoji(), "🔴");
        assert_eq!(RiskLevel::Critical.emoji(), "âš«");
    }

    #[test]
    fn test_risk_level_from_score_boundaries() {
        assert!(matches!(RiskLevel::from_score(0.0), RiskLevel::Low));
        assert!(matches!(RiskLevel::from_score(3.0), RiskLevel::Low));
        assert!(matches!(RiskLevel::from_score(3.1), RiskLevel::Medium));
        assert!(matches!(RiskLevel::from_score(6.0), RiskLevel::Medium));
        assert!(matches!(RiskLevel::from_score(6.1), RiskLevel::High));
        assert!(matches!(RiskLevel::from_score(8.0), RiskLevel::High));
        assert!(matches!(RiskLevel::from_score(8.1), RiskLevel::Critical));
        assert!(matches!(RiskLevel::from_score(10.0), RiskLevel::Critical));
    }

    #[test]
    fn test_weighted_score_calculation() {
        let engine = RiskEngine::new();
        
        let factors = vec![
            RiskFactor {
                name: "Test1".to_string(),
                category: RiskCategory::Behavioral,
                score: 5.0,
                weight: 0.5,
                description: "Test factor 1".to_string(),
                evidence: vec!["Evidence 1".to_string()],
            },
            RiskFactor {
                name: "Test2".to_string(),
                category: RiskCategory::Association,
                score: 3.0,
                weight: 0.5,
                description: "Test factor 2".to_string(),
                evidence: vec!["Evidence 2".to_string()],
            },
        ];
        
        let score = engine.calculate_weighted_score(&factors);
        assert!((score - 4.0).abs() < 0.01);
    }

    #[test]
    fn test_weighted_score_empty_factors() {
        let engine = RiskEngine::new();
        let score = engine.calculate_weighted_score(&[]);
        assert_eq!(score, 0.0);
    }

    #[test]
    fn test_recommendations_by_level() {
        let engine = RiskEngine::new();
        let factors = vec![];
        
        let low_recs = engine.generate_recommendations(&factors, RiskLevel::Low);
        assert!(low_recs.iter().any(|r| r.contains("Standard monitoring")));
        
        let med_recs = engine.generate_recommendations(&factors, RiskLevel::Medium);
        assert!(med_recs.iter().any(|r| r.contains("Standard due diligence")));
        
        let high_recs = engine.generate_recommendations(&factors, RiskLevel::High);
        assert!(high_recs.iter().any(|r| r.contains("Enhanced due diligence")));
        
        let crit_recs = engine.generate_recommendations(&factors, RiskLevel::Critical);
        assert!(crit_recs.iter().any(|r| r.contains("Immediate investigation")));
    }

    #[test]
    fn test_risk_factor_categories() {
        let categories = vec![
            RiskCategory::Behavioral,
            RiskCategory::Association,
            RiskCategory::Source,
            RiskCategory::Destination,
            RiskCategory::Entity,
            RiskCategory::Sanctions,
            RiskCategory::Reputation,
        ];
        
        for category in categories {
            let factor = RiskFactor {
                name: "Test".to_string(),
                category,
                score: 5.0,
                weight: 0.5,
                description: "Test".to_string(),
                evidence: vec![],
            };
            assert_eq!(factor.category, category);
        }
    }
}