@@ -153,7 +153,73 @@ def find_event(t):
153153 r = self .client .post (url , dict (charter_state = str (State .objects .get (used = True ,type = "charter" ,slug = "intrev" ).pk ), message = "test" ))
154154 self .assertEqual (r .status_code , 302 )
155155 self .assertTrue ("A new charter" in outbox [- 3 ].get_payload ())
156-
156+
157+ def test_already_open_charter_ballot (self ):
158+ # make sure the right thing happens to the charter ballots as the Secretariat
159+ # does the unusual state sequence of: intrev --> extrev --> intrev
160+ make_test_data ()
161+
162+ group = Group .objects .get (acronym = "ames" )
163+ charter = group .charter
164+
165+ url = urlreverse ('ietf.doc.views_charter.change_state' , kwargs = dict (name = charter .name ))
166+ login_testing_unauthorized (self , "secretary" , url )
167+
168+ # get the charter state change page
169+ r = self .client .get (url )
170+ self .assertEqual (r .status_code , 200 )
171+
172+ # put the charter in "intrev" state
173+ s = State .objects .get (used = True , type = "charter" , slug = "intrev" )
174+ r = self .client .post (url , dict (charter_state = str (s .pk ), message = "test message" ))
175+ self .assertEqual (r .status_code , 302 )
176+ self .assertEqual (charter .get_state_slug (), "intrev" )
177+ self .assertTrue (charter .ballot_open ("r-extrev" ))
178+
179+ events_before = charter .docevent_set .count ()
180+
181+ # get the charter state change page again
182+ r = self .client .get (url )
183+ self .assertEqual (r .status_code , 200 )
184+
185+ # put the charter in "extrev" state without closing the previous ballot
186+ s = State .objects .get (used = True , type = "charter" , slug = "extrev" )
187+ r = self .client .post (url , dict (charter_state = str (s .pk ), message = "test message" ))
188+ self .assertEqual (r .status_code , 302 )
189+ charter = Document .objects .get (name = "charter-ietf-%s" % group .acronym )
190+ self .assertEqual (charter .get_state_slug (), "extrev" )
191+ self .assertTrue (charter .ballot_open ("approve" ))
192+
193+ # make sure there is a closed_ballot event and a create_ballot event
194+ events_now = charter .docevent_set .count ()
195+ self .assertTrue (events_now > events_before )
196+
197+ def find_event (t ):
198+ return [e for e in charter .docevent_set .all ()[:events_now - events_before ] if e .type == t ]
199+
200+ self .assertTrue (find_event ("closed_ballot" ))
201+ self .assertTrue (find_event ("created_ballot" ))
202+
203+ events_before = events_now
204+
205+ # get the charter state change page for a third time
206+ r = self .client .get (url )
207+ self .assertEqual (r .status_code , 200 )
208+
209+ # put the charter back in "intrev" state without closing the previous ballot
210+ s = State .objects .get (used = True , type = "charter" , slug = "intrev" )
211+ r = self .client .post (url , dict (charter_state = str (s .pk ), message = "test message" ))
212+ self .assertEqual (r .status_code , 302 )
213+ charter = Document .objects .get (name = "charter-ietf-%s" % group .acronym )
214+ self .assertEqual (charter .get_state_slug (), "intrev" )
215+ self .assertTrue (charter .ballot_open ("r-extrev" ))
216+
217+ # make sure there is a closed_ballot event and a create_ballot event
218+ events_now = charter .docevent_set .count ()
219+ self .assertTrue (events_now > events_before )
220+ self .assertTrue (find_event ("closed_ballot" ))
221+ self .assertTrue (find_event ("created_ballot" ))
222+
157223 def test_edit_telechat_date (self ):
158224 make_test_data ()
159225
0 commit comments