diff --git a/tests/test_detector.py b/tests/test_detector.py new file mode 100644 index 0000000..0c189b3 --- /dev/null +++ b/tests/test_detector.py @@ -0,0 +1,136 @@ +"""Tests for detector.py.""" + +import tempfile +from pathlib import Path + +import pytest + +from gitignore_generator.detector import ( + ProjectDetector, + detect_project, + suggest_gitignore, + DETECTION_RULES +) + + +class TestProjectDetector: + """Tests for ProjectDetector class.""" + + @pytest.fixture + def detector(self): + """Create detector with temp directory.""" + with tempfile.TemporaryDirectory() as tmpdir: + yield ProjectDetector(Path(tmpdir)) + + def test_detect_node_project(self, detector): + """Test detecting Node.js project.""" + (detector.path / 'package.json').touch() + (detector.path / 'node_modules').mkdir() + + result = detector.detect() + assert 'node' in result + + def test_detect_python_project(self, detector): + """Test detecting Python project.""" + (detector.path / 'requirements.txt').touch() + (detector.path / 'venv').mkdir() + + result = detector.detect() + assert 'python' in result + + def test_detect_django_project(self, detector): + """Test detecting Django project.""" + (detector.path / 'manage.py').touch() + (detector.path / 'settings.py').touch() + + result = detector.detect() + assert 'django' in result + + def test_detect_multiple_technologies(self, detector): + """Test detecting multiple technologies.""" + (detector.path / 'package.json').touch() + (detector.path / 'requirements.txt').touch() + (detector.path / 'Dockerfile').touch() + + result = detector.detect() + assert 'node' in result + assert 'python' in result + assert 'docker' in result + + def test_detect_no_project(self, detector): + """Test when no project is detected.""" + result = detector.detect() + assert len(result) == 0 + + def test_detect_with_min_confidence(self, detector): + """Test minimum confidence threshold.""" + (detector.path / 'package.json').touch() + + result = detector.detect(min_confidence=2) + assert 'node' not in result + + def test_get_detection_details(self, detector): + """Test getting detailed detection results.""" + (detector.path / 'package.json').touch() + (detector.path / 'yarn.lock').touch() + + details = detector.get_detection_details() + assert len(details) > 0 + assert details[0]['technology'] == 'node' + assert details[0]['confidence'] >= 1 + + def test_suggest_gitignore(self, detector): + """Test gitignore suggestions.""" + (detector.path / 'package.json').touch() + (detector.path / 'requirements.txt').touch() + (detector.path / 'manage.py').touch() + + suggestions = detector.suggest_gitignore() + assert 'node' in suggestions + assert 'python' in suggestions + assert 'django' in suggestions + + def test_scan_directory(self, detector): + """Test directory scanning.""" + (detector.path / 'package.json').touch() + (detector.path / 'requirements.txt').touch() + + result = detector.scan_directory() + assert 'node' in result + assert 'python' in result + + +class TestDetectionRules: + """Tests for detection rules configuration.""" + + def test_detection_rules_exist(self): + """Test that detection rules are defined.""" + assert len(DETECTION_RULES) > 0 + + def test_common_technologies_have_rules(self): + """Test that common technologies have detection rules.""" + common = ['node', 'python', 'django', 'rails', 'java', 'go', 'rust', 'dotnet'] + for tech in common: + assert tech in DETECTION_RULES + assert len(DETECTION_RULES[tech]) > 0 + + def test_each_rule_has_markers(self): + """Test that each detection rule has markers.""" + for tech, markers in DETECTION_RULES.items(): + assert len(markers) > 0, f"{tech} has no markers" + + +class TestConvenienceFunctions: + """Tests for convenience functions.""" + + def test_detect_project_function(self, detector): + """Test detect_project convenience function.""" + (detector.path / 'requirements.txt').touch() + result = detect_project(detector.path) + assert 'python' in result + + def test_suggest_gitignore_function(self, detector): + """Test suggest_gitignore convenience function.""" + (detector.path / 'requirements.txt').touch() + result = suggest_gitignore(detector.path) + assert 'python' in result