fix: keep pull request filters session-local
This commit is contained in:
@@ -59,18 +59,43 @@ fn loading_is_lazy_and_applied_preferences_round_trip_atomically() {
|
||||
);
|
||||
store.save(&preferences).unwrap();
|
||||
let (_, loaded, notice) = Store::load(Ok(path.clone()));
|
||||
assert_eq!(loaded, preferences);
|
||||
assert_eq!(loaded.sort, preferences.sort);
|
||||
assert_eq!(loaded.filters, Preferences::default().filters);
|
||||
assert!(!fs::read_to_string(&path).unwrap().contains("filters"));
|
||||
assert!(notice.is_none());
|
||||
preferences.filters.clear();
|
||||
preferences.sort.clear();
|
||||
store.save(&preferences).unwrap();
|
||||
assert_eq!(Store::load(Ok(path)).1, preferences);
|
||||
assert_eq!(Store::load(Ok(path)).1, Preferences::default());
|
||||
assert_eq!(
|
||||
fs::read_dir(fixture.0.join("state/vamp")).unwrap().count(),
|
||||
1
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn previously_saved_filters_are_ignored_without_changing_sort_or_file() {
|
||||
let fixture = Fixture::new();
|
||||
let path = fixture.path();
|
||||
fs::create_dir_all(path.parent().unwrap()).unwrap();
|
||||
for filters in [
|
||||
r#"[]"#,
|
||||
r#"["approved"]"#,
|
||||
r#"["unknown"]"#,
|
||||
r#"{"invalid":true}"#,
|
||||
] {
|
||||
let bytes = format!(
|
||||
r#"{{"version":1,"preferences":{{"sort":{{"created_at":{{"precedence":1,"direction":"asc"}}}},"filters":{filters}}}}}"#
|
||||
);
|
||||
fs::write(&path, &bytes).unwrap();
|
||||
let (_, loaded, notice) = Store::load(Ok(path.clone()));
|
||||
assert!(notice.is_none());
|
||||
assert_eq!(loaded.filters, Preferences::default().filters);
|
||||
assert_eq!(loaded.sort[&SortField::CreatedAt].direction, Direction::Asc);
|
||||
assert_eq!(fs::read_to_string(&path).unwrap(), bytes);
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn corrupt_incompatible_and_invalid_data_is_preserved_even_after_apply() {
|
||||
let fixture = Fixture::new();
|
||||
@@ -83,8 +108,6 @@ fn corrupt_incompatible_and_invalid_data_is_preserved_even_after_apply() {
|
||||
r#"{"version":1,"preferences":{"sort":{"updated_at":{"direction":"up"}}}}"#,
|
||||
r#"{"version":1,"preferences":{"sort":{"updated_at":{"precedence":0}}}}"#,
|
||||
r#"{"version":1,"preferences":{"sort":{"updated_at":{"precedence":1},"created_at":{"precedence":1}}}}"#,
|
||||
r#"{"version":1,"preferences":{"filters":["unknown"]}}"#,
|
||||
r#"{"version":1,"preferences":{"filters":["requested","requested"]}}"#,
|
||||
] {
|
||||
fs::write(&path, bytes).unwrap();
|
||||
let (store, loaded, notice) = Store::load(Ok(path.clone()));
|
||||
|
||||
+29
-29
@@ -3838,7 +3838,7 @@ fn async_responses_edit_only_current_bound_working_after_and_refresh_projection(
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn applied_pull_request_preferences_survive_startup_without_config() {
|
||||
fn applied_pull_request_filters_survive_picker_reopen_but_not_restart() {
|
||||
use crate::pull_requests::ReviewFilter;
|
||||
let fixture = Fixture::new();
|
||||
let path = fixture.0.join("state/pull_requests.json");
|
||||
@@ -3864,13 +3864,31 @@ fn applied_pull_request_preferences_survive_startup_without_config() {
|
||||
session.handle(Input::Char(' '));
|
||||
assert!(!path.exists());
|
||||
session.handle(Input::Enter);
|
||||
assert!(path.exists());
|
||||
assert!(!path.exists());
|
||||
assert!(!session.editor.pull_request_preferences_changed);
|
||||
assert_eq!(
|
||||
session.editor.pull_request_preferences.filters,
|
||||
[ReviewFilter::Other]
|
||||
);
|
||||
session.handle(Input::Escape);
|
||||
session.editor.execute("pull_requests");
|
||||
assert!(session.editor.take_diff_request().is_some());
|
||||
session.handle(Input::Ctrl('f'));
|
||||
session.handle(Input::Enter);
|
||||
assert_eq!(
|
||||
session.editor.pull_request_preferences.filters,
|
||||
[ReviewFilter::Other]
|
||||
);
|
||||
// A sort edit still persists, without carrying the active filter to disk.
|
||||
session.handle(Input::Ctrl('s'));
|
||||
session.handle(Input::Char('1'));
|
||||
session.handle(Input::Enter);
|
||||
assert!(path.exists());
|
||||
let reopened =
|
||||
EditorSession::open_with_preferences_path(None, vec![], None, Some(Ok(path))).unwrap();
|
||||
assert_eq!(
|
||||
reopened.editor.pull_request_preferences.filters,
|
||||
[ReviewFilter::Other]
|
||||
crate::pull_requests::Preferences::default().filters
|
||||
);
|
||||
assert_eq!(reopened.editor.pull_request_configured, [false, false]);
|
||||
}
|
||||
@@ -3897,7 +3915,7 @@ fn configured_pull_request_sections_replace_only_their_persisted_section() {
|
||||
"config.pull_request_sort = {}",
|
||||
Preferences {
|
||||
sort: Default::default(),
|
||||
filters: preferences.filters.clone(),
|
||||
filters: Preferences::default().filters,
|
||||
},
|
||||
[true, false],
|
||||
),
|
||||
@@ -3920,7 +3938,7 @@ fn configured_pull_request_sections_replace_only_their_persisted_section() {
|
||||
},
|
||||
)]
|
||||
.into(),
|
||||
filters: preferences.filters.clone(),
|
||||
filters: Preferences::default().filters,
|
||||
},
|
||||
[true, false],
|
||||
),
|
||||
@@ -3952,19 +3970,10 @@ fn corrupt_pull_request_storage_warns_and_apply_remains_session_only() {
|
||||
assert!(session.editor.message().contains("session-only"));
|
||||
session.editor.execute("pull_requests");
|
||||
assert!(session.editor.take_diff_request().is_some());
|
||||
session.handle(Input::Ctrl('f'));
|
||||
for input in [
|
||||
Input::Char(' '),
|
||||
Input::Down,
|
||||
Input::Char(' '),
|
||||
Input::Down,
|
||||
Input::Char(' '),
|
||||
Input::Enter,
|
||||
] {
|
||||
session.handle(input);
|
||||
}
|
||||
session.handle(Input::Ctrl('s'));
|
||||
session.handle(Input::Char('1'));
|
||||
session.handle(Input::Enter);
|
||||
assert!(session.editor.message().contains("preserved"));
|
||||
assert!(session.editor.pull_request_preferences.filters.is_empty());
|
||||
assert_eq!(fs::read_to_string(path).unwrap(), "preserve invalid bytes");
|
||||
}
|
||||
|
||||
@@ -3978,19 +3987,10 @@ fn failed_pull_request_save_keeps_applied_session_preferences_and_reports_failur
|
||||
fs::write(&parent, "do not replace").unwrap();
|
||||
session.editor.execute("pull_requests");
|
||||
assert!(session.editor.take_diff_request().is_some());
|
||||
session.handle(Input::Ctrl('f'));
|
||||
for input in [
|
||||
Input::Char(' '),
|
||||
Input::Down,
|
||||
Input::Char(' '),
|
||||
Input::Down,
|
||||
Input::Char(' '),
|
||||
Input::Enter,
|
||||
] {
|
||||
session.handle(input);
|
||||
}
|
||||
session.handle(Input::Ctrl('s'));
|
||||
session.handle(Input::Char('1'));
|
||||
session.handle(Input::Enter);
|
||||
assert!(session.editor.message().contains("session-only"));
|
||||
assert!(session.editor.pull_request_preferences.filters.is_empty());
|
||||
assert!(!session.editor.pull_request_preferences_changed);
|
||||
assert_eq!(fs::read_to_string(parent).unwrap(), "do not replace");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user