Add test suite for ShellGen CLI
This commit is contained in:
159
app/tests/test_generator.py
Normal file
159
app/tests/test_generator.py
Normal file
@@ -0,0 +1,159 @@
|
|||||||
|
"""Tests for command generator."""
|
||||||
|
|
||||||
|
import pytest
|
||||||
|
from unittest.mock import Mock, patch
|
||||||
|
|
||||||
|
|
||||||
|
class TestCommandGenerator:
|
||||||
|
"""Tests for CommandGenerator class."""
|
||||||
|
|
||||||
|
def test_generator_initialization(self):
|
||||||
|
"""Test CommandGenerator initialization."""
|
||||||
|
from shellgen.core.generator import CommandGenerator
|
||||||
|
|
||||||
|
mock_backend = Mock()
|
||||||
|
generator = CommandGenerator(mock_backend)
|
||||||
|
|
||||||
|
assert generator.backend == mock_backend
|
||||||
|
|
||||||
|
@patch('shellgen.core.generator.PromptTemplates')
|
||||||
|
def test_generate_basic_command(self, mock_templates):
|
||||||
|
"""Test generating a basic command."""
|
||||||
|
from shellgen.core.generator import CommandGenerator
|
||||||
|
|
||||||
|
mock_backend = Mock()
|
||||||
|
mock_backend.generate.return_value = "```\nls -la\n```\nThis lists all files with details."
|
||||||
|
|
||||||
|
generator = CommandGenerator(mock_backend)
|
||||||
|
mock_templates_instance = Mock()
|
||||||
|
mock_templates.generate_prompt.return_value = "Generate: list files"
|
||||||
|
mock_templates.return_value = mock_templates_instance
|
||||||
|
|
||||||
|
result = generator.generate("list files", shell="bash")
|
||||||
|
|
||||||
|
assert "ls" in result.command.lower()
|
||||||
|
assert len(result.explanation) > 0
|
||||||
|
|
||||||
|
def test_generate_zsh_shell(self):
|
||||||
|
"""Test generating command for Zsh."""
|
||||||
|
from shellgen.core.generator import CommandGenerator
|
||||||
|
|
||||||
|
mock_backend = Mock()
|
||||||
|
mock_backend.generate.return_value = "ls"
|
||||||
|
|
||||||
|
generator = CommandGenerator(mock_backend)
|
||||||
|
|
||||||
|
with patch.object(generator, 'templates') as mock_templates:
|
||||||
|
mock_templates.generate_prompt.return_value = "Generate for zsh"
|
||||||
|
result = generator.generate("list files", shell="zsh")
|
||||||
|
|
||||||
|
mock_templates.generate_prompt.assert_called_once()
|
||||||
|
call_args = mock_templates.generate_prompt.call_args
|
||||||
|
assert "zsh" in call_args[0][1].lower()
|
||||||
|
|
||||||
|
def test_extract_command_with_code_block(self):
|
||||||
|
"""Test extracting command from code block."""
|
||||||
|
from shellgen.core.generator import CommandGenerator
|
||||||
|
|
||||||
|
mock_backend = Mock()
|
||||||
|
mock_backend.generate.return_value = """Here is the command:
|
||||||
|
|
||||||
|
```
|
||||||
|
find . -name "*.py" -type f
|
||||||
|
```
|
||||||
|
|
||||||
|
This searches for Python files."""
|
||||||
|
|
||||||
|
generator = CommandGenerator(mock_backend)
|
||||||
|
result = generator.generate("find python files")
|
||||||
|
|
||||||
|
assert "find" in result.command
|
||||||
|
assert "name" in result.command or "*.py" in result.command
|
||||||
|
|
||||||
|
def test_extract_command_plain(self):
|
||||||
|
"""Test extracting command from plain text."""
|
||||||
|
from shellgen.core.generator import CommandGenerator
|
||||||
|
|
||||||
|
mock_backend = Mock()
|
||||||
|
mock_backend.generate.return_value = "git status"
|
||||||
|
|
||||||
|
generator = CommandGenerator(mock_backend)
|
||||||
|
result = generator.generate("show git status")
|
||||||
|
|
||||||
|
assert "git" in result.command
|
||||||
|
|
||||||
|
def test_confidence_estimation(self):
|
||||||
|
"""Test confidence estimation."""
|
||||||
|
from shellgen.core.generator import CommandGenerator
|
||||||
|
|
||||||
|
mock_backend = Mock()
|
||||||
|
mock_backend.generate.return_value = "```\nls\n```"
|
||||||
|
|
||||||
|
generator = CommandGenerator(mock_backend)
|
||||||
|
result = generator.generate("list files")
|
||||||
|
|
||||||
|
assert 0.0 <= result.confidence <= 1.0
|
||||||
|
|
||||||
|
def test_empty_response_fallback(self):
|
||||||
|
"""Test handling of empty response."""
|
||||||
|
from shellgen.core.generator import CommandGenerator
|
||||||
|
|
||||||
|
mock_backend = Mock()
|
||||||
|
mock_backend.generate.return_value = ""
|
||||||
|
|
||||||
|
generator = CommandGenerator(mock_backend)
|
||||||
|
result = generator.generate("list files")
|
||||||
|
|
||||||
|
assert result.command == ""
|
||||||
|
|
||||||
|
|
||||||
|
class TestPromptTemplates:
|
||||||
|
"""Tests for prompt templates."""
|
||||||
|
|
||||||
|
def test_generate_prompt_bash(self):
|
||||||
|
"""Test generating prompt for Bash."""
|
||||||
|
from shellgen.core.prompts import PromptTemplates
|
||||||
|
|
||||||
|
templates = PromptTemplates()
|
||||||
|
prompt = templates.generate_prompt("list files", "bash")
|
||||||
|
|
||||||
|
assert "BASH" in prompt
|
||||||
|
assert "list files" in prompt
|
||||||
|
|
||||||
|
def test_generate_prompt_zsh(self):
|
||||||
|
"""Test generating prompt for Zsh."""
|
||||||
|
from shellgen.core.prompts import PromptTemplates
|
||||||
|
|
||||||
|
templates = PromptTemplates()
|
||||||
|
prompt = templates.generate_prompt("find files", "zsh")
|
||||||
|
|
||||||
|
assert "ZSH" in prompt
|
||||||
|
assert "find files" in prompt
|
||||||
|
|
||||||
|
def test_generate_prompt_with_context(self):
|
||||||
|
"""Test generating prompt with context."""
|
||||||
|
from shellgen.core.prompts import PromptTemplates
|
||||||
|
|
||||||
|
templates = PromptTemplates()
|
||||||
|
prompt = templates.generate_prompt(
|
||||||
|
"list files",
|
||||||
|
"bash",
|
||||||
|
context="/home/user/project"
|
||||||
|
)
|
||||||
|
|
||||||
|
assert "/home/user/project" in prompt
|
||||||
|
|
||||||
|
def test_generate_feedback_prompt(self):
|
||||||
|
"""Test generating feedback prompt."""
|
||||||
|
from shellgen.core.prompts import PromptTemplates
|
||||||
|
|
||||||
|
templates = PromptTemplates()
|
||||||
|
prompt = templates.generate_feedback_prompt(
|
||||||
|
original_description="list files",
|
||||||
|
generated_command="ls -x",
|
||||||
|
user_correction="ls -la",
|
||||||
|
)
|
||||||
|
|
||||||
|
assert "list files" in prompt
|
||||||
|
assert "ls -x" in prompt
|
||||||
|
assert "ls -la" in prompt
|
||||||
Reference in New Issue
Block a user