diff --git a/tests/test_cli.py b/tests/test_cli.py new file mode 100644 index 0000000..8ab34be --- /dev/null +++ b/tests/test_cli.py @@ -0,0 +1,230 @@ +"""Tests for CLI commands.""" + +import pytest +import tempfile +import os +from click.testing import CliRunner + +from src.cli import main + + +class TestCLIPromptCommands: + """Test cases for prompt CLI commands.""" + + def setup_method(self): + """Set up test fixtures.""" + self.runner = CliRunner() + self.temp_dir = tempfile.mkdtemp() + + def teardown_method(self): + """Clean up test fixtures.""" + import shutil + shutil.rmtree(self.temp_dir, ignore_errors=True) + + def test_prompt_create(self): + """Test creating a prompt.""" + result = self.runner.invoke(main, [ + "prompt", "create", "test-prompt", + "--template", "Hello {{ name }}", + "--description", "A test prompt", + "--dir", self.temp_dir + ]) + assert result.exit_code == 0 + assert "Created prompt: test-prompt" in result.output + + def test_prompt_create_duplicate(self): + """Test creating duplicate prompt.""" + self.runner.invoke(main, [ + "prompt", "create", "test-prompt", + "--template", "Hello {{ name }}", + "--dir", self.temp_dir + ]) + result = self.runner.invoke(main, [ + "prompt", "create", "test-prompt", + "--template", "Hello {{ name }}", + "--dir", self.temp_dir + ]) + assert result.exit_code == 0 + assert "already exists" in result.output + + def test_prompt_list(self): + """Test listing prompts.""" + self.runner.invoke(main, [ + "prompt", "create", "test-prompt", + "--template", "Hello {{ name }}", + "--dir", self.temp_dir + ]) + result = self.runner.invoke(main, [ + "prompt", "list", + "--dir", self.temp_dir + ]) + assert result.exit_code == 0 + assert "test-prompt" in result.output + + def test_prompt_list_empty(self): + """Test listing prompts when empty.""" + result = self.runner.invoke(main, [ + "prompt", "list", + "--dir", self.temp_dir + ]) + assert result.exit_code == 0 + + def test_prompt_delete(self): + """Test deleting a prompt.""" + self.runner.invoke(main, [ + "prompt", "create", "test-prompt", + "--template", "Hello {{ name }}", + "--dir", self.temp_dir + ]) + result = self.runner.invoke(main, [ + "prompt", "delete", "test-prompt", + "--force", + "--dir", self.temp_dir + ]) + assert result.exit_code == 0 + assert "Deleted prompt" in result.output + + def test_prompt_delete_not_found(self): + """Test deleting non-existent prompt.""" + result = self.runner.invoke(main, [ + "prompt", "delete", "non-existent", + "--force", + "--dir", self.temp_dir + ]) + assert result.exit_code != 0 or "not found" in result.output + + +class TestCLITagCommands: + """Test cases for tag CLI commands.""" + + def setup_method(self): + """Set up test fixtures.""" + self.runner = CliRunner() + self.temp_dir = tempfile.mkdtemp() + + def teardown_method(self): + """Clean up test fixtures.""" + import shutil + shutil.rmtree(self.temp_dir, ignore_errors=True) + + def test_tag_add(self): + """Test adding a tag to prompt.""" + self.runner.invoke(main, [ + "prompt", "create", "test-prompt", + "--template", "Hello {{ name }}", + "--dir", self.temp_dir + ]) + result = self.runner.invoke(main, [ + "tag", "add", "test-prompt", "test-tag", + "--dir", self.temp_dir + ]) + assert result.exit_code == 0 + assert "Added tag" in result.output + + def test_tag_list(self): + """Test listing tags.""" + self.runner.invoke(main, [ + "prompt", "create", "test-prompt", + "--template", "Hello {{ name }}", + "--dir", self.temp_dir + ]) + self.runner.invoke(main, [ + "tag", "add", "test-prompt", "test-tag", + "--dir", self.temp_dir + ]) + result = self.runner.invoke(main, [ + "tag", "list", + "--dir", self.temp_dir + ]) + assert result.exit_code == 0 + assert "test-tag" in result.output + + def test_tag_remove(self): + """Test removing a tag from prompt.""" + self.runner.invoke(main, [ + "prompt", "create", "test-prompt", + "--template", "Hello {{ name }}", + "--dir", self.temp_dir + ]) + self.runner.invoke(main, [ + "tag", "add", "test-prompt", "test-tag", + "--dir", self.temp_dir + ]) + result = self.runner.invoke(main, [ + "tag", "remove", "test-prompt", "test-tag", + "--dir", self.temp_dir + ]) + assert result.exit_code == 0 + assert "Removed tag" in result.output + + +class TestCLISearchCommands: + """Test cases for search CLI commands.""" + + def setup_method(self): + """Set up test fixtures.""" + self.runner = CliRunner() + self.temp_dir = tempfile.mkdtemp() + + def teardown_method(self): + """Clean up test fixtures.""" + import shutil + shutil.rmtree(self.temp_dir, ignore_errors=True) + + def test_search_by_name(self): + """Test searching by name.""" + self.runner.invoke(main, [ + "prompt", "create", "my-test-prompt", + "--template", "Hello {{ name }}", + "--dir", self.temp_dir + ]) + result = self.runner.invoke(main, [ + "search", "my-test-prompt", + "--name", "my-test", + "--dir", self.temp_dir + ]) + assert result.exit_code == 0 + assert "my-test-prompt" in result.output + + def test_search_by_tag(self): + """Test searching by tag.""" + self.runner.invoke(main, [ + "prompt", "create", "test-prompt", + "--template", "Hello {{ name }}", + "--tag", "documentation", + "--dir", self.temp_dir + ]) + result = self.runner.invoke(main, [ + "search", + "--tag", "documentation", + "--dir", self.temp_dir + ]) + assert result.exit_code == 0 + assert "test-prompt" in result.output + + +class TestCLIConfigCommands: + """Test cases for config CLI commands.""" + + def setup_method(self): + """Set up test fixtures.""" + self.runner = CliRunner() + self.temp_dir = tempfile.mkdtemp() + + def teardown_method(self): + """Clean up test fixtures.""" + import shutil + shutil.rmtree(self.temp_dir, ignore_errors=True) + + def test_config_show(self): + """Test showing configuration.""" + result = self.runner.invoke(main, ["config", "show"]) + assert result.exit_code == 0 + assert "ollama_url" in result.output or "Configuration" in result.output + + def test_config_set(self): + """Test setting configuration value.""" + result = self.runner.invoke(main, [ + "config", "set", "default_model", "test-model" + ]) + assert result.exit_code == 0 or "Set" in result.output