use tempfile::TempDir;
use x0x::{network, Agent};
#[tokio::test]
async fn test_agent_creation() {
let agent = Agent::new().await;
assert!(agent.is_ok());
let agent = agent.unwrap();
assert!(agent.identity().machine_id().as_bytes() != &[0u8; 32]);
assert!(agent.identity().agent_id().as_bytes() != &[0u8; 32]);
}
#[tokio::test]
async fn test_agent_with_network_config() {
let temp_dir = TempDir::new().expect("Failed to create temp dir");
let builder = Agent::builder();
let builder = builder.with_machine_key(temp_dir.path().join("machine.key"));
let builder = builder.with_network_config(network::NetworkConfig {
bind_addr: Some("127.0.0.1:0".parse().unwrap()),
bootstrap_nodes: vec!["127.0.0.1:5483".parse().unwrap()],
..Default::default()
});
let agent = builder.build().await.expect("Failed to build agent");
assert!(agent.network().is_some());
}
#[tokio::test]
async fn test_agent_join_network() {
let agent = Agent::new().await.expect("Failed to create agent");
let result = agent.join_network().await;
assert!(result.is_ok());
}
#[tokio::test]
async fn test_agent_subscribe() {
let agent = Agent::new().await.expect("Failed to create agent");
let result = agent.subscribe("test-topic").await;
assert!(result.is_err());
}
#[tokio::test]
async fn test_agent_publish() {
let agent = Agent::builder()
.with_network_config(x0x::network::NetworkConfig::default())
.build()
.await
.expect("Failed to create agent");
let result = agent.publish("test-topic", b"hello world".to_vec()).await;
assert!(result.is_ok());
}
#[tokio::test]
async fn test_identity_stability() {
let agent = Agent::builder()
.with_network_config(x0x::network::NetworkConfig::default())
.build()
.await
.expect("Failed to create agent");
let machine_id = agent.machine_id();
let agent_id = agent.agent_id();
let _ = agent.join_network().await;
let _ = agent.subscribe("test-topic").await;
let _ = agent.publish("test-topic", vec![]).await;
assert_eq!(agent.machine_id(), machine_id);
assert_eq!(agent.agent_id(), agent_id);
}
#[tokio::test]
async fn test_builder_custom_machine_key() {
let temp_dir = TempDir::new().expect("Failed to create temp dir");
let key_path = temp_dir.path().join("custom_machine.key");
let agent1 = Agent::builder()
.with_machine_key(&key_path)
.with_agent_key_path(temp_dir.path().join("agent1.key"))
.build()
.await
.expect("Failed to create agent1");
let machine_id1 = agent1.machine_id();
let agent2 = Agent::builder()
.with_machine_key(&key_path)
.with_agent_key_path(temp_dir.path().join("agent2.key"))
.build()
.await
.expect("Failed to create agent2");
let machine_id2 = agent2.machine_id();
assert_eq!(machine_id1, machine_id2);
assert_ne!(agent1.agent_id(), agent2.agent_id());
}
#[tokio::test]
async fn test_message_format() {
use x0x::Message;
let msg = Message {
origin: "test-agent".to_string(),
payload: b"test payload".to_vec(),
topic: "test-topic".to_string(),
};
assert_eq!(msg.origin, "test-agent");
assert_eq!(msg.payload, b"test payload");
assert_eq!(msg.topic, "test-topic");
}