/// When a repo loads a change diff, it should only be used if the same change
/// is still selected
#[test(tokio::test)]
async fn test_repo_got_change_diffs() {
let TestState {
mut state,
tasks: _tasks,
fs_watch_task: _,
id: _,
repo: _,
} = setup_state().await;
let change_hash_0 = change_hash(&[0]);
let change_hash_1 = change_hash(&[1]);
// _________________________________________________________________________
// Case: nothing is selected
assert!(state.cursor.selection.is_none());
let diffs = BTreeMap::from_iter([]);
let task = repo_got_change_diffs(&mut state, change_hash_0, diffs);
assert!(task.is_none());
assert!(state.cursor.selection.is_none());
// _________________________________________________________________________
// Case: selection is changed
state.cursor.selection = Some(cursor::Selection::LogChange {
ix: 0,
hash: change_hash_0,
message: "".to_string(),
diffs: None,
file: None,
});
let diffs = BTreeMap::from_iter([]);
let task = repo_got_change_diffs(&mut state, change_hash_1, diffs);
assert!(task.is_none());
assert!(state.cursor.selection.is_some());
assert_matches!(
state.cursor.selection.as_ref().unwrap(),
cursor::Selection::LogChange { diffs: None, .. }
);
// _________________________________________________________________________
// Case: selection is still the same
state.cursor.selection = Some(cursor::Selection::LogChange {
ix: 0,
hash: change_hash_1,
message: "".to_string(),
diffs: None,
file: None,
});
let diffs = BTreeMap::from_iter([]);
let task = repo_got_change_diffs(&mut state, change_hash_1, diffs);
assert!(task.is_none());
assert!(state.cursor.selection.is_some());
assert_matches!(
state.cursor.selection.as_ref().unwrap(),
cursor::Selection::LogChange { diffs: Some(_), .. }
);
}