feat: copy diff review comments to configured clipboard
This commit is contained in:
@@ -7462,6 +7462,116 @@ mod system_clipboard {
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn review_copy_uses_cli_text_and_configured_clipboard_without_saving_drafts() {
|
||||
use crate::review::{Anchor, Comment, Review, Side, Store, Verdict};
|
||||
|
||||
for mode in ["system", "separate"] {
|
||||
let fixture = Fixture::new();
|
||||
let root = fixture.0.0.canonicalize().unwrap();
|
||||
let storage = root.join("reviews");
|
||||
let mut review = Review::new(root.clone());
|
||||
review.summary = "Review summary".into();
|
||||
review.verdict = Some(Verdict::ChangesRequested);
|
||||
review.comments = vec![
|
||||
Comment {
|
||||
id: 1,
|
||||
body: "First\nfeedback".into(),
|
||||
resolved: false,
|
||||
anchor: Anchor {
|
||||
revision: "base".into(),
|
||||
path: "file.txt".into(),
|
||||
side: Side::Before,
|
||||
start: TextPosition { row: 0, column: 1 },
|
||||
end: TextPosition { row: 1, column: 1 },
|
||||
content: "xe\u{301}👩💻\n界z".into(),
|
||||
},
|
||||
},
|
||||
Comment {
|
||||
id: 2,
|
||||
body: "Resolved feedback".into(),
|
||||
resolved: true,
|
||||
anchor: Anchor {
|
||||
revision: "stale".into(),
|
||||
path: "other.rs".into(),
|
||||
side: Side::After,
|
||||
start: TextPosition { row: 0, column: 0 },
|
||||
end: TextPosition { row: 0, column: 3 },
|
||||
content: "old".into(),
|
||||
},
|
||||
},
|
||||
];
|
||||
let mut store = Store::open(&storage).unwrap();
|
||||
store.save(&mut review).unwrap();
|
||||
let id = review.storage_id.unwrap();
|
||||
let expected = format!(
|
||||
"Repository: {}\nReview {id} (revision 1): Review summary\n \
|
||||
Verdict: changes_requested; 1 unresolved, 1 resolved (2 total)\n\
|
||||
\nComment 1 [unresolved] file.txt (before) 0:1–1:1 @ base\n\
|
||||
e\u{301}👩💻\n界\nFirst\nfeedback\n\
|
||||
\nComment 2 [resolved] other.rs (after) 0:0–0:3 @ stale\n\
|
||||
old\nResolved feedback\n",
|
||||
root.display(),
|
||||
);
|
||||
let mut editor = fixture.editor();
|
||||
editor.set_clipboard_mode(mode).unwrap();
|
||||
editor.clipboard = vec!["internal".into()];
|
||||
fixture.external("external");
|
||||
editor.execute("diff.review.copy");
|
||||
assert_eq!(editor.clipboard, ["internal"]);
|
||||
assert_eq!(fixture.bytes("state"), b"external");
|
||||
|
||||
editor.set_review_directory(storage);
|
||||
historical_diff(
|
||||
&mut editor,
|
||||
&root,
|
||||
vec!["xe\u{301}👩💻".into(), "界z".into()],
|
||||
vec!["new".into()],
|
||||
);
|
||||
editor.execute("diff.review.edit 1");
|
||||
type_text(&mut editor, "A UNSAVED");
|
||||
editor.handle(Input::Escape);
|
||||
let draft = editor.context().text;
|
||||
editor.execute("diff.review.copy");
|
||||
assert_eq!(editor.context().text, draft);
|
||||
assert!(editor.local_reviews_dirty());
|
||||
let stored = store.load(&root, id).unwrap();
|
||||
assert_eq!(stored.storage_revision, review.storage_revision);
|
||||
assert_eq!(stored.comments, review.comments);
|
||||
if mode == "system" {
|
||||
assert_eq!(fixture.bytes("state"), expected.as_bytes());
|
||||
assert_eq!(editor.clipboard, ["internal"]);
|
||||
let owned = editor.owned_system_clipboard.clone();
|
||||
fixture.fail("fail-write", true);
|
||||
editor.execute("diff.review.copy");
|
||||
assert_eq!(fixture.bytes("state"), expected.as_bytes());
|
||||
assert_eq!(editor.owned_system_clipboard, owned);
|
||||
} else {
|
||||
assert_eq!(editor.clipboard, [expected.clone()]);
|
||||
assert!(!editor.clipboard_linewise);
|
||||
assert_eq!(fixture.bytes("state"), b"external");
|
||||
assert!(fixture.bytes("writes").is_empty());
|
||||
}
|
||||
editor.execute("diff.review.copy unexpected");
|
||||
editor.with_pane(editor.diff_owner.unwrap(), |editor| {
|
||||
editor
|
||||
.diff
|
||||
.as_mut()
|
||||
.unwrap()
|
||||
.local_review
|
||||
.document
|
||||
.comments
|
||||
.clear();
|
||||
});
|
||||
editor.execute("diff.review.copy");
|
||||
if mode == "system" {
|
||||
assert_eq!(fixture.bytes("state"), expected.as_bytes());
|
||||
} else {
|
||||
assert_eq!(editor.clipboard, [expected]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn line_actions_clipboard_failure_preserves_carets_history_and_repeat() {
|
||||
let fixture = Fixture::new();
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
use super::*;
|
||||
use vamp::{
|
||||
plugin::TextPosition,
|
||||
review::{Comment, Side},
|
||||
review::{Anchor, Comment, Side},
|
||||
};
|
||||
|
||||
#[test]
|
||||
|
||||
Reference in New Issue
Block a user