feat: separate draft pull requests into their own tab

This commit is contained in:
Valdemar Lorenzen
2026-10-21 10:25:08 +02:00
parent cce3b1e469
commit 6a359cc351
9 changed files with 179 additions and 22 deletions
+80 -1
View File
@@ -445,7 +445,12 @@ fn pull_request_categories_keep_query_and_select_loaded_rows_before_completion()
let mut state = DiffState::pull_requests("origin".into());
assert_eq!(
state.categories(),
[Category::Open, Category::Closed, Category::All]
[
Category::Open,
Category::Closed,
Category::Drafts,
Category::All
]
);
state.take_request();
state.handle(Input::Char('\t'));
@@ -464,6 +469,7 @@ fn pull_request_categories_keep_query_and_select_loaded_rows_before_completion()
assert!(state.pull_request_partial());
assert_eq!(state.entries().next().unwrap().label, "#2 Fix Ünicode");
state.handle(Input::Char('\t'));
state.handle(Input::Char('\t'));
state.apply_result(
1,
Ok(pull_page(
@@ -498,6 +504,79 @@ fn pull_request_categories_keep_query_and_select_loaded_rows_before_completion()
));
}
#[test]
fn pull_request_drafts_filter_independently_and_share_open_loading_and_retry() {
let mut state = DiffState::pull_requests("origin".into());
state.take_request();
let mut page = pull_page(
false,
&[
(1, "Ready", "2024-01-01T00:00:00Z"),
(2, "Draft Ünicode", "2024-01-02T00:00:00Z"),
],
true,
);
if let Outcome::PullRequestPage {
result: Ok(page), ..
} = &mut page
{
page.entries[1].0.category = Category::Drafts;
}
state.apply_result(1, Ok(page));
state.apply_result(
1,
Ok(pull_page(
true,
&[(3, "Closed", "2024-01-03T00:00:00Z")],
false,
)),
);
let labels = |state: &DiffState| {
state
.entries()
.map(|entry| entry.label.clone())
.collect::<Vec<_>>()
};
assert_eq!(labels(&state), ["#1 Ready"]);
state.handle(Input::BackTab);
assert_eq!(
labels(&state),
["#3 Closed", "#2 Draft Ünicode", "#1 Ready"]
);
state.handle(Input::BackTab);
assert_eq!(labels(&state), ["#2 Draft Ünicode"]);
assert!(state.pull_request_partial());
state.apply_result(
1,
Ok(Outcome::PullRequestPage {
closed: false,
result: Err("open stream unavailable".into()),
}),
);
assert!(
state
.pull_request_notice()
.unwrap()
.contains("open stream unavailable")
);
state.handle(Input::Ctrl('r'));
assert_eq!(state.pull_request_retries, [1, 0]);
state.apply_result(1, Ok(pull_page(false, &[], false)));
assert!(!state.pull_request_partial());
for ch in "Ünicode Alice".chars() {
state.handle(Input::Char(ch));
}
assert_eq!(labels(&state), ["#2 Draft Ünicode"]);
state.handle(Input::Enter);
assert!(matches!(
state.take_request(),
Some(Operation::ResolvePullRequest(Revision {
target: RevisionTarget::PullRequest { number: 2, .. },
..
}))
));
}
#[test]
fn pull_request_all_streams_sort_deduplicate_and_preserve_selection_identity() {
let mut state = DiffState::pull_requests("origin".into());