From e31bb5ccc91e1088ab23bf890c4b47e9d695050b Mon Sep 17 00:00:00 2001 From: 7000pctAUTO Date: Thu, 29 Jan 2026 12:45:42 +0000 Subject: [PATCH] Add test suite for ShellGen CLI --- app/tests/test_generator.py | 159 ++++++++++++++++++++++++++++++++++++ 1 file changed, 159 insertions(+) create mode 100644 app/tests/test_generator.py diff --git a/app/tests/test_generator.py b/app/tests/test_generator.py new file mode 100644 index 0000000..b7699aa --- /dev/null +++ b/app/tests/test_generator.py @@ -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