use std::sync::Arc;
use tap_agent::TapAgent;
use tap_http::{TapHttpConfig, TapHttpServer};
use tap_node::{NodeConfig, TapNode};
use tempfile::TempDir;
#[tokio::test]
async fn test_tap_http_with_per_agent_storage() {
let temp_dir = TempDir::new().unwrap();
let tap_root = temp_dir.path().to_path_buf();
println!("Testing TAP-HTTP with per-agent storage at: {:?}", tap_root);
let node_config = NodeConfig {
tap_root: Some(tap_root.clone()),
enable_message_logging: true,
log_message_content: true,
..Default::default()
};
let node = TapNode::new(node_config);
let (agent1, did1) = TapAgent::from_ephemeral_key().await.unwrap();
let (agent2, did2) = TapAgent::from_ephemeral_key().await.unwrap();
println!("Created test agents: {} and {}", did1, did2);
let node_arc = Arc::new(node);
node_arc.register_agent(Arc::new(agent1)).await.unwrap();
node_arc.register_agent(Arc::new(agent2)).await.unwrap();
println!("Registered agents with TAP Node");
let storage_manager = node_arc.agent_storage_manager().unwrap();
let storage1 = storage_manager.get_agent_storage(&did1).await.unwrap();
let storage2 = storage_manager.get_agent_storage(&did2).await.unwrap();
assert!(!Arc::ptr_eq(&storage1, &storage2));
println!("Verified per-agent storage isolation");
let http_config = TapHttpConfig {
port: 0, ..Default::default()
};
let _server = TapHttpServer::new(http_config, (*node_arc).clone());
println!("Created TAP-HTTP server successfully");
let test_message = serde_json::json!({
"id": "test-message-123",
"type": "basic-message",
"from": did1,
"to": [did2],
"created_time": chrono::Utc::now().timestamp(),
"body": {
"content": "Test message for per-agent storage"
}
});
let result = node_arc.receive_message(test_message).await;
assert!(result.is_ok(), "Message processing should succeed");
println!("Successfully processed test message through TAP Node");
let storage_manager = node_arc.agent_storage_manager().unwrap();
let recipient_storage = storage_manager.get_agent_storage(&did2).await.unwrap();
let messages = recipient_storage.list_messages(10, 0, None).await.unwrap();
assert!(
!messages.is_empty(),
"Recipient should have received the message"
);
let stored_message = &messages[0];
assert_eq!(stored_message.message_id, "test-message-123");
assert_eq!(stored_message.from_did, Some(did1.clone()));
assert_eq!(stored_message.to_did, Some(did2.clone()));
println!("Verified message was stored in recipient's per-agent storage");
println!("TAP-HTTP per-agent storage integration test completed successfully");
}
#[tokio::test]
async fn test_tap_http_agent_storage_manager_delegation() {
let temp_dir = TempDir::new().unwrap();
let tap_root = temp_dir.path().to_path_buf();
let node_config = NodeConfig {
tap_root: Some(tap_root),
..Default::default()
};
let node = TapNode::new(node_config);
let node_arc = Arc::new(node);
let http_config = TapHttpConfig::default();
let server = TapHttpServer::new(http_config, (*node_arc).clone());
let storage_manager = server.node().agent_storage_manager();
assert!(
storage_manager.is_some(),
"Storage manager should be available"
);
let test_did = "did:example:test-agent";
let storage = storage_manager.unwrap().get_agent_storage(test_did).await;
assert!(storage.is_ok(), "Should be able to get agent storage");
println!("Verified TAP-HTTP properly delegates to TAP Node's agent storage manager");
}
#[test]
fn test_tap_http_architecture_consistency() {
let node = TapNode::new(NodeConfig::default());
let config = TapHttpConfig::default();
let _server = TapHttpServer::new(config, node);
println!("TAP-HTTP architecture is consistent with per-agent storage design");
}