feat: sort and filter pull requests by review state
This commit is contained in:
@@ -486,6 +486,111 @@ fn pull_request_review_refresh_preserves_identity_sorting_and_raw_search_labels(
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn pull_request_review_controls_compose_with_search_categories_and_streamed_updates() {
|
||||
use PullRequestReviewState::{Approved, None, Requested};
|
||||
let mut editor = editor();
|
||||
editor.execute("pull_requests origin");
|
||||
let (id, _) = editor.take_diff_request().unwrap();
|
||||
let mut page = pull_page(
|
||||
false,
|
||||
&[
|
||||
(1, "Fix", "1"),
|
||||
(2, "Fix", "2"),
|
||||
(3, "Fix", "3"),
|
||||
(4, "Fix", "4"),
|
||||
(5, "Fix", "4"),
|
||||
(6, "prefix Fix", "6"),
|
||||
(7, "Draft Fix", "7"),
|
||||
],
|
||||
true,
|
||||
);
|
||||
if let Outcome::PullRequestPage {
|
||||
result: Ok(page), ..
|
||||
} = &mut page
|
||||
{
|
||||
for (entry, state) in page.entries.iter_mut().zip([
|
||||
Requested, Approved, None, Requested, Approved, None, Requested,
|
||||
]) {
|
||||
entry.2 = state;
|
||||
}
|
||||
page.entries[6].0.category = Category::Drafts;
|
||||
}
|
||||
editor.apply_diff_result(id, Ok(page));
|
||||
let numbers = |editor: &Editor| {
|
||||
editor
|
||||
.diff()
|
||||
.unwrap()
|
||||
.entries()
|
||||
.map(|entry| {
|
||||
let RevisionTarget::PullRequest { number, .. } = entry.target else {
|
||||
panic!("expected pull request");
|
||||
};
|
||||
number
|
||||
})
|
||||
.collect::<Vec<_>>()
|
||||
};
|
||||
let selected = |editor: &Editor| {
|
||||
let diff = editor.diff().unwrap();
|
||||
diff.entries().nth(diff.selected).unwrap().target.clone()
|
||||
};
|
||||
assert_eq!(numbers(&editor), [6, 5, 4, 3, 2, 1]);
|
||||
editor.handle(Input::End);
|
||||
let target = selected(&editor);
|
||||
editor.handle(Input::Ctrl('s'));
|
||||
assert_eq!(numbers(&editor), [4, 1, 6, 5, 3, 2]);
|
||||
assert_eq!(selected(&editor), target);
|
||||
editor.handle(Input::Ctrl('s'));
|
||||
assert_eq!(numbers(&editor), [5, 2, 6, 4, 3, 1]);
|
||||
assert_eq!(selected(&editor), target);
|
||||
editor.handle(Input::Ctrl('s'));
|
||||
assert_eq!(numbers(&editor), [6, 5, 4, 3, 2, 1]);
|
||||
for ch in "Fix".chars() {
|
||||
editor.handle(Input::Char(ch));
|
||||
}
|
||||
assert_eq!(numbers(&editor), [5, 4, 3, 2, 1, 6]);
|
||||
editor.handle(Input::Ctrl('s'));
|
||||
assert_eq!(numbers(&editor), [4, 1, 5, 3, 2, 6]);
|
||||
editor.handle(Input::Ctrl('f'));
|
||||
assert_eq!(numbers(&editor), [4, 1]);
|
||||
editor.handle(Input::Ctrl('f'));
|
||||
assert_eq!(numbers(&editor), [5, 2]);
|
||||
editor.handle(Input::Ctrl('f'));
|
||||
assert_eq!(numbers(&editor), [4, 1, 5, 3, 2, 6]);
|
||||
editor.handle(Input::Ctrl('f'));
|
||||
editor.handle(Input::Home);
|
||||
let mut update = pull_page(false, &[(4, "Fix", "4")], true);
|
||||
if let Outcome::PullRequestPage {
|
||||
result: Ok(page), ..
|
||||
} = &mut update
|
||||
{
|
||||
page.entries[0].2 = Approved;
|
||||
}
|
||||
editor.apply_diff_result(id, Ok(update));
|
||||
assert_eq!(numbers(&editor), [1]);
|
||||
editor.handle(Input::Char('\t'));
|
||||
assert!(numbers(&editor).is_empty());
|
||||
editor.handle(Input::Char('\t'));
|
||||
assert_eq!(numbers(&editor), [7]);
|
||||
editor.handle(Input::Char('\t'));
|
||||
assert_eq!(numbers(&editor), [1, 7]);
|
||||
assert_eq!(editor.diff().unwrap().query, "Fix");
|
||||
assert!(editor.diff().unwrap().pull_request_partial());
|
||||
editor.handle(Input::Ctrl('u'));
|
||||
assert_eq!(numbers(&editor), [7, 1]);
|
||||
editor.handle(Input::Enter);
|
||||
assert!(matches!(
|
||||
editor.take_diff_request(),
|
||||
Some((
|
||||
_,
|
||||
Operation::ResolvePullRequest(Revision {
|
||||
target: RevisionTarget::PullRequest { number: 7, .. },
|
||||
..
|
||||
})
|
||||
))
|
||||
));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn pull_request_categories_keep_query_and_select_loaded_rows_before_completion() {
|
||||
let mut state = DiffState::pull_requests("origin".into());
|
||||
|
||||
Reference in New Issue
Block a user