from click.testing import CliRunner from hqt import cli from hqt.config import Settings def test_tool_cmd_opens_tool_window(monkeypatch, tmp_path): monkeypatch.setattr( "hqt.config.get_settings", lambda: Settings(db_path=tmp_path / "t.db") ) calls = {} async def fake_for_window(self, window, tool): calls["tool"] = (window, tool) return "@9" monkeypatch.setattr( "hqt.sessions.service.SessionService.open_tool_window_for_window", fake_for_window, ) result = CliRunner().invoke(cli.main, ["tool", "lazygit", "hqt-5"]) assert result.exit_code == 0, result.output assert calls["tool"] == ("hqt-5", "lazygit") def test_tool_cmd_clone_dispatches_to_clone(monkeypatch, tmp_path): monkeypatch.setattr( "hqt.config.get_settings", lambda: Settings(db_path=tmp_path / "t.db") ) calls = {} async def fake_clone(self, window): calls["clone"] = window return "RESULT" monkeypatch.setattr( "hqt.sessions.service.SessionService.clone_session_for_window", fake_clone ) result = CliRunner().invoke(cli.main, ["tool", "clone", "hqt-5"]) assert result.exit_code == 0, result.output assert calls["clone"] == "hqt-5" def test_tool_cmd_reports_service_error(monkeypatch, tmp_path): from hqt.errors import ServiceError monkeypatch.setattr( "hqt.config.get_settings", lambda: Settings(db_path=tmp_path / "t.db") ) async def boom(self, window, tool): raise ServiceError("'hqt-5' is not an hqt session window") monkeypatch.setattr( "hqt.sessions.service.SessionService.open_tool_window_for_window", boom ) result = CliRunner().invoke(cli.main, ["tool", "nvim", "hqt-5"]) assert result.exit_code == 1 assert "not an hqt session window" in result.output def test_palette_cmd_shows_popup_for_session_window(monkeypatch, tmp_path): monkeypatch.setattr( "hqt.config.get_settings", lambda: Settings(db_path=tmp_path / "t.db") ) monkeypatch.setattr( "hqt.sessions.service.SessionService.session_id_for_window", lambda self, window: 5, ) runs = [] monkeypatch.setattr(cli.subprocess, "run", lambda argv, **kw: runs.append(argv)) result = CliRunner().invoke(cli.main, ["palette", "hqt-5"]) assert result.exit_code == 0, result.output assert len(runs) == 1 argv = runs[0] assert "display-popup" in argv popup_cmd = argv[-1] assert "fzf" in popup_cmd assert "nvim" in popup_cmd and "clone" in popup_cmd # the window is baked into the command for `hqt tool {} ` assert "hqt-5" in popup_cmd def test_palette_cmd_hints_for_non_session_window(monkeypatch, tmp_path): monkeypatch.setattr( "hqt.config.get_settings", lambda: Settings(db_path=tmp_path / "t.db") ) monkeypatch.setattr( "hqt.sessions.service.SessionService.session_id_for_window", lambda self, window: None, ) runs = [] monkeypatch.setattr(cli.subprocess, "run", lambda argv, **kw: runs.append(argv)) result = CliRunner().invoke(cli.main, ["palette", "nvim"]) assert result.exit_code == 0, result.output assert len(runs) == 1 argv = runs[0] assert "display-message" in argv assert "display-popup" not in argv