use std::sync::Arc;
use tap_agent::TapAgent;
use tap_msg::message::tap_message_trait::TapMessageBody;
use tap_msg::message::{Party, Transfer};
use tap_node::storage::models::{DeliveryStatus, DeliveryType};
use tap_node::{NodeConfig, TapNode};
#[tokio::test]
async fn test_delivery_tracking_with_send_message() -> Result<(), Box<dyn std::error::Error>> {
let config = NodeConfig::default();
let mut node = TapNode::new(config);
let storage = tap_node::storage::Storage::new_in_memory().await?;
node.set_storage(storage).await?;
let (sender_agent, sender_did) = TapAgent::from_ephemeral_key().await?;
let (recipient_agent, recipient_did) = TapAgent::from_ephemeral_key().await?;
node.register_agent(Arc::new(sender_agent)).await?;
node.register_agent(Arc::new(recipient_agent)).await?;
let transfer = Transfer {
transaction_id: Some("tx-123".to_string()),
asset: "eip155:1/erc20:0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48".parse()?,
amount: "100.00".to_string(),
originator: Some(Party::new(&sender_did)),
beneficiary: Some(Party::new(&recipient_did)),
agents: vec![],
settlement_id: None,
expiry: None,
transaction_value: None,
memo: Some("Test transfer".to_string()),
connection_id: None,
metadata: std::collections::HashMap::new(),
};
let test_message = transfer.to_didcomm(&sender_did)?;
let message_id = test_message.id.clone(); let packed_message = node.send_message(sender_did.clone(), test_message).await?;
println!("Packed message: {}", packed_message);
tokio::time::sleep(std::time::Duration::from_millis(100)).await;
if let Some(storage_manager) = node.agent_storage_manager() {
let sender_storage = storage_manager.get_agent_storage(&sender_did).await?;
let deliveries = sender_storage
.get_deliveries_for_message(&message_id)
.await?;
println!("Found {} delivery records", deliveries.len());
assert!(!deliveries.is_empty(), "No delivery records found");
let delivery = &deliveries[0];
println!("Delivery record: {:?}", delivery);
assert_eq!(delivery.message_id, message_id);
assert_eq!(delivery.recipient_did, recipient_did);
assert_eq!(delivery.delivery_type, DeliveryType::Internal);
assert_eq!(delivery.status, DeliveryStatus::Success);
assert!(delivery.delivered_at.is_some());
assert!(delivery.error_message.is_none());
assert!(!delivery.message_text.is_empty());
assert_ne!(delivery.message_text, "test-message-123");
println!("✅ Internal delivery tracking test passed!");
} else {
panic!("Storage manager not available");
}
Ok(())
}
#[tokio::test]
async fn test_external_delivery_tracking() -> Result<(), Box<dyn std::error::Error>> {
let config = NodeConfig::default();
let mut node = TapNode::new(config);
let storage = tap_node::storage::Storage::new_in_memory().await?;
node.set_storage(storage).await?;
let (sender_agent, sender_did) = TapAgent::from_ephemeral_key().await?;
node.register_agent(Arc::new(sender_agent)).await?;
let external_did = "did:example:external-recipient";
let transfer = Transfer {
transaction_id: Some("tx-456".to_string()),
asset: "eip155:1/erc20:0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48".parse()?,
amount: "200.00".to_string(),
originator: Some(Party::new(&sender_did)),
beneficiary: Some(Party::new(external_did)),
agents: vec![],
settlement_id: None,
expiry: None,
transaction_value: None,
memo: Some("External transfer".to_string()),
connection_id: None,
metadata: std::collections::HashMap::new(),
};
let test_message = transfer.to_didcomm(&sender_did)?;
let message_id = test_message.id.clone();
let send_result = node.send_message(sender_did.clone(), test_message).await;
match send_result {
Ok(packed_message) => {
println!("Packed message for external delivery: {}", packed_message);
tokio::time::sleep(std::time::Duration::from_millis(100)).await;
if let Some(storage_manager) = node.agent_storage_manager() {
let sender_storage = storage_manager.get_agent_storage(&sender_did).await?;
let deliveries = sender_storage
.get_deliveries_for_message(&message_id)
.await?;
println!(
"Found {} delivery records for external message",
deliveries.len()
);
assert!(!deliveries.is_empty(), "No delivery records found");
let delivery = &deliveries[0];
println!("External delivery record: {:?}", delivery);
assert_eq!(delivery.message_id, message_id);
assert_eq!(delivery.recipient_did, external_did);
assert_eq!(delivery.delivery_type, DeliveryType::Https);
assert_eq!(delivery.status, DeliveryStatus::Success);
assert!(delivery.delivery_url.is_some());
assert!(delivery.delivered_at.is_some());
assert!(delivery.last_http_status_code.is_some());
assert!(!delivery.message_text.is_empty());
println!("✅ External delivery tracking test passed!");
} else {
panic!("Storage manager not available");
}
}
Err(e) => {
let error_msg = e.to_string();
assert!(
error_msg.contains("Failed to deliver")
|| error_msg.contains("Networking error")
|| error_msg.contains("HTTP delivery failed"),
"Unexpected error: {}",
error_msg
);
println!("✅ External delivery tracking test passed (network unavailable)");
}
}
Ok(())
}