55from ietf .doc .factories import WgDraftFactory
66from ietf .group .factories import ReviewTeamFactory
77from ietf .group .models import Group , Role
8- from ietf .review .factories import ReviewAssignmentFactory
8+ from ietf .person .models import Email
9+ from ietf .review .factories import ReviewAssignmentFactory , ReviewRequestFactory
910from ietf .review .models import ReviewerSettings , NextReviewerInTeam , UnavailablePeriod , \
10- ReviewRequest
11- from ietf .review .policies import get_reviewer_queue_policy
11+ ReviewRequest , ReviewWish
12+ from ietf .review .policies import get_reviewer_queue_policy , AssignmentOrderResolver
1213from ietf .utils .test_data import create_person
1314from ietf .utils .test_utils import TestCase
1415
@@ -49,6 +50,14 @@ def test_default_reviewer_rotation_list(self):
4950 rotation = policy .default_reviewer_rotation_list ()
5051 self .assertNotIn (unavailable_reviewer , rotation )
5152 self .assertEqual (rotation , reviewers [2 :] + reviewers [:1 ])
53+
54+ def test_recommended_assignment_order (self ):
55+ team = ReviewTeamFactory (acronym = "rotationteam" , name = "Review Team" , list_email = "rotationteam@ietf.org" , parent = Group .objects .get (acronym = "farfut" ))
56+ policy = get_reviewer_queue_policy (team )
57+
58+ reviewer_high = create_person (team , "reviewer" , name = "Test Reviewer-high" , username = "testreviewerhigh" )
59+ reviewer_low = create_person (team , "reviewer" , name = "Test Reviewer-low" , username = "testreviewerlow" )
60+
5261
5362 def test_update_policy_state_for_assignment (self ):
5463
@@ -137,4 +146,48 @@ def get_skip_next(person):
137146 self .assertEqual (get_skip_next (reviewers [1 ]), 1 )
138147 self .assertEqual (get_skip_next (reviewers [2 ]), 0 )
139148 self .assertEqual (get_skip_next (reviewers [3 ]), 0 )
140- self .assertEqual (get_skip_next (reviewers [4 ]), 0 )
149+ self .assertEqual (get_skip_next (reviewers [4 ]), 0 )
150+
151+
152+ class AssignmentOrderResolverTests (TestCase ):
153+ def test_determine_ranking (self ):
154+ # reviewer_high is second in the default rotation, reviewer_low is first
155+ # however, reviewer_high hits every score increase, reviewer_low hits every score decrease
156+ team = ReviewTeamFactory (acronym = "rotationteam" , name = "Review Team" , list_email = "rotationteam@ietf.org" , parent = Group .objects .get (acronym = "farfut" ))
157+ reviewer_high = create_person (team , "reviewer" , name = "Test Reviewer-high" , username = "testreviewerhigh" )
158+ reviewer_low = create_person (team , "reviewer" , name = "Test Reviewer-low" , username = "testreviewerlow" )
159+
160+ # Trigger author check, AD check and group check
161+ doc = WgDraftFactory (group__acronym = 'mars' , rev = '01' , authors = [reviewer_low ], ad_id = reviewer_low .pk , shepherd = reviewer_low )
162+ Role .objects .create (group = doc .group , person = reviewer_low , email = reviewer_low .email (), name_id = 'advisor' )
163+
164+ review_req = ReviewRequestFactory (doc = doc , team = team , type_id = 'early' , state_id = 'assigned' )
165+ rotation_list = [reviewer_low , reviewer_high ]
166+
167+ # Trigger previous review check and completed review stats - TODO: something something related documents
168+ ReviewAssignmentFactory (review_request__team = team , review_request__doc = doc , reviewer = reviewer_high .email (), state_id = 'completed' )
169+ # Trigger other review stats
170+ ReviewAssignmentFactory (review_request__team = team , review_request__doc = doc , reviewer = reviewer_high .email (), state_id = 'no-response' )
171+ ReviewAssignmentFactory (review_request__team = team , review_request__doc = doc , reviewer = reviewer_high .email (), state_id = 'part-completed' )
172+ # Trigger review wish check
173+ ReviewWish .objects .create (team = team , doc = doc , person = reviewer_high )
174+
175+ # Trigger max frequency and open review stats
176+ ReviewAssignmentFactory (review_request__team = team , reviewer = reviewer_low .email (), state_id = 'assigned' , review_request__doc__pages = 10 )
177+ # Trigger skip_next, max frequency and filter_re
178+ ReviewerSettings .objects .create (
179+ team = team ,
180+ person = reviewer_low ,
181+ filter_re = '.*draft.*' ,
182+ skip_next = 2 ,
183+ min_interval = 91 ,
184+ )
185+
186+ order = AssignmentOrderResolver (Email .objects .all (), review_req , rotation_list )
187+ ranking = order .determine_ranking ()
188+ self .assertEqual (ranking [0 ]['email' ], reviewer_high .email ())
189+ self .assertEqual (ranking [1 ]['email' ], reviewer_low .email ())
190+ self .assertEqual (ranking [0 ]['scores' ], [ 1 , 1 , 1 , 1 , 0 , 0 , - 1 ])
191+ self .assertEqual (ranking [1 ]['scores' ], [- 1 , - 1 , - 1 , - 1 , - 91 , - 2 , 0 ])
192+ self .assertEqual (ranking [0 ]['label' ], 'Test Reviewer-high: reviewed document before; wishes to review document; #2; 1 no response, 1 partially complete, 1 fully completed' )
193+ self .assertEqual (ranking [1 ]['label' ], 'Test Reviewer-low: is author of document; filter regexp matches; max frequency exceeded, ready in 91 days; skip next 2; #1; currently 1 open, 10 pages' )
0 commit comments