feat(cli,wizard): auto-offer telegram_bot setup after install; integrate into pyra setup
cli.py — plugin_install() now asks "Configure now?" after a successful install, runs the plugin's setup wizard, and offers to enable inline. Failing to install short-circuits before the prompt is shown. wizard.py — _offer_telegram_setup_if_selected() runs install + wizard + enable automatically at the end of pyra setup when the user selected "Communication bots". Adds load_config import (was missing alongside save_config). Tests: test_plugin_install_decline_setup, test_plugin_install_error_does_not_prompt. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -137,3 +137,47 @@ def test_main_skips_setup_when_config_exists(tmp_pyra_home, monkeypatch):
|
||||
def test_config_slash_command_registered():
|
||||
from pyra.chat.session import _STATIC_COMMANDS
|
||||
assert "/config" in _STATIC_COMMANDS
|
||||
|
||||
|
||||
# ── plugin install ────────────────────────────────────────────────────────────
|
||||
|
||||
def test_plugin_install_decline_setup(tmp_pyra_home, monkeypatch):
|
||||
"""Declining 'Configure now?' shows manual instructions and exits cleanly."""
|
||||
from unittest.mock import MagicMock
|
||||
import questionary
|
||||
|
||||
monkeypatch.setattr(
|
||||
"pyra.plugins.install.install_bundled_plugin", lambda *a, **kw: None
|
||||
)
|
||||
monkeypatch.setattr(
|
||||
questionary, "confirm",
|
||||
lambda *a, **kw: MagicMock(ask=lambda: False),
|
||||
)
|
||||
|
||||
runner = CliRunner()
|
||||
result = runner.invoke(main, ["plugin", "install", "telegram_bot"])
|
||||
assert result.exit_code == 0
|
||||
assert "Installed" in result.output
|
||||
assert "Configure later" in result.output
|
||||
|
||||
|
||||
def test_plugin_install_error_does_not_prompt(tmp_pyra_home, monkeypatch):
|
||||
"""If install fails, the configure prompt is never shown."""
|
||||
from unittest.mock import MagicMock
|
||||
import questionary
|
||||
|
||||
monkeypatch.setattr(
|
||||
"pyra.plugins.install.install_bundled_plugin",
|
||||
lambda *a, **kw: (_ for _ in ()).throw(FileNotFoundError("not found")),
|
||||
)
|
||||
confirm_calls = []
|
||||
monkeypatch.setattr(
|
||||
questionary, "confirm",
|
||||
lambda *a, **kw: confirm_calls.append(1) or MagicMock(ask=lambda: False),
|
||||
)
|
||||
|
||||
runner = CliRunner()
|
||||
result = runner.invoke(main, ["plugin", "install", "telegram_bot"])
|
||||
assert result.exit_code == 0
|
||||
assert "Error" in result.output
|
||||
assert len(confirm_calls) == 0 # prompt never reached
|
||||
|
||||
Reference in New Issue
Block a user