def test_rotation_queue_update(self): group = ReviewTeamFactory.create() empty_outbox() reviewers = [RoleFactory.create(group=group,name_id='reviewer') for i in range(6)] # pyflakes:ignore secretary = RoleFactory.create(group=group,name_id='secr') docs = [DocumentFactory.create(type_id='draft',group=None) for i in range(4)] requests = [ReviewRequestFactory(team=group,doc=docs[i]) for i in range(4)] rot_list = reviewer_rotation_list(group) expected_ending_head_of_rotation = rot_list[3] unassigned_url = urlreverse(ietf.group.views.manage_review_requests, kwargs={ 'acronym': group.acronym, 'group_type': group.type_id, "assignment_status": "unassigned" }) postdict = {} postdict['reviewrequest'] = [r.id for r in requests] # assignments that affect the first 3 reviewers in queue for i in range(3): postdict['r{}-existing_reviewer'.format(requests[i].pk)] = '' postdict['r{}-action'.format(requests[i].pk)] = 'assign' postdict['r{}-reviewer'.format(requests[i].pk)] = rot_list[i].email_address() # and one out of order assignment postdict['r{}-existing_reviewer'.format(requests[3].pk)] = '' postdict['r{}-action'.format(requests[3].pk)] = 'assign' postdict['r{}-reviewer'.format(requests[3].pk)] = rot_list[5].email_address() postdict['action'] = 'save' self.client.login(username=secretary.person.user.username,password=secretary.person.user.username+'+password') r = self.client.post(unassigned_url, postdict) self.assertEqual(r.status_code,302) self.assertEqual(expected_ending_head_of_rotation,reviewer_rotation_list(group)[0]) self.assertMailboxContains(outbox, subject='Last Call assignment', text='Requested by', count=4)
def test_valid_submit(self): "Valid Submit" make_test_data() nomcom_test_data() empty_outbox() url = reverse('ietf.secr.announcement.views.main') confirm_url = reverse('ietf.secr.announcement.views.confirm') nomcom = Group.objects.get(type='nomcom') post_data = { 'nomcom': nomcom.pk, 'to': 'Other...', 'to_custom': '*****@*****.**', 'frm': 'IETF Secretariat <[email protected]>', 'subject': 'Test Subject', 'body': 'This is a test.' } self.client.login(username="******", password="******") response = self.client.post(url, post_data) self.assertEqual(response.status_code, 200) self.assertTrue('Confirm Announcement' in response.content) response = self.client.post(confirm_url, post_data, follow=True) self.assertRedirects(response, url) self.assertEqual(len(outbox), 1) self.assertEqual(outbox[0]['subject'], 'Test Subject') self.assertEqual(outbox[0]['to'], '<*****@*****.**>') message = Message.objects.last() self.assertEqual(message.subject, 'Test Subject') self.assertTrue(nomcom in message.related_groups.all())
def test_update_bad_post(self): draft = make_test_data() url = urlreverse("ietf.ipr.views.new", kwargs={"type": "specific"}) # successful post empty_outbox() r = self.client.post( url, { "updates": "this is supposed to be an integer", "holder_legal_name": "Test Legal", "holder_contact_name": "Test Holder", "holder_contact_email": "*****@*****.**", "iprdocrel_set-TOTAL_FORMS": 1, "iprdocrel_set-INITIAL_FORMS": 0, "iprdocrel_set-0-document": "%s" % draft.docalias_set.first().pk, "iprdocrel_set-0-revisions": '00', "patent_info": "none", "has_patent_pending": False, "licensing": "royalty-free", "submitter_name": "Test Holder", "submitter_email": "*****@*****.**", }) self.assertEqual(r.status_code, 200) q = PyQuery(r.content) self.assertTrue( q("#id_updates").parents(".form-group").hasClass("has-error"))
def register_and_verify(self, email): url = urlreverse(ietf.ietfauth.views.create_account) # register email empty_outbox() r = self.client.post(url, { 'email': email }) self.assertEqual(r.status_code, 200) self.assertIn("Account request received", unicontent(r)) self.assertEqual(len(outbox), 1) # go to confirm page confirm_url = self.extract_confirm_url(outbox[-1]) r = self.client.get(confirm_url) self.assertEqual(r.status_code, 200) # password mismatch r = self.client.post(confirm_url, { 'password': '******', 'password_confirmation': 'nosecret' }) self.assertEqual(r.status_code, 200) self.assertEqual(User.objects.filter(username=email).count(), 0) # confirm r = self.client.post(confirm_url, { 'name': 'User Name', 'ascii': 'User Name', 'password': '******', 'password_confirmation': 'secret' }) self.assertEqual(r.status_code, 200) self.assertEqual(User.objects.filter(username=email).count(), 1) self.assertEqual(Person.objects.filter(user__username=email).count(), 1) self.assertEqual(Email.objects.filter(person__user__username=email).count(), 1) self.assertTrue(self.username_in_htpasswd_file(email))
def test_not_meeting(self): make_test_data() group = Group.objects.get(acronym='mars') url = reverse('sessions_no_session',kwargs={'acronym':group.acronym}) self.client.login(username="******", password="******") empty_outbox() r = self.client.get(url,follow=True) # If the view invoked by that get throws an exception (such as an integrity error), # the traceback from this test will talk about a TransactionManagementError and # yell about executing queries before the end of an 'atomic' block # This is a sign of a problem - a get shouldn't have a side-effect like this one does self.assertEqual(r.status_code, 200) self.assertTrue('A message was sent to notify not having a session' in unicontent(r)) r = self.client.get(url,follow=True) self.assertEqual(r.status_code, 200) self.assertTrue('is already marked as not meeting' in unicontent(r)) self.assertEqual(len(outbox),1) self.assertTrue('Not having a session' in outbox[0]['Subject']) self.assertTrue('session-request@' in outbox[0]['To'])
def test_changes_sync(self): draft = make_test_data() data = json.dumps({ "changes": [ { "time": "2011-10-09 12:00:01", "doc": draft.name, "state": "IANA Not OK", "type": "iana_review", }, { "time": "2011-10-09 12:00:02", "doc": draft.name, "state": "IANA - Review Needed", # this should be skipped "type": "iana_review", }, { "time": "2011-10-09 12:00:00", "doc": draft.name, "state": "Waiting on RFC-Editor", "type": "iana_state", }, { "time": "2011-10-09 11:00:00", "doc": draft.name, "state": "In Progress", "type": "iana_state", } ] }) changes = iana.parse_changes_json(data) # check sorting self.assertEqual(changes[0]["time"], "2011-10-09 11:00:00") empty_outbox() added_events, warnings = iana.update_history_with_changes(changes) self.assertEqual(len(added_events), 3) self.assertEqual(len(warnings), 0) self.assertEqual(draft.get_state_slug("draft-iana-review"), "not-ok") self.assertEqual(draft.get_state_slug("draft-iana-action"), "waitrfc") e = draft.latest_event(StateDocEvent, type="changed_state", state_type="draft-iana-action") self.assertEqual( e.desc, "IANA Action state changed to <b>Waiting on RFC Editor</b> from In Progress" ) # self.assertEqual(e.time, datetime.datetime(2011, 10, 9, 5, 0)) # check timezone handling self.assertEqual(len(outbox), 3) for m in outbox: self.assertTrue('aread@' in m['To']) # make sure it doesn't create duplicates added_events, warnings = iana.update_history_with_changes(changes) self.assertEqual(len(added_events), 0) self.assertEqual(len(warnings), 0)
def test_update(self): draft = make_test_data() original_ipr = IprDisclosureBase.objects.get( title='Statement regarding rights') url = urlreverse("ietf.ipr.views.new", kwargs={"type": "specific"}) # successful post empty_outbox() r = self.client.post( url, { "updates": str(original_ipr.pk), "holder_legal_name": "Test Legal", "holder_contact_name": "Test Holder", "holder_contact_email": "*****@*****.**", "holder_contact_info": "555-555-0100", "ietfer_name": "Test Participant", "ietfer_contact_info": "555-555-0101", "iprdocrel_set-TOTAL_FORMS": 2, "iprdocrel_set-INITIAL_FORMS": 0, "iprdocrel_set-0-document": "%s" % draft.docalias_set.first().pk, "iprdocrel_set-0-revisions": '00', "iprdocrel_set-1-document": DocAlias.objects.filter(name__startswith="rfc").first().pk, "patent_info": "none", "has_patent_pending": False, "licensing": "royalty-free", "submitter_name": "Test Holder", "submitter_email": "*****@*****.**", }) self.assertEqual(r.status_code, 200) self.assertTrue( "Your IPR disclosure has been submitted" in unicontent(r)) iprs = IprDisclosureBase.objects.filter(title__icontains=draft.name) self.assertEqual(len(iprs), 1) ipr = iprs[0] self.assertEqual(ipr.holder_legal_name, "Test Legal") self.assertEqual(ipr.state.slug, 'pending') self.assertTrue(ipr.relatedipr_source_set.filter(target=original_ipr)) self.assertEqual(len(outbox), 1) self.assertTrue('New IPR Submission' in outbox[0]['Subject']) self.assertTrue('ietf-ipr@' in outbox[0]['To'])
def test_review_reminders(self): doc = make_test_data() review_req = make_review_data(doc) remind_days = 6 reviewer = Person.objects.get(user__username="******") reviewer_settings = ReviewerSettings.objects.get(team=review_req.team, person=reviewer) reviewer_settings.remind_days_before_deadline = remind_days reviewer_settings.save() secretary = Person.objects.get(user__username="******") secretary_role = Role.objects.get(group=review_req.team, name="secr", person=secretary) secretary_settings = ReviewSecretarySettings(team=review_req.team, person=secretary) secretary_settings.remind_days_before_deadline = remind_days secretary_settings.save() today = datetime.date.today() review_req.reviewer = reviewer.email_set.first() review_req.deadline = today + datetime.timedelta(days=remind_days) review_req.save() # reviewer needing_reminders = review_requests_needing_reviewer_reminder(today - datetime.timedelta(days=1)) self.assertEqual(list(needing_reminders), []) needing_reminders = review_requests_needing_reviewer_reminder(today) self.assertEqual(list(needing_reminders), [review_req]) needing_reminders = review_requests_needing_reviewer_reminder(today + datetime.timedelta(days=1)) self.assertEqual(list(needing_reminders), []) # secretary needing_reminders = review_requests_needing_secretary_reminder(today - datetime.timedelta(days=1)) self.assertEqual(list(needing_reminders), []) needing_reminders = review_requests_needing_secretary_reminder(today) self.assertEqual(list(needing_reminders), [(review_req, secretary_role)]) needing_reminders = review_requests_needing_secretary_reminder(today + datetime.timedelta(days=1)) self.assertEqual(list(needing_reminders), []) # email reviewer empty_outbox() email_reviewer_reminder(review_req) self.assertEqual(len(outbox), 1) self.assertTrue(review_req.doc_id in outbox[0].get_payload(decode=True).decode("utf-8")) # email secretary empty_outbox() email_secretary_reminder(review_req, secretary_role) self.assertEqual(len(outbox), 1) self.assertTrue(review_req.doc_id in outbox[0].get_payload(decode=True).decode("utf-8"))
def test_changes_sync(self): draft = make_test_data() data = json.dumps({ "changes": [ { "time": "2011-10-09 12:00:01", "doc": draft.name, "state": "IANA Not OK", "type": "iana_review", }, { "time": "2011-10-09 12:00:02", "doc": draft.name, "state": "IANA - Review Needed", # this should be skipped "type": "iana_review", }, { "time": "2011-10-09 12:00:00", "doc": draft.name, "state": "Waiting on RFC-Editor", "type": "iana_state", }, { "time": "2011-10-09 11:00:00", "doc": draft.name, "state": "In Progress", "type": "iana_state", } ] }) changes = iana.parse_changes_json(data) # check sorting self.assertEqual(changes[0]["time"], "2011-10-09 11:00:00") empty_outbox() added_events, warnings = iana.update_history_with_changes(changes) self.assertEqual(len(added_events), 3) self.assertEqual(len(warnings), 0) self.assertEqual(draft.get_state_slug("draft-iana-review"), "not-ok") self.assertEqual(draft.get_state_slug("draft-iana-action"), "waitrfc") e = draft.latest_event(StateDocEvent, type="changed_state", state_type="draft-iana-action") self.assertEqual(e.desc, "IANA Action state changed to <b>Waiting on RFC Editor</b> from In Progress") # self.assertEqual(e.time, datetime.datetime(2011, 10, 9, 5, 0)) # check timezone handling self.assertEqual(len(outbox), 3 ) for m in outbox: self.assertTrue('aread@' in m['To']) # make sure it doesn't create duplicates added_events, warnings = iana.update_history_with_changes(changes) self.assertEqual(len(added_events), 0) self.assertEqual(len(warnings), 0)
def test_new_thirdparty(self): """Add a new third-party disclosure. Note: submitter does not need to be logged in. """ draft = make_test_data() url = urlreverse("ietf.ipr.views.new", kwargs={"type": "third-party"}) # successful post empty_outbox() r = self.client.post( url, { "holder_legal_name": "Test Legal", "ietfer_name": "Test Participant", "ietfer_contact_email": "*****@*****.**", "ietfer_contact_info": "555-555-0101", "iprdocrel_set-TOTAL_FORMS": 2, "iprdocrel_set-INITIAL_FORMS": 0, "iprdocrel_set-0-document": "%s" % draft.docalias_set.first().pk, "iprdocrel_set-0-revisions": '00', "iprdocrel_set-1-document": DocAlias.objects.filter(name__startswith="rfc").first().pk, "patent_info": "none", "has_patent_pending": False, "licensing": "royalty-free", "submitter_name": "Test Holder", "submitter_email": "*****@*****.**", }) self.assertEqual(r.status_code, 200) self.assertTrue( "Your IPR disclosure has been submitted" in unicontent(r)) iprs = IprDisclosureBase.objects.filter( title__icontains="belonging to Test Legal") self.assertEqual(len(iprs), 1) ipr = iprs[0] self.assertEqual(ipr.holder_legal_name, "Test Legal") self.assertEqual(ipr.state.slug, "pending") self.assertTrue(isinstance(ipr.get_child(), ThirdPartyIprDisclosure)) self.assertEqual(len(outbox), 1) self.assertTrue('New IPR Submission' in outbox[0]['Subject']) self.assertTrue('ietf-ipr@' in outbox[0]['To'])
def test_email_open_review_assignments(self): doc = make_test_data() review_req1 = make_review_data(doc) DBTemplateFactory.create(path='/group/defaults/email/open_assignments.txt', type_id='django', content = """ {% autoescape off %} Reviewer Deadline Draft {% for r in review_requests %}{{ r.reviewer.person.plain_name|ljust:"22" }} {{ r.deadline|date:"Y-m-d" }} {{ r.doc_id }}-{% if r.requested_rev %}{{ r.requested_rev }}{% else %}{{ r.doc.rev }}{% endif %} {% endfor %} {% if rotation_list %}Next in the reviewer rotation: {% for p in rotation_list %} {{ p }} {% endfor %}{% endif %} {% endautoescape %} """) group = review_req1.team url = urlreverse(ietf.group.views.email_open_review_assignments, kwargs={ 'acronym': group.acronym }) login_testing_unauthorized(self, "secretary", url) url = urlreverse(ietf.group.views.email_open_review_assignments, kwargs={ 'acronym': group.acronym, 'group_type': group.type_id }) r = self.client.get(url) self.assertEqual(r.status_code, 200) q = PyQuery(r.content) generated_text = q("[name=body]").text() self.assertTrue(review_req1.doc.name in generated_text) self.assertTrue(unicode(Person.objects.get(user__username="******")) in generated_text) empty_outbox() r = self.client.post(url, { "to": '*****@*****.**', "cc": '*****@*****.**', "reply_to": '*****@*****.**', "frm" : '*****@*****.**', "subject": "Test subject", "body": "Test body", "action": "email", }) self.assertEqual(r.status_code, 302) self.assertEqual(len(outbox), 1) self.assertTrue('toaddr' in outbox[0]["To"]) self.assertTrue('ccaddr' in outbox[0]["Cc"]) self.assertTrue('replytoaddr' in outbox[0]["Reply-To"]) self.assertTrue('fromaddr' in outbox[0]["From"]) self.assertEqual(outbox[0]["subject"], "Test subject") self.assertTrue("Test body" in outbox[0].get_payload(decode=True).decode("utf-8"))
def test_create_account_failure(self): make_test_data() url = urlreverse(ietf.ietfauth.views.create_account) # get r = self.client.get(url) self.assertEqual(r.status_code, 200) # register email and verify failure email = '*****@*****.**' empty_outbox() r = self.client.post(url, { 'email': email }) self.assertEqual(r.status_code, 200) self.assertIn("Account creation failed", unicontent(r))
def test_revision_rfcqueue(self): # Makes sure that a manual posting by the Secretariat of an I-D that is # in the RFC Editor Queue will result in notification of the RFC Editor draft = make_test_data() empty_outbox() state = State.objects.get(type='draft-iesg', slug='rfcqueue') draft.set_state(state) url = urlreverse('ietf.secr.drafts.views.revision', kwargs={'id': draft.name}) self.client.login(username="******", password="******") rev = str(int(draft.rev) + 1).zfill(2) file = StringIO("This is a test.") file.name = "%s-%s.txt" % (draft.name, rev) post = {'title': 'The Title', 'pages': '10', 'txt': file} response = self.client.post(url, post, follow=True) self.assertEqual(response.status_code, 200)
def test_process_response_email(self): # first send a mail make_test_data() ipr = IprDisclosureBase.objects.get(title='Statement regarding rights') url = urlreverse('ietf.ipr.views.email', kwargs={"id": ipr.id}) self.client.login(username="******", password="******") yesterday = datetime.date.today() - datetime.timedelta(1) data = dict(to='*****@*****.**', frm='*****@*****.**', subject='test', reply_to=get_reply_to(), body='Testing.', response_due=yesterday.isoformat()) empty_outbox() r = self.client.post(url, data, follow=True) #print r.content self.assertEqual(r.status_code, 200) q = Message.objects.filter(reply_to=data['reply_to']) self.assertEqual(q.count(), 1) event = q[0].msgevents.first() self.assertTrue(event.response_past_due()) self.assertEqual(len(outbox), 1) self.assertTrue('*****@*****.**' in outbox[0]['To']) # test process response uninteresting message addrs = gather_address_lists('ipr_disclosure_submitted').as_strings() message_string = """To: {} Cc: {} From: [email protected] Date: {} Subject: test """.format(addrs.to, addrs.cc, datetime.datetime.now().ctime()) result = process_response_email(message_string) self.assertIsNone(result) # test process response message_string = """To: {} From: [email protected] Date: {} Subject: test """.format(data['reply_to'], datetime.datetime.now().ctime()) result = process_response_email(message_string) self.assertIsInstance(result, Message) self.assertFalse(event.response_past_due())
def test_reset_password(self): url = urlreverse(ietf.ietfauth.views.password_reset) user = User.objects.create(username="******", email="*****@*****.**") user.set_password("forgotten") user.save() p = Person.objects.create(name="Some One", ascii="Some One", user=user) Email.objects.create(address=user.username, person=p) # get r = self.client.get(url) self.assertEqual(r.status_code, 200) # ask for reset, wrong username r = self.client.post(url, { 'username': "******" }) self.assertEqual(r.status_code, 200) q = PyQuery(r.content) self.assertTrue(len(q("form .has-error")) > 0) # ask for reset empty_outbox() r = self.client.post(url, { 'username': user.username }) self.assertEqual(r.status_code, 200) self.assertEqual(len(outbox), 1) # go to change password page confirm_url = self.extract_confirm_url(outbox[-1]) r = self.client.get(confirm_url) self.assertEqual(r.status_code, 200) # password mismatch r = self.client.post(confirm_url, { 'password': '******', 'password_confirmation': 'nosecret' }) self.assertEqual(r.status_code, 200) q = PyQuery(r.content) self.assertTrue(len(q("form .has-error")) > 0) # confirm r = self.client.post(confirm_url, { 'password': '******', 'password_confirmation': 'secret' }) self.assertEqual(r.status_code, 200) q = PyQuery(r.content) self.assertEqual(len(q("form .has-error")), 0) self.assertTrue(self.username_in_htpasswd_file(user.username))
def test_issue_ballot(self): draft = make_test_data() url = urlreverse('ietf.doc.views_ballot.ballot_writeupnotes', kwargs=dict(name=draft.name)) login_testing_unauthorized(self, "ad", url) empty_outbox() r = self.client.post( url, dict(ballot_writeup="This is a test.", issue_ballot="1")) self.assertEqual(r.status_code, 200) draft = Document.objects.get(name=draft.name) self.assertTrue(draft.latest_event(type="sent_ballot_announcement")) self.assertEqual(len(outbox), 2) self.assertTrue('Evaluation:' in outbox[-2]['Subject']) self.assertTrue('iesg@' in outbox[-2]['To']) self.assertTrue('Evaluation:' in outbox[-1]['Subject']) self.assertTrue('drafts-eval@' in outbox[-1]['To']) self.assertTrue('X-IETF-Draft-string' in outbox[-1])
def test_issue_ballot(self): draft = make_test_data() url = urlreverse('doc_ballot_writeupnotes', kwargs=dict(name=draft.name)) login_testing_unauthorized(self, "ad", url) empty_outbox() r = self.client.post(url, dict( ballot_writeup="This is a test.", issue_ballot="1")) self.assertEqual(r.status_code, 200) draft = Document.objects.get(name=draft.name) self.assertTrue(draft.latest_event(type="sent_ballot_announcement")) self.assertEqual(len(outbox), 2) self.assertTrue('Evaluation:' in outbox[-2]['Subject']) self.assertTrue('iesg@' in outbox[-2]['To']) self.assertTrue('Evaluation:' in outbox[-1]['Subject']) self.assertTrue('drafts-eval@' in outbox[-1]['To']) self.assertTrue('X-IETF-Draft-string' in outbox[-1])
def test_edit_ballot_writeupnotes(self): draft = make_test_data() charter = draft.group.charter by = Person.objects.get(user__username="******") BallotDocEvent.objects.create( type="created_ballot", ballot_type=BallotType.objects.get(doc_type="charter", slug="approve"), by=by, doc=charter, rev=charter.rev, desc="Created ballot", ) url = urlreverse('ietf.doc.views_charter.ballot_writeupnotes', kwargs=dict(name=charter.name)) login_testing_unauthorized(self, "secretary", url) e = default_action_text(draft.group, charter, by) e.save() # normal get r = self.client.get(url) self.assertEqual(r.status_code, 200) q = PyQuery(r.content) self.assertEqual(len(q('textarea[name=ballot_writeup]')), 1) # save r = self.client.post(url, dict( ballot_writeup="This is a simple test.", save_ballot_writeup="1")) self.assertEqual(r.status_code, 200) self.assertTrue("This is a simple test" in charter.latest_event(WriteupDocEvent, type="changed_ballot_writeup_text").text) # send empty_outbox() r = self.client.post(url, dict( ballot_writeup="This is a simple test.", send_ballot="1")) self.assertEqual(len(outbox), 1) self.assertTrue('Evaluation' in outbox[0]['Subject'])
def approve_test_helper(self,approve_type): doc = Document.objects.get(name='conflict-review-imaginary-irtf-submission') url = urlreverse('conflict_review_approve',kwargs=dict(name=doc.name)) login_testing_unauthorized(self, "secretary", url) # Some additional setup create_ballot_if_not_open(doc,Person.objects.get(name="Sec Retary"),"conflrev") doc.set_state(State.objects.get(used=True, slug=approve_type+'-pend',type='conflrev')) doc.save() # get r = self.client.get(url) self.assertEqual(r.status_code, 200) q = PyQuery(r.content) self.assertEqual(len(q('[type=submit]:contains("Send announcement")')), 1) if approve_type == 'appr-noprob': self.assertTrue( 'IESG has no problem' in ''.join(wrap(r.content,2**16))) else: self.assertTrue( 'NOT be published' in ''.join(wrap(r.content,2**16))) # submit empty_outbox() r = self.client.post(url,dict(announcement_text=default_approval_text(doc))) self.assertEqual(r.status_code, 302) doc = Document.objects.get(name='conflict-review-imaginary-irtf-submission') self.assertEqual(doc.get_state_slug(),approve_type+'-sent') self.assertFalse(doc.ballot_open("conflrev")) self.assertEqual(len(outbox), 1) self.assertTrue('Results of IETF-conflict review' in outbox[0]['Subject']) self.assertTrue('irtf-chair' in outbox[0]['To']) self.assertTrue('ietf-announce@' in outbox[0]['Cc']) self.assertTrue('iana@' in outbox[0]['Cc']) if approve_type == 'appr-noprob': self.assertTrue( 'IESG has no problem' in ''.join(wrap(unicode(outbox[0]),2**16))) else: self.assertTrue( 'NOT be published' in ''.join(wrap(unicode(outbox[0]),2**16)))
def test_new_generic(self): """Add a new generic disclosure. Note: submitter does not need to be logged in. """ make_test_data() url = urlreverse("ietf.ipr.views.new", kwargs={"type": "generic"}) # invalid post r = self.client.post(url, { "holder_legal_name": "Test Legal", }) self.assertEqual(r.status_code, 200) q = PyQuery(r.content) self.assertTrue(len(q("form .has-error")) > 0) # successful post empty_outbox() r = self.client.post( url, { "holder_legal_name": "Test Legal", "holder_contact_name": "Test Holder", "holder_contact_email": "*****@*****.**", "holder_contact_info": "555-555-0100", "submitter_name": "Test Holder", "submitter_email": "*****@*****.**", "notes": "some notes" }) self.assertEqual(r.status_code, 200) self.assertTrue( "Your IPR disclosure has been submitted" in unicontent(r)) self.assertEqual(len(outbox), 1) self.assertTrue('New IPR Submission' in outbox[0]['Subject']) self.assertTrue('ietf-ipr@' in outbox[0]['To']) iprs = IprDisclosureBase.objects.filter( title__icontains="General License Statement") self.assertEqual(len(iprs), 1) ipr = iprs[0] self.assertEqual(ipr.holder_legal_name, "Test Legal") self.assertEqual(ipr.state.slug, 'pending') self.assertTrue(isinstance(ipr.get_child(), GenericIprDisclosure))
def approve_test_helper(self,approve_type): doc = Document.objects.get(name='conflict-review-imaginary-irtf-submission') url = urlreverse('ietf.doc.views_conflict_review.approve',kwargs=dict(name=doc.name)) login_testing_unauthorized(self, "secretary", url) # Some additional setup create_ballot_if_not_open(doc,Person.objects.get(name="Sec Retary"),"conflrev") doc.set_state(State.objects.get(used=True, slug=approve_type+'-pend',type='conflrev')) # get r = self.client.get(url) self.assertEqual(r.status_code, 200) q = PyQuery(r.content) self.assertEqual(len(q('[type=submit]:contains("Send announcement")')), 1) if approve_type == 'appr-noprob': self.assertTrue( 'IESG has no problem' in ''.join(wrap(r.content,2**16))) else: self.assertTrue( 'NOT be published' in ''.join(wrap(r.content,2**16))) # submit empty_outbox() r = self.client.post(url,dict(announcement_text=default_approval_text(doc))) self.assertEqual(r.status_code, 302) doc = Document.objects.get(name='conflict-review-imaginary-irtf-submission') self.assertEqual(doc.get_state_slug(),approve_type+'-sent') self.assertFalse(doc.ballot_open("conflrev")) self.assertEqual(len(outbox), 1) self.assertTrue('Results of IETF-conflict review' in outbox[0]['Subject']) self.assertTrue('irtf-chair' in outbox[0]['To']) self.assertTrue('ietf-announce@' in outbox[0]['Cc']) self.assertTrue('iana@' in outbox[0]['Cc']) if approve_type == 'appr-noprob': self.assertTrue( 'IESG has no problem' in ''.join(wrap(unicode(outbox[0]),2**16))) else: self.assertTrue( 'NOT be published' in ''.join(wrap(unicode(outbox[0]),2**16)))
def test_edit_ballot_writeupnotes(self): draft = make_test_data() charter = draft.group.charter by = Person.objects.get(user__username="******") BallotDocEvent.objects.create( type="created_ballot", ballot_type=BallotType.objects.get(doc_type="charter", slug="approve"), by=by, doc=charter, desc="Created ballot", ) url = urlreverse('ietf.doc.views_charter.ballot_writeupnotes', kwargs=dict(name=charter.name)) login_testing_unauthorized(self, "secretary", url) default_action_text(draft.group, charter, by) # normal get r = self.client.get(url) self.assertEqual(r.status_code, 200) q = PyQuery(r.content) self.assertEqual(len(q('textarea[name=ballot_writeup]')), 1) # save r = self.client.post(url, dict( ballot_writeup="This is a simple test.", save_ballot_writeup="1")) self.assertEqual(r.status_code, 200) self.assertTrue("This is a simple test" in charter.latest_event(WriteupDocEvent, type="changed_ballot_writeup_text").text) # send empty_outbox() r = self.client.post(url, dict( ballot_writeup="This is a simple test.", send_ballot="1")) self.assertEqual(len(outbox), 1) self.assertTrue('Evaluation' in outbox[0]['Subject'])
def test_not_meeting(self): make_meeting_test_data() group = Group.objects.get(acronym='mars') url = reverse('ietf.secr.sreq.views.no_session',kwargs={'acronym':group.acronym}) self.client.login(username="******", password="******") empty_outbox() r = self.client.get(url,follow=True) # If the view invoked by that get throws an exception (such as an integrity error), # the traceback from this test will talk about a TransactionManagementError and # yell about executing queries before the end of an 'atomic' block # This is a sign of a problem - a get shouldn't have a side-effect like this one does self.assertEqual(r.status_code, 200) self.assertTrue('A message was sent to notify not having a session' in unicontent(r)) r = self.client.get(url,follow=True) self.assertEqual(r.status_code, 200) self.assertTrue('is already marked as not meeting' in unicontent(r)) self.assertEqual(len(outbox),1) self.assertTrue('Not having a session' in outbox[0]['Subject']) self.assertTrue('session-request@' in outbox[0]['To'])
def test_edit_review_announcement_text(self): draft = make_test_data() charter = draft.group.charter url = urlreverse('ietf.doc.views_charter.review_announcement_text', kwargs=dict(name=charter.name)) self.client.logout() login_testing_unauthorized(self, "secretary", url) # normal get r = self.client.get(url) self.assertEqual(r.status_code, 200) q = PyQuery(r.content) self.assertEqual(len(q('textarea[name=announcement_text]')), 1) self.assertEqual(len(q('textarea[name=new_work_text]')), 1) by = Person.objects.get(user__username="******") (e1, e2) = default_review_text(draft.group, charter, by) announcement_text = e1.text new_work_text = e2.text empty_outbox() r = self.client.post(url, dict( announcement_text=announcement_text, new_work_text=new_work_text, send_both="1")) self.assertEqual(len(outbox), 2) self.assertTrue(all(['WG Review' in m['Subject'] for m in outbox])) self.assertTrue('ietf-announce@' in outbox[0]['To']) self.assertTrue('mars-wg@' in outbox[0]['Cc']) self.assertTrue('new-work@' in outbox[1]['To']) empty_outbox() r = self.client.post(url, dict( announcement_text=announcement_text, new_work_text=new_work_text, send_annc_only="1")) self.assertEqual(len(outbox), 1) self.assertTrue('ietf-announce@' in outbox[0]['To']) empty_outbox() r = self.client.post(url, dict( announcement_text=announcement_text, new_work_text=new_work_text, send_nw_only="1")) self.assertEqual(len(outbox), 1) self.assertTrue('new-work@' in outbox[0]['To']) # save r = self.client.post(url, dict( announcement_text="This is a simple test.", new_work_text="New work gets something different.", save_text="1")) self.assertEqual(r.status_code, 302) self.assertTrue("This is a simple test" in charter.latest_event(WriteupDocEvent, type="changed_review_announcement").text) self.assertTrue("New work gets something different." in charter.latest_event(WriteupDocEvent, type="changed_new_work_text").text) # test regenerate r = self.client.post(url, dict( announcement_text="This is a simple test.", new_work_text="Too simple perhaps?", regenerate_text="1")) self.assertEqual(r.status_code, 200) q = PyQuery(r.content) self.assertTrue(draft.group.name in charter.latest_event(WriteupDocEvent, type="changed_review_announcement").text) self.assertTrue(draft.group.name in charter.latest_event(WriteupDocEvent, type="changed_new_work_text").text)
def test_profile(self): make_test_data() username = "******" email_address = Email.objects.filter(person__user__username=username).first().address url = urlreverse(ietf.ietfauth.views.profile) login_testing_unauthorized(self, username, url) # get r = self.client.get(url) self.assertEqual(r.status_code, 200) q = PyQuery(r.content) self.assertEqual(len(q('.form-control-static:contains("%s")' % username)), 1) self.assertEqual(len(q('[name="active_emails"][value="%s"][checked]' % email_address)), 1) base_data = { "name": u"Test Nãme", "ascii": u"Test Name", "ascii_short": u"T. Name", "address": "Test address", "affiliation": "Test Org", "active_emails": email_address, } # edit details - faulty ASCII faulty_ascii = base_data.copy() faulty_ascii["ascii"] = u"Test Nãme" r = self.client.post(url, faulty_ascii) self.assertEqual(r.status_code, 200) q = PyQuery(r.content) self.assertTrue(len(q("form .has-error")) > 0) # edit details - blank ASCII blank_ascii = base_data.copy() blank_ascii["ascii"] = u"" r = self.client.post(url, blank_ascii) self.assertEqual(r.status_code, 200) q = PyQuery(r.content) self.assertTrue(len(q("form .has-error")) > 0) # we get a warning about reconstructed name self.assertEqual(q("input[name=ascii]").val(), base_data["ascii"]) # edit details r = self.client.post(url, base_data) self.assertEqual(r.status_code, 200) person = Person.objects.get(user__username=username) self.assertEqual(person.name, u"Test Nãme") self.assertEqual(person.ascii, u"Test Name") self.assertEqual(Person.objects.filter(alias__name=u"Test Name", user__username=username).count(), 1) self.assertEqual(Person.objects.filter(alias__name=u"Test Nãme", user__username=username).count(), 1) self.assertEqual(Email.objects.filter(address=email_address, person__user__username=username, active=True).count(), 1) # deactivate address without_email_address = { k: v for k, v in base_data.iteritems() if k != "active_emails" } r = self.client.post(url, without_email_address) self.assertEqual(r.status_code, 200) self.assertEqual(Email.objects.filter(address=email_address, person__user__username="******", active=True).count(), 0) r = self.client.get(url) self.assertEqual(r.status_code, 200) q = PyQuery(r.content) self.assertEqual(len(q('[name="%s"][checked]' % email_address)), 0) # add email address empty_outbox() new_email_address = "*****@*****.**" with_new_email_address = base_data.copy() with_new_email_address["new_email"] = new_email_address r = self.client.post(url, with_new_email_address) self.assertEqual(r.status_code, 200) self.assertEqual(len(outbox), 1) # confirm new email address confirm_url = self.extract_confirm_url(outbox[-1]) r = self.client.get(confirm_url) self.assertEqual(r.status_code, 200) q = PyQuery(r.content) self.assertEqual(len(q('[name="action"][value=confirm]')), 1) r = self.client.post(confirm_url, { "action": "confirm" }) self.assertEqual(r.status_code, 200) self.assertEqual(Email.objects.filter(address=new_email_address, person__user__username=username, active=1).count(), 1) # check that we can't re-add it - that would give a duplicate r = self.client.get(confirm_url) self.assertEqual(r.status_code, 200) q = PyQuery(r.content) self.assertEqual(len(q('[name="action"][value="confirm"]')), 0) # change role email role = Role.objects.create( person=Person.objects.get(user__username=username), email=Email.objects.get(address=email_address), name=RoleName.objects.get(slug="chair"), group=Group.objects.get(acronym="mars"), ) role_email_input_name = "role_%s-email" % role.pk r = self.client.get(url) self.assertEqual(r.status_code, 200) q = PyQuery(r.content) self.assertEqual(len(q('[name="%s"]' % role_email_input_name)), 1) with_changed_role_email = base_data.copy() with_changed_role_email["active_emails"] = new_email_address with_changed_role_email[role_email_input_name] = new_email_address r = self.client.post(url, with_changed_role_email) self.assertEqual(r.status_code, 200) updated_roles = Role.objects.filter(person=role.person, name=role.name, group=role.group) self.assertEqual(len(updated_roles), 1) self.assertEqual(updated_roles[0].email_id, new_email_address)
def test_change_reviewer_settings(self): doc = make_test_data() review_req = make_review_data(doc) review_req.reviewer = Email.objects.get(person__user__username="******") review_req.save() reviewer = review_req.reviewer.person url = urlreverse(ietf.group.views.change_reviewer_settings, kwargs={ "acronym": review_req.team.acronym, "reviewer_email": review_req.reviewer_id, }) login_testing_unauthorized(self, reviewer.user.username, url) url = urlreverse(ietf.group.views.change_reviewer_settings, kwargs={ "group_type": review_req.team.type_id, "acronym": review_req.team.acronym, "reviewer_email": review_req.reviewer_id, }) # get r = self.client.get(url) self.assertEqual(r.status_code, 200) # set settings empty_outbox() r = self.client.post(url, { "action": "change_settings", "min_interval": "7", "filter_re": "test-[regexp]", "remind_days_before_deadline": "6", "expertise": "Some expertise", }) self.assertEqual(r.status_code, 302) settings = ReviewerSettings.objects.get(person=reviewer, team=review_req.team) self.assertEqual(settings.min_interval, 7) self.assertEqual(settings.filter_re, "test-[regexp]") self.assertEqual(settings.skip_next, 0) self.assertEqual(settings.remind_days_before_deadline, 6) self.assertEqual(settings.expertise, "Some expertise") self.assertEqual(len(outbox), 1) self.assertTrue("reviewer availability" in outbox[0]["subject"].lower()) msg_content = outbox[0].get_payload(decode=True).decode("utf-8").lower() self.assertTrue("frequency changed", msg_content) self.assertTrue("skip next", msg_content) # Normal reviewer should not be able to change skip_next r = self.client.post(url, { "action": "change_settings", "min_interval": "7", "filter_re": "test-[regexp]", "remind_days_before_deadline": "6", "skip_next" : "2", }) self.assertEqual(r.status_code, 302) settings = ReviewerSettings.objects.get(person=reviewer, team=review_req.team) self.assertEqual(settings.skip_next, 0) # add unavailable period start_date = datetime.date.today() + datetime.timedelta(days=10) empty_outbox() r = self.client.post(url, { "action": "add_period", 'start_date': start_date.isoformat(), 'end_date': "", 'availability': "unavailable", }) self.assertEqual(r.status_code, 302) period = UnavailablePeriod.objects.get(person=reviewer, team=review_req.team, start_date=start_date) self.assertEqual(period.end_date, None) self.assertEqual(period.availability, "unavailable") self.assertEqual(len(outbox), 1) msg_content = outbox[0].get_payload(decode=True).decode("utf-8").lower() self.assertTrue(start_date.isoformat(), msg_content) self.assertTrue("indefinite", msg_content) # end unavailable period empty_outbox() end_date = start_date + datetime.timedelta(days=10) r = self.client.post(url, { "action": "end_period", 'period_id': period.pk, 'end_date': end_date.isoformat(), }) self.assertEqual(r.status_code, 302) period = reload_db_objects(period) self.assertEqual(period.end_date, end_date) self.assertEqual(len(outbox), 1) msg_content = outbox[0].get_payload(decode=True).decode("utf-8").lower() self.assertTrue(start_date.isoformat(), msg_content) self.assertTrue("indefinite", msg_content) # delete unavailable period empty_outbox() r = self.client.post(url, { "action": "delete_period", 'period_id': period.pk, }) self.assertEqual(r.status_code, 302) self.assertEqual(UnavailablePeriod.objects.filter(person=reviewer, team=review_req.team, start_date=start_date).count(), 0) self.assertEqual(len(outbox), 1) msg_content = outbox[0].get_payload(decode=True).decode("utf-8").lower() self.assertTrue(start_date.isoformat(), msg_content) self.assertTrue(end_date.isoformat(), msg_content) # secretaries and the secretariat should be able to change skip_next for username in ["secretary","reviewsecretary"]: skip_next_val = {'secretary':'3','reviewsecretary':'4'}[username] self.client.login(username=username,password=username+"+password") r = self.client.post(url, { "action": "change_settings", "min_interval": "7", "filter_re": "test-[regexp]", "remind_days_before_deadline": "6", "skip_next" : skip_next_val, }) self.assertEqual(r.status_code, 302) settings = ReviewerSettings.objects.get(person=reviewer, team=review_req.team) self.assertEqual(settings.skip_next, int(skip_next_val))
def test_approve(self): make_test_data() group = Group.objects.get(acronym="ames") charter = group.charter url = urlreverse('charter_approve', kwargs=dict(name=charter.name)) login_testing_unauthorized(self, "secretary", url) with open(os.path.join(self.charter_dir, "%s-%s.txt" % (charter.canonical_name(), charter.rev)), "w") as f: f.write("This is a charter.") p = Person.objects.get(name="Areað Irector") BallotDocEvent.objects.create( type="created_ballot", ballot_type=BallotType.objects.get(doc_type="charter", slug="approve"), by=p, doc=charter, desc="Created ballot", ) charter.set_state(State.objects.get(used=True, type="charter", slug="iesgrev")) due_date = datetime.date.today() + datetime.timedelta(days=180) m1 = GroupMilestone.objects.create(group=group, state_id="active", desc="Has been copied", due=due_date, resolved="") GroupMilestone.objects.create(group=group, state_id="active", desc="To be deleted", due=due_date, resolved="") GroupMilestone.objects.create(group=group, state_id="charter", desc="Has been copied", due=due_date, resolved="") m4 = GroupMilestone.objects.create(group=group, state_id="charter", desc="New charter milestone", due=due_date, resolved="") # normal get r = self.client.get(url) self.assertEqual(r.status_code, 200) q = PyQuery(r.content) self.assertTrue(q('[type=submit]:contains("Send announcement")')) self.assertEqual(len(q('pre')), 1) # approve empty_outbox() r = self.client.post(url, dict()) self.assertEqual(r.status_code, 302) charter = Document.objects.get(name=charter.name) self.assertEqual(charter.get_state_slug(), "approved") self.assertTrue(not charter.ballot_open("approve")) self.assertEqual(charter.rev, "01") self.assertTrue(os.path.exists(os.path.join(self.charter_dir, "charter-ietf-%s-%s.txt" % (group.acronym, charter.rev)))) self.assertEqual(len(outbox), 2) # self.assertTrue("approved" in outbox[0]['Subject'].lower()) self.assertTrue("iesg-secretary" in outbox[0]['To']) body = outbox[0].get_payload() for word in ["WG", "/wg/ames/charter/", "Charter", "/doc/charter-ietf-ames/", ]: self.assertIn(word, body) # self.assertTrue("WG Action" in outbox[1]['Subject']) self.assertTrue("ietf-announce" in outbox[1]['To']) self.assertTrue("*****@*****.**" in outbox[1]['Cc']) body = outbox[1].get_payload() for word in ["Chairs", "Ames Man <*****@*****.**>", "Secretaries", "Secretary <*****@*****.**>", "Assigned Area Director", "Areað Irector <*****@*****.**>", "Area Directors", "Mailing list", "*****@*****.**", "Charter", "/doc/charter-ietf-ames/", "Milestones"]: self.assertIn(word, body) self.assertEqual(group.groupmilestone_set.filter(state="charter").count(), 0) self.assertEqual(group.groupmilestone_set.filter(state="active").count(), 2) self.assertEqual(group.groupmilestone_set.filter(state="active", desc=m1.desc).count(), 1) self.assertEqual(group.groupmilestone_set.filter(state="active", desc=m4.desc).count(), 1)
def test_change_state(self): make_test_data() group = Group.objects.get(acronym="ames") charter = group.charter url = urlreverse('charter_change_state', kwargs=dict(name=charter.name)) login_testing_unauthorized(self, "secretary", url) first_state = charter.get_state() # normal get r = self.client.get(url) self.assertEqual(r.status_code, 200) q = PyQuery(r.content) self.assertEqual(len(q('form select[name=charter_state]')), 1) # faulty post r = self.client.post(url, dict(charter_state="-12345")) self.assertEqual(r.status_code, 200) q = PyQuery(r.content) self.assertTrue(len(q('form .has-error')) > 0) self.assertEqual(charter.get_state(), first_state) # change state for slug in ("intrev", "extrev", "iesgrev"): s = State.objects.get(used=True, type="charter", slug=slug) events_before = charter.docevent_set.count() empty_outbox() r = self.client.post(url, dict(charter_state=str(s.pk), message="test message")) self.assertEqual(r.status_code, 302) charter = Document.objects.get(name="charter-ietf-%s" % group.acronym) self.assertEqual(charter.get_state_slug(), slug) events_now = charter.docevent_set.count() self.assertTrue(events_now > events_before) def find_event(t): return [e for e in charter.docevent_set.all()[:events_now - events_before] if e.type == t] self.assertTrue("state changed" in find_event("changed_state")[0].desc.lower()) if slug in ("intrev", "iesgrev"): self.assertTrue(find_event("created_ballot")) self.assertEqual(len(outbox), 3 if slug=="intrev" else 2 ) if slug=="intrev": self.assertIn("Internal WG Review", outbox[-3]['Subject']) self.assertIn("iab@", outbox[-3]['To']) self.assertIn("iesg@", outbox[-3]['To']) self.assertIn("A new IETF WG", outbox[-3].get_payload()) body = outbox[-3].get_payload() for word in ["Chairs", "Ames Man <*****@*****.**>", "Secretaries", "Secretary <*****@*****.**>", "Assigned Area Director", "Areað Irector <*****@*****.**>", "Area Directors", "Mailing list", "*****@*****.**", "Charter", "Milestones"]: self.assertIn(word, body) self.assertIn("state changed", outbox[-2]['Subject'].lower()) self.assertIn("iesg-secretary@", outbox[-2]['To']) body = outbox[-2].get_payload() for word in ["WG", "Charter", ]: self.assertIn(word, body) self.assertIn("State Update Notice", outbox[-1]['Subject']) self.assertIn("ames-chairs@", outbox[-1]['To']) body = outbox[-1].get_payload() for word in ["State changed", "ID Tracker URL", ]: self.assertIn(word, body) # Exercise internal review of a recharter group = Group.objects.get(acronym="mars") charter = group.charter url = urlreverse('charter_change_state', kwargs=dict(name=charter.name)) empty_outbox() r = self.client.post(url, dict(charter_state=str(State.objects.get(used=True,type="charter",slug="intrev").pk), message="test")) self.assertEqual(r.status_code, 302) self.assertTrue("A new charter" in outbox[-3].get_payload())
def test_edit_info(self): make_test_data() group = Group.objects.get(acronym="mars") url = urlreverse('group_edit', kwargs=dict(group_type=group.type_id, acronym=group.acronym)) login_testing_unauthorized(self, "secretary", url) # normal get r = self.client.get(url) self.assertEqual(r.status_code, 200) q = PyQuery(r.content) self.assertEqual(len(q('form select[name=parent]')), 1) self.assertEqual(len(q('form input[name=acronym]')), 1) # faulty post Group.objects.create(name="Collision Test Group", acronym="collide") r = self.client.post(url, dict(acronym="collide")) self.assertEqual(r.status_code, 200) q = PyQuery(r.content) self.assertTrue(len(q('form .has-error')) > 0) # create old acronym group.acronym = "oldmars" group.save() save_group_in_history(group) group.acronym = "mars" group.save() # post with warning r = self.client.post(url, dict(acronym="oldmars")) self.assertEqual(r.status_code, 200) q = PyQuery(r.content) self.assertTrue(len(q('form .has-error')) > 0) # edit info with open(os.path.join(self.charter_dir, "%s-%s.txt" % (group.charter.canonical_name(), group.charter.rev)), "w") as f: f.write("This is a charter.") area = group.parent ad = Person.objects.get(name="Areað Irector") state = GroupStateName.objects.get(slug="bof") empty_outbox() r = self.client.post(url, dict(name="Mars Not Special Interest Group", acronym="mars", parent=area.pk, ad=ad.pk, state=state.pk, chairs="[email protected], [email protected]", secretaries="[email protected], [email protected], [email protected]", techadv="*****@*****.**", delegates="*****@*****.**", list_email="mars@mail", list_subscribe="subscribe.mars", list_archive="archive.mars", urls="http://mars.mars (MARS site)" )) self.assertEqual(r.status_code, 302) group = Group.objects.get(acronym="mars") self.assertEqual(group.name, "Mars Not Special Interest Group") self.assertEqual(group.parent, area) self.assertEqual(group.ad_role().person, ad) for k in ("chair", "secr", "techadv"): self.assertTrue(group.role_set.filter(name=k, email__address="*****@*****.**")) self.assertTrue(group.role_set.filter(name="delegate", email__address="*****@*****.**")) self.assertEqual(group.list_email, "mars@mail") self.assertEqual(group.list_subscribe, "subscribe.mars") self.assertEqual(group.list_archive, "archive.mars") self.assertEqual(group.groupurl_set.all()[0].url, "http://mars.mars") self.assertEqual(group.groupurl_set.all()[0].name, "MARS site") self.assertTrue(os.path.exists(os.path.join(self.charter_dir, "%s-%s.txt" % (group.charter.canonical_name(), group.charter.rev)))) self.assertEqual(len(outbox), 1) self.assertTrue('Personnel change' in outbox[0]['Subject']) for prefix in ['ad1','ad2','aread','marschairman','marsdelegate']: self.assertTrue(prefix+'@' in outbox[0]['To'])
def test_approve(self): make_test_data() group = Group.objects.get(acronym="ames") charter = group.charter url = urlreverse('ietf.doc.views_charter.approve', kwargs=dict(name=charter.name)) login_testing_unauthorized(self, "secretary", url) self.write_charter_file(charter) p = Person.objects.get(name="Areað Irector") BallotDocEvent.objects.create( type="created_ballot", ballot_type=BallotType.objects.get(doc_type="charter", slug="approve"), by=p, doc=charter, rev=charter.rev, desc="Created ballot", ) charter.set_state(State.objects.get(used=True, type="charter", slug="iesgrev")) due_date = datetime.date.today() + datetime.timedelta(days=180) m1 = GroupMilestone.objects.create(group=group, state_id="active", desc="Has been copied", due=due_date, resolved="") GroupMilestone.objects.create(group=group, state_id="active", desc="To be deleted", due=due_date, resolved="") GroupMilestone.objects.create(group=group, state_id="charter", desc="Has been copied", due=due_date, resolved="") m4 = GroupMilestone.objects.create(group=group, state_id="charter", desc="New charter milestone", due=due_date, resolved="") # normal get r = self.client.get(url) self.assertEqual(r.status_code, 200) q = PyQuery(r.content) self.assertTrue(q('[type=submit]:contains("Send announcement")')) self.assertEqual(len(q('pre')), 1) # approve empty_outbox() r = self.client.post(url, dict()) self.assertEqual(r.status_code, 302) charter = Document.objects.get(name=charter.name) self.assertEqual(charter.get_state_slug(), "approved") self.assertTrue(not charter.ballot_open("approve")) self.assertEqual(charter.rev, "01") self.assertTrue(os.path.exists(os.path.join(self.charter_dir, "charter-ietf-%s-%s.txt" % (group.acronym, charter.rev)))) self.assertEqual(len(outbox), 2) # self.assertTrue("approved" in outbox[0]['Subject'].lower()) self.assertTrue("iesg-secretary" in outbox[0]['To']) body = outbox[0].get_payload() for word in ["WG", "/wg/ames/about/", "Charter", "/doc/charter-ietf-ames/", ]: self.assertIn(word, body) # self.assertTrue("WG Action" in outbox[1]['Subject']) self.assertTrue("ietf-announce" in outbox[1]['To']) self.assertTrue("*****@*****.**" in outbox[1]['Cc']) body = outbox[1].get_payload() for word in ["Chairs", "Ames Man <*****@*****.**>", "Secretaries", "Secretary <*****@*****.**>", "Assigned Area Director", "Areað Irector <*****@*****.**>", "Area Directors", "Mailing list", "*****@*****.**", "Charter", "/doc/charter-ietf-ames/", "Milestones"]: self.assertIn(word, body) self.assertEqual(group.groupmilestone_set.filter(state="charter").count(), 0) self.assertEqual(group.groupmilestone_set.filter(state="active").count(), 2) self.assertEqual(group.groupmilestone_set.filter(state="active", desc=m1.desc).count(), 1) self.assertEqual(group.groupmilestone_set.filter(state="active", desc=m4.desc).count(), 1)
def test_duplicate_person_name(self): empty_outbox() Person.objects.create(name="Duplicate Test") Person.objects.create(name="Duplicate Test") self.assertTrue("possible duplicate" in outbox[0]["Subject"].lower())
def test_change_state(self): make_test_data() group = Group.objects.get(acronym="ames") charter = group.charter url = urlreverse('ietf.doc.views_charter.change_state', kwargs=dict(name=charter.name)) login_testing_unauthorized(self, "secretary", url) first_state = charter.get_state() # normal get r = self.client.get(url) self.assertEqual(r.status_code, 200) q = PyQuery(r.content) self.assertEqual(len(q('form select[name=charter_state]')), 1) # faulty post r = self.client.post(url, dict(charter_state="-12345")) self.assertEqual(r.status_code, 200) q = PyQuery(r.content) self.assertTrue(len(q('form .has-error')) > 0) self.assertEqual(charter.get_state(), first_state) # change state for slug in ("intrev", "extrev", "iesgrev"): s = State.objects.get(used=True, type="charter", slug=slug) events_before = charter.docevent_set.count() empty_outbox() r = self.client.post(url, dict(charter_state=str(s.pk), message="test message")) self.assertEqual(r.status_code, 302) charter = Document.objects.get(name="charter-ietf-%s" % group.acronym) self.assertEqual(charter.get_state_slug(), slug) events_now = charter.docevent_set.count() self.assertTrue(events_now > events_before) def find_event(t): return [e for e in charter.docevent_set.all()[:events_now - events_before] if e.type == t] self.assertTrue("state changed" in find_event("changed_state")[0].desc.lower()) if slug in ("intrev", "extrev"): self.assertTrue(find_event("created_ballot")) self.assertEqual(len(outbox), 3 if slug=="intrev" else 2 ) if slug=="intrev": self.assertIn("Internal WG Review", outbox[-3]['Subject']) self.assertIn("iab@", outbox[-3]['To']) self.assertIn("iesg@", outbox[-3]['To']) self.assertIn("A new IETF WG", outbox[-3].get_payload()) body = outbox[-3].get_payload() for word in ["Chairs", "Ames Man <*****@*****.**>", "Secretaries", "Secretary <*****@*****.**>", "Assigned Area Director", "Areað Irector <*****@*****.**>", "Mailing list", "*****@*****.**", "Charter", "Milestones"]: self.assertIn(word, body) self.assertIn("state changed", outbox[-2]['Subject'].lower()) self.assertIn("iesg-secretary@", outbox[-2]['To']) body = outbox[-2].get_payload() for word in ["WG", "Charter", ]: self.assertIn(word, body) self.assertIn("State Update Notice", outbox[-1]['Subject']) self.assertIn("ames-chairs@", outbox[-1]['To']) body = outbox[-1].get_payload() for word in ["State changed", "Datatracker URL", ]: self.assertIn(word, body) by = Person.objects.get(user__username="******") for slug in ('extrev','iesgrev'): close_open_ballots(charter,by) r = self.client.post(url, dict(charter_state=str(State.objects.get(used=True,type='charter',slug=slug).pk) )) self.assertTrue(r.status_code,302) charter = Document.objects.get(name="charter-ietf-%s" % group.acronym) self.assertTrue(charter.ballot_open('approve')) # Exercise internal review of a recharter group = Group.objects.get(acronym="mars") charter = group.charter url = urlreverse('ietf.doc.views_charter.change_state', kwargs=dict(name=charter.name)) empty_outbox() r = self.client.post(url, dict(charter_state=str(State.objects.get(used=True,type="charter",slug="intrev").pk), message="test")) self.assertEqual(r.status_code, 302) self.assertTrue("A new charter" in outbox[-3].get_payload())