use crate::app::*;
const SOME_HASH: u64 = 0xabc;
fn test_session() -> ReviewSession {
let mut session = ReviewSession::new(
PathBuf::from("/repo"),
"abc1234".to_string(),
Some("main".to_string()),
SessionDiffSource::WorkingTree,
);
session.add_file(
PathBuf::from("src/main.rs"),
FileStatus::Modified,
SOME_HASH,
);
session
}
fn comment(id: &str, content: &str) -> Comment {
let mut comment = Comment::new(content.to_string(), CommentType::from_id("note"), None);
comment.id = id.to_string();
comment
}
fn push_file_comment(session: &mut ReviewSession, id: &str, content: &str) {
session
.get_file_mut(&PathBuf::from("src/main.rs"))
.unwrap()
.file_comments
.push(comment(id, content));
}
fn file_comment_ids(session: &ReviewSession) -> Vec<String> {
session
.files
.get(&PathBuf::from("src/main.rs"))
.unwrap()
.file_comments
.iter()
.map(|comment| comment.id.clone())
.collect()
}
#[test]
fn should_merge_external_comment_without_losing_local_comment() {
let base = test_session();
let mut current = base.clone();
let mut latest = base.clone();
push_file_comment(&mut current, "local", "from tui");
push_file_comment(&mut latest, "external", "from cli");
let changed = App::merge_external_session_changes(&mut current, &base, &latest);
assert_eq!(changed, 1);
assert_eq!(file_comment_ids(¤t), vec!["local", "external"]);
}
#[test]
fn should_not_resurrect_locally_deleted_comment_when_disk_is_unchanged() {
let mut base = test_session();
push_file_comment(&mut base, "deleted", "old");
let mut current = base.clone();
current
.get_file_mut(&PathBuf::from("src/main.rs"))
.unwrap()
.file_comments
.clear();
let latest = base.clone();
let changed = App::merge_external_session_changes(&mut current, &base, &latest);
assert_eq!(changed, 0);
assert!(file_comment_ids(¤t).is_empty());
}
#[test]
fn should_apply_external_edit_when_comment_is_unchanged_locally() {
let mut base = test_session();
push_file_comment(&mut base, "same", "old");
let mut current = base.clone();
let mut latest = base.clone();
latest
.get_file_mut(&PathBuf::from("src/main.rs"))
.unwrap()
.file_comments[0]
.content = "new".to_string();
let changed = App::merge_external_session_changes(&mut current, &base, &latest);
assert_eq!(changed, 1);
assert_eq!(
current
.files
.get(&PathBuf::from("src/main.rs"))
.unwrap()
.file_comments[0]
.content,
"new"
);
}