Add / filter for the plugin menu list

This commit is contained in:
pleb
2026-07-12 14:42:46 -07:00
parent 4b544e0858
commit 17d50e1239
2 changed files with 214 additions and 20 deletions
+47 -3
View File
@@ -11,7 +11,7 @@ from zipfile import ZipFile
from rich.text import Text
from textual.coordinate import Coordinate
from textual.widgets import DataTable
from textual.widgets import DataTable, Input
from plugin_helper.bootstrap import _run_ipa, build_bootstrap_command, ensure_healthy_bootstrap
from plugin_helper.bsipa import check_bsipa_health, planning_requires_bootstrap
@@ -2606,8 +2606,8 @@ class PluginHelperTuiTests(unittest.IsolatedAsyncioTestCase):
table = app.query_one(DataTable)
self.assertEqual(table.row_count, 2)
self.assertEqual(app.mode, "installations")
self.assertEqual(str(table.get_cell_at(Coordinate(0, 3))), "/tmp/state-linux/installs/linux")
self.assertEqual(str(table.get_cell_at(Coordinate(1, 3))), "/tmp/state-windows/installs/windows")
self.assertEqual(table.get_cell_at(Coordinate(0, 3)), str(Path("/tmp/state-linux/installs/linux")))
self.assertEqual(table.get_cell_at(Coordinate(1, 3)), str(Path("/tmp/state-windows/installs/windows")))
async def test_single_instance_skips_installation_picker(self) -> None:
with tempfile.TemporaryDirectory() as tmp:
@@ -2809,6 +2809,50 @@ class PluginHelperTuiTests(unittest.IsolatedAsyncioTestCase):
self.assertNotIn("example", updated.get("disabledPlugins", {}))
self.assertIn("hash mismatch", app.status_message)
async def test_slash_filters_plugin_list(self) -> None:
with tempfile.TemporaryDirectory() as tmp:
app, _instance, _state = _make_two_plugin_tui_fixture(Path(tmp))
async with app.run_test() as pilot:
table = app.query_one(DataTable)
self.assertEqual(table.row_count, 2)
await pilot.press("/")
await pilot.pause()
filter_input = app.query_one("#filter", Input)
self.assertFalse(filter_input.has_class("-hidden"))
self.assertTrue(filter_input.has_focus)
await pilot.press("b", "e", "t")
await pilot.pause()
self.assertEqual(app.filter_query, "bet")
self.assertEqual(table.row_count, 1)
self.assertEqual(app._filtered_plugins()[0]["id"], "beta")
await pilot.press("enter")
await pilot.pause()
self.assertFalse(filter_input.has_focus)
self.assertEqual(table.row_count, 1)
await pilot.press("space")
await pilot.pause()
self.assertEqual(app.plugin_rows[1]["id"], "beta")
self.assertEqual(app.plugin_rows[1]["status"], "disabled")
async def test_escape_clears_plugin_filter(self) -> None:
with tempfile.TemporaryDirectory() as tmp:
app, _instance, _state = _make_two_plugin_tui_fixture(Path(tmp))
async with app.run_test() as pilot:
table = app.query_one(DataTable)
await pilot.press("/")
await pilot.press("a", "l")
await pilot.pause()
self.assertEqual(table.row_count, 1)
self.assertEqual(app._filtered_plugins()[0]["id"], "alpha")
await pilot.press("escape")
await pilot.pause()
self.assertEqual(app.filter_query, "")
self.assertEqual(table.row_count, 2)
self.assertTrue(app.query_one("#filter", Input).has_class("-hidden"))
self.assertIn("Filter cleared", app.status_message)
if __name__ == "__main__":
unittest.main()