Shows an immediate status message and braille spinner for slow slash commands (/skills search|browse|inspect|install, /reload-mcp). Makes input read-only while the command runs so the CLI doesn't appear frozen. Cherry-picked from PR #714 by vilkasdev, rebased onto current main with conflict resolution and bug fix (get_hint_text duplicate return). Fixes #636 Co-authored-by: vilkasdev <vilkasdev@users.noreply.github.com>
66 lines
2.2 KiB
Python
66 lines
2.2 KiB
Python
"""Regression tests for loading feedback on slow slash commands."""
|
|
|
|
from unittest.mock import patch
|
|
|
|
from cli import HermesCLI
|
|
|
|
|
|
class TestCLILoadingIndicator:
|
|
def _make_cli(self):
|
|
cli_obj = HermesCLI.__new__(HermesCLI)
|
|
cli_obj._app = None
|
|
cli_obj._last_invalidate = 0.0
|
|
cli_obj._command_running = False
|
|
cli_obj._command_status = ""
|
|
return cli_obj
|
|
|
|
def test_skills_command_sets_busy_state_and_prints_status(self, capsys):
|
|
cli_obj = self._make_cli()
|
|
seen = {}
|
|
|
|
def fake_handle(cmd: str):
|
|
seen["cmd"] = cmd
|
|
seen["running"] = cli_obj._command_running
|
|
seen["status"] = cli_obj._command_status
|
|
print("skills done")
|
|
|
|
with patch.object(cli_obj, "_handle_skills_command", side_effect=fake_handle), \
|
|
patch.object(cli_obj, "_invalidate") as invalidate_mock:
|
|
assert cli_obj.process_command("/skills search kubernetes")
|
|
|
|
output = capsys.readouterr().out
|
|
assert "⏳ Searching skills..." in output
|
|
assert "skills done" in output
|
|
assert seen == {
|
|
"cmd": "/skills search kubernetes",
|
|
"running": True,
|
|
"status": "Searching skills...",
|
|
}
|
|
assert cli_obj._command_running is False
|
|
assert cli_obj._command_status == ""
|
|
assert invalidate_mock.call_count == 2
|
|
|
|
def test_reload_mcp_sets_busy_state_and_prints_status(self, capsys):
|
|
cli_obj = self._make_cli()
|
|
seen = {}
|
|
|
|
def fake_reload():
|
|
seen["running"] = cli_obj._command_running
|
|
seen["status"] = cli_obj._command_status
|
|
print("reload done")
|
|
|
|
with patch.object(cli_obj, "_reload_mcp", side_effect=fake_reload), \
|
|
patch.object(cli_obj, "_invalidate") as invalidate_mock:
|
|
assert cli_obj.process_command("/reload-mcp")
|
|
|
|
output = capsys.readouterr().out
|
|
assert "⏳ Reloading MCP servers..." in output
|
|
assert "reload done" in output
|
|
assert seen == {
|
|
"running": True,
|
|
"status": "Reloading MCP servers...",
|
|
}
|
|
assert cli_obj._command_running is False
|
|
assert cli_obj._command_status == ""
|
|
assert invalidate_mock.call_count == 2
|