1414from ietf .meeting .helpers import can_approve_interim_request , can_view_interim_request
1515from ietf .meeting .helpers import send_interim_approval_request
1616from ietf .meeting .helpers import send_interim_cancellation_notice
17+ from ietf .meeting .helpers import send_interim_minutes_reminder
1718from ietf .meeting .models import Session , TimeSlot , Meeting
18- from ietf .meeting .test_data import make_meeting_test_data
19+ from ietf .meeting .test_data import make_meeting_test_data , make_interim_meeting
1920from ietf .name .models import SessionStatusName
2021from ietf .utils .test_utils import TestCase , login_testing_unauthorized , unicontent
2122from ietf .utils .mail import outbox
@@ -794,13 +795,45 @@ def test_interim_request_disapprove(self):
794795
795796 def test_interim_request_cancel (self ):
796797 make_meeting_test_data ()
797- meeting = Meeting .objects .filter (type = 'interim' ,session__status = 'apprw' ,session__group__acronym = 'mars' ).first ()
798- url = urlreverse ('ietf.meeting.views.interim_request_details' ,kwargs = {'number' :meeting .number })
799- login_testing_unauthorized (self ,"secretary" ,url )
800- r = self .client .post (url ,{'cancel' :'Cancel' })
798+ meeting = Meeting .objects .filter (type = 'interim' , session__status = 'apprw' , session__group__acronym = 'mars' ).first ()
799+ url = urlreverse ('ietf.meeting.views.interim_request_details' , kwargs = {'number' : meeting .number })
800+ # ensure no cancel button for unauthorized user
801+ self .client .login (username = "ameschairman" , password = "ameschairman+password" )
802+ r = self .client .get (url )
801803 self .assertEqual (r .status_code , 200 )
804+ q = PyQuery (r .content )
805+ self .assertEqual (len (q ("a.btn:contains('Cancel')" )),0 )
806+ # ensure cancel button for authorized user
807+ self .client .login (username = "marschairman" , password = "marschairman+password" )
808+ r = self .client .get (url )
809+ self .assertEqual (r .status_code , 200 )
810+ q = PyQuery (r .content )
811+ self .assertEqual (len (q ("a.btn:contains('Cancel')" )),1 )
812+ # ensure fail unauthorized
813+ url = urlreverse ('ietf.meeting.views.interim_request_cancel' , kwargs = {'number' : meeting .number })
814+ comments = 'Bob cannot make it'
815+ self .client .login (username = "ameschairman" , password = "ameschairman+password" )
816+ r = self .client .post (url , {'comments' : comments })
817+ self .assertEqual (r .status_code , 403 )
818+ # test cancelling before announcement
819+ self .client .login (username = "marschairman" , password = "marschairman+password" )
820+ length_before = len (outbox )
821+ r = self .client .post (url , {'comments' : comments })
822+ self .assertRedirects (r , urlreverse ('ietf.meeting.views.upcoming' ))
802823 for session in meeting .session_set .all ():
803- self .assertEqual (session .status_id ,'canceledpa' )
824+ self .assertEqual (session .status_id , 'canceledpa' )
825+ self .assertEqual (session .comments , comments )
826+ self .assertEqual (len (outbox ), length_before ) # no email notice
827+ # test cancelling after announcement
828+ meeting = Meeting .objects .filter (type = 'interim' , session__status = 'sched' , session__group__acronym = 'mars' ).first ()
829+ url = urlreverse ('ietf.meeting.views.interim_request_cancel' , kwargs = {'number' : meeting .number })
830+ r = self .client .post (url , {'comments' : comments })
831+ self .assertRedirects (r , urlreverse ('ietf.meeting.views.upcoming' ))
832+ for session in meeting .session_set .all ():
833+ self .assertEqual (session .status_id , 'canceled' )
834+ self .assertEqual (session .comments , comments )
835+ self .assertEqual (len (outbox ), length_before + 1 )
836+ self .assertTrue ('Interim Meeting Cancelled' in outbox [- 1 ]['Subject' ])
804837
805838 def test_interim_request_edit (self ):
806839 make_meeting_test_data ()
@@ -834,4 +867,14 @@ def test_send_interim_cancellation_notice(self):
834867 length_before = len (outbox )
835868 send_interim_cancellation_notice (meeting = meeting )
836869 self .assertEqual (len (outbox ),length_before + 1 )
837- self .assertTrue ('Interim Meeting Cancelled' in outbox [- 1 ]['Subject' ])
870+ self .assertTrue ('Interim Meeting Cancelled' in outbox [- 1 ]['Subject' ])
871+
872+ def test_send_interim_minutes_reminder (self ):
873+ make_meeting_test_data ()
874+ group = Group .objects .get (acronym = 'mars' )
875+ date = datetime .datetime .today () - datetime .timedelta (days = 10 )
876+ meeting = make_interim_meeting (group = group , date = date , status = 'sched' )
877+ length_before = len (outbox )
878+ send_interim_minutes_reminder (meeting = meeting )
879+ self .assertEqual (len (outbox ),length_before + 1 )
880+ self .assertTrue ('Action Required: Minutes' in outbox [- 1 ]['Subject' ])
0 commit comments