feat: configure personal pull request review indicators

This commit is contained in:
Valdemar Lorenzen
2026-10-21 11:14:50 +02:00
parent bd71d463a4
commit 0202644efa
18 changed files with 901 additions and 88 deletions
+119 -4
View File
@@ -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() {