Add test files and configuration
This commit is contained in:
204
tests/test_generation.py
Normal file
204
tests/test_generation.py
Normal file
@@ -0,0 +1,204 @@
|
|||||||
|
"""Tests for pattern generation functionality."""
|
||||||
|
|
||||||
|
from src.generators.merge import PatternMerger
|
||||||
|
from src.generators.pattern import PatternGenerator
|
||||||
|
|
||||||
|
|
||||||
|
class TestPatternGenerator:
|
||||||
|
"""Tests for PatternGenerator class."""
|
||||||
|
|
||||||
|
def test_generate_python_patterns(self):
|
||||||
|
"""Test generation of Python patterns."""
|
||||||
|
generator = PatternGenerator()
|
||||||
|
content = generator.generate(languages=["python"])
|
||||||
|
assert "__pycache__/" in content
|
||||||
|
assert "*.py[cod]" in content
|
||||||
|
assert ".venv/" in content
|
||||||
|
|
||||||
|
def test_generate_nodejs_patterns(self):
|
||||||
|
"""Test generation of Node.js patterns."""
|
||||||
|
generator = PatternGenerator()
|
||||||
|
content = generator.generate(languages=["nodejs"])
|
||||||
|
assert "node_modules/" in content
|
||||||
|
assert "*.log" in content
|
||||||
|
|
||||||
|
def test_generate_django_patterns(self):
|
||||||
|
"""Test generation of Django patterns."""
|
||||||
|
generator = PatternGenerator()
|
||||||
|
content = generator.generate(frameworks=["django"])
|
||||||
|
assert "db.sqlite3" in content
|
||||||
|
assert "media/" in content
|
||||||
|
|
||||||
|
def test_generate_react_patterns(self):
|
||||||
|
"""Test generation of React patterns."""
|
||||||
|
generator = PatternGenerator()
|
||||||
|
content = generator.generate(frameworks=["react"])
|
||||||
|
assert "build/" in content
|
||||||
|
assert ".next/" in content
|
||||||
|
|
||||||
|
def test_generate_vscode_patterns(self):
|
||||||
|
"""Test generation of VSCode patterns."""
|
||||||
|
generator = PatternGenerator()
|
||||||
|
content = generator.generate(ides=["vscode"])
|
||||||
|
assert ".vscode/" in content
|
||||||
|
|
||||||
|
def test_generate_jetbrains_patterns(self):
|
||||||
|
"""Test generation of JetBrains patterns."""
|
||||||
|
generator = PatternGenerator()
|
||||||
|
content = generator.generate(ides=["jetbrains"])
|
||||||
|
assert ".idea/" in content
|
||||||
|
|
||||||
|
def test_generate_macos_patterns(self):
|
||||||
|
"""Test generation of macOS patterns."""
|
||||||
|
generator = PatternGenerator()
|
||||||
|
content = generator.generate(os_list=["macos"])
|
||||||
|
assert ".DS_Store" in content
|
||||||
|
|
||||||
|
def test_generate_windows_patterns(self):
|
||||||
|
"""Test generation of Windows patterns."""
|
||||||
|
generator = PatternGenerator()
|
||||||
|
content = generator.generate(os_list=["windows"])
|
||||||
|
assert "Thumbs.db" in content
|
||||||
|
|
||||||
|
def test_generate_linux_patterns(self):
|
||||||
|
"""Test generation of Linux patterns."""
|
||||||
|
generator = PatternGenerator()
|
||||||
|
content = generator.generate(os_list=["linux"])
|
||||||
|
assert "*~" in content
|
||||||
|
|
||||||
|
def test_generate_custom_patterns(self):
|
||||||
|
"""Test generation of custom patterns."""
|
||||||
|
generator = PatternGenerator()
|
||||||
|
content = generator.generate(custom_patterns=["custom_dir/", "*.custom"])
|
||||||
|
assert "custom_dir/" in content
|
||||||
|
assert "*.custom" in content
|
||||||
|
|
||||||
|
def test_generate_empty_when_no_options(self):
|
||||||
|
"""Test that empty content is generated when no options provided."""
|
||||||
|
generator = PatternGenerator()
|
||||||
|
content = generator.generate()
|
||||||
|
assert ".DS_Store" in content
|
||||||
|
assert "Thumbs.db" in content
|
||||||
|
|
||||||
|
def test_get_supported_languages(self):
|
||||||
|
"""Test getting list of supported languages."""
|
||||||
|
generator = PatternGenerator()
|
||||||
|
languages = generator.get_supported_languages()
|
||||||
|
assert "python" in languages
|
||||||
|
assert "nodejs" in languages
|
||||||
|
assert "go" in languages
|
||||||
|
|
||||||
|
def test_get_supported_frameworks(self):
|
||||||
|
"""Test getting list of supported frameworks."""
|
||||||
|
generator = PatternGenerator()
|
||||||
|
frameworks = generator.get_supported_frameworks()
|
||||||
|
assert "django" in frameworks
|
||||||
|
assert "react" in frameworks
|
||||||
|
assert "flask" in frameworks
|
||||||
|
|
||||||
|
def test_get_supported_ides(self):
|
||||||
|
"""Test getting list of supported IDEs."""
|
||||||
|
generator = PatternGenerator()
|
||||||
|
ides = generator.get_supported_ides()
|
||||||
|
assert "vscode" in ides
|
||||||
|
assert "jetbrains" in ides
|
||||||
|
|
||||||
|
def test_get_supported_os(self):
|
||||||
|
"""Test getting list of supported operating systems."""
|
||||||
|
generator = PatternGenerator()
|
||||||
|
os_list = generator.get_supported_os()
|
||||||
|
assert "macos" in os_list
|
||||||
|
assert "windows" in os_list
|
||||||
|
assert "linux" in os_list
|
||||||
|
|
||||||
|
def test_validate_valid_pattern(self):
|
||||||
|
"""Test validation of valid patterns."""
|
||||||
|
generator = PatternGenerator()
|
||||||
|
is_valid, error = generator.validate_pattern("*.log")
|
||||||
|
assert is_valid is True
|
||||||
|
assert error == ""
|
||||||
|
|
||||||
|
def test_validate_empty_pattern(self):
|
||||||
|
"""Test validation of empty patterns."""
|
||||||
|
generator = PatternGenerator()
|
||||||
|
is_valid, error = generator.validate_pattern("")
|
||||||
|
assert is_valid is False
|
||||||
|
assert "empty" in error.lower()
|
||||||
|
|
||||||
|
def test_validate_comment_pattern(self):
|
||||||
|
"""Test validation of comment patterns."""
|
||||||
|
generator = PatternGenerator()
|
||||||
|
is_valid, error = generator.validate_pattern("# This is a comment")
|
||||||
|
assert is_valid is True
|
||||||
|
|
||||||
|
def test_validate_negation_pattern(self):
|
||||||
|
"""Test validation of negation patterns."""
|
||||||
|
generator = PatternGenerator()
|
||||||
|
is_valid, error = generator.validate_pattern("!important.txt")
|
||||||
|
assert is_valid is True
|
||||||
|
|
||||||
|
|
||||||
|
class TestPatternMerger:
|
||||||
|
"""Tests for PatternMerger class."""
|
||||||
|
|
||||||
|
def test_merge_priority(self):
|
||||||
|
"""Test merging patterns with priority strategy."""
|
||||||
|
merger = PatternMerger()
|
||||||
|
patterns_by_category = {
|
||||||
|
"os": ["*.log"],
|
||||||
|
"language": ["node_modules/", "*.pyc"],
|
||||||
|
}
|
||||||
|
merged, conflicts = merger.merge(patterns_by_category)
|
||||||
|
assert len(conflicts) == 0
|
||||||
|
|
||||||
|
def test_merge_deduplication(self):
|
||||||
|
"""Test that merging deduplicates patterns."""
|
||||||
|
merger = PatternMerger()
|
||||||
|
patterns_by_category = {
|
||||||
|
"language": ["*.log", "*.log"],
|
||||||
|
"framework": ["*.log"],
|
||||||
|
}
|
||||||
|
merged, conflicts = merger.merge(patterns_by_category)
|
||||||
|
log_count = sum(1 for p in merged if "*.log" in p)
|
||||||
|
assert log_count == 1
|
||||||
|
|
||||||
|
def test_deduplicate_method(self):
|
||||||
|
"""Test deduplicate method directly."""
|
||||||
|
merger = PatternMerger()
|
||||||
|
patterns = ["*.log", "*.log", "node_modules/", "*.log"]
|
||||||
|
unique = merger.deduplicate(patterns)
|
||||||
|
assert len(unique) == 2
|
||||||
|
|
||||||
|
def test_merge_empty_categories(self):
|
||||||
|
"""Test merging with empty categories."""
|
||||||
|
merger = PatternMerger()
|
||||||
|
merged, conflicts = merger.merge({})
|
||||||
|
assert merged == []
|
||||||
|
|
||||||
|
def test_merge_with_custom_patterns(self):
|
||||||
|
"""Test merging with custom patterns."""
|
||||||
|
merger = PatternMerger()
|
||||||
|
patterns_by_category = {
|
||||||
|
"language": ["*.pyc"],
|
||||||
|
}
|
||||||
|
merged, conflicts = merger.merge(patterns_by_category, custom_patterns=["custom.txt"])
|
||||||
|
assert "custom.txt" in merged
|
||||||
|
|
||||||
|
def test_get_pattern_sources(self):
|
||||||
|
"""Test getting pattern sources."""
|
||||||
|
merger = PatternMerger()
|
||||||
|
patterns = ["*.log", "node_modules/", ".DS_Store"]
|
||||||
|
sources = merger.get_pattern_sources(patterns)
|
||||||
|
assert "os" in sources or "other" in sources
|
||||||
|
|
||||||
|
def test_resolve_conflict_keep_existing(self):
|
||||||
|
"""Test conflict resolution keeping existing."""
|
||||||
|
merger = PatternMerger()
|
||||||
|
result = merger.resolve_conflict("new.txt", "old.txt", "keep_existing")
|
||||||
|
assert result == "old.txt"
|
||||||
|
|
||||||
|
def test_resolve_conflict_keep_new(self):
|
||||||
|
"""Test conflict resolution keeping new."""
|
||||||
|
merger = PatternMerger()
|
||||||
|
result = merger.resolve_conflict("new.txt", "old.txt", "keep_new")
|
||||||
|
assert result == "new.txt"
|
||||||
Reference in New Issue
Block a user