Files
galaxy/crates/integration/src/test/settings_file_hot_reload.rs
T

107 lines
4.6 KiB
Rust

//! Integration test for the settings file hot-reload pipeline.
//!
//! Verifies that changes to `settings.toml` on disk are picked up by the
//! filesystem watcher and pushed into the in-memory setting models, on every
//! platform where Warp watches `config_local_dir()`.
use settings::Setting as _;
use std::time::Duration;
use galaxy::{
features::FeatureFlag,
integration_testing::{
step::new_step_with_default_assertions,
terminal::wait_until_bootstrapped_single_pane_for_tab,
},
settings::FontSettings,
};
use galaxyui::{async_assert_eq, integration::TestStep, SingletonEntity};
use super::{new_builder, Builder};
/// Helper: returns the path to the TOML settings file.
fn toml_file_path() -> std::path::PathBuf {
galaxy::settings::user_preferences_toml_file_path()
}
/// Verifies the full settings hot-reload pipeline end-to-end: the filesystem
/// watcher detects a change to `settings.toml`, `reload_from_disk` runs, and
/// `reload_all_public_settings` pushes the new value into the in-memory
/// setting model.
pub fn test_settings_file_hot_reload_applies_new_values() -> Builder {
FeatureFlag::SettingsFile.set_enabled(true);
new_builder()
.with_setup(move |utils| {
// Use a short watcher delay so each reload fires quickly.
utils.set_env("WARP_CONFIG_WATCHER_DELAY_MS", Some("10".to_string()));
// Write an initial valid settings file so the watcher is already
// tracking it and the app reads a known value at startup.
let path = toml_file_path();
if let Some(parent) = path.parent() {
std::fs::create_dir_all(parent).expect("should create config dir");
}
std::fs::write(&path, "[appearance.text]\nfont_size = 14.0\n")
.expect("should write initial valid TOML");
})
.with_step(wait_until_bootstrapped_single_pane_for_tab(0))
// Step 1: Confirm the initial value was loaded on startup. This
// baseline rules out a later false positive where the "reload" just
// returns the default value.
.with_step(
new_step_with_default_assertions("Initial font_size loaded from disk")
.add_named_assertion("monospace_font_size == 14.0", |app, _| {
app.read(|ctx| {
let val = FontSettings::as_ref(ctx).monospace_font_size.value();
async_assert_eq!(
*val,
14.0,
"startup load should have set font size to 14.0"
)
})
}),
)
// Step 2: Rewrite the file with a different valid value and wait for
// the watcher to push the new value into the in-memory model.
.with_step(
TestStep::new("Hot reload font_size to 18.0")
.set_timeout(Duration::from_secs(30))
.with_setup(|_utils| {
let path = toml_file_path();
std::fs::write(&path, "[appearance.text]\nfont_size = 18.0\n")
.expect("should write updated font size");
})
.add_named_assertion("monospace_font_size == 18.0", |app, _| {
app.read(|ctx| {
let val = FontSettings::as_ref(ctx).monospace_font_size.value();
async_assert_eq!(
*val,
18.0,
"hot reload should have updated font size to 18.0"
)
})
}),
)
// Step 3: Rewrite a second time to confirm the reload is repeatable
// and not a one-shot effect tied to the initial load.
.with_step(
TestStep::new("Hot reload font_size to 16.0")
.set_timeout(Duration::from_secs(30))
.with_setup(|_utils| {
let path = toml_file_path();
std::fs::write(&path, "[appearance.text]\nfont_size = 16.0\n")
.expect("should write second updated font size");
})
.add_named_assertion("monospace_font_size == 16.0", |app, _| {
app.read(|ctx| {
let val = FontSettings::as_ref(ctx).monospace_font_size.value();
async_assert_eq!(
*val,
16.0,
"second hot reload should have updated font size to 16.0"
)
})
}),
)
}