Skip to content

Commit 1ce43eb

Browse files
authored
Don't let requirements checkers claim the review (#413)
1 parent a3c0560 commit 1ce43eb

3 files changed

Lines changed: 82 additions & 5 deletions

File tree

app/controllers/admin/reviews_controller.rb

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,8 @@ def leaderboard
8686
def show
8787
authorize @project, :review_screen?
8888

89-
@session = ensure_session(@project) if @project.pending?
89+
can_review = policy(@project).review?
90+
@session = ensure_session(@project) if @project.pending? && can_review
9091
concurrent = concurrent_active_reviewers(@project)
9192
claim = claim_state(@project)
9293
next_pending_id = next_in_queue(@project)
@@ -107,9 +108,9 @@ def show
107108
slack_id: current_user.slack_id
108109
},
109110
can: {
110-
review: policy(@project).review?,
111+
review: can_review,
111112
requirements_check: policy(@project).requirements_check?,
112-
claim: claim[:locked_by].nil? || current_user.superadmin?
113+
claim: !can_review || claim[:locked_by].nil? || current_user.superadmin?
113114
},
114115
claim: claim,
115116
session_stats: current_user.superadmin? ? session_stats(@project) : nil,
@@ -217,7 +218,7 @@ def claim_state(project)
217218
avatar: holder.reviewer.avatar,
218219
since: holder.started_at.iso8601
219220
},
220-
can_take_over: current_user.superadmin?
221+
can_take_over: current_user.superadmin? && policy(project).review?
221222
}
222223
end
223224
end

app/javascript/pages/Admin/Reviews/Show.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -685,7 +685,7 @@ export default function AdminReviewsShow({
685685
unflagging={unflagging}
686686
/>
687687
)}
688-
{claim.locked_by ? (
688+
{claim.locked_by && !requirementsOnly ? (
689689
<ClaimBanner claim={claim} onTakeOver={takeOver} takingOver={takingOver} />
690690
) : (
691691
<ConcurrentReviewersBanner reviewers={concurrent_reviewers} />
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
require "test_helper"
2+
3+
class Admin::ReviewsRequirementsClaimTest < ActionDispatch::IntegrationTest
4+
def make_user(attrs = {})
5+
token = SecureRandom.hex(6)
6+
User.create!({
7+
avatar: "avatar",
8+
display_name: "User #{token}",
9+
email: "#{token}@example.com",
10+
timezone: "UTC",
11+
slack_id: "S#{token}",
12+
hca_id: "H#{token}",
13+
roles: [ "user" ]
14+
}.merge(attrs))
15+
end
16+
17+
def sign_in_as(user)
18+
original = User.method(:exchange_hca_token)
19+
User.define_singleton_method(:exchange_hca_token) { |*_| user }
20+
get hca_callback_path, params: { code: "x" }
21+
ensure
22+
User.define_singleton_method(:exchange_hca_token, original)
23+
end
24+
25+
setup do
26+
@checker = make_user(roles: %w[user reviewer], permissions: %w[review_requirements], birthday: Date.new(2008, 1, 1))
27+
@project = Project.create!(
28+
user: make_user,
29+
name: "Needs A Requirements Check",
30+
tier: "tier_2",
31+
status: :pending,
32+
submitted_at: 1.hour.ago
33+
)
34+
end
35+
36+
test "requirements checker opening a review does not claim it" do
37+
sign_in_as(@checker)
38+
39+
assert_no_difference "ReviewSession.count" do
40+
get admin_review_path(@project)
41+
end
42+
assert_response :success
43+
end
44+
45+
test "a tier reviewer opening a review still claims it" do
46+
reviewer = make_user(roles: %w[user reviewer], permissions: User::ROLE_DEFAULT_PERMISSIONS["reviewer"], birthday: Date.new(2008, 1, 1))
47+
sign_in_as(reviewer)
48+
49+
assert_difference "ReviewSession.count", 1 do
50+
get admin_review_path(@project)
51+
end
52+
assert_response :success
53+
end
54+
55+
test "requirements checker can still act while a reviewer holds the claim" do
56+
reviewer = make_user(roles: %w[user reviewer], permissions: User::ROLE_DEFAULT_PERMISSIONS["reviewer"], birthday: Date.new(2008, 1, 1))
57+
ReviewSession.create!(project: @project, reviewer: reviewer, started_at: Time.current, last_heartbeat_at: Time.current)
58+
59+
sign_in_as(@checker)
60+
get admin_review_path(@project)
61+
62+
assert_equal true, inertia.props[:can][:claim]
63+
assert_equal false, inertia.props[:claim][:can_take_over]
64+
end
65+
66+
test "requirements checker cannot take over a claim" do
67+
reviewer = make_user(roles: %w[user reviewer], permissions: User::ROLE_DEFAULT_PERMISSIONS["reviewer"], birthday: Date.new(2008, 1, 1))
68+
ReviewSession.create!(project: @project, reviewer: reviewer, started_at: Time.current, last_heartbeat_at: Time.current)
69+
70+
sign_in_as(@checker)
71+
post admin_claim_review_path(@project)
72+
73+
assert_redirected_to root_path
74+
assert ReviewSession.active.for_project(@project).exists?(reviewer_id: reviewer.id)
75+
end
76+
end

0 commit comments

Comments
 (0)