release: 0.2.6 add advanced navigation and contextual open actions
This commit is contained in:
119
tests/test_ui.py
119
tests/test_ui.py
@@ -52,6 +52,19 @@ def test_format_entry_supports_parent_and_tree_indicators(tmp_path: Path) -> Non
|
||||
assert format_entry(expanded_child) == " build"
|
||||
|
||||
|
||||
def test_format_entry_marks_files_with_file_indicator(tmp_path: Path) -> None:
|
||||
file_entry = VisibleEntry(
|
||||
name="notes.txt",
|
||||
path=tmp_path / "notes.txt",
|
||||
depth=0,
|
||||
has_children=False,
|
||||
is_expanded=False,
|
||||
is_file=True,
|
||||
)
|
||||
|
||||
assert format_entry(file_entry) == "• notes.txt"
|
||||
|
||||
|
||||
def test_build_render_lines_marks_selected_entry(tmp_path: Path) -> None:
|
||||
workspace = tmp_path / "workspace"
|
||||
workspace.mkdir()
|
||||
@@ -221,6 +234,112 @@ def test_enter_returns_selected_path_without_navigating(tmp_path: Path) -> None:
|
||||
assert navigator.current_path == workspace.resolve()
|
||||
|
||||
|
||||
def test_toggle_files_key_updates_navigator_state(tmp_path: Path) -> None:
|
||||
root = tmp_path / "root"
|
||||
root.mkdir()
|
||||
(root / "folder").mkdir()
|
||||
(root / "notes.txt").write_text("content", encoding="utf-8")
|
||||
|
||||
navigator = Navigator(root)
|
||||
ui = TerminalUI()
|
||||
|
||||
assert navigator.show_files is False
|
||||
assert ui._handle_tree_key(ord("a"), navigator) is None
|
||||
assert navigator.show_files is True
|
||||
|
||||
|
||||
def test_filter_matching_is_case_insensitive(tmp_path: Path) -> None:
|
||||
root = tmp_path / "root"
|
||||
root.mkdir()
|
||||
(root / "Alpha").mkdir()
|
||||
(root / "beta").mkdir()
|
||||
|
||||
navigator = Navigator(root)
|
||||
ui = TerminalUI()
|
||||
ui._filter_mode = True
|
||||
ui._filter_query = "alp"
|
||||
|
||||
matches = ui._matching_indices(navigator.visible_entries)
|
||||
|
||||
assert matches == [1]
|
||||
|
||||
|
||||
def test_filter_mode_uses_g_and_g_upper_as_query_characters(tmp_path: Path) -> None:
|
||||
root = tmp_path / "root"
|
||||
root.mkdir()
|
||||
(root / "alpha").mkdir()
|
||||
(root / "gamma").mkdir()
|
||||
|
||||
navigator = Navigator(root)
|
||||
ui = TerminalUI()
|
||||
ui._filter_mode = True
|
||||
|
||||
assert ui._handle_filter_key(ord("g"), navigator) is None
|
||||
assert ui._handle_filter_key(ord("G"), navigator) is None
|
||||
assert ui._filter_query == "gG"
|
||||
|
||||
|
||||
def test_filter_enter_on_directory_navigates_and_exits_filter(tmp_path: Path) -> None:
|
||||
root = tmp_path / "root"
|
||||
child = root / "child"
|
||||
root.mkdir()
|
||||
child.mkdir()
|
||||
|
||||
navigator = Navigator(root)
|
||||
ui = TerminalUI()
|
||||
ui._filter_mode = True
|
||||
ui._filter_query = "child"
|
||||
|
||||
result = ui._handle_filter_key(10, navigator)
|
||||
|
||||
assert result is None
|
||||
assert ui._filter_mode is False
|
||||
assert navigator.current_path == child.resolve()
|
||||
|
||||
|
||||
def test_filter_enter_on_file_opens_menu_and_exits_filter(
|
||||
tmp_path: Path, monkeypatch: pytest.MonkeyPatch
|
||||
) -> None:
|
||||
root = tmp_path / "root"
|
||||
root.mkdir()
|
||||
file_path = root / "notes.txt"
|
||||
file_path.write_text("hello", encoding="utf-8")
|
||||
|
||||
navigator = Navigator(root)
|
||||
navigator.toggle_files()
|
||||
ui = TerminalUI()
|
||||
ui._filter_mode = True
|
||||
ui._filter_query = "notes"
|
||||
opened: dict[str, bool] = {"called": False}
|
||||
|
||||
def fake_open_with_selected(
|
||||
_navigator: Navigator, _stdscr: curses.window | None
|
||||
) -> None:
|
||||
opened["called"] = True
|
||||
|
||||
monkeypatch.setattr(ui, "_open_with_selected", fake_open_with_selected)
|
||||
|
||||
result = ui._handle_filter_key(10, navigator)
|
||||
|
||||
assert result is None
|
||||
assert ui._filter_mode is False
|
||||
assert opened["called"] is True
|
||||
assert navigator.selected_entry.path == file_path.resolve()
|
||||
|
||||
|
||||
def test_end_key_jumps_to_last_entry(tmp_path: Path) -> None:
|
||||
root = tmp_path / "root"
|
||||
root.mkdir()
|
||||
for name in ("alpha", "beta", "gamma"):
|
||||
(root / name).mkdir()
|
||||
|
||||
navigator = Navigator(root)
|
||||
ui = TerminalUI()
|
||||
|
||||
assert ui._handle_tree_key(curses.KEY_END, navigator) is None
|
||||
assert navigator.selected_index == len(navigator.visible_entries) - 1
|
||||
|
||||
|
||||
def test_open_terminal_streams_raises_without_terminal(
|
||||
monkeypatch: pytest.MonkeyPatch,
|
||||
) -> None:
|
||||
|
||||
Reference in New Issue
Block a user