Files
nkode-protocol/tests/in_memory_client_app_test.rs
2025-12-20 09:55:47 -06:00

62 lines
2.8 KiB
Rust

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<Icon> = 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<Icon> = register_code.get_new_user_icons().await.unwrap();
let passcode_idx = ..4;
let icon_ids:Vec<IconID> = icons.iter().map(|el| el.id.clone()).collect();
let selected_icon_ids = icon_ids[passcode_idx].to_vec();
let code_login = register_code.new_user_register_code(selected_icon_ids.clone()).await.unwrap();
let display_keypad = code_login.get_keypad().unwrap();
let selected_keys = display_keypad.keypad.select_keys(&(0..passcode_idx.end).collect()).unwrap();
code_login.login(&selected_keys).await.unwrap();
}