mirror of
https://github.com/open-jarvis/OpenJarvis.git
synced 2026-07-28 13:26:48 +00:00
Adds connect_cmd.py with --list, --disconnect, --sync, and positional source routing (filesystem vs OAuth), registers it in the CLI, and covers all behaviours with 5 passing unit tests. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
111 lines
3.4 KiB
Python
111 lines
3.4 KiB
Python
"""Tests for ``jarvis connect`` CLI command."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from unittest import mock
|
|
|
|
from click.testing import CliRunner
|
|
|
|
from openjarvis.cli import cli
|
|
|
|
|
|
def test_connect_list_no_connectors() -> None:
|
|
"""--list with an empty registry shows a 'no connectors' message."""
|
|
runner = CliRunner()
|
|
with mock.patch(
|
|
"openjarvis.cli.connect_cmd.connect.__wrapped__"
|
|
if hasattr(cli, "__wrapped__")
|
|
else "openjarvis.core.registry.ConnectorRegistry.items",
|
|
return_value=(),
|
|
):
|
|
with mock.patch(
|
|
"openjarvis.core.registry.ConnectorRegistry.items",
|
|
return_value=(),
|
|
):
|
|
result = runner.invoke(cli, ["connect", "--list"])
|
|
|
|
assert result.exit_code == 0
|
|
assert "No connectors registered" in result.output
|
|
|
|
|
|
def test_connect_list_with_connector(tmp_path: object) -> None:
|
|
"""--list with a connector registered shows it in the table."""
|
|
runner = CliRunner()
|
|
|
|
# Build a minimal mock connector class
|
|
mock_cls = mock.MagicMock()
|
|
mock_cls.auth_type = "filesystem"
|
|
mock_instance = mock.MagicMock()
|
|
mock_instance.is_connected.return_value = True
|
|
mock_cls.return_value = mock_instance
|
|
|
|
with mock.patch(
|
|
"openjarvis.core.registry.ConnectorRegistry.items",
|
|
return_value=(("obsidian", mock_cls),),
|
|
):
|
|
result = runner.invoke(cli, ["connect", "--list"])
|
|
|
|
assert result.exit_code == 0
|
|
assert "obsidian" in result.output
|
|
|
|
|
|
def test_connect_help() -> None:
|
|
"""--help exits 0 and mentions the word 'connect'."""
|
|
runner = CliRunner()
|
|
result = runner.invoke(cli, ["connect", "--help"])
|
|
assert result.exit_code == 0
|
|
assert "connect" in result.output.lower()
|
|
|
|
|
|
def test_connect_specific_source(tmp_path: object) -> None:
|
|
"""connect --path /nonexistent obsidian shows an error gracefully."""
|
|
runner = CliRunner()
|
|
|
|
mock_cls = mock.MagicMock()
|
|
mock_cls.auth_type = "filesystem"
|
|
mock_instance = mock.MagicMock()
|
|
# Path does not exist -> is_connected returns False
|
|
mock_instance.is_connected.return_value = False
|
|
mock_cls.return_value = mock_instance
|
|
|
|
with (
|
|
mock.patch(
|
|
"openjarvis.core.registry.ConnectorRegistry.contains",
|
|
return_value=True,
|
|
),
|
|
mock.patch(
|
|
"openjarvis.core.registry.ConnectorRegistry.get",
|
|
return_value=mock_cls,
|
|
),
|
|
):
|
|
# --path before the positional source arg (standard Click group behaviour)
|
|
result = runner.invoke(cli, ["connect", "--path", "/nonexistent", "obsidian"])
|
|
|
|
assert result.exit_code == 0
|
|
# Should mention the source and give an indication something went wrong
|
|
assert "obsidian" in result.output or "nonexistent" in result.output
|
|
|
|
|
|
def test_connect_disconnect() -> None:
|
|
"""--disconnect gmail exits 0."""
|
|
runner = CliRunner()
|
|
|
|
mock_cls = mock.MagicMock()
|
|
mock_instance = mock.MagicMock()
|
|
mock_cls.return_value = mock_instance
|
|
|
|
with (
|
|
mock.patch(
|
|
"openjarvis.core.registry.ConnectorRegistry.contains",
|
|
return_value=True,
|
|
),
|
|
mock.patch(
|
|
"openjarvis.core.registry.ConnectorRegistry.get",
|
|
return_value=mock_cls,
|
|
),
|
|
):
|
|
result = runner.invoke(cli, ["connect", "--disconnect", "gmail"])
|
|
|
|
assert result.exit_code == 0
|
|
mock_instance.disconnect.assert_called_once()
|