[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