use opaque_ke::argon2::password_hash::rand_core::OsRng; use nkode_protocol::client::app::{ClientApp, NewUserRegisterKey}; use nkode_protocol::client::client_auth_api::ClientAuth; use nkode_protocol::client::repo::InMemoryClientRepo; use nkode_protocol::server::app::ServerApp; use nkode_protocol::server::repository::in_memory::in_memory_opaque_db::InMemoryOpaqueDB; use nkode_protocol::server::repository::in_memory::in_memory_opaque_session::InMemoryOpaqueSession; use nkode_protocol::server::repository::in_memory::in_memory_transport::{InMemoryCodeServer, InMemoryKeyServer, InMemoryServerTransport}; use nkode_protocol::server::repository::in_memory::in_memory_user_db::InMemoryUserDB; use nkode_protocol::shared::email::Email; use nkode_protocol::shared::models::app::{Icon, IconID, ICON_ID_SIZE}; use nkode_protocol::shared::opaque::{NKodeServerSetup, UserSecretKey}; use nkode_protocol::shared::user_api::IconPoolAPI; #[tokio::test] async fn in_memory_client_app() { let mut rng = OsRng; let server_setup = NKodeServerSetup::new(&mut rng); let user_db = InMemoryUserDB::new(); let n: usize = 200; let mut new_icons: Vec = Vec::with_capacity(n); for i in 0u8..(n as u8) { let id = IconID([i; ICON_ID_SIZE]); // [0; 32], [1; 32], ... [199; 32] new_icons.push(Icon { id, data: vec![i], // dummy payload; adjust as needed }); } user_db.add_icons(new_icons).await.unwrap(); let server = ServerApp::new( server_setup, InMemoryOpaqueDB::new(), InMemoryOpaqueSession::new(), user_db, ); let key_transport: InMemoryKeyServer = InMemoryServerTransport::new(&server); let code_transport: InMemoryCodeServer = InMemoryServerTransport::new(&server); let client_auth = ClientAuth::new(&key_transport, &code_transport, &server.user_db); let client_repo = InMemoryClientRepo::new(); let new_user: ClientApp< '_, '_, '_, NewUserRegisterKey, InMemoryServerTransport<'_, _>, InMemoryServerTransport<'_, _>, _, _ > = ClientApp::new(client_auth, client_repo); let user_email = Email::new("a@b.com").unwrap(); let user_secret_key = UserSecretKey::new(); let register_code = new_user.new_user(user_email, user_secret_key).await.unwrap(); let icons: Vec = register_code.get_new_user_icons().await.unwrap(); let icon_ids:Vec = icons.iter().map(|el| el.id.clone()).collect(); let selected_icons = icon_ids[0..4].to_vec(); let code_login = register_code.new_user_register_code(selected_icons.clone()).await.unwrap(); let display_keypad = code_login.get_keypad().unwrap(); let icon_idxs: Vec = selected_icons.iter().map(|x| { display_keypad.sorted_icons.iter().position(|x1| {x1.id == *x}).unwrap() }).collect(); let selected_keys = display_keypad.keypad.select_keys(&icon_idxs).unwrap(); code_login.login(&selected_keys).await.unwrap(); }