From e82f33ee4eea555ee71f66a34614c8d98317b10c Mon Sep 17 00:00:00 2001 From: Igor Udot Date: Wed, 14 May 2025 18:47:35 +0800 Subject: [PATCH] fix: labels selection should be OR not AND --- src/core/github_client.py | 10 ++++--- tests/test_github_client.py | 57 ++++++++++++++++++++++++++----------- 2 files changed, 47 insertions(+), 20 deletions(-) diff --git a/src/core/github_client.py b/src/core/github_client.py index 3ac8cf1..c215b79 100644 --- a/src/core/github_client.py +++ b/src/core/github_client.py @@ -25,14 +25,16 @@ def get_recent_issues( state = "all" if apply_to_closed else "open" all_issues = repo.get_issues( - state=state, - sort="created", - direction="desc", - labels=required_labels if required_labels else None, + state=state, sort="created", direction="desc", since=date_threshold ) recent_issues = [] + required_labels = set(required_labels or []) + for issue in all_issues: + if required_labels: + if not any(label.name in required_labels for label in issue.labels): + continue if issue.created_at >= date_threshold and not issue.pull_request: recent_issues.append(issue) if len(recent_issues) >= limit: diff --git a/tests/test_github_client.py b/tests/test_github_client.py index 5cb2508..def98c6 100644 --- a/tests/test_github_client.py +++ b/tests/test_github_client.py @@ -1,5 +1,5 @@ import datetime -from unittest.mock import MagicMock, Mock, patch +from unittest.mock import ANY, MagicMock, Mock, patch import pytest @@ -75,33 +75,64 @@ def test_get_recent_issues_with_labels(): mock_github = Mock() mock_repo = Mock() + # Labels + enhancement_label = Mock() + enhancement_label.name = "enhancement" + bug_label = Mock() + bug_label.name = "bug" + # Create mock issues mock_issue1 = Mock() mock_issue1.created_at = datetime.datetime.now() mock_issue1.pull_request = None + mock_issue1.labels = [enhancement_label, bug_label] + + mock_issue2 = Mock() + mock_issue2.created_at = datetime.datetime.now() + mock_issue2.pull_request = None + mock_issue2.labels = [bug_label] + + mock_issue3 = Mock() + mock_issue3.created_at = datetime.datetime.now() + mock_issue3.pull_request = None + mock_issue3.labels = [enhancement_label] - mock_repo.get_issues.return_value = [mock_issue1] + mock_issue4 = Mock() + mock_issue4.created_at = datetime.datetime.now() + mock_issue4.pull_request = None + mock_issue4.labels = [] + + mock_repo.get_issues.return_value = [mock_issue1, mock_issue2, mock_issue3, mock_issue4] with patch("src.core.github_client.Github", return_value=mock_github): client = GitHubClient("valid-token") # Test with single label - client.get_recent_issues(mock_repo, required_labels=["bug"]) + issues = client.get_recent_issues(mock_repo, required_labels=["bug"]) + mock_repo.get_issues.assert_called_with( + state="open", sort="created", direction="desc", since=ANY + ) + assert len(issues) == 2 + + issues = client.get_recent_issues(mock_repo, required_labels=["enhancement"]) mock_repo.get_issues.assert_called_with( - state="open", sort="created", direction="desc", labels=["bug"] + state="open", sort="created", direction="desc", since=ANY ) + assert len(issues) == 2 # Test with multiple labels - client.get_recent_issues(mock_repo, required_labels=["bug", "enhancement"]) + issues = client.get_recent_issues(mock_repo, required_labels=["bug", "enhancement"]) mock_repo.get_issues.assert_called_with( - state="open", sort="created", direction="desc", labels=["bug", "enhancement"] + state="open", sort="created", direction="desc", since=ANY ) + assert len(issues) == 3 # Test with no labels - client.get_recent_issues(mock_repo, required_labels=[]) + issues = client.get_recent_issues(mock_repo, required_labels=[]) mock_repo.get_issues.assert_called_with( - state="open", sort="created", direction="desc", labels=None + state="open", sort="created", direction="desc", since=ANY ) + assert len(issues) == 4 def test_get_recent_issues_with_apply_to_closed(): @@ -112,20 +143,14 @@ def test_get_recent_issues_with_apply_to_closed(): github_client.get_recent_issues(mock_repo, days_to_scan=7, limit=100) mock_repo.get_issues.assert_called_with( - state="open", - sort="created", - direction="desc", - labels=None, + state="open", sort="created", direction="desc", since=ANY ) mock_repo.get_issues.reset_mock() github_client.get_recent_issues(mock_repo, days_to_scan=7, limit=100, apply_to_closed=True) mock_repo.get_issues.assert_called_with( - state="all", - sort="created", - direction="desc", - labels=None, + state="all", sort="created", direction="desc", since=ANY )