feat: configure personal pull request review indicators
This commit is contained in:
+119
-4
@@ -3515,6 +3515,7 @@ fn pull_request_picker_renders_all_rows_without_a_pinned_offset() {
|
||||
},
|
||||
},
|
||||
format!("2026-01-{:02}T00:00:00Z", 20 - index),
|
||||
crate::diff::PullRequestReviewState::None,
|
||||
)
|
||||
})
|
||||
.collect(),
|
||||
@@ -3526,17 +3527,17 @@ fn pull_request_picker_renders_all_rows_without_a_pinned_offset() {
|
||||
let text = screen_text(&terminal);
|
||||
assert!(text.contains("Pull requests"));
|
||||
assert!(text.contains("Open") && text.contains("Closed") && text.contains("All"));
|
||||
assert!(text.contains("> #00 Pull request"));
|
||||
assert!(text.contains("> #00 Pull request"));
|
||||
assert!(!text.contains("pinned"));
|
||||
assert!(text.contains("[partial]"));
|
||||
diff.handle(Input::End);
|
||||
render_diff(&mut terminal, &diff, &mut panels);
|
||||
let text = screen_text(&terminal);
|
||||
assert!(text.contains("> #19 Pull request"));
|
||||
assert!(text.contains("> #19 Pull request"));
|
||||
assert!(!text.contains("#00 Pull request"));
|
||||
diff.handle(Input::Home);
|
||||
render_diff(&mut terminal, &diff, &mut panels);
|
||||
assert!(screen_text(&terminal).contains("> #00 Pull request"));
|
||||
assert!(screen_text(&terminal).contains("> #00 Pull request"));
|
||||
diff.handle(Input::Char('\t'));
|
||||
diff.apply_result(
|
||||
2,
|
||||
@@ -3555,10 +3556,124 @@ fn pull_request_picker_renders_all_rows_without_a_pinned_offset() {
|
||||
diff.handle(Input::Char('\t'));
|
||||
render_diff(&mut terminal, &diff, &mut panels);
|
||||
let text = screen_text(&terminal);
|
||||
assert!(text.contains("> #01 Pull request"));
|
||||
assert!(text.contains("> #01 Pull request"));
|
||||
assert!(!text.contains("#00 Pull request") && !text.contains("#19 Pull request"));
|
||||
}
|
||||
}
|
||||
#[test]
|
||||
fn pull_request_review_symbols_use_terminal_cells_and_keep_the_selection_arrow_independent() {
|
||||
use crate::diff::{
|
||||
Category, Outcome, PullRequestPage, PullRequestReviewState, RepoKind, Revision,
|
||||
RevisionTarget,
|
||||
};
|
||||
let mut diff = DiffState::pull_requests("origin".into());
|
||||
diff.take_request();
|
||||
diff.apply_result(
|
||||
1,
|
||||
Ok(Outcome::PullRequestPage {
|
||||
closed: false,
|
||||
result: Ok(PullRequestPage {
|
||||
kind: RepoKind::Git,
|
||||
remote: "origin".into(),
|
||||
has_more: false,
|
||||
entries: [
|
||||
PullRequestReviewState::Requested,
|
||||
PullRequestReviewState::Approved,
|
||||
PullRequestReviewState::None,
|
||||
]
|
||||
.into_iter()
|
||||
.enumerate()
|
||||
.map(|(index, state)| {
|
||||
(
|
||||
Revision {
|
||||
target: RevisionTarget::PullRequest {
|
||||
remote: "origin".into(),
|
||||
number: index as u64,
|
||||
},
|
||||
label: format!("#{index} title"),
|
||||
description: format!("metadata{index}"),
|
||||
category: Category::Open,
|
||||
},
|
||||
(3 - index).to_string(),
|
||||
state,
|
||||
)
|
||||
})
|
||||
.collect(),
|
||||
}),
|
||||
}),
|
||||
);
|
||||
for (requested, approved, with_editor) in [
|
||||
("🙏", "👍", false),
|
||||
("🙏", "👍", true),
|
||||
("👩🚀 R", "界", true),
|
||||
("ask", "ok", true),
|
||||
("", "👍", true),
|
||||
("🙏", "", true),
|
||||
("", "", true),
|
||||
] {
|
||||
let mut editor = Editor::open(None, vec![]).unwrap();
|
||||
editor.pull_request_review_requested_symbol = requested.into();
|
||||
editor.pull_request_approved_symbol = approved.into();
|
||||
let slot = requested.width().max(approved.width());
|
||||
let slot = slot + usize::from(slot > 0);
|
||||
for width in [100, 44] {
|
||||
let mut terminal =
|
||||
Terminal::new(ratatui::backend::TestBackend::new(width, 24)).unwrap();
|
||||
let mut panels = WheelPanels::default();
|
||||
terminal
|
||||
.draw(|frame| {
|
||||
panels.begin_frame();
|
||||
draw_diff(
|
||||
frame,
|
||||
&diff,
|
||||
frame.area(),
|
||||
"↑/↓",
|
||||
"h/j/k/l",
|
||||
&mut panels,
|
||||
with_editor.then_some(&editor),
|
||||
);
|
||||
})
|
||||
.unwrap();
|
||||
let buffer = terminal.backend().buffer();
|
||||
let mut number_column = None;
|
||||
for (index, symbol) in [requested, approved, ""].into_iter().enumerate() {
|
||||
let (x, y) = (0..24)
|
||||
.find_map(|y| {
|
||||
(0..width).find_map(|x| {
|
||||
(buffer[(x, y)].symbol() == "#"
|
||||
&& buffer[(x + 1, y)].symbol() == index.to_string())
|
||||
.then_some((x, y))
|
||||
})
|
||||
})
|
||||
.expect("all review states render");
|
||||
assert_eq!(*number_column.get_or_insert(x), x);
|
||||
let arrow_x = x - (2 + slot) as u16;
|
||||
assert_eq!(
|
||||
buffer[(arrow_x, y)].symbol(),
|
||||
if index == 0 { ">" } else { " " }
|
||||
);
|
||||
if !symbol.is_empty() {
|
||||
assert_eq!(
|
||||
buffer[(arrow_x + 2, y)].symbol(),
|
||||
symbol.graphemes(true).next().unwrap()
|
||||
);
|
||||
} else {
|
||||
for blank in arrow_x + 2..x {
|
||||
assert_eq!(buffer[(blank, y)].symbol(), " ");
|
||||
}
|
||||
}
|
||||
if width == 100 {
|
||||
assert_eq!(
|
||||
buffer[(x, y + 1)].symbol(),
|
||||
"m",
|
||||
"metadata aligns with #number"
|
||||
);
|
||||
}
|
||||
}
|
||||
assert!(!screen_text(&terminal).contains('✓'));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn diff_excerpts_render_original_lines_and_expand_without_losing_changes() {
|
||||
|
||||
Reference in New Issue
Block a user