11# Copyright The IETF Trust 2016-2019, All Rights Reserved
22
3- import datetime
4-
53from ietf .doc .factories import WgDraftFactory
64from ietf .group .factories import ReviewTeamFactory
75from ietf .group .models import Group , Role
86from ietf .person .fields import PersonEmailChoiceField
97from ietf .person .models import Email
108from ietf .review .factories import ReviewAssignmentFactory , ReviewRequestFactory
11- from ietf .review .models import ReviewerSettings , NextReviewerInTeam , UnavailablePeriod , \
12- ReviewRequest , ReviewWish
9+ from ietf .review .models import ReviewerSettings , NextReviewerInTeam , UnavailablePeriod , ReviewWish
1310from ietf .review .policies import get_reviewer_queue_policy , AssignmentOrderResolver
1411from ietf .utils .test_data import create_person
1512from ietf .utils .test_utils import TestCase
@@ -99,7 +96,6 @@ def test_recommended_assignment_order(self):
9996 def test_update_policy_state_for_assignment (self ):
10097 team = ReviewTeamFactory (acronym = "rotationteam" , name = "Review Team" , list_email = "rotationteam@ietf.org" , parent = Group .objects .get (acronym = "farfut" ))
10198 policy = get_reviewer_queue_policy (team )
102- doc = WgDraftFactory ()
10399
104100 # make a bunch of reviewers
105101 reviewers = [
@@ -109,81 +105,66 @@ def test_update_policy_state_for_assignment(self):
109105
110106 self .assertEqual (reviewers , policy .default_reviewer_rotation_list ())
111107
108+ def reviewer_settings_for (person ):
109+ return (ReviewerSettings .objects .filter (team = team , person = person ).first ()
110+ or ReviewerSettings (team = team , person = person ))
111+
112112 def get_skip_next (person ):
113- settings = (ReviewerSettings .objects .filter (team = team , person = person ).first ()
114- or ReviewerSettings (team = team ))
115- return settings .skip_next
113+ return reviewer_settings_for (person ).skip_next
116114
117- policy .update_policy_state_for_assignment (assignee_person_id = reviewers [0 ].pk , add_skip = False )
115+ # Regular in-order assignment without skips
116+ policy .update_policy_state_for_assignment (assignee_person = reviewers [0 ], add_skip = False )
118117 self .assertEqual (NextReviewerInTeam .objects .get (team = team ).next_reviewer , reviewers [1 ])
119118 self .assertEqual (get_skip_next (reviewers [0 ]), 0 )
120119 self .assertEqual (get_skip_next (reviewers [1 ]), 0 )
121-
122- policy .update_policy_state_for_assignment (assignee_person_id = reviewers [1 ].pk , add_skip = True )
123- self .assertEqual (NextReviewerInTeam .objects .get (team = team ).next_reviewer , reviewers [2 ])
124- self .assertEqual (get_skip_next (reviewers [1 ]), 1 )
125- self .assertEqual (get_skip_next (reviewers [2 ]), 0 )
126-
127- # skip reviewer 2
128- policy .update_policy_state_for_assignment (assignee_person_id = reviewers [3 ].pk , add_skip = True )
129- self .assertEqual (NextReviewerInTeam .objects .get (team = team ).next_reviewer , reviewers [2 ])
130- self .assertEqual (get_skip_next (reviewers [0 ]), 0 )
131- self .assertEqual (get_skip_next (reviewers [1 ]), 1 )
132- self .assertEqual (get_skip_next (reviewers [2 ]), 0 )
133- self .assertEqual (get_skip_next (reviewers [3 ]), 1 )
134-
135- # pick reviewer 2, use up reviewer 3's skip_next
136- policy .update_policy_state_for_assignment (assignee_person_id = reviewers [2 ].pk , add_skip = False )
137- self .assertEqual (NextReviewerInTeam .objects .get (team = team ).next_reviewer , reviewers [4 ])
138- self .assertEqual (get_skip_next (reviewers [0 ]), 0 )
139- self .assertEqual (get_skip_next (reviewers [1 ]), 1 )
140- self .assertEqual (get_skip_next (reviewers [2 ]), 0 )
141- self .assertEqual (get_skip_next (reviewers [3 ]), 0 )
142- self .assertEqual (get_skip_next (reviewers [4 ]), 0 )
143-
144- # check wrap-around
145- policy .update_policy_state_for_assignment (assignee_person_id = reviewers [4 ].pk )
146- self .assertEqual (NextReviewerInTeam .objects .get (team = team ).next_reviewer , reviewers [0 ])
147- self .assertEqual (get_skip_next (reviewers [0 ]), 0 )
148- self .assertEqual (get_skip_next (reviewers [1 ]), 1 )
149120 self .assertEqual (get_skip_next (reviewers [2 ]), 0 )
150121 self .assertEqual (get_skip_next (reviewers [3 ]), 0 )
151122 self .assertEqual (get_skip_next (reviewers [4 ]), 0 )
152123
153- # unavailable
154- today = datetime .date .today ()
155- UnavailablePeriod .objects .create (team = team , person = reviewers [1 ], start_date = today , end_date = today , availability = "unavailable" )
156- policy .update_policy_state_for_assignment (assignee_person_id = reviewers [0 ].pk )
124+ # In-order assignment with add_skip
125+ policy .update_policy_state_for_assignment (assignee_person = reviewers [1 ], add_skip = True )
157126 self .assertEqual (NextReviewerInTeam .objects .get (team = team ).next_reviewer , reviewers [2 ])
158127 self .assertEqual (get_skip_next (reviewers [0 ]), 0 )
159- self .assertEqual (get_skip_next (reviewers [1 ]), 1 ) # don't consume that skip while the reviewer is unavailable
128+ self .assertEqual (get_skip_next (reviewers [1 ]), 1 ) # from current add_skip=True
160129 self .assertEqual (get_skip_next (reviewers [2 ]), 0 )
161130 self .assertEqual (get_skip_next (reviewers [3 ]), 0 )
162131 self .assertEqual (get_skip_next (reviewers [4 ]), 0 )
163132
164- # pick unavailable anyway
165- policy .update_policy_state_for_assignment (assignee_person_id = reviewers [1 ].pk , add_skip = False )
166- self .assertEqual (NextReviewerInTeam .objects .get (team = team ).next_reviewer , reviewers [2 ])
133+ # In-order assignment to 2, but 3 has a skip_next, so 4 should be assigned.
134+ # 3 has skip_next decreased as it is skipped over, 1 retains its skip_next
135+ reviewer3_settings = reviewer_settings_for (reviewers [3 ])
136+ reviewer3_settings .skip_next = 2
137+ reviewer3_settings .save ()
138+ policy .update_policy_state_for_assignment (assignee_person = reviewers [2 ], add_skip = False )
139+ self .assertEqual (NextReviewerInTeam .objects .get (team = team ).next_reviewer , reviewers [4 ])
167140 self .assertEqual (get_skip_next (reviewers [0 ]), 0 )
168- self .assertEqual (get_skip_next (reviewers [1 ]), 1 )
141+ self .assertEqual (get_skip_next (reviewers [1 ]), 1 ) # from previous add_skip=true
169142 self .assertEqual (get_skip_next (reviewers [2 ]), 0 )
170- self .assertEqual (get_skip_next (reviewers [3 ]), 0 )
143+ self .assertEqual (get_skip_next (reviewers [3 ]), 1 ) # from manually set skip_next - 1
171144 self .assertEqual (get_skip_next (reviewers [4 ]), 0 )
172145
173- # not through min_interval so advance past reviewer[2]
174- settings , _ = ReviewerSettings .objects .get_or_create (team = team , person = reviewers [2 ])
175- settings .min_interval = 30
176- settings .save ()
177- req = ReviewRequest .objects .create (team = team , doc = doc , type_id = "early" , state_id = "assigned" , deadline = today , requested_by = reviewers [0 ])
178- ReviewAssignmentFactory (review_request = req , state_id = "accepted" , reviewer = reviewers [2 ].email_set .first (),assigned_on = req .time )
179- policy .update_policy_state_for_assignment (assignee_person_id = reviewers [3 ].pk )
146+ # Out of order assignments, nothing should change,
147+ # except the add_skip=True should still apply
148+ policy .update_policy_state_for_assignment (assignee_person = reviewers [3 ], add_skip = False )
149+ policy .update_policy_state_for_assignment (assignee_person = reviewers [2 ], add_skip = False )
150+ policy .update_policy_state_for_assignment (assignee_person = reviewers [1 ], add_skip = False )
151+ policy .update_policy_state_for_assignment (assignee_person = reviewers [0 ], add_skip = True )
180152 self .assertEqual (NextReviewerInTeam .objects .get (team = team ).next_reviewer , reviewers [4 ])
181- self .assertEqual (get_skip_next (reviewers [0 ]), 0 )
153+ self .assertEqual (get_skip_next (reviewers [0 ]), 1 ) # from current add_skip=True
182154 self .assertEqual (get_skip_next (reviewers [1 ]), 1 )
183155 self .assertEqual (get_skip_next (reviewers [2 ]), 0 )
184- self .assertEqual (get_skip_next (reviewers [3 ]), 0 )
156+ self .assertEqual (get_skip_next (reviewers [3 ]), 1 )
185157 self .assertEqual (get_skip_next (reviewers [4 ]), 0 )
186158
159+ # Regular assignment, testing wrap-around
160+ policy .update_policy_state_for_assignment (assignee_person = reviewers [4 ], add_skip = False )
161+ self .assertEqual (NextReviewerInTeam .objects .get (team = team ).next_reviewer , reviewers [2 ])
162+ self .assertEqual (get_skip_next (reviewers [0 ]), 0 ) # skipped over with this assignment
163+ self .assertEqual (get_skip_next (reviewers [1 ]), 0 ) # skipped over with this assignment
164+ self .assertEqual (get_skip_next (reviewers [2 ]), 0 )
165+ self .assertEqual (get_skip_next (reviewers [3 ]), 1 )
166+ self .assertEqual (get_skip_next (reviewers [4 ]), 0 )
167+
187168
188169class AssignmentOrderResolverTests (TestCase ):
189170 def test_determine_ranking (self ):
0 commit comments