use beam::Node;
use beam::sea::session::InMemorySessionStorage;
#[allow(unused_imports)]
use beam::sea::{SessionStorage, User};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let mut db = Node::new();
let alice = User::create("alice", "password123", &mut db).await?;
assert!(alice.is_authenticated());
assert_eq!(alice.alias().as_deref(), Some("alice"));
println!("Created user: {}", alice.alias().unwrap());
let alice2 = User::auth("alice", "password123", &mut db).await?;
assert!(alice2.is_authenticated());
assert_eq!(alice2.pub_key(), alice.pub_key());
println!("Authenticated: {}", alice2.alias().unwrap());
let storage = InMemorySessionStorage::new();
alice.save_to(&storage).await?;
let recalled = User::recall("alice", &storage).await?;
assert!(recalled.is_authenticated());
assert_eq!(recalled.pub_key(), alice.pub_key());
println!("Saved session, recalled: {}", recalled.alias().unwrap());
let alice_clone = alice.clone();
alice.leave();
assert!(!alice_clone.is_authenticated());
assert!(alice_clone.pair().priv_key.is_empty());
println!(
"After leave, authenticated: {}",
alice_clone.is_authenticated()
);
db.stop();
Ok(())
}