| """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 | |