122 lines
4.2 KiB
Rust
122 lines
4.2 KiB
Rust
use serde_json::Value;
|
|
use warpui::{App, SingletonEntity};
|
|
|
|
use super::Prompt;
|
|
use crate::auth::AuthStateProvider;
|
|
use crate::settings::WarpPromptSeparator;
|
|
use crate::test_util::settings::initialize_settings_for_tests;
|
|
use crate::workspaces::user_workspaces::UserWorkspaces;
|
|
use crate::{
|
|
context_chips::{
|
|
prompt::{PromptConfiguration, PromptSelection},
|
|
ContextChipKind,
|
|
},
|
|
terminal::session_settings::SessionSettings,
|
|
};
|
|
|
|
fn initialize_app(app: &mut App) {
|
|
initialize_settings_for_tests(app);
|
|
app.add_singleton_model(UserWorkspaces::default_mock);
|
|
app.add_singleton_model(|_| AuthStateProvider::new_for_test());
|
|
}
|
|
|
|
#[test]
|
|
// Legacy prompt configs do not have git diff stats, so it should be added after normalization.
|
|
// `did_separate_git_diff_stats` is set to `false`.
|
|
fn test_prompt_config_adds_git_diff_stats_for_legacy_config() {
|
|
let config = PromptConfiguration::from_chips(
|
|
[
|
|
ContextChipKind::WorkingDirectory,
|
|
ContextChipKind::ShellGitBranch,
|
|
],
|
|
false,
|
|
WarpPromptSeparator::None,
|
|
);
|
|
let mut serialized = serde_json::to_value(config).expect("serialize prompt config");
|
|
|
|
let Value::Object(ref mut map) = serialized else {
|
|
panic!("expected object");
|
|
};
|
|
map.remove("did_separate_git_diff_stats");
|
|
|
|
let legacy_config: PromptConfiguration =
|
|
serde_json::from_value(serialized).expect("deserialize legacy config");
|
|
let normalized = legacy_config.normalize_custom_prompt_config();
|
|
|
|
assert_eq!(
|
|
normalized.chip_kinds(),
|
|
vec![
|
|
ContextChipKind::WorkingDirectory,
|
|
ContextChipKind::ShellGitBranch,
|
|
ContextChipKind::GitDiffStats,
|
|
]
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
// Ensure that prompt configs don't re-insert git diff stats if they were explicitly removed.
|
|
// `did_separate_git_diff_stats` is set to `true`.
|
|
fn test_prompt_config_after_nomalization() {
|
|
let config = PromptConfiguration::from_chips(
|
|
[ContextChipKind::ShellGitBranch],
|
|
false,
|
|
WarpPromptSeparator::None,
|
|
);
|
|
let normalized = config.normalize_custom_prompt_config();
|
|
|
|
assert_eq!(
|
|
normalized.chip_kinds(),
|
|
vec![ContextChipKind::ShellGitBranch]
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn test_prompt_settings() {
|
|
App::test((), |mut app| async move {
|
|
initialize_app(&mut app);
|
|
|
|
let session_settings = SessionSettings::handle(&app);
|
|
let default_prompt = PromptConfiguration::default_prompt();
|
|
|
|
let prompt = app.add_singleton_model(Prompt::new);
|
|
|
|
// First, the default prompt should be set.
|
|
let current_prompt_chips = prompt.read(&app, |prompt, _| prompt.chip_kinds());
|
|
assert_eq!(current_prompt_chips, default_prompt.chip_kinds());
|
|
session_settings.read(&app, |settings, _| {
|
|
assert_eq!(settings.saved_prompt.to_owned(), PromptSelection::Default)
|
|
});
|
|
|
|
// Now, set a new prompt.
|
|
let new_chips = [ContextChipKind::Ssh, ContextChipKind::WorkingDirectory];
|
|
prompt.update(&mut app, |prompt, ctx| {
|
|
prompt
|
|
.update(new_chips.clone(), false, WarpPromptSeparator::None, ctx)
|
|
.expect("Saving prompt failed")
|
|
});
|
|
|
|
// The configuration should be updated both in-memory and in settings.
|
|
let new_prompt_chips = prompt.read(&app, |prompt, _| prompt.chip_kinds());
|
|
assert_eq!(
|
|
new_prompt_chips,
|
|
vec![ContextChipKind::Ssh, ContextChipKind::WorkingDirectory]
|
|
);
|
|
session_settings.read(&app, |settings, _| {
|
|
assert_eq!(
|
|
settings.saved_prompt.to_owned(),
|
|
PromptConfiguration::from_chips(new_chips, false, WarpPromptSeparator::None).into()
|
|
);
|
|
});
|
|
|
|
// If we reset the prompt, settings are cleared.
|
|
prompt.update(&mut app, |prompt, ctx| {
|
|
prompt.reset(ctx).expect("Saving prompt failed");
|
|
});
|
|
let reset_prompt_chips = prompt.read(&app, |prompt, _| prompt.chip_kinds());
|
|
assert_eq!(reset_prompt_chips, default_prompt.chip_kinds());
|
|
session_settings.read(&app, |settings, _| {
|
|
assert_eq!(settings.saved_prompt.to_owned(), PromptSelection::Default);
|
|
});
|
|
});
|
|
}
|