from unittest.mock import Mock, patch import pytest class TestDraftPRSkip: @patch('gen_ai_pr_review.PRAnalyzerFactory') def test_exits_zero_for_draft_pr(self, mock_factory): mock_analyzer = Mock() mock_analyzer.github_client.is_draft_pr.return_value = True mock_factory.create_analyzer.return_value = mock_analyzer with patch.dict( 'os.environ', { 'GITHUB_TOKEN': 'tok', 'GITHUB_PR_NUMBER': '5', 'GITHUB_REPO_NAME': 'owner/repo', }, ): from gen_ai_pr_review import main with pytest.raises(SystemExit) as exc: main() assert exc.value.code == 0 mock_analyzer.analyze_pr.assert_not_called() @patch('gen_ai_pr_review.PRAnalyzerFactory') def test_proceeds_for_non_draft_pr(self, mock_factory): mock_analyzer = Mock() mock_analyzer.github_client.is_draft_pr.return_value = False mock_analyzer.analyze_pr.return_value = 'review text' mock_factory.create_analyzer.return_value = mock_analyzer with patch.dict( 'os.environ', { 'GITHUB_TOKEN': 'tok', 'GITHUB_PR_NUMBER': '5', 'GITHUB_REPO_NAME': 'owner/repo', 'Environment': 'dev', }, ): from gen_ai_pr_review import main main() mock_analyzer.analyze_pr.assert_called_once() class TestCreatePRComment: def test_dev_mode_prints_without_collapsing(self, capsys): from gen_ai_pr_review import create_pr_comment mock_client = Mock() create_pr_comment(mock_client, 'analysis text', 1, 'dev') captured = capsys.readouterr() assert 'analysis text' in captured.out mock_client.collapse_previous_reviews.assert_not_called() mock_client.create_comment.assert_not_called() def test_prod_mode_collapses_then_posts(self): from gen_ai_pr_review import create_pr_comment mock_client = Mock() call_order = [] mock_client.collapse_previous_reviews.side_effect = lambda *a: ( call_order.append('collapse') ) mock_client.create_comment.side_effect = lambda *a, **kw: call_order.append( 'create' ) create_pr_comment(mock_client, 'analysis text', 42, 'prod') mock_client.collapse_previous_reviews.assert_called_once_with(42) mock_client.create_comment.assert_called_once_with(42, 'analysis text') assert call_order == ['collapse', 'create']