diff --git a/issue_metrics.py b/issue_metrics.py index 77e02e0..e1ff563 100644 --- a/issue_metrics.py +++ b/issue_metrics.py @@ -22,10 +22,11 @@ import shutil import sys -from typing import List, Union from time import sleep +from typing import List, Union import github3 +import github3.structs from auth import auth_to_github, get_github_app_installation_token from classes import IssueWithMetrics from config import EnvVars, get_env_vars @@ -64,22 +65,19 @@ def search_issues( List[github3.search.IssueSearchResult]: A list of issues that match the search query. """ - def wait_for_GH_api_refresh(iterator): + def wait_for_api_refresh(iterator: github3.structs.SearchIterator): # Rate Limit Handling: API only allows 30 requests per minute while iterator.ratelimit_remaining < 5: - print( - "Github API Rate Limit Low, waiting 1 minute to refresh" - ) + print("Github API Rate Limit Low, waiting 1 minute to refresh") sleep(65) - ISSUES_PER_PAGE = 100 + issues_per_page = 100 print("Searching for issues...") issues_iterator = github_connection.search_issues( - search_query, per_page=ISSUES_PER_PAGE + search_query, per_page=issues_per_page ) - wait_for_GH_api_refresh(issues_iterator) - + wait_for_api_refresh(issues_iterator) issues = [] repos_and_owners_string = "" @@ -93,8 +91,9 @@ def wait_for_GH_api_refresh(iterator): issues.append(issue) # requests are sent once per page of issues - if idx % ISSUES_PER_PAGE == 0: - wait_for_GH_api_refresh(issues_iterator) + if idx % issues_per_page == 0: + wait_for_api_refresh(issues_iterator) + except github3.exceptions.ForbiddenError: print( f"You do not have permission to view a repository from: '{repos_and_owners_string}'; Check your API Token." diff --git a/test_issue_metrics.py b/test_issue_metrics.py index 1d41d3b..a0bb3e9 100644 --- a/test_issue_metrics.py +++ b/test_issue_metrics.py @@ -42,13 +42,20 @@ class TestSearchIssues(unittest.TestCase): def test_search_issues(self): """Test that search_issues returns the correct issues.""" + # Set up the mock GitHub connection object - mock_connection = MagicMock() mock_issues = [ MagicMock(title="Issue 1"), MagicMock(title="Issue 2"), ] - mock_connection.search_issues.return_value = mock_issues + + # simulating github3.structs.SearchIterator return value + mock_search_result = MagicMock() + mock_search_result.__iter__.return_value = iter(mock_issues) + mock_search_result.ratelimit_remaining = 30 + + mock_connection = MagicMock() + mock_connection.search_issues.return_value = mock_search_result # Call search_issues and check that it returns the correct issues repo_with_owner = {"owner": "owner1", "repository": "repo1"}