"""Tests for storage layer.""" import pytest import tempfile import os from pathlib import Path from src.storage import PromptStorage, ConfigManager from src.models import Prompt class TestPromptStorage: """Test cases for PromptStorage.""" def setup_method(self): """Set up test fixtures.""" self.temp_dir = tempfile.mkdtemp() self.storage = PromptStorage(self.temp_dir) def teardown_method(self): """Clean up test fixtures.""" import shutil shutil.rmtree(self.temp_dir, ignore_errors=True) def test_save_and_get_prompt(self): """Test saving and retrieving a prompt.""" prompt = Prompt( name="test-prompt", template="Hello {{ name }}" ) self.storage.save_prompt(prompt) retrieved = self.storage.get_prompt("test-prompt") assert retrieved is not None assert retrieved.name == "test-prompt" assert retrieved.template == "Hello {{ name }}" def test_list_prompts(self): """Test listing prompts.""" prompt1 = Prompt(name="prompt-1", template="Template 1") prompt2 = Prompt(name="prompt-2", template="Template 2") self.storage.save_prompt(prompt1) self.storage.save_prompt(prompt2) prompts = self.storage.list_prompts() assert len(prompts) == 2 assert "prompt-1" in prompts assert "prompt-2" in prompts def test_delete_prompt(self): """Test deleting a prompt.""" prompt = Prompt(name="test-prompt", template="Template") self.storage.save_prompt(prompt) result = self.storage.delete_prompt("test-prompt") assert result is True retrieved = self.storage.get_prompt("test-prompt") assert retrieved is None def test_prompt_exists(self): """Test checking if prompt exists.""" prompt = Prompt(name="test-prompt", template="Template") self.storage.save_prompt(prompt) assert self.storage.prompt_exists("test-prompt") is True assert self.storage.prompt_exists("non-existent") is False def test_add_tag_to_prompt(self): """Test adding tag to prompt.""" prompt = Prompt(name="test-prompt", template="Template") self.storage.save_prompt(prompt) self.storage.add_tag_to_prompt("test-prompt", "test-tag") tag = self.storage.get_tag("test-tag") assert tag is not None assert "test-prompt" in tag.prompts def test_remove_tag_from_prompt(self): """Test removing tag from prompt.""" prompt = Prompt(name="test-prompt", template="Template", tags=["test-tag"]) self.storage.save_prompt(prompt) self.storage.add_tag_to_prompt("test-prompt", "test-tag") result = self.storage.remove_tag_from_prompt("test-prompt", "test-tag") assert result is True tag = self.storage.get_tag("test-tag") assert tag is None or "test-prompt" not in tag.prompts def test_search_prompts_by_name(self): """Test searching prompts by name.""" prompt1 = Prompt(name="search-test", template="Template 1") prompt2 = Prompt(name="other-prompt", template="Template 2") self.storage.save_prompt(prompt1) self.storage.save_prompt(prompt2) results = self.storage.search_prompts(name="search") assert len(results) == 1 assert results[0].name == "search-test" def test_search_prompts_by_content(self): """Test searching prompts by content.""" prompt1 = Prompt(name="prompt-1", template="Hello world") prompt2 = Prompt(name="prompt-2", template="Goodbye world") self.storage.save_prompt(prompt1) self.storage.save_prompt(prompt2) results = self.storage.search_prompts(content="Hello") assert len(results) == 1 assert results[0].name == "prompt-1" def test_get_prompts_by_tag(self): """Test getting prompts by tag.""" prompt1 = Prompt(name="prompt-1", template="Template 1", tags=["docs"]) prompt2 = Prompt(name="prompt-2", template="Template 2", tags=["other"]) self.storage.save_prompt(prompt1) self.storage.save_prompt(prompt2) self.storage.add_tag_to_prompt("prompt-1", "docs") results = self.storage.get_prompts_by_tag("docs") assert len(results) == 1 assert results[0].name == "prompt-1" class TestConfigManager: """Test cases for ConfigManager.""" def setup_method(self): """Set up test fixtures.""" self.temp_file = tempfile.mktemp(suffix=".yaml") self.manager = ConfigManager(self.temp_file) def teardown_method(self): """Clean up test fixtures.""" if os.path.exists(self.temp_file): os.unlink(self.temp_file) def test_load_default_config(self): """Test loading default configuration.""" config = self.manager.load() assert config.ollama_url == "http://localhost:11434" assert config.default_model == "llama3.2" def test_save_and_load_config(self): """Test saving and loading configuration.""" from src.models import Config config = Config() config.ollama_url = "http://custom:9000" config.default_model = "custom-model" self.manager.save(config) loaded = self.manager.load() assert loaded.ollama_url == "http://custom:9000" assert loaded.default_model == "custom-model" def test_set_config_value(self): """Test setting a configuration value.""" self.manager.set("default_model", "new-model") config = self.manager.load() assert config.default_model == "new-model" def test_get_config_value(self): """Test getting a configuration value.""" value = self.manager.get("default_model") assert value == "llama3.2"