diff --git a/tools/ci/issue_claim.py b/tools/ci/issue_claim.py index 4da1a381ae9..d077c13a480 100644 --- a/tools/ci/issue_claim.py +++ b/tools/ci/issue_claim.py @@ -228,12 +228,14 @@ def get_permission(self, repository, actor): return {} raise - def can_assign(self, repository, actor): + def can_assign(self, repository, issue_number, actor): try: self.request( "GET", - "{}/assignees/{}".format( - self._repository_path(repository), quote(actor, safe="") + "{}/issues/{}/assignees/{}".format( + self._repository_path(repository), + issue_number, + quote(actor, safe=""), ), expected=(204,), ) @@ -462,7 +464,9 @@ def handle_claim(client, context, comments): post_result(client, context, rejection_message("claim", latest)) return "race_{}".format(latest.reason) - assignable = client.can_assign(context.repository, context.actor) + assignable = client.can_assign( + context.repository, context.issue_number, context.actor + ) if assignable: client.add_assignees(context.repository, context.issue_number, (context.actor,)) confirmed_issue = client.get_issue(context.repository, context.issue_number) diff --git a/tools/ci/test_issue_claim.py b/tools/ci/test_issue_claim.py index 9aa265bbdcb..cdda0ac8a8d 100644 --- a/tools/ci/test_issue_claim.py +++ b/tools/ci/test_issue_claim.py @@ -75,8 +75,8 @@ def get_permission(self, repository, actor): self.calls.append(("get_permission", repository, actor)) return self.permission - def can_assign(self, repository, actor): - self.calls.append(("can_assign", repository, actor)) + def can_assign(self, repository, issue_number, actor): + self.calls.append(("can_assign", repository, issue_number, actor)) return self.assignable def get_label(self, repository, label): @@ -91,6 +91,28 @@ def remove_label(self, repository, issue_number, label): class ClientTests(unittest.TestCase): + def test_assignability_is_checked_for_specific_issue(self): + class RecordingClient(issue_claim.GitHubClient): + def __init__(self): + self.call = None + + def request(self, *args, **kwargs): + self.call = (args, kwargs) + + client = RecordingClient() + + self.assertTrue( + client.can_assign("RT-Thread/rt-thread", 42, "external-user") + ) + self.assertEqual( + client.call[0], + ( + "GET", + "/repos/RT-Thread/rt-thread/issues/42/assignees/external-user", + ), + ) + self.assertEqual(client.call[1]["expected"], (204,)) + def test_comment_creation_disables_automatic_retries(self): class RecordingClient(issue_claim.GitHubClient): def __init__(self): @@ -254,6 +276,9 @@ def test_successful_claim_rechecks_and_confirms_state(self): result = issue_claim.handle_event(make_event(), client) self.assertEqual(result, "claimed") + self.assertIn( + ("can_assign", "RT-Thread/rt-thread", 42, "alice"), client.calls + ) self.assertIn( ("add_assignees", "RT-Thread/rt-thread", 42, ("alice",)), client.calls,