use std::sync::Arc;
use tap_node::event::logger::{EventLogger, EventLoggerConfig, LogDestination};
use tap_node::event::EventBus;
use tap_node::{EventSubscriber, NodeEvent};
#[derive(Debug, Default)]
struct TestEventSubscriber {
count: std::sync::atomic::AtomicUsize,
}
#[async_trait::async_trait]
impl EventSubscriber for TestEventSubscriber {
async fn handle_event(&self, _event: NodeEvent) {
self.count.fetch_add(1, std::sync::atomic::Ordering::SeqCst);
}
}
impl TestEventSubscriber {
fn get_count(&self) -> usize {
self.count.load(std::sync::atomic::Ordering::SeqCst)
}
}
#[tokio::test]
async fn test_event_logger_creation() {
let event_bus = Arc::new(EventBus::new());
let logger_config = EventLoggerConfig {
destination: LogDestination::Console,
structured: false,
log_level: log::Level::Info,
};
let event_logger = Arc::new(EventLogger::new(logger_config));
let subscriber = Arc::new(TestEventSubscriber::default());
event_bus.subscribe(subscriber.clone()).await;
event_bus.subscribe(event_logger.clone()).await;
event_bus
.publish_agent_registered("did:example:alice".to_string())
.await;
assert_eq!(subscriber.get_count(), 1);
}
#[tokio::test]
async fn test_multiple_events() {
let event_bus = Arc::new(EventBus::new());
let logger_config = EventLoggerConfig {
destination: LogDestination::Console,
structured: false,
log_level: log::Level::Info,
};
let event_logger = Arc::new(EventLogger::new(logger_config));
let subscriber = Arc::new(TestEventSubscriber::default());
event_bus.subscribe(subscriber.clone()).await;
event_bus.subscribe(event_logger.clone()).await;
for i in 0..5 {
let test_message = format!("Test message {}", i);
event_bus
.publish_agent_message(format!("did:example:bob{}", i), test_message.into_bytes())
.await;
}
assert_eq!(subscriber.get_count(), 5);
}