Skip to content

Commit 83df1fd

Browse files
committed
Take RotationMode into account when performing reviews using [review_prefs]
1 parent 63a622c commit 83df1fd

File tree

2 files changed

+64
-10
lines changed

2 files changed

+64
-10
lines changed

src/handlers/assign.rs

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -998,20 +998,22 @@ async fn candidate_reviewers_from_names<'a>(
998998
let username = username?;
999999

10001000
// If no review prefs were found, we assume the default unlimited
1001-
// review capacity.
1001+
// review capacity and being on rotation.
10021002
let Some(review_prefs) = review_prefs.get(username.as_str()) else {
10031003
return Ok(username);
10041004
};
1005-
let Some(capacity) = review_prefs.max_assigned_prs else {
1006-
return Ok(username);
1007-
};
1008-
let assigned_prs = workqueue.assigned_pr_count(review_prefs.user_id as UserId);
1009-
// Can we assign one more PR?
1010-
if (assigned_prs as i32) < capacity {
1011-
Ok(username)
1012-
} else {
1013-
Err(FindReviewerError::ReviewerAtMaxCapacity { username })
1005+
if let Some(capacity) = review_prefs.max_assigned_prs {
1006+
let assigned_prs = workqueue.assigned_pr_count(review_prefs.user_id as UserId);
1007+
// Is the reviewer at max capacity?
1008+
if (assigned_prs as i32) >= capacity {
1009+
return Err(FindReviewerError::ReviewerAtMaxCapacity { username });
1010+
}
1011+
}
1012+
if review_prefs.rotation_mode == RotationMode::OffRotation {
1013+
return Err(FindReviewerError::ReviewerOffRotation { username });
10141014
}
1015+
1016+
return Ok(username);
10151017
})
10161018
.collect();
10171019
}

src/handlers/assign/tests/tests_candidates.rs

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,58 @@ async fn unlimited_capacity() {
243243
.await;
244244
}
245245

246+
#[tokio::test]
247+
async fn ignore_user_off_rotation_direct() {
248+
run_db_test(|ctx| async move {
249+
let user = user("martin", 1);
250+
review_prefs_test(ctx)
251+
.set_review_prefs(&user, None, RotationMode::OffRotation)
252+
.await
253+
.check(
254+
&["martin"],
255+
Err(FindReviewerError::ReviewerOffRotation {
256+
username: "martin".to_string(),
257+
}),
258+
)
259+
.await
260+
})
261+
.await;
262+
}
263+
264+
#[tokio::test]
265+
async fn ignore_user_off_rotation_through_team() {
266+
run_db_test(|ctx| async move {
267+
let teams = toml::toml!(compiler = ["martin", "diana"]);
268+
let user = user("martin", 1);
269+
review_prefs_test(ctx)
270+
.teams(&teams)
271+
.set_review_prefs(&user, None, RotationMode::OffRotation)
272+
.await
273+
.check(&["compiler"], Ok(&["diana"]))
274+
.await
275+
})
276+
.await;
277+
}
278+
279+
#[tokio::test]
280+
async fn review_prefs_prefer_capacity_before_rotation() {
281+
run_db_test(|ctx| async move {
282+
let user = user("martin", 1);
283+
review_prefs_test(ctx)
284+
.set_review_prefs(&user, Some(1), RotationMode::OffRotation)
285+
.await
286+
.assign_prs(user.id, 2)
287+
.check(
288+
&["martin"],
289+
Err(FindReviewerError::ReviewerAtMaxCapacity {
290+
username: "martin".to_string(),
291+
}),
292+
)
293+
.await
294+
})
295+
.await;
296+
}
297+
246298
#[tokio::test]
247299
async fn multiple_reviewers() {
248300
run_db_test(|ctx| async move {

0 commit comments

Comments
 (0)