use crate::models::Settings; use crate::store::Store; use std::sync::Mutex; pub fn get_settings_inner(state: &Mutex) -> Result { let store = state.lock().map_err(|e| e.to_string())?; store.get_settings() } pub fn update_setting_inner(state: &Mutex, key: &str, value: &str) -> Result<(), String> { let store = state.lock().map_err(|e| e.to_string())?; store.update_setting(key, value) } #[tauri::command] pub fn get_settings(state: tauri::State) -> Result { get_settings_inner(&state.db_store) } #[tauri::command] pub fn update_setting(state: tauri::State, key: String, value: String) -> Result<(), String> { update_setting_inner(&state.db_store, &key, &value) } #[cfg(test)] mod tests { use super::*; use crate::store::Store; fn state() -> std::sync::Mutex { let conn = rusqlite::Connection::open_in_memory().unwrap(); crate::store::migrations::run_migrations(&conn).unwrap(); std::sync::Mutex::new(Store::from_connection(conn)) } #[test] fn get_settings_returns_defaults() { let st = state(); let s = get_settings_inner(&st).unwrap(); assert_eq!(s.theme, "system"); assert_eq!(s.font_size, "medium"); assert_eq!(s.accent_color, "#2563EB"); } #[test] fn update_setting_persists() { let st = state(); update_setting_inner(&st, "theme", "light").unwrap(); assert_eq!(get_settings_inner(&st).unwrap().theme, "light"); } #[test] fn update_accent_color_persists() { let st = state(); update_setting_inner(&st, "accent_color", "#EF4444").unwrap(); assert_eq!(get_settings_inner(&st).unwrap().accent_color, "#EF4444"); } }