Initial upload: shell-speak CLI tool with natural language to shell command conversion
Some checks failed
CI / test (push) Has been cancelled
CI / build (push) Has been cancelled

This commit is contained in:
2026-01-31 05:31:21 +00:00
parent 3c0abaf61b
commit 30114c4f6c

157
tests/test_cli.py Normal file
View File

@@ -0,0 +1,157 @@
"""Tests for CLI interface."""
import os
import sys
from pathlib import Path
import pytest
sys.path.insert(0, str(Path(__file__).parent.parent))
@pytest.fixture
def cli_runner():
"""Create a CLI runner for testing."""
from typer.testing import CliRunner
from shell_speak.main import app
return CliRunner(), app
@pytest.fixture
def setup_test_env(tmp_path, sample_docker_yaml, sample_git_yaml):
"""Set up test environment with sample libraries."""
docker_file = tmp_path / "docker.yaml"
docker_file.write_text(sample_docker_yaml)
git_file = tmp_path / "git.yaml"
git_file.write_text(sample_git_yaml)
os.environ["SHELL_SPEAK_DATA_DIR"] = str(tmp_path)
os.environ["SHELL_SPEAK_HISTORY_FILE"] = str(tmp_path / "history.json")
os.environ["SHELL_SPEAK_CORRECTIONS_FILE"] = str(tmp_path / "corrections.json")
class TestCLIConvert:
"""Tests for the convert command."""
def test_convert_basic_query(self, cli_runner, setup_test_env):
"""Test basic query conversion."""
runner, app = cli_runner
result = runner.invoke(
app,
["convert", "list running containers"]
)
assert result.exit_code == 0
assert "docker ps" in result.stdout or "docker" in result.stdout.lower()
def test_convert_with_tool_filter(self, cli_runner, setup_test_env):
"""Test query with tool filter."""
runner, app = cli_runner
result = runner.invoke(
app,
["convert", "--tool", "docker", "list running containers"]
)
assert result.exit_code == 0
assert "docker" in result.stdout.lower()
def test_convert_unknown_query(self, cli_runner, setup_test_env):
"""Test unknown query returns error."""
runner, app = cli_runner
result = runner.invoke(
app,
["convert", "xyz unknown query"]
)
assert result.exit_code == 0
assert "not found" in result.stdout.lower() or "could not" in result.stdout.lower()
class TestCLIHistory:
"""Tests for the history command."""
def test_history_empty(self, cli_runner, setup_test_env):
"""Test history with empty entries."""
runner, app = cli_runner
result = runner.invoke(
app,
["history"]
)
assert result.exit_code == 0
def test_history_with_limit(self, cli_runner, setup_test_env):
"""Test history with limit option."""
runner, app = cli_runner
result = runner.invoke(
app,
["history", "--limit", "10"]
)
assert result.exit_code == 0
class TestCLILearn:
"""Tests for the learn command."""
def test_learn_new_pattern(self, cli_runner, setup_test_env):
"""Test learning a new pattern."""
runner, app = cli_runner
result = runner.invoke(
app,
["learn", "test query", "echo test", "--tool", "unix"]
)
assert result.exit_code == 0
assert "learned" in result.stdout.lower() or "test query" in result.stdout
class TestCLIForget:
"""Tests for the forget command."""
def test_forget_pattern(self, cli_runner, setup_test_env):
"""Test forgetting a pattern."""
runner, app = cli_runner
result = runner.invoke(
app,
["forget", "test query", "--tool", "unix"]
)
assert result.exit_code == 0
class TestCLIReload:
"""Tests for the reload command."""
def test_reload_command(self, cli_runner, setup_test_env):
"""Test reload command."""
runner, app = cli_runner
result = runner.invoke(
app,
["reload"]
)
assert result.exit_code == 0
assert "reloaded" in result.stdout.lower()
class TestCLITools:
"""Tests for the tools command."""
def test_tools_command(self, cli_runner):
"""Test listing available tools."""
runner, app = cli_runner
result = runner.invoke(
app,
["tools"]
)
assert result.exit_code == 0
assert "docker" in result.stdout.lower()
class TestCLIVersion:
"""Tests for version option."""
def test_version_flag(self, cli_runner):
"""Test --version flag."""
runner, app = cli_runner
result = runner.invoke(
app,
["--version"]
)
assert result.exit_code == 0
assert "shell speak" in result.stdout.lower() or "version" in result.stdout.lower()