|
| 1 | +// Skip on macOS to match other integration tests that require non-main-thread access. |
| 2 | +#[cfg(all(test, not(target_os = "macos")))] |
| 3 | +mod tests { |
| 4 | + use serial_test::serial; |
| 5 | + use tempfile::TempDir; |
| 6 | + use std::fs; |
| 7 | + use std::path::PathBuf; |
| 8 | + |
| 9 | + use crate::commands::settings_commands::{load_app_settings, save_app_settings}; |
| 10 | + use crate::models::AppSettings; |
| 11 | + |
| 12 | + fn build_test_app() -> (tauri::App, TempDir) { |
| 13 | + let td = TempDir::new().expect("tempdir"); |
| 14 | + std::env::set_var("HOME", td.path()); |
| 15 | + let app = tauri::Builder::default() |
| 16 | + .plugin(tauri_plugin_store::Builder::new().build()) |
| 17 | + .build(tauri::generate_context!()) |
| 18 | + .expect("failed to build test app"); |
| 19 | + (app, td) |
| 20 | + } |
| 21 | + |
| 22 | + fn settings_file_path(home: &TempDir) -> PathBuf { |
| 23 | + home.path().join(".commander").join("settings.json") |
| 24 | + } |
| 25 | + |
| 26 | + #[test] |
| 27 | + #[serial] |
| 28 | + fn test_code_auto_collapse_default_and_persistence() { |
| 29 | + let (app, _home_td) = build_test_app(); |
| 30 | + let handle = app.handle(); |
| 31 | + |
| 32 | + let defaults = tauri::async_runtime::block_on(load_app_settings(handle.clone())) |
| 33 | + .expect("load_app_settings should succeed"); |
| 34 | + assert!(!defaults.code_settings.auto_collapse_sidebar); |
| 35 | + |
| 36 | + let mut updated = defaults.clone(); |
| 37 | + updated.code_settings.auto_collapse_sidebar = true; |
| 38 | + tauri::async_runtime::block_on(save_app_settings(handle.clone(), updated)) |
| 39 | + .expect("save_app_settings should succeed"); |
| 40 | + |
| 41 | + let reloaded = tauri::async_runtime::block_on(load_app_settings(handle.clone())) |
| 42 | + .expect("load_app_settings should succeed after save"); |
| 43 | + assert!(reloaded.code_settings.auto_collapse_sidebar); |
| 44 | + } |
| 45 | + |
| 46 | + #[test] |
| 47 | + #[serial] |
| 48 | + fn test_code_auto_collapse_persists_to_user_file_and_is_respected() { |
| 49 | + let (app, home_td) = build_test_app(); |
| 50 | + let handle = app.handle(); |
| 51 | + |
| 52 | + let mut s = AppSettings::default(); |
| 53 | + s.code_settings.auto_collapse_sidebar = true; |
| 54 | + tauri::async_runtime::block_on(save_app_settings(handle.clone(), s)) |
| 55 | + .expect("save_app_settings should succeed"); |
| 56 | + |
| 57 | + let sf = settings_file_path(&home_td); |
| 58 | + assert!(sf.exists(), "user settings file should be created"); |
| 59 | + |
| 60 | + let mut json: serde_json::Value = serde_json::from_str( |
| 61 | + &fs::read_to_string(&sf).expect("read user settings"), |
| 62 | + ) |
| 63 | + .expect("parse user settings json"); |
| 64 | + assert_eq!( |
| 65 | + json.get("code") |
| 66 | + .and_then(|c| c.get("auto_collapse_sidebar")) |
| 67 | + .and_then(|b| b.as_bool()), |
| 68 | + Some(true) |
| 69 | + ); |
| 70 | + |
| 71 | + // Flip the value manually to ensure load respects user edits. |
| 72 | + json["code"]["auto_collapse_sidebar"] = serde_json::json!(false); |
| 73 | + fs::write(&sf, serde_json::to_string_pretty(&json).expect("serialize json")) |
| 74 | + .expect("write user settings"); |
| 75 | + |
| 76 | + let loaded = tauri::async_runtime::block_on(load_app_settings(handle.clone())) |
| 77 | + .expect("load_app_settings should succeed after manual edit"); |
| 78 | + assert!(!loaded.code_settings.auto_collapse_sidebar); |
| 79 | + } |
| 80 | +} |
0 commit comments