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::adaptive_learning::{AdaptiveAnalyzer, AdaptiveConfig, ModelHealth};
use crate::behavioral::{AccessEvent, Anomaly};
use chrono::{Utc, Duration};
use std::time::Duration as StdDuration;

#[tokio::test]
async fn test_adaptive_learning() {
    let config = AdaptiveConfig {
        performance_window_size: 5,
        min_performance_threshold: 0.7,
        max_history_size: 100,
        auto_retrain: true,
    };

    let mut analyzer = AdaptiveAnalyzer::new(config);

    let events = generate_test_events();
    let anomalies = generate_test_anomalies();

    let initial_metrics = analyzer.update_model(&events, &anomalies)
        .expect("Model training failed");

    assert!(initial_metrics.current_performance.accuracy > 0.0);

    let test_event = AccessEvent {
        user_id: "test_user".to_string(),
        resource: "sensitive_data".to_string(),
        timestamp: Utc::now(),
        duration: StdDuration::from_secs(30),
        success: true,
    };

    let prediction = analyzer.analyze(&test_event)
        .expect("Prediction failed");

    match prediction.model_health {
        ModelHealth::Healthy => println!("Model is healthy"),
        ModelHealth::NeedsAttention => println!("Model needs attention"),
        ModelHealth::Critical => println!("Model is critical"),
    }

    assert!(prediction.confidence_adjustment > 0.0);
    assert!(prediction.confidence_adjustment <= 1.0);
}

#[tokio::test]
async fn test_model_optimization() {
    let config = AdaptiveConfig {
        performance_window_size: 5,
        min_performance_threshold: 0.7,
        max_history_size: 100,
        auto_retrain: true,
    };

    let mut analyzer = AdaptiveAnalyzer::new(config);

    let events = generate_test_events();
    let anomalies = generate_test_anomalies();
    
    analyzer.update_model(&events, &anomalies).expect("Model training failed");
    
    if let Some(optimization_result) = analyzer.optimize_model() {
        assert!(optimization_result.performance_improvement >= 0.0);
        assert!(optimization_result.best_params.learning_rate > 0.0);
        assert!(optimization_result.best_params.learning_rate < 1.0);
    }

    let test_event = generate_single_test_event();
    let prediction = analyzer.analyze(&test_event).expect("Prediction failed");
    
    assert!(prediction.confidence_adjustment > 0.0);
    assert!(matches!(prediction.model_health, ModelHealth::Healthy | ModelHealth::NeedsAttention));
}

fn generate_test_events() -> Vec<AccessEvent> {
    vec![
        AccessEvent {
            user_id: "user1".to_string(),
            resource: "resource1".to_string(),
            timestamp: Utc::now(),
            duration: StdDuration::from_secs(10),
            success: true,
        },
    ]
}

fn generate_test_anomalies() -> Vec<Anomaly> {
    vec![
        Anomaly {
            anomaly_type: crate::behavioral::AnomalyType::UnusualAccessTime,
            severity: 0.8,
            description: "Unusual access time".to_string(),
            timestamp: Utc::now(),
        },
    ]
}

fn generate_single_test_event() -> AccessEvent {
    AccessEvent {
        user_id: "test_user".to_string(),
        resource: "sensitive_data".to_string(),
        timestamp: chrono::Utc::now(),
        duration: std::time::Duration::from_secs(30),
        success: true,
    }
}