A local-first private AI assistant for everyday use. Runs on-device models with encrypted P2P sync, and supports sharing chats publicly on ATProto.
10
fork

Configure Feed

Select the types of activity you want to include in your feed.

test: Added more tests for account.rs + some refactoring

madclaws 41511f24 c2728a9b

+84 -9
+1 -1
tiles/src/commands/mod.rs
··· 303 303 if root_user_details.id.is_empty() { 304 304 println!("{}", get_account_not_created_msg()); 305 305 } else { 306 - match set_nickname(&config, nickname) { 306 + match set_nickname(&config, &nickname) { 307 307 Ok(root_user_config) => { 308 308 let id = root_user_config.get("id").unwrap().as_str().unwrap(); 309 309 let nickname = root_user_config.get("nickname").unwrap().as_str().unwrap();
+83 -8
tiles/src/utils/accounts.rs
··· 7 7 use crate::utils::config::save_config; 8 8 const ROOT_USER_CONFIG_KEY: &str = "root-user"; 9 9 10 + const ROOT_PARSE_ERROR: &str = "Failed to parse root user config"; 10 11 #[allow(dead_code)] 11 12 pub struct RootUser { 12 13 pub id: String, ··· 56 57 pub fn get_root_user_details(config: &Table) -> Result<RootUser> { 57 58 let root_user = config 58 59 .get(ROOT_USER_CONFIG_KEY) 59 - .ok_or_else(|| anyhow!("root-user key not found"))?; 60 + .ok_or_else(|| anyhow!(ROOT_PARSE_ERROR))?; 60 61 let root_user_table = root_user 61 62 .as_table() 62 63 .ok_or_else(|| anyhow!("root user not a table"))?; ··· 78 79 .ok_or_else(|| anyhow!("{} doesn't exist", ROOT_USER_CONFIG_KEY))?; 79 80 let root_user_table = root_user 80 81 .as_table() 81 - .ok_or_else(|| anyhow!("Failed to parse root user info"))?; 82 + .ok_or_else(|| anyhow!(ROOT_PARSE_ERROR))?; 82 83 let root_user_data = RootUser::new(root_user_table)?; 83 84 let did = root_user_data.id; 84 85 if did.is_empty() { ··· 110 111 /// - nickname: Nickname for the identity 111 112 /// 112 113 /// Returns the root_user_config as a `Table` type 113 - pub fn set_nickname(config: &Table, nickname: String) -> Result<Table> { 114 - let root_user = config.get(ROOT_USER_CONFIG_KEY).unwrap(); 115 - let mut root_user_table = root_user.as_table().unwrap().clone(); 116 - let did = root_user_table.get("id").unwrap().as_str().unwrap(); 114 + pub fn set_nickname(config: &Table, nickname: &str) -> Result<Table> { 115 + let root_user = config 116 + .get(ROOT_USER_CONFIG_KEY) 117 + .ok_or_else(|| anyhow!("{} doesn't exist", ROOT_USER_CONFIG_KEY))?; 118 + 119 + let mut root_user_table = root_user 120 + .as_table() 121 + .ok_or_else(|| anyhow!(ROOT_PARSE_ERROR))? 122 + .clone(); 123 + let did = root_user_table 124 + .get("id") 125 + .and_then(|v| v.as_str()) 126 + .ok_or(anyhow!("Failed to get id from config"))?; 117 127 if did.is_empty() { 118 128 Err(anyhow::anyhow!("No Root user available")) 119 129 } else { 120 130 root_user_table.insert("id".to_owned(), toml::Value::String(did.to_owned())); 121 - root_user_table.insert("nickname".to_owned(), toml::Value::String(nickname)); 131 + root_user_table.insert( 132 + "nickname".to_owned(), 133 + toml::Value::String(nickname.to_owned()), 134 + ); 122 135 Ok(root_user_table) 123 136 } 124 137 } ··· 143 156 use keyring::{mock, set_default_credential_builder}; 144 157 use toml::Table; 145 158 146 - use crate::utils::accounts::{create_root_account, get_root_user_details}; 159 + use crate::utils::accounts::{ 160 + RootUser, create_root_account, get_root_user_details, set_nickname, 161 + }; 147 162 148 163 #[test] 149 164 fn test_get_root_user_details_empty_id() -> Result<()> { ··· 252 267 root_user.get("nickname").unwrap().as_str().unwrap(), 253 268 "madclaws" 254 269 ); 270 + } 271 + 272 + #[test] 273 + fn test_get_root_user_details_missing_key() { 274 + let config: Table = toml::from_str( 275 + r#" 276 + # no root-user table 277 + [other] 278 + foo = "bar" 279 + "#, 280 + ) 281 + .unwrap(); 282 + 283 + let res = get_root_user_details(&config); 284 + assert!(res.is_err(), "Expected error when root-user key is missing"); 285 + } 286 + 287 + #[test] 288 + fn test_root_user_new_wrong_types() { 289 + // id is integer, nickname is table 290 + let config: Table = toml::from_str( 291 + r#" 292 + [root-user] 293 + id = 123 294 + nickname = { nested = "value" } 295 + "#, 296 + ) 297 + .unwrap(); 298 + 299 + let root_tbl = config.get("root-user").unwrap().as_table().unwrap().clone(); 300 + assert!( 301 + RootUser::new(&root_tbl).is_err(), 302 + "Expected error for wrong types" 303 + ); 304 + } 305 + 306 + #[test] 307 + fn test_root_user_roundtrip_table() -> Result<()> { 308 + let user = RootUser { 309 + id: "did:key:abc".into(), 310 + nickname: "nick".into(), 311 + }; 312 + let tbl = user.to_table(); 313 + let parsed = RootUser::new(&tbl)?; 314 + assert_eq!(parsed.id, user.id); 315 + assert_eq!(parsed.nickname, user.nickname); 316 + Ok(()) 317 + } 318 + 319 + #[test] 320 + fn test_set_nickname_but_invalid_config() { 321 + let config: Table = toml::from_str( 322 + r#" 323 + [ruser] 324 + id = '' 325 + "#, 326 + ) 327 + .unwrap(); 328 + 329 + assert!(set_nickname(&config, "madclaws").is_err()) 255 330 } 256 331 }