spawn-access-control 0.1.12

A Rust library for access control management with WebAssembly support, including role-based access control (RBAC), permissions, and audit logging.
Documentation
use crate::model_explainer::{ModelExplainer, SecurityConfig};
use crate::model_optimizer::ModelParameters;
use crate::ml_metrics::ModelMetrics;
use std::time::Duration;

#[test]
fn test_model_explanation() {
    let feature_names = vec![
        "time_of_day".to_string(),
        "location".to_string(),
        "device_type".to_string(),
        "failed_attempts".to_string(),
    ];

    let security_config = SecurityConfig {
        false_positive_weight: 0.7,
        false_negative_weight: 0.3,
        risk_threshold: 0.8,
    };

    let explainer = ModelExplainer::new(feature_names, security_config);

    let params = ModelParameters {
        learning_rate: 0.01,
        batch_size: 32,
        num_trees: 100,
        max_depth: 10,
        feature_sampling_ratio: 0.7,
    };

    let metrics = create_test_metrics();

    let explanation = explainer.explain_model(&params, &metrics);

    assert!(!explanation.feature_importance.is_empty());
    assert!(explanation.feature_importance.values().all(|&v| v >= 0.0 && v <= 1.0));

    assert!(explanation.security_impact.false_positive_impact >= 0.0);
    assert!(explanation.security_impact.false_negative_impact >= 0.0);
    assert!(!explanation.security_impact.risk_factors.is_empty());
}

#[test]
fn test_security_impact_analysis() {
    let feature_names = vec!["test_feature".to_string()];
    let security_config = SecurityConfig {
        false_positive_weight: 0.8,
        false_negative_weight: 0.2,
        risk_threshold: 0.9,
    };

    let explainer = ModelExplainer::new(feature_names, security_config);
    let metrics = create_test_metrics();

    let security_impact = explainer.analyze_security_impact(&metrics);
    
    assert!(!security_impact.risk_factors.is_empty());
    for factor in &security_impact.risk_factors {
        assert!(factor.impact_score >= 0.0 && factor.impact_score <= 1.0);
        assert!(!factor.mitigation_strategy.is_empty());
    }
}

fn create_test_metrics() -> ModelMetrics {
    ModelMetrics {
        model_id: "test_model".to_string(),
        timestamp: chrono::Utc::now(),
        accuracy: 0.85,
        precision: 0.82,
        recall: 0.88,
        f1_score: 0.85,
        confusion_matrix: Default::default(),
        feature_importance: Default::default(),
        training_duration: Duration::from_secs(60),
    }
}