[PATCH RFC 2/2] review-tui: test the cherry-pick+merge take method
Christian Brauner <[email protected]> Thu, 25 Jun 2026 14:18:37 +0200
| Newsgroups | org.kernel.linux.tools |
|---|---|
| Message-ID | <20260625-20260625-review-tui-take-cherry-pick-merge-v1-2-8ba4809d048a@kernel.org> |
Cover the merge-pick routing added in the previous commit:
- the patch picker always opens for merge-pick, even when no patch is
skipped (like cherry-pick, unlike a plain merge);
- the chosen method survives the picker, so the selection reaches
_show_take_confirm as merge-pick with the picked indices;
- _on_take_final dispatches merge-pick to _do_take_merge rather than
the git-am path, so the "+merge" half actually produces a merge.
These extend TestMergeTakeSkipRouting, which already exercises the
plain-merge skip-trimming path.
Signed-off-by: Christian Brauner (Amutable) <[email protected]>
---
src/tests/test_tui_tracking.py | 66 ++++++++++++++++++++++++++++++++++++++++++
1 file changed, 66 insertions(+)
diff --git a/src/tests/test_tui_tracking.py b/src/tests/test_tui_tracking.py
index b7d543b..853f405 100644
--- a/src/tests/test_tui_tracking.py
+++ b/src/tests/test_tui_tracking.py
@@ -2807,6 +2807,72 @@ class TestMergeTakeSkipRouting:
assert args[0] == 'merge', 'method must remain merge, not cherry-pick'
assert kwargs.get('cherrypick') == [1, 3]
+ def test_merge_pick_always_opens_picker(self, gitdir: str) -> None:
+ """cherry-pick+merge offers the picker even with nothing skipped."""
+ branch = self._setup_branch(gitdir, 'mp-noskip-1', skip_indices=[])
+ pushed, confirmed = self._route(gitdir, branch, 'merge-pick')
+ assert len(pushed) == 1
+ assert isinstance(pushed[0], CherryPickScreen)
+ assert not confirmed
+
+ def test_merge_pick_confirmed_preserves_method(self, gitdir: str) -> None:
+ """cherry-pick+merge keeps method='merge-pick' through the picker."""
+ from types import SimpleNamespace
+
+ branch = self._setup_branch(gitdir, 'mp-keep-1', skip_indices=[])
+ app = TrackingApp.__new__(TrackingApp)
+ confirmed: list[Any] = []
+ app._show_take_confirm = ( # type: ignore[method-assign]
+ lambda *a, **k: confirmed.append((a, k))
+ )
+ take_screen: Any = SimpleNamespace(
+ method_result='merge-pick', target_result='master'
+ )
+ pick_screen: Any = SimpleNamespace(selected_indices=[1, 3])
+ app._on_cherrypick_confirmed(
+ True,
+ 'cid',
+ branch,
+ take_screen,
+ {'subject': 'Test'},
+ pick_screen,
+ )
+ assert len(confirmed) == 1
+ args, kwargs = confirmed[0]
+ assert args[0] == 'merge-pick', 'method must remain merge-pick'
+ assert kwargs.get('cherrypick') == [1, 3]
+
+ def test_take_final_routes_merge_pick_to_merge(self, gitdir: str) -> None:
+ """cherry-pick+merge executes the merge path, not git-am."""
+ from contextlib import nullcontext
+ from types import SimpleNamespace
+
+ branch = self._setup_branch(gitdir, 'mp-final-1', skip_indices=[])
+ app = TrackingApp.__new__(TrackingApp)
+ calls: list[str] = []
+ app.suspend = lambda: nullcontext() # type: ignore[method-assign]
+ app._invalidate_caches = lambda *a, **k: None # type: ignore[method-assign]
+ app._load_series = lambda *a, **k: None # type: ignore[method-assign]
+ app._do_take_merge = ( # type: ignore[method-assign]
+ lambda *a, **k: calls.append('merge')
+ )
+ app._do_take_am = ( # type: ignore[method-assign]
+ lambda *a, **k: calls.append('am')
+ )
+ take_screen: Any = SimpleNamespace(target_result='master')
+ confirm_screen: Any = SimpleNamespace(accept_series=True)
+ app._on_take_final(
+ True,
+ 'merge-pick',
+ 'cid',
+ branch,
+ take_screen,
+ {'subject': 'Test'},
+ confirm_screen,
+ cherrypick=[1, 3],
+ )
+ assert calls == ['merge'], 'merge-pick must run _do_take_merge'
+
@patch('b4.review.tracking.get_review_target_branches', return_value=['master'])
class TestTargetBranch:
--
2.53.0