arcade-mcp/arcade/tests/cli/test_dashboard.py
Eric Gustin 817131c6ce
Add arcade dashboard CLI Command (#330)
* `arcade dashboard` opens the Arcade Dashboard in a web browser.
Defaults to `https://api.arcade.dev/dashboard`, but is configurable via
flags.


* `arcade dashboard --local` opens your locally hosted Arcade Dashboard
in a web browser.


* Performs a health check of the engine and will print a warning to the
console if the Engine is not healthy / not running.


----------------------------------------

* Inspiration from https://minikube.sigs.k8s.io/docs/handbook/dashboard/
2025-04-28 10:22:55 -07:00

80 lines
2.9 KiB
Python

from unittest.mock import MagicMock, patch
import pytest
from typer.testing import CliRunner
from arcade.cli.constants import PROD_ENGINE_HOST
from arcade.cli.main import cli
runner = CliRunner()
@pytest.mark.parametrize(
"args, expected_url",
[
([], f"https://{PROD_ENGINE_HOST}/dashboard"),
(["--local"], "http://localhost:9099/dashboard"),
(["--host", "custom.host.com"], "https://custom.host.com/dashboard"),
(["-h", "api.arcade.dev", "-p", "9099"], "https://api.arcade.dev:9099/dashboard"),
(["--local", "--port", "9099"], "http://localhost:9099/dashboard"),
(["--local", "--tls"], "https://localhost:9099/dashboard"),
(["--no-tls"], f"http://{PROD_ENGINE_HOST}/dashboard"),
],
)
def test_dashboard_url_construction(args, expected_url):
"""Test that the dashboard command constructs the correct URL with various args."""
with (
patch("webbrowser.open") as mock_open,
patch("arcade.cli.main.validate_and_get_config") as mock_validate,
patch("arcade.cli.main.log_engine_health") as mock_health_check,
):
# Setup mocks
mock_open.return_value = True # Successfully opened browser
mock_validate.return_value = MagicMock()
mock_health_check.return_value = None # Successful health check
# Run command
result = runner.invoke(cli, ["dashboard", *args])
assert result.exit_code == 0
mock_open.assert_called_once_with(expected_url)
mock_health_check.assert_called_once()
def test_fallback_when_browser_fails():
"""Test fallback message when browser.open fails."""
with (
patch("webbrowser.open") as mock_open,
patch("arcade.cli.main.validate_and_get_config") as mock_validate,
patch("arcade.cli.main.log_engine_health") as mock_health_check,
patch("arcade.cli.main.console.print") as mock_print,
):
mock_open.return_value = False # Failed to open browser
mock_validate.return_value = MagicMock()
mock_health_check.return_value = None
result = runner.invoke(cli, ["dashboard"])
assert result.exit_code == 0
mock_print.assert_any_call(
f"If a browser doesn't open automatically, copy this URL and paste it into your browser: https://{PROD_ENGINE_HOST}/dashboard",
style="dim",
)
def test_health_check_success():
"""Test successful health check."""
with (
patch("webbrowser.open") as mock_open,
patch("arcade.cli.main.validate_and_get_config") as mock_validate,
patch("arcade.cli.main.log_engine_health") as mock_health_check,
):
mock_open.return_value = True
mock_validate.return_value = MagicMock()
mock_health_check.return_value = None # Successful health check
result = runner.invoke(cli, ["dashboard"])
assert result.exit_code == 0
mock_health_check.assert_called_once()
mock_open.assert_called_once()