class TestIssueHandler: def setup_class(self): self.issue = IssueHandler('fakerepo/doesnotexist', 1234) def test_urls(self): assert self.issue._url_issue == 'https://api.github.com/repos/fakerepo/doesnotexist/issues/1234' assert self.issue._url_issue_nonapi == 'https://github.com/fakerepo/doesnotexist/issues/1234' assert self.issue._url_labels == 'https://api.github.com/repos/fakerepo/doesnotexist/issues/1234/labels' assert self.issue._url_issue_comment == 'https://api.github.com/repos/fakerepo/doesnotexist/issues/1234/comments' assert self.issue._url_timeline == 'https://api.github.com/repos/fakerepo/doesnotexist/issues/1234/timeline' @pytest.mark.parametrize(('state', 'answer'), [('open', False), ('closed', True)]) def test_is_closed(self, state, answer): with patch('changebot.github.github_api.IssueHandler.json', new_callable=PropertyMock) as mock_json: # noqa mock_json.return_value = {'state': state} assert self.issue.is_closed is answer def test_missing_labels(self): with patch('changebot.github.github_api.IssueHandler.labels', new_callable=PropertyMock) as mock_issue_labels: # noqa mock_issue_labels.return_value = ['io.fits'] with patch('changebot.github.github_api.RepoHandler.get_all_labels' ) as mock_repo_labels: # noqa mock_repo_labels.return_value = ['io.fits', 'closed-by-bot'] # closed-by-bot label will be added to issue in POST missing_labels = self.issue._get_missing_labels( 'closed-by-bot') assert missing_labels == ['closed-by-bot'] # Desired labels do not exist in repo missing_labels = self.issue._get_missing_labels( ['dummy', 'foo']) assert missing_labels is None # Desired label already set on issue missing_labels = self.issue._get_missing_labels(['io.fits']) assert missing_labels is None # A mix missing_labels = self.issue._get_missing_labels( ['io.fits', 'closed-by-bot', 'foo']) assert missing_labels == ['closed-by-bot']
def setup_class(self): self.issue = IssueHandler('fakerepo/doesnotexist', 1234)
def process_issues(repository, installation): now = time.time() # Get issues labeled as 'Close?' repo = RepoHandler(repository, 'master', installation) issuelist = repo.get_issues('open', 'Close?') for n in issuelist: print(f'Checking {n}') issue = IssueHandler(repository, n, installation) labeled_time = issue.get_label_added_date('Close?') if labeled_time is None: continue dt = now - labeled_time if current_app.stale_issue_close and dt > current_app.stale_issue_close_seconds: comment_ids = issue.find_comments('astropy-bot[bot]', filter_keep=is_close_epilogue) if len(comment_ids) == 0: print(f'-> CLOSING issue {n}') issue.submit_comment(ISSUE_CLOSE_EPILOGUE) issue.close() else: print(f'-> Skipping issue {n} (already closed)') elif dt > current_app.stale_issue_warn_seconds: comment_ids = issue.find_comments('astropy-bot[bot]', filter_keep=is_close_warning) if len(comment_ids) == 0: print(f'-> WARNING issue {n}') issue.submit_comment( ISSUE_CLOSE_WARNING.format( pasttime=naturaltime(dt), futuretime=naturaldelta( current_app.stale_issue_close_seconds - current_app.stale_issue_warn_seconds))) else: print(f'-> Skipping issue {n} (already warned)') else: print(f'-> OK issue {n}')