Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 8 additions & 4 deletions tools/ci/issue_claim.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,),
)
Expand Down Expand Up @@ -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)
Expand Down
29 changes: 27 additions & 2 deletions tools/ci/test_issue_claim.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand All @@ -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):
Expand Down Expand Up @@ -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,
Expand Down
Loading