Some checks failed
Mark stable commit / test-unit (push) Has been cancelled
Mark stable commit / test-integration (push) Has been cancelled
Mark stable commit / test-container (push) Has been cancelled
Mark stable commit / test-e2e (push) Has been cancelled
Mark stable commit / test-virgin-user (push) Has been cancelled
Mark stable commit / test-virgin-root (push) Has been cancelled
Mark stable commit / mark-stable (push) Has been cancelled
The old test tests/unit/pkgmgr/actions/test_branch.py has been removed because: - it targeted the previous monolithic pkgmgr.actions.branch module structure - its patch targets no longer match the refactored code - its responsibilities are now fully covered by the new, dedicated unit, integration, and E2E tests for branch actions and CLI wiring This avoids redundant coverage and prevents misleading or broken tests after the branch refactor. https://chatgpt.com/share/693bcc8d-b84c-800f-8510-8d6c66faf627
251 lines
8.5 KiB
Python
251 lines
8.5 KiB
Python
from __future__ import annotations
|
|
|
|
import unittest
|
|
from types import SimpleNamespace
|
|
from unittest.mock import patch
|
|
|
|
from pkgmgr.cli.commands.branch import handle_branch
|
|
from pkgmgr.cli.context import CLIContext
|
|
|
|
|
|
class TestCliBranch(unittest.TestCase):
|
|
def _dummy_ctx(self) -> CLIContext:
|
|
"""
|
|
Minimal CLIContext; handle_branch does not actually use it,
|
|
but we keep the type consistent.
|
|
"""
|
|
return CLIContext(
|
|
config_merged={},
|
|
repositories_base_dir="/tmp/repos",
|
|
all_repositories=[],
|
|
binaries_dir="/tmp/bin",
|
|
user_config_path="/tmp/config.yaml",
|
|
)
|
|
|
|
# ------------------------------------------------------------------
|
|
# open subcommand
|
|
# ------------------------------------------------------------------
|
|
|
|
@patch("pkgmgr.cli.commands.branch.open_branch")
|
|
def test_handle_branch_open_forwards_args_to_open_branch(self, mock_open_branch) -> None:
|
|
"""
|
|
handle_branch('open') should call open_branch with name, base and cwd='.'.
|
|
"""
|
|
args = SimpleNamespace(
|
|
command="branch",
|
|
subcommand="open",
|
|
name="feature/cli-test",
|
|
base="develop",
|
|
)
|
|
|
|
ctx = self._dummy_ctx()
|
|
|
|
handle_branch(args, ctx)
|
|
|
|
mock_open_branch.assert_called_once()
|
|
call_args, call_kwargs = mock_open_branch.call_args
|
|
self.assertEqual(call_kwargs.get("name"), "feature/cli-test")
|
|
self.assertEqual(call_kwargs.get("base_branch"), "develop")
|
|
self.assertEqual(call_kwargs.get("cwd"), ".")
|
|
|
|
@patch("pkgmgr.cli.commands.branch.open_branch")
|
|
def test_handle_branch_open_uses_default_base_when_not_set(self, mock_open_branch) -> None:
|
|
"""
|
|
If --base is not passed, argparse gives base='main' (default),
|
|
and handle_branch should propagate that to open_branch.
|
|
"""
|
|
args = SimpleNamespace(
|
|
command="branch",
|
|
subcommand="open",
|
|
name=None,
|
|
base="main",
|
|
)
|
|
|
|
ctx = self._dummy_ctx()
|
|
handle_branch(args, ctx)
|
|
|
|
mock_open_branch.assert_called_once()
|
|
_, call_kwargs = mock_open_branch.call_args
|
|
self.assertIsNone(call_kwargs.get("name"))
|
|
self.assertEqual(call_kwargs.get("base_branch"), "main")
|
|
self.assertEqual(call_kwargs.get("cwd"), ".")
|
|
|
|
# ------------------------------------------------------------------
|
|
# close subcommand
|
|
# ------------------------------------------------------------------
|
|
|
|
@patch("pkgmgr.cli.commands.branch.close_branch")
|
|
def test_handle_branch_close_forwards_args_to_close_branch(self, mock_close_branch) -> None:
|
|
"""
|
|
handle_branch('close') should call close_branch with name, base,
|
|
cwd='.' and force=False by default.
|
|
"""
|
|
args = SimpleNamespace(
|
|
command="branch",
|
|
subcommand="close",
|
|
name="feature/cli-close",
|
|
base="develop",
|
|
force=False,
|
|
)
|
|
|
|
ctx = self._dummy_ctx()
|
|
|
|
handle_branch(args, ctx)
|
|
|
|
mock_close_branch.assert_called_once()
|
|
_, call_kwargs = mock_close_branch.call_args
|
|
self.assertEqual(call_kwargs.get("name"), "feature/cli-close")
|
|
self.assertEqual(call_kwargs.get("base_branch"), "develop")
|
|
self.assertEqual(call_kwargs.get("cwd"), ".")
|
|
self.assertFalse(call_kwargs.get("force"))
|
|
|
|
@patch("pkgmgr.cli.commands.branch.close_branch")
|
|
def test_handle_branch_close_uses_default_base_when_not_set(self, mock_close_branch) -> None:
|
|
"""
|
|
If --base is not passed for 'close', argparse gives base='main'
|
|
(default), and handle_branch should propagate that to close_branch.
|
|
"""
|
|
args = SimpleNamespace(
|
|
command="branch",
|
|
subcommand="close",
|
|
name=None,
|
|
base="main",
|
|
force=False,
|
|
)
|
|
|
|
ctx = self._dummy_ctx()
|
|
|
|
handle_branch(args, ctx)
|
|
|
|
mock_close_branch.assert_called_once()
|
|
_, call_kwargs = mock_close_branch.call_args
|
|
self.assertIsNone(call_kwargs.get("name"))
|
|
self.assertEqual(call_kwargs.get("base_branch"), "main")
|
|
self.assertEqual(call_kwargs.get("cwd"), ".")
|
|
self.assertFalse(call_kwargs.get("force"))
|
|
|
|
@patch("pkgmgr.cli.commands.branch.close_branch")
|
|
def test_handle_branch_close_with_force_true(self, mock_close_branch) -> None:
|
|
"""
|
|
handle_branch('close') should pass force=True when the args specify it.
|
|
"""
|
|
args = SimpleNamespace(
|
|
command="branch",
|
|
subcommand="close",
|
|
name="feature/cli-close-force",
|
|
base="main",
|
|
force=True,
|
|
)
|
|
|
|
ctx = self._dummy_ctx()
|
|
|
|
handle_branch(args, ctx)
|
|
|
|
mock_close_branch.assert_called_once()
|
|
_, call_kwargs = mock_close_branch.call_args
|
|
self.assertEqual(call_kwargs.get("name"), "feature/cli-close-force")
|
|
self.assertEqual(call_kwargs.get("base_branch"), "main")
|
|
self.assertEqual(call_kwargs.get("cwd"), ".")
|
|
self.assertTrue(call_kwargs.get("force"))
|
|
|
|
# ------------------------------------------------------------------
|
|
# drop subcommand
|
|
# ------------------------------------------------------------------
|
|
|
|
@patch("pkgmgr.cli.commands.branch.drop_branch")
|
|
def test_handle_branch_drop_forwards_args_to_drop_branch(self, mock_drop_branch) -> None:
|
|
"""
|
|
handle_branch('drop') should call drop_branch with name, base,
|
|
cwd='.' and force=False by default.
|
|
"""
|
|
args = SimpleNamespace(
|
|
command="branch",
|
|
subcommand="drop",
|
|
name="feature/cli-drop",
|
|
base="develop",
|
|
force=False,
|
|
)
|
|
|
|
ctx = self._dummy_ctx()
|
|
|
|
handle_branch(args, ctx)
|
|
|
|
mock_drop_branch.assert_called_once()
|
|
_, call_kwargs = mock_drop_branch.call_args
|
|
self.assertEqual(call_kwargs.get("name"), "feature/cli-drop")
|
|
self.assertEqual(call_kwargs.get("base_branch"), "develop")
|
|
self.assertEqual(call_kwargs.get("cwd"), ".")
|
|
self.assertFalse(call_kwargs.get("force"))
|
|
|
|
@patch("pkgmgr.cli.commands.branch.drop_branch")
|
|
def test_handle_branch_drop_uses_default_base_when_not_set(self, mock_drop_branch) -> None:
|
|
"""
|
|
If --base is not passed for 'drop', argparse gives base='main'
|
|
(default), and handle_branch should propagate that to drop_branch.
|
|
"""
|
|
args = SimpleNamespace(
|
|
command="branch",
|
|
subcommand="drop",
|
|
name=None,
|
|
base="main",
|
|
force=False,
|
|
)
|
|
|
|
ctx = self._dummy_ctx()
|
|
|
|
handle_branch(args, ctx)
|
|
|
|
mock_drop_branch.assert_called_once()
|
|
_, call_kwargs = mock_drop_branch.call_args
|
|
self.assertIsNone(call_kwargs.get("name"))
|
|
self.assertEqual(call_kwargs.get("base_branch"), "main")
|
|
self.assertEqual(call_kwargs.get("cwd"), ".")
|
|
self.assertFalse(call_kwargs.get("force"))
|
|
|
|
@patch("pkgmgr.cli.commands.branch.drop_branch")
|
|
def test_handle_branch_drop_with_force_true(self, mock_drop_branch) -> None:
|
|
"""
|
|
handle_branch('drop') should pass force=True when the args specify it.
|
|
"""
|
|
args = SimpleNamespace(
|
|
command="branch",
|
|
subcommand="drop",
|
|
name="feature/cli-drop-force",
|
|
base="main",
|
|
force=True,
|
|
)
|
|
|
|
ctx = self._dummy_ctx()
|
|
|
|
handle_branch(args, ctx)
|
|
|
|
mock_drop_branch.assert_called_once()
|
|
_, call_kwargs = mock_drop_branch.call_args
|
|
self.assertEqual(call_kwargs.get("name"), "feature/cli-drop-force")
|
|
self.assertEqual(call_kwargs.get("base_branch"), "main")
|
|
self.assertEqual(call_kwargs.get("cwd"), ".")
|
|
self.assertTrue(call_kwargs.get("force"))
|
|
|
|
# ------------------------------------------------------------------
|
|
# unknown subcommand
|
|
# ------------------------------------------------------------------
|
|
|
|
def test_handle_branch_unknown_subcommand_exits_with_code_2(self) -> None:
|
|
"""
|
|
Unknown branch subcommand should result in SystemExit(2).
|
|
"""
|
|
args = SimpleNamespace(
|
|
command="branch",
|
|
subcommand="unknown",
|
|
)
|
|
ctx = self._dummy_ctx()
|
|
|
|
with self.assertRaises(SystemExit) as cm:
|
|
handle_branch(args, ctx)
|
|
|
|
self.assertEqual(cm.exception.code, 2)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|