use eidetica::{Result, sync::SyncPeerInfo};
use super::helpers::setup_instance_with_initialized;
#[test]
fn test_register_sync_peer_tracks_relationship_immediately() -> Result<()> {
let instance = setup_instance_with_initialized();
let sync = instance.sync().expect("sync available");
let settings = eidetica::crdt::Doc::new();
let (signing_key, _) = eidetica::auth::crypto::generate_keypair();
let db = eidetica::Database::create(settings, &instance, signing_key, "test_key".to_string())?;
let tree_id = db.root_id().clone();
let (_, peer_verifying_key) = eidetica::auth::crypto::generate_keypair();
let peer_pubkey = eidetica::auth::crypto::format_public_key(&peer_verifying_key);
let peers_before = sync.list_peers()?;
assert_eq!(peers_before.len(), 0, "No peers should exist initially");
let _handle = sync.register_sync_peer(SyncPeerInfo {
peer_pubkey: peer_pubkey.clone(),
tree_id: tree_id.clone(),
addresses: vec![eidetica::sync::Address {
transport_type: "http".to_string(),
address: "http://test:8080".to_string(),
}],
auth: None,
display_name: Some("Test Peer".to_string()),
})?;
let peers_after = sync.list_peers()?;
assert_eq!(peers_after.len(), 1, "Peer should be registered");
assert_eq!(peers_after[0].pubkey, peer_pubkey);
assert_eq!(peers_after[0].display_name, Some("Test Peer".to_string()));
assert_eq!(peers_after[0].addresses.len(), 1);
assert_eq!(peers_after[0].addresses[0].address, "http://test:8080");
Ok(())
}
#[test]
fn test_sync_handle_methods() -> Result<()> {
let instance = setup_instance_with_initialized();
let sync = instance.sync().expect("sync available");
let settings = eidetica::crdt::Doc::new();
let (signing_key, _) = eidetica::auth::crypto::generate_keypair();
let db = eidetica::Database::create(settings, &instance, signing_key, "test_key".to_string())?;
let tree_id = db.root_id().clone();
let (_, peer_verifying_key) = eidetica::auth::crypto::generate_keypair();
let peer_pubkey = eidetica::auth::crypto::format_public_key(&peer_verifying_key);
let handle = sync.register_sync_peer(SyncPeerInfo {
peer_pubkey: peer_pubkey.clone(),
tree_id: tree_id.clone(),
addresses: vec![],
auth: None,
display_name: None,
})?;
assert_eq!(handle.tree_id(), &tree_id);
assert_eq!(handle.peer_pubkey(), &peer_pubkey);
let status = handle.status()?;
assert!(
status.has_local_data,
"Created database should have root entry"
);
Ok(())
}
#[test]
fn test_sync_handle_add_address() -> Result<()> {
let instance = setup_instance_with_initialized();
let sync = instance.sync().expect("sync available");
let settings = eidetica::crdt::Doc::new();
let (signing_key, _) = eidetica::auth::crypto::generate_keypair();
let db = eidetica::Database::create(settings, &instance, signing_key, "test_key".to_string())?;
let (_, peer_verifying_key) = eidetica::auth::crypto::generate_keypair();
let peer_pubkey = eidetica::auth::crypto::format_public_key(&peer_verifying_key);
let handle = sync.register_sync_peer(SyncPeerInfo {
peer_pubkey: peer_pubkey.clone(),
tree_id: db.root_id().clone(),
addresses: vec![eidetica::sync::Address {
transport_type: "http".to_string(),
address: "http://primary:8080".to_string(),
}],
auth: None,
display_name: None,
})?;
let peer = sync.get_peer_info(&peer_pubkey)?.expect("peer exists");
assert_eq!(peer.addresses.len(), 1);
handle.add_address(eidetica::sync::Address {
transport_type: "http".to_string(),
address: "http://backup:8080".to_string(),
})?;
let peer = sync.get_peer_info(&peer_pubkey)?.expect("peer exists");
assert_eq!(peer.addresses.len(), 2);
assert!(peer.addresses.iter().any(|a| a.address.contains("primary")));
assert!(peer.addresses.iter().any(|a| a.address.contains("backup")));
Ok(())
}
#[test]
fn test_get_sync_status() -> Result<()> {
let instance = setup_instance_with_initialized();
let sync = instance.sync().expect("sync available");
let settings = eidetica::crdt::Doc::new();
let (signing_key, _) = eidetica::auth::crypto::generate_keypair();
let db = eidetica::Database::create(settings, &instance, signing_key, "test_key".to_string())?;
let status = sync.get_sync_status(db.root_id(), "fake_peer")?;
assert!(
status.has_local_data,
"Created database should report has_local_data"
);
Ok(())
}