Skip to content

Commit cf58b26

Browse files
committed
[ci][issue] Fix external contributor assignment
1 parent 1edc46a commit cf58b26

2 files changed

Lines changed: 35 additions & 6 deletions

File tree

tools/ci/issue_claim.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -228,12 +228,14 @@ def get_permission(self, repository, actor):
228228
return {}
229229
raise
230230

231-
def can_assign(self, repository, actor):
231+
def can_assign(self, repository, issue_number, actor):
232232
try:
233233
self.request(
234234
"GET",
235-
"{}/assignees/{}".format(
236-
self._repository_path(repository), quote(actor, safe="")
235+
"{}/issues/{}/assignees/{}".format(
236+
self._repository_path(repository),
237+
issue_number,
238+
quote(actor, safe=""),
237239
),
238240
expected=(204,),
239241
)
@@ -462,7 +464,9 @@ def handle_claim(client, context, comments):
462464
post_result(client, context, rejection_message("claim", latest))
463465
return "race_{}".format(latest.reason)
464466

465-
assignable = client.can_assign(context.repository, context.actor)
467+
assignable = client.can_assign(
468+
context.repository, context.issue_number, context.actor
469+
)
466470
if assignable:
467471
client.add_assignees(context.repository, context.issue_number, (context.actor,))
468472
confirmed_issue = client.get_issue(context.repository, context.issue_number)

tools/ci/test_issue_claim.py

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,8 @@ def get_permission(self, repository, actor):
7575
self.calls.append(("get_permission", repository, actor))
7676
return self.permission
7777

78-
def can_assign(self, repository, actor):
79-
self.calls.append(("can_assign", repository, actor))
78+
def can_assign(self, repository, issue_number, actor):
79+
self.calls.append(("can_assign", repository, issue_number, actor))
8080
return self.assignable
8181

8282
def get_label(self, repository, label):
@@ -91,6 +91,28 @@ def remove_label(self, repository, issue_number, label):
9191

9292

9393
class ClientTests(unittest.TestCase):
94+
def test_assignability_is_checked_for_specific_issue(self):
95+
class RecordingClient(issue_claim.GitHubClient):
96+
def __init__(self):
97+
self.call = None
98+
99+
def request(self, *args, **kwargs):
100+
self.call = (args, kwargs)
101+
102+
client = RecordingClient()
103+
104+
self.assertTrue(
105+
client.can_assign("RT-Thread/rt-thread", 42, "external-user")
106+
)
107+
self.assertEqual(
108+
client.call[0],
109+
(
110+
"GET",
111+
"/repos/RT-Thread/rt-thread/issues/42/assignees/external-user",
112+
),
113+
)
114+
self.assertEqual(client.call[1]["expected"], (204,))
115+
94116
def test_comment_creation_disables_automatic_retries(self):
95117
class RecordingClient(issue_claim.GitHubClient):
96118
def __init__(self):
@@ -254,6 +276,9 @@ def test_successful_claim_rechecks_and_confirms_state(self):
254276
result = issue_claim.handle_event(make_event(), client)
255277

256278
self.assertEqual(result, "claimed")
279+
self.assertIn(
280+
("can_assign", "RT-Thread/rt-thread", 42, "alice"), client.calls
281+
)
257282
self.assertIn(
258283
("add_assignees", "RT-Thread/rt-thread", 42, ("alice",)),
259284
client.calls,

0 commit comments

Comments
 (0)