#![cfg(feature = "test-utils")] use std::sync::Arc; use dirigent_archivist::backend::mock::MockBackend; use dirigent_archivist::backend::{ArchiveBackend, ArchiveCapability, CapabilitySet, HealthStatus}; use dirigent_archivist::coordinator::Archivist; use dirigent_archivist::registry::{ArchiveRegistration, FailureMode, WritePolicy}; use dirigent_archivist::types::{MetaEventRecord, MetaEventType}; use uuid::Uuid; fn reg(name: &str, backend: Arc, priority: u32) -> Arc { Arc::new(ArchiveRegistration::new( name.into(), "mock", backend as Arc, true, FailureMode::Required, priority, true, WritePolicy::Inline, None, HealthStatus::Healthy, )) } fn stub_meta_event(scroll_id: Uuid) -> MetaEventRecord { MetaEventRecord { version: 1, event_id: Uuid::now_v7(), session: scroll_id, ts: chrono::Utc::now(), event_type: MetaEventType::ClientConnected, description: "test event".into(), linked_session_id: None, linked_connector_id: None, linked_connector_title: None, metadata: serde_json::Value::Null, } } #[tokio::test] async fn capability_filter_skips_backend_without_meta_events() { let mut caps_with_meta = CapabilitySet::new(); caps_with_meta.insert(ArchiveCapability::MetaEvents); caps_with_meta.insert(ArchiveCapability::SessionMapping); caps_with_meta.insert(ArchiveCapability::ConnectorRegistry); let with_meta = Arc::new(MockBackend::with_capabilities(caps_with_meta)); let mut caps_without_meta = CapabilitySet::new(); caps_without_meta.insert(ArchiveCapability::SessionMapping); caps_without_meta.insert(ArchiveCapability::ConnectorRegistry); let without_meta = Arc::new(MockBackend::with_capabilities(caps_without_meta)); let archivist = Archivist::from_registrations(vec![ reg("primary", with_meta.clone(), 0), reg("secondary", without_meta.clone(), 10), ]); let scroll = Uuid::new_v4(); archivist .append_meta_events(scroll, vec![stub_meta_event(scroll)], None) .await .unwrap(); // Primary received the meta event. assert!( with_meta.has_meta_events(scroll), "primary should receive meta event" ); // Secondary was capability-skipped. assert!( !without_meta.has_meta_events(scroll), "secondary should be skipped" ); }