1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
from __future__ import annotations
from pathlib import Path
from unittest.mock import MagicMock
import pytest
from pygit2 import init_repository
from pyratatui import Rect
from pygittools.tui.git_worktrees import WorktreeInfo
from pygittools.tui.keys import key
from pygittools.tui.pages.worktree_add import WorktreeAddPage
from pygittools.tui.types import PageAction, PageContext
from pygittools.tui.worktrees_list import WorktreesList, _Row, _row_label
def test_row_label_marks_current() -> None:
info = WorktreeInfo(
path=Path("/proj/main"),
head="abc",
branch="main",
bare=False,
detached=False,
locked=None,
prunable=None,
)
label = _row_label(_Row(kind="worktree", info=info), current=Path("/proj/main"), width=80)
assert label.startswith("*")
def test_worktrees_list_open_add(page_ctx: PageContext) -> None:
wt = WorktreesList()
wt.refresh(page_ctx.repo)
result = wt.handle_nav_key(key("Enter"), page_ctx.repo)
assert result is not None
assert result.action == PageAction.PUSH
assert isinstance(result.next_page, WorktreeAddPage)
def test_worktrees_list_switch_repo(
monkeypatch: pytest.MonkeyPatch,
tmp_path: Path,
) -> None:
repo_path = tmp_path / "main"
repo_path.mkdir()
repo = init_repository(str(repo_path), bare=False)
other = tmp_path / "other"
entries = [
WorktreeInfo(
path=repo_path.resolve(),
head=None,
branch="main",
bare=False,
detached=False,
locked=None,
prunable=None,
),
WorktreeInfo(
path=other.resolve(),
head=None,
branch="feature",
bare=False,
detached=False,
locked=None,
prunable=None,
),
]
monkeypatch.setattr(
"pygittools.tui.worktrees_list.list_worktrees",
lambda _repo: (entries, None),
)
wt = WorktreesList()
wt.refresh(repo)
wt.handle_nav_key(key("Down"), repo)
wt.handle_nav_key(key("Down"), repo)
result = wt.handle_nav_key(key("Enter"), repo)
assert result is not None
assert result.switch_repo == other.resolve()
def test_worktrees_list_draw(frame: MagicMock) -> None:
wt = WorktreesList()
wt.draw(frame, Rect(0, 0, 80, 10), highlight=True)