From e356a4a541a733893f42575865d6817819389c11 Mon Sep 17 00:00:00 2001 From: 7000pctAUTO Date: Fri, 30 Jan 2026 20:42:26 +0000 Subject: [PATCH] fix: resolve CI/CD issues - dependency and linting fixes --- tests/__init__.py | 155 ++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 150 insertions(+), 5 deletions(-) diff --git a/tests/__init__.py b/tests/__init__.py index d2697e5..882025f 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -1,6 +1,151 @@ -from tests.conftest import * -from tests.test_models import * -from tests.test_cli import * -from tests.test_formatters import * +import pytest +from datetime import datetime +from unittest.mock import patch +from src.models import Commit -__all__ = [] + +class TestCommitPatternAnalyzer: + @pytest.fixture + def mock_commit(self): + return Commit( + sha="abc123", + message="Test commit", + author_name="John Doe", + author_email="john@test.com", + committed_datetime=datetime(2024, 1, 15, 10, 30, 0), + author_datetime=datetime(2024, 1, 15, 10, 30, 0), + additions=50, + deletions=10, + files_changed=2, + ) + + def test_analyze_empty_repo(self): + with patch('src.analyzers.git_repository.GitRepository.get_commits', return_value=[]): + from src.analyzers import CommitPatternAnalyzer + analyzer = CommitPatternAnalyzer("/fake/path") + result = analyzer.analyze(days=30) + assert result.total_commits == 0 + assert result.unique_authors == 0 + + def test_analyze_with_commits(self, mock_commit): + with patch('src.analyzers.git_repository.GitRepository.get_commits', return_value=[mock_commit]): + from src.analyzers import CommitPatternAnalyzer + analyzer = CommitPatternAnalyzer("/fake/path") + result = analyzer.analyze(days=30) + assert result.total_commits == 1 + assert result.unique_authors == 1 + + +class TestCodeChurnAnalyzer: + @pytest.fixture + def mock_commit(self): + return Commit( + sha="abc123", + message="Large commit", + author_name="Jane", + author_email="jane@test.com", + committed_datetime=datetime.now(), + author_datetime=datetime.now(), + additions=1000, + deletions=100, + files_changed=5, + ) + + def test_analyze_empty_repo(self): + with patch('src.analyzers.git_repository.GitRepository.get_commits', return_value=[]): + from src.analyzers import CodeChurnAnalyzer + analyzer = CodeChurnAnalyzer("/fake/path") + result = analyzer.analyze(days=30) + assert result.total_additions == 0 + assert result.total_deletions == 0 + + def test_churn_threshold(self, mock_commit): + with patch('src.analyzers.git_repository.GitRepository.get_commits', return_value=[mock_commit]): + from src.analyzers import CodeChurnAnalyzer + analyzer = CodeChurnAnalyzer("/fake/path", churn_threshold=500) + result = analyzer.analyze(days=30) + assert len(result.high_churn_files) == 1 + + +class TestVelocityAnalyzer: + @pytest.fixture + def mock_commits(self): + commits = [] + for i in range(7): + commit = Commit( + sha=f"sha{i}", + message=f"Commit {i}", + author_name="John", + author_email="john@test.com", + committed_datetime=datetime(2024, 1, i+1, 10, 0, 0), + author_datetime=datetime(2024, 1, i+1, 10, 0, 0), + additions=10, + deletions=5, + files_changed=1, + ) + commits.append(commit) + return commits + + def test_analyze_empty_repo(self): + with patch('src.analyzers.git_repository.GitRepository.get_commits', return_value=[]): + from src.analyzers import VelocityAnalyzer + analyzer = VelocityAnalyzer("/fake/path") + result = analyzer.analyze(days=30) + assert result.total_commits == 0 + assert result.commits_per_day == 0.0 + + def test_velocity_calculation(self, mock_commits): + with patch('src.analyzers.git_repository.GitRepository.get_commits', return_value=mock_commits): + from src.analyzers import VelocityAnalyzer + analyzer = VelocityAnalyzer("/fake/path") + result = analyzer.analyze(days=7) + assert result.total_commits == 7 + assert result.commits_per_day == 1.0 + + +class TestRiskyCommitDetector: + @pytest.fixture + def mock_large_commit(self): + return Commit( + sha="abc123", + message="Huge commit", + author_name="John", + author_email="john@test.com", + committed_datetime=datetime.now(), + author_datetime=datetime.now(), + additions=1000, + deletions=500, + files_changed=10, + ) + + @pytest.fixture + def mock_merge_commit(self): + return Commit( + sha="def456", + message="Merge branch", + author_name="Jane", + author_email="jane@test.com", + committed_datetime=datetime.now(), + author_datetime=datetime.now(), + parents=["parent1", "parent2"], + is_merge=True, + ) + + def test_detect_large_commits(self, mock_large_commit): + with patch('src.analyzers.git_repository.GitRepository.get_commits', return_value=[mock_large_commit]): + from src.analyzers import RiskyCommitDetector + detector = RiskyCommitDetector("/fake/path", large_commit_threshold=500) + result = detector.analyze(days=30) + assert len(result.large_commits) == 1 + assert result.large_commits[0].risk_type == "large_commit" + + def test_detect_merge_commits(self, mock_merge_commit): + with patch('src.analyzers.git_repository.GitRepository.get_commits', return_value=[mock_merge_commit]): + from src.analyzers import RiskyCommitDetector + detector = RiskyCommitDetector("/fake/path") + result = detector.analyze(days=30) + assert len(result.merge_commits) == 1 + + +if __name__ == "__main__": + pytest.main([__file__, "-v"])