Beispiel #1
0
    def test_add_possible_wg(self):
        url = urlreverse('iesg_working_group_actions')
        login_testing_unauthorized(self, "klm", url)
        
        r = self.client.post(url, dict(add="1",
                                       filename='sieve-charter.txt'))
        self.assertEquals(r.status_code, 302)

        add_url = r['Location']
        r = self.client.get(add_url)
        self.assertEquals(r.status_code, 200)
        q = PyQuery(r.content)
        self.assertTrue('(sieve)' in r.content)
        self.assertEquals(len(q('form select[name=token_name]')), 1)
        self.assertEquals(q('form input[name=status_date]')[0].get("value"), "2010-05-07")
        self.assertEquals(len(q('form select[name=telechat_date]')), 1)

        wgas_before = WGAction.objects.all().count()
        dates = TelechatDates.objects.all()[0]
        token_name = IESGLogin.active_iesg()[0].first_name
        r = self.client.post(add_url,
                             dict(status_date=dates.date1.isoformat(),
                                  token_name=token_name,
                                  category="23",
                                  note="Testing.",
                                  telechat_date=dates.date4.isoformat()))
        self.assertEquals(r.status_code, 302)
        self.assertEquals(wgas_before + 1, WGAction.objects.all().count())
Beispiel #2
0
    def test_approve_ballot(self):
        draft = make_test_data()
        draft.set_state(State.objects.get(used=True, type="draft-iesg", slug="iesg-eva")) # make sure it's approvable

        url = urlreverse('doc_approve_ballot', kwargs=dict(name=draft.name))
        login_testing_unauthorized(self, "secretary", url)

        # normal get
        r = self.client.get(url)
        self.assertEqual(r.status_code, 200)
        q = PyQuery(r.content)
        self.assertTrue("send out the announcement" in q('.actions input[type=submit]')[0].get('value').lower())
        self.assertEqual(len(q('.announcement pre:contains("Subject: Protocol Action")')), 1)

        # approve
        mailbox_before = len(outbox)

        r = self.client.post(url, dict(skiprfceditorpost="1"))
        self.assertEqual(r.status_code, 302)

        draft = Document.objects.get(name=draft.name)
        self.assertEqual(draft.get_state_slug("draft-iesg"), "ann")
        self.assertEqual(len(outbox), mailbox_before + 4)
        self.assertTrue("Protocol Action" in outbox[-2]['Subject'])
        # the IANA copy
        self.assertTrue("Protocol Action" in outbox[-1]['Subject'])
        self.assertTrue(not outbox[-1]['CC'])
        self.assertTrue("Protocol Action" in draft.message_set.order_by("-time")[0].subject)
Beispiel #3
0
 def test_notify_page(self):
     # check that we can get the notify page
     url = urlreverse("ietf.sync.views.notify", kwargs=dict(org="iana", notification="changes"))
     login_testing_unauthorized(self, "secretary", url)
     r = self.client.get(url)
     self.assertEqual(r.status_code, 200)
     self.assertTrue("new changes at" in unicontent(r))
Beispiel #4
0
    def test_reset_charter_milestones(self):
        m1, m2, group = self.create_test_milestones()

        url = urlreverse('wg_reset_charter_milestones',
                         kwargs=dict(acronym=group.acronym))
        login_testing_unauthorized(self, "secretary", url)

        # normal get
        r = self.client.get(url)
        self.assertEquals(r.status_code, 200)
        q = PyQuery(r.content)
        self.assertEquals(q('input[name=milestone]').val(), str(m1.pk))

        events_before = group.charter.docevent_set.count()

        # reset
        r = self.client.post(url, dict(milestone=[str(m1.pk)]))
        self.assertEquals(r.status_code, 302)

        self.assertEquals(
            GroupMilestone.objects.get(pk=m1.pk).state_id, "active")
        self.assertEquals(
            GroupMilestone.objects.get(pk=m2.pk).state_id, "deleted")
        self.assertEquals(
            GroupMilestone.objects.filter(due=m1.due,
                                          desc=m1.desc,
                                          state="charter").count(), 1)

        self.assertEquals(group.charter.docevent_set.count(),
                          events_before + 2)  # 1 delete, 1 add
Beispiel #5
0
    def test_create(self):
        make_test_data()

        url = urlreverse('wg_create')
        login_testing_unauthorized(self, "secretary", url)

        num_wgs = len(Group.objects.filter(type="wg"))

        # normal get
        r = self.client.get(url)
        self.assertEquals(r.status_code, 200)
        q = PyQuery(r.content)
        self.assertEquals(len(q('form input[name=acronym]')), 1)

        # faulty post
        r = self.client.post(url, dict(acronym="foobarbaz"))  # No name
        self.assertEquals(r.status_code, 200)
        q = PyQuery(r.content)
        self.assertTrue(len(q('form ul.errorlist')) > 0)
        self.assertEquals(len(Group.objects.filter(type="wg")), num_wgs)

        # creation
        state = GroupStateName.objects.get(slug="bof")
        r = self.client.post(
            url, dict(acronym="testwg", name="Testing WG", state=state.pk))
        self.assertEquals(r.status_code, 302)
        self.assertEquals(len(Group.objects.filter(type="wg")), num_wgs + 1)
        group = Group.objects.get(acronym="testwg")
        self.assertEquals(group.name, "Testing WG")
        self.assertEquals(group.charter.name, "charter-ietf-testwg")
        self.assertEquals(group.charter.rev, "00-00")
Beispiel #6
0
    def test_conclude(self):
        make_test_data()

        group = Group.objects.get(acronym="mars")

        url = urlreverse('wg_conclude', kwargs=dict(acronym=group.acronym))
        login_testing_unauthorized(self, "secretary", url)

        # normal get
        r = self.client.get(url)
        self.assertEquals(r.status_code, 200)
        q = PyQuery(r.content)
        self.assertEquals(len(q('form textarea[name=instructions]')), 1)

        # faulty post
        r = self.client.post(url, dict(instructions=""))  # No instructions
        self.assertEquals(r.status_code, 200)
        q = PyQuery(r.content)
        self.assertTrue(len(q('form ul.errorlist')) > 0)

        # request conclusion
        mailbox_before = len(outbox)
        r = self.client.post(url, dict(instructions="Test instructions"))
        self.assertEquals(r.status_code, 302)
        self.assertEquals(len(outbox), mailbox_before + 1)
        # the WG remains active until the Secretariat takes action
        group = Group.objects.get(acronym=group.acronym)
        self.assertEquals(group.state_id, "active")
Beispiel #7
0
    def test_delete_milestone(self):
        m1, m2, group = self.create_test_milestones()

        url = urlreverse('wg_edit_milestones',
                         kwargs=dict(acronym=group.acronym))
        login_testing_unauthorized(self, "secretary", url)

        milestones_before = GroupMilestone.objects.count()
        events_before = group.groupevent_set.count()

        # delete
        r = self.client.post(
            url, {
                'prefix': "m1",
                'm1-id': m1.id,
                'm1-desc': m1.desc,
                'm1-due_month': str(m1.due.month),
                'm1-due_year': str(m1.due.year),
                'm1-resolved': "",
                'm1-docs': ",".join(m1.docs.values_list("name", flat=True)),
                'm1-delete': "checked",
                'action': "save",
            })
        self.assertEquals(r.status_code, 302)
        self.assertEquals(GroupMilestone.objects.count(), milestones_before)
        self.assertEquals(group.groupevent_set.count(), events_before + 1)

        m = GroupMilestone.objects.get(pk=m1.pk)
        self.assertEquals(m.state_id, "deleted")
        self.assertTrue(
            "Deleted milestone" in m.milestonegroupevent_set.all()[0].desc)
Beispiel #8
0
    def test_delete_milestone(self):
        m1, m2, group = self.create_test_milestones()

        url = urlreverse('group_edit_milestones', kwargs=dict(group_type=group.type_id, acronym=group.acronym))
        login_testing_unauthorized(self, "secretary", url)

        milestones_before = GroupMilestone.objects.count()
        events_before = group.groupevent_set.count()

        # delete
        r = self.client.post(url, { 'prefix': "m1",
                                    'm1-id': m1.id,
                                    'm1-desc': m1.desc,
                                    'm1-due_month': str(m1.due.month),
                                    'm1-due_year': str(m1.due.year),
                                    'm1-resolved': "",
                                    'm1-docs': ",".join(m1.docs.values_list("name", flat=True)),
                                    'm1-delete': "checked",
                                    'action': "save",
                                    })
        self.assertEqual(r.status_code, 302)
        self.assertEqual(GroupMilestone.objects.count(), milestones_before)
        self.assertEqual(group.groupevent_set.count(), events_before + 1)

        m = GroupMilestone.objects.get(pk=m1.pk)
        self.assertEqual(m.state_id, "deleted")
        self.assertTrue("Deleted milestone" in m.milestonegroupevent_set.all()[0].desc)
Beispiel #9
0
    def test_edit_position_as_secretary(self):
        draft = make_test_data()
        url = urlreverse('ietf.doc.views_ballot.edit_position',
                         kwargs=dict(name=draft.name,
                                     ballot_id=draft.latest_event(
                                         BallotDocEvent,
                                         type="created_ballot").pk))
        ad = Person.objects.get(name="Areað Irector")
        url += "?ad=%s" % ad.pk
        login_testing_unauthorized(self, "secretary", url)

        # normal get
        r = self.client.get(url)
        self.assertEqual(r.status_code, 200)
        q = PyQuery(r.content)
        self.assertTrue(len(q('form input[name=position]')) > 0)

        # vote on behalf of AD
        # events_before = draft.docevent_set.count()
        r = self.client.post(
            url, dict(position="discuss", discuss="Test discuss text"))
        self.assertEqual(r.status_code, 302)

        pos = draft.latest_event(BallotPositionDocEvent, ad=ad)
        self.assertEqual(pos.pos.slug, "discuss")
        self.assertEqual(pos.discuss, "Test discuss text")
        self.assertTrue("New position" in pos.desc)
        self.assertTrue("by Sec" in pos.desc)
Beispiel #10
0
    def test_edit_action_announcement_text(self):
        draft = make_test_data()
        charter = draft.group.charter

        url = urlreverse('ietf.doc.views_charter.action_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)

        # save
        r = self.client.post(url, dict(
                announcement_text="This is a simple test.",
                save_text="1"))
        self.assertEqual(r.status_code, 302)
        self.assertTrue("This is a simple test" in charter.latest_event(WriteupDocEvent, type="changed_action_announcement").text)

        # test regenerate
        r = self.client.post(url, dict(
                announcement_text="This is a simple test.",
                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_action_announcement").text)
Beispiel #11
0
    def test_submit_initial_charter(self):
        make_test_data()

        group = Group.objects.get(acronym="mars")
        # get rid of existing charter
        charter = group.charter
        group.charter = None
        group.save()
        charter.delete()
        charter = None

        url = urlreverse('ietf.doc.views_charter.submit', kwargs=dict(name=charter_name_for_group(group)))
        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 input[name=txt]')), 1)

        # create charter
        test_file = StringIO("Simple test")
        test_file.name = "unnamed"

        r = self.client.post(url, dict(txt=test_file))
        self.assertEqual(r.status_code, 302)

        charter = Document.objects.get(name="charter-ietf-%s" % group.acronym)
        self.assertEqual(charter.rev, "00-00")
        self.assertTrue("new_revision" in charter.latest_event().type)

        group = Group.objects.get(pk=group.pk)
        self.assertEqual(group.charter, charter)
Beispiel #12
0
    def test_no_returning_item_for_different_ballot(self):
        make_test_data()

        group = Group.objects.get(acronym="ames")
        charter = group.charter
        url = urlreverse('charter_telechat_date', kwargs=dict(name=charter.name))
        login_testing_unauthorized(self, "secretary", url)
        login = Person.objects.get(user__username="******")

        # Make it so that the charter has been through internal review, and passed its external review
        # ballot on a previous telechat 
        last_week = datetime.date.today()-datetime.timedelta(days=7)
        BallotDocEvent.objects.create(type='created_ballot',by=login,doc=charter,
                                      ballot_type=BallotType.objects.get(doc_type=charter.type,slug='r-extrev'),
                                      time=last_week)
        TelechatDocEvent.objects.create(type='scheduled_for_telechat',doc=charter,by=login,telechat_date=last_week,returning_item=False)
        BallotDocEvent.objects.create(type='created_ballot',by=login,doc=charter,
                                      ballot_type=BallotType.objects.get(doc_type=charter.type,slug='approve'))
        
        # Put the charter onto a future telechat and verify returning item is not set
        telechat_date = TelechatDate.objects.active()[1].date
        r = self.client.post(url, dict(name=group.name, acronym=group.acronym, telechat_date=telechat_date.isoformat()))
        self.assertEqual(r.status_code, 302)
        
        charter = Document.objects.get(name=charter.name)
        telechat_event = charter.latest_event(TelechatDocEvent, "scheduled_for_telechat")
        self.assertEqual(telechat_event.telechat_date, telechat_date)
        self.assertFalse(telechat_event.returning_item)
Beispiel #13
0
    def test_edit_notify(self):
        make_test_data()

        charter = Group.objects.get(acronym="mars").charter

        url = urlreverse('charter_edit_notify', kwargs=dict(name=charter.name))
        login_testing_unauthorized(self, "secretary", url)

        # get
        r = self.client.get(url)
        self.assertEqual(r.status_code, 200)

        # post
        self.assertTrue(not charter.notify)
        newlist = "[email protected], [email protected]"
        r = self.client.post(url, dict(notify=newlist,save_addresses="1"))
        self.assertEqual(r.status_code, 302)

        charter = Document.objects.get(name=charter.name)
        self.assertEqual(charter.notify, newlist)

        # Ask the form to regenerate the list
        r = self.client.post(url,dict(regenerate_addresses="1"))
        self.assertEqual(r.status_code,200)
        charter= Document.objects.get(name=charter.name)
        # Regenerate does not save!
        self.assertEqual(charter.notify,newlist)
        q = PyQuery(r.content)
        formlist = q('form input[name=notify]')[0].value
        self.assertEqual(formlist, None)
Beispiel #14
0
    def test_change_review_secretary_settings(self):
        doc = make_test_data()

        review_req = make_review_data(doc)

        secretary = Person.objects.get(user__username="******")

        url = urlreverse(ietf.group.views.change_review_secretary_settings, kwargs={
            "acronym": review_req.team.acronym,
        })

        login_testing_unauthorized(self, secretary.user.username, url)

        url = urlreverse(ietf.group.views.change_review_secretary_settings, kwargs={
            "group_type": review_req.team.type_id,
            "acronym": review_req.team.acronym,
        })

        # get
        r = self.client.get(url)
        self.assertEqual(r.status_code, 200)

        # set settings
        r = self.client.post(url, {
            "remind_days_before_deadline": "6"
        })
        self.assertEqual(r.status_code, 302)
        settings = ReviewSecretarySettings.objects.get(person=secretary, team=review_req.team)
        self.assertEqual(settings.remind_days_before_deadline, 6)
Beispiel #15
0
    def test_add_delegate(self):
        make_test_data()

        url = urlreverse('manage_delegates', kwargs=dict(acronym="mars"))
        login_testing_unauthorized(self, "secretary", url)

        # get
        r = self.client.get(url)
        self.assertEquals(r.status_code, 200)
        q = PyQuery(r.content)
        self.assertEquals(len(q('form input[name=email]')), 1)

        # add existing person
        history_before = GroupHistory.objects.filter(acronym="mars").count()
        r = self.client.post(
            url, dict(email="*****@*****.**", form_type="single"))
        self.assertEquals(r.status_code, 200)
        q = PyQuery(r.content)
        self.assertTrue("new delegate" in r.content)
        self.assertTrue(
            Email.objects.get(
                address="*****@*****.**").person.plain_name() in r.content)
        self.assertEquals(
            Role.objects.filter(name="delegate",
                                group__acronym="mars",
                                email__address="*****@*****.**").count(), 1)
        self.assertEquals(history_before + 1,
                          GroupHistory.objects.filter(acronym="mars").count())
Beispiel #16
0
    def test_add_not_existing_delegate(self):
        make_test_data()

        url = urlreverse('manage_delegates', kwargs=dict(acronym="mars"))
        login_testing_unauthorized(self, "secretary", url)

        # get
        r = self.client.get(url)
        self.assertEquals(r.status_code, 200)
        q = PyQuery(r.content)
        self.assertEquals(len(q('form input[name=email]')), 1)

        # add non-existing
        r = self.client.post(
            url, dict(email="*****@*****.**", form_type="single"))
        self.assertEquals(r.status_code, 200)
        self.assertTrue("*****@*****.**" in r.content)
        q = PyQuery(r.content)
        self.assertEquals(
            len(q('form input[type=submit][value*="Send email"]')), 1)

        # we get back a warning and offer to send email, do that
        mailbox_before = len(outbox)
        r = self.client.post(
            url, dict(email="*****@*****.**", form_type="notexist"))
        self.assertEquals(r.status_code, 200)
        self.assertTrue("Email sent" in r.content)
        self.assertEquals(len(outbox), mailbox_before + 3)
Beispiel #17
0
    def test_no_returning_item_for_different_ballot(self):
        make_test_data()

        group = Group.objects.get(acronym="ames")
        charter = group.charter
        url = urlreverse('ietf.doc.views_doc.telechat_date;charter', kwargs=dict(name=charter.name))
        login_testing_unauthorized(self, "secretary", url)
        login = Person.objects.get(user__username="******")

        # Make it so that the charter has been through internal review, and passed its external review
        # ballot on a previous telechat 
        last_week = datetime.date.today()-datetime.timedelta(days=7)
        BallotDocEvent.objects.create(type='created_ballot',by=login,doc=charter, rev=charter.rev,
                                      ballot_type=BallotType.objects.get(doc_type=charter.type,slug='r-extrev'),
                                      time=last_week)
        TelechatDocEvent.objects.create(type='scheduled_for_telechat', doc=charter, rev=charter.rev, by=login, telechat_date=last_week, returning_item=False)
        BallotDocEvent.objects.create(type='created_ballot', by=login, doc=charter, rev=charter.rev,
                                      ballot_type=BallotType.objects.get(doc_type=charter.type, slug='approve'))
        
        # Put the charter onto a future telechat and verify returning item is not set
        telechat_date = TelechatDate.objects.active()[1].date
        r = self.client.post(url, dict(name=group.name, acronym=group.acronym, telechat_date=telechat_date.isoformat()))
        self.assertEqual(r.status_code, 302)
        
        charter = Document.objects.get(name=charter.name)
        telechat_event = charter.latest_event(TelechatDocEvent, "scheduled_for_telechat")
        self.assertEqual(telechat_event.telechat_date, telechat_date)
        self.assertFalse(telechat_event.returning_item)
Beispiel #18
0
    def test_edit_relations(self):
        doc = Document.objects.get(name='status-change-imaginary-mid-review')
        url = urlreverse('status_change_relations',kwargs=dict(name=doc.name))

        login_testing_unauthorized(self, "secretary", url)
        
        # Some additional setup
        doc.relateddocument_set.create(target=DocAlias.objects.get(name='rfc9999'),relationship_id='tois')
        doc.relateddocument_set.create(target=DocAlias.objects.get(name='rfc9998'),relationship_id='tohist')

        # get
        r = self.client.get(url)
        self.assertEquals(r.status_code, 200)
        q = PyQuery(r.content)
        self.assertEquals(len(q('form.edit-status-change-rfcs')),1)
        # There should be three rows on the form
        self.assertEquals(len(q('tr[id^=relation_row]')),3)

        # Try to add a relation to an RFC that doesn't exist
        r = self.client.post(url,dict(new_relation_row_blah="rfc9997",
                                      statchg_relation_row_blah="tois",
                                      Submit="Submit"))
        self.assertEquals(r.status_code, 200)
        q = PyQuery(r.content)
        self.assertTrue(len(q('form ul.errorlist')) > 0)

       # Try to add a relation leaving the relation type blank
        r = self.client.post(url,dict(new_relation_row_blah="rfc9999",
                                      statchg_relation_row_blah="",
                                      Submit="Submit"))
        self.assertEquals(r.status_code, 200)
        q = PyQuery(r.content)
        self.assertTrue(len(q('form ul.errorlist')) > 0)

       # Try to add a relation with an unknown relationship type
        r = self.client.post(url,dict(new_relation_row_blah="rfc9999",
                                      statchg_relation_row_blah="badslug",
                                      Submit="Submit"))
        self.assertEquals(r.status_code, 200)
        q = PyQuery(r.content)
        self.assertTrue(len(q('form ul.errorlist')) > 0)
        
        # Successful change of relations
        r = self.client.post(url,dict(new_relation_row_blah="rfc9999",
                                      statchg_relation_row_blah="toexp",
                                      new_relation_row_foo="rfc9998",
                                      statchg_relation_row_foo="tobcp",
                                      Submit="Submit"))
        self.assertEquals(r.status_code, 302)
        doc = Document.objects.get(name='status-change-imaginary-mid-review')
        self.assertEquals(doc.relateddocument_set.count(),2)
        verify9999 = doc.relateddocument_set.filter(target__name='rfc9999')
        self.assertTrue(verify9999)
        self.assertEquals(verify9999.count(),1)
        self.assertEquals(verify9999[0].relationship.slug,'toexp')
        verify9998 = doc.relateddocument_set.filter(target__name='rfc9998')
        self.assertTrue(verify9998)
        self.assertEquals(verify9998.count(),1)
        self.assertEquals(verify9998[0].relationship.slug,'tobcp')
        self.assertTrue(doc.latest_event(DocEvent,type="added_comment").desc.startswith('Affected RFC list changed.'))       
Beispiel #19
0
    def test_edit_notify(self):
        make_test_data()

        charter = Group.objects.get(acronym="mars").charter

        url = urlreverse('ietf.doc.views_doc.edit_notify;charter', kwargs=dict(name=charter.name))
        login_testing_unauthorized(self, "secretary", url)

        # get
        r = self.client.get(url)
        self.assertEqual(r.status_code, 200)

        # post
        self.assertTrue(not charter.notify)
        newlist = "[email protected], [email protected]"
        r = self.client.post(url, dict(notify=newlist,save_addresses="1"))
        self.assertEqual(r.status_code, 302)

        charter = Document.objects.get(name=charter.name)
        self.assertEqual(charter.notify, newlist)

        # Ask the form to regenerate the list
        r = self.client.post(url,dict(regenerate_addresses="1"))
        self.assertEqual(r.status_code,200)
        charter= Document.objects.get(name=charter.name)
        # Regenerate does not save!
        self.assertEqual(charter.notify,newlist)
        q = PyQuery(r.content)
        formlist = q('form input[name=notify]')[0].value
        self.assertEqual(formlist, None)
Beispiel #20
0
    def test_initial_submission(self):
        doc = Document.objects.get(name='status-change-imaginary-mid-review')
        url = urlreverse('status_change_submit',kwargs=dict(name=doc.name))
        login_testing_unauthorized(self, "ad", url)

        # normal get
        r = self.client.get(url)
        self.assertEquals(r.status_code,200)
        q = PyQuery(r.content)
        self.assertTrue(q('textarea')[0].text.startswith("Provide a description"))
        
        # Faulty posts using textbox
        # Right now, nothing to test - we let people put whatever the web browser will let them put into that textbox

        # sane post using textbox
        path = os.path.join(settings.STATUS_CHANGE_PATH, '%s-%s.txt' % (doc.canonical_name(), doc.rev))
        self.assertEquals(doc.rev,u'00')
        self.assertFalse(os.path.exists(path))
        r = self.client.post(url,dict(content="Some initial review text\n",submit_response="1"))
        self.assertEquals(r.status_code,302)
        doc = Document.objects.get(name='status-change-imaginary-mid-review')
        self.assertEquals(doc.rev,u'00')
        with open(path) as f:
            self.assertEquals(f.read(),"Some initial review text\n")
            f.close()
        self.assertTrue( "mid-review-00" in doc.latest_event(NewRevisionDocEvent).desc)
Beispiel #21
0
    def test_edit_action_announcement_text(self):
        draft = make_test_data()
        charter = draft.group.charter

        url = urlreverse('ietf.doc.views_charter.action_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)

        # save
        r = self.client.post(url, dict(
                announcement_text="This is a simple test.",
                save_text="1"))
        self.assertEqual(r.status_code, 302)
        self.assertTrue("This is a simple test" in charter.latest_event(WriteupDocEvent, type="changed_action_announcement").text)

        # test regenerate
        r = self.client.post(url, dict(
                announcement_text="This is a simple test.",
                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_action_announcement").text)
Beispiel #22
0
    def test_create(self):
        make_test_data()

        url = urlreverse('wg_create')
        login_testing_unauthorized(self, "secretary", url)

        num_wgs = len(Group.objects.filter(type="wg"))

        # normal get
        r = self.client.get(url)
        self.assertEquals(r.status_code, 200)
        q = PyQuery(r.content)
        self.assertEquals(len(q('form input[name=acronym]')), 1)
        
        # faulty post
        r = self.client.post(url, dict(acronym="foobarbaz")) # No name
        self.assertEquals(r.status_code, 200)
        q = PyQuery(r.content)
        self.assertTrue(len(q('form ul.errorlist')) > 0)
        self.assertEquals(len(Group.objects.filter(type="wg")), num_wgs)

        # creation
        state = GroupStateName.objects.get(slug="bof")
        r = self.client.post(url, dict(acronym="testwg", name="Testing WG", state=state.pk))
        self.assertEquals(r.status_code, 302)
        self.assertEquals(len(Group.objects.filter(type="wg")), num_wgs + 1)
        group = Group.objects.get(acronym="testwg")
        self.assertEquals(group.name, "Testing WG")
        self.assertEquals(group.charter.name, "charter-ietf-testwg")
        self.assertEquals(group.charter.rev, "00-00")
Beispiel #23
0
    def test_accept_milestone(self):
        m1, m2, group = self.create_test_milestones()
        m1.state_id = "review"
        m1.save()

        url = urlreverse('group_edit_milestones', kwargs=dict(group_type=group.type_id, acronym=group.acronym))
        login_testing_unauthorized(self, "ad", url)

        # normal get
        r = self.client.get(url)
        self.assertEqual(r.status_code, 200)

        events_before = group.groupevent_set.count()

        # add
        r = self.client.post(url, { 'prefix': "m1",
                                    'm1-id': m1.id,
                                    'm1-desc': m1.desc,
                                    'm1-due_month': str(m1.due.month),
                                    'm1-due_year': str(m1.due.year),
                                    'm1-resolved': m1.resolved,
                                    'm1-docs': ",".join(m1.docs.values_list("name", flat=True)),
                                    'm1-accept': "accept",
                                    'action': "save",
                                    })
        self.assertEqual(r.status_code, 302)

        m = GroupMilestone.objects.get(pk=m1.pk)
        self.assertEqual(m.state_id, "active")
        self.assertEqual(group.groupevent_set.count(), events_before + 1)
        self.assertTrue("to active from review" in m.milestonegroupevent_set.all()[0].desc)
Beispiel #24
0
    def test_edit_ballot_writeup(self):
        draft = make_test_data()
        url = urlreverse('doc_ballot_writeupnotes', kwargs=dict(name=draft.name))
        login_testing_unauthorized(self, "secretary", url)

        # add a IANA review note
        draft.set_state(State.objects.get(used=True, type="draft-iana-review", slug="not-ok"))
        DocEvent.objects.create(type="iana_review",
                                doc=draft,
                                by=Person.objects.get(user__username="******"),
                                desc="IANA does not approve of this document, it does not make sense.",
                                )

        # 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)
        self.assertEqual(len(q('input[type=submit][value*="Save Ballot Writeup"]')), 1)
        self.assertTrue("IANA does not" in r.content)

        # save
        r = self.client.post(url, dict(
                ballot_writeup="This is a simple test.",
                save_ballot_writeup="1"))
        self.assertEqual(r.status_code, 200)
        draft = Document.objects.get(name=draft.name)
        self.assertTrue("This is a simple test" in draft.latest_event(WriteupDocEvent, type="changed_ballot_writeup_text").text)
Beispiel #25
0
    def test_create_based_on_existing(self):
        make_test_data()

        url = urlreverse('group_create', kwargs=dict(group_type="wg"))
        login_testing_unauthorized(self, "secretary", url)

        group = Group.objects.get(acronym="mars")

        # try hijacking area - faulty
        r = self.client.post(url, dict(name="Test", acronym=group.parent.acronym))
        self.assertEqual(r.status_code, 200)
        q = PyQuery(r.content)
        self.assertTrue(len(q('form ul.errorlist')) > 0)
        self.assertEqual(len(q('form input[name="confirmed"]')), 0) # can't confirm us out of this

        # try elevating BoF to WG
        group.state_id = "bof"
        group.save()

        r = self.client.post(url, dict(name="Test", acronym=group.acronym))
        self.assertEqual(r.status_code, 200)
        q = PyQuery(r.content)
        self.assertTrue(len(q('form ul.errorlist')) > 0)
        self.assertEqual(len(q('form input[name="confirmed"]')), 1)

        self.assertEqual(Group.objects.get(acronym=group.acronym).state_id, "bof")

        # confirm elevation
        state = GroupStateName.objects.get(slug="proposed")
        r = self.client.post(url, dict(name="Test", acronym=group.acronym, confirmed="1",state=state.pk))
        self.assertEqual(r.status_code, 302)
        self.assertEqual(Group.objects.get(acronym=group.acronym).state_id, "proposed")
        self.assertEqual(Group.objects.get(acronym=group.acronym).name, "Test")
Beispiel #26
0
    def test_initial_submission(self):
        doc = Document.objects.get(name='status-change-imaginary-mid-review')
        url = urlreverse('status_change_submit', kwargs=dict(name=doc.name))
        login_testing_unauthorized(self, "ad", url)

        # normal get
        r = self.client.get(url)
        self.assertEquals(r.status_code, 200)
        q = PyQuery(r.content)
        self.assertTrue(
            q('textarea')[0].text.startswith("Provide a description"))

        # Faulty posts using textbox
        # Right now, nothing to test - we let people put whatever the web browser will let them put into that textbox

        # sane post using textbox
        path = os.path.join(settings.STATUS_CHANGE_PATH,
                            '%s-%s.txt' % (doc.canonical_name(), doc.rev))
        self.assertEquals(doc.rev, u'00')
        self.assertFalse(os.path.exists(path))
        r = self.client.post(
            url, dict(content="Some initial review text\n",
                      submit_response="1"))
        self.assertEquals(r.status_code, 302)
        doc = Document.objects.get(name='status-change-imaginary-mid-review')
        self.assertEquals(doc.rev, u'00')
        with open(path) as f:
            self.assertEquals(f.read(), "Some initial review text\n")
            f.close()
        self.assertTrue(
            "mid-review-00" in doc.latest_event(NewRevisionDocEvent).desc)
Beispiel #27
0
    def test_approval(self):
        make_test_data()
        liaison = make_liaison_models()
        # has to come from WG to need approval
        liaison.from_group = Group.objects.get(acronym="mars")
        liaison.approved = None
        liaison.save()

        url = urlreverse('liaison_approval_detail',
                         kwargs=dict(object_id=liaison.pk))
        # this liaison is for a WG so we need the AD for the area
        login_testing_unauthorized(self, "ad", url)

        # normal get
        r = self.client.get(url)
        self.assertEquals(r.status_code, 200)
        q = PyQuery(r.content)
        self.assertEquals(len(q('form input[name=do_approval]')), 1)

        # approve
        mailbox_before = len(outbox)
        r = self.client.post(url, dict(do_approval="1"))
        self.assertEquals(r.status_code, 302)

        liaison = LiaisonStatement.objects.get(id=liaison.id)
        self.assertTrue(liaison.approved)
        self.assertEquals(len(outbox), mailbox_before + 1)
        self.assertTrue("Liaison Statement" in outbox[-1]["Subject"])
Beispiel #28
0
    def test_add_milestone_as_chair(self):
        m1, m2, group = self.create_test_milestones()

        url = urlreverse('group_edit_milestones', kwargs=dict(group_type=group.type_id, acronym=group.acronym))
        login_testing_unauthorized(self, "marschairman", url)

        # normal get
        r = self.client.get(url)
        self.assertEqual(r.status_code, 200)

        milestones_before = GroupMilestone.objects.count()
        events_before = group.groupevent_set.count()
        due = self.last_day_of_month(datetime.date.today() + datetime.timedelta(days=365))

        # add
        r = self.client.post(url, { 'prefix': "m-1",
                                    'm-1-id': -1,
                                    'm-1-desc': "Test 3",
                                    'm-1-due_month': str(due.month),
                                    'm-1-due_year': str(due.year),
                                    'm-1-resolved': "",
                                    'm-1-docs': "",
                                    'action': "save",
                                    })
        self.assertEqual(r.status_code, 302)
        self.assertEqual(GroupMilestone.objects.count(), milestones_before + 1)

        m = GroupMilestone.objects.get(desc="Test 3")
        self.assertEqual(m.state_id, "review")
        self.assertEqual(group.groupevent_set.count(), events_before + 1)
        self.assertTrue("for review" in m.milestonegroupevent_set.all()[0].desc)
Beispiel #29
0
    def test_manage_stream_delegates(self):
        make_test_data()

        url = urlreverse('stream_delegates', kwargs=dict(stream_name="IETF"))
        login_testing_unauthorized(self, "secretary", url)

        # get
        r = self.client.get(url)
        self.assertEquals(r.status_code, 200)
        q = PyQuery(r.content)
        self.assertEquals(len(q('input[type=submit][value*=Add]')), 1)

        delegate = Email.objects.get(address="*****@*****.**")

        # add delegate
        r = self.client.post(url,
                             dict(email=delegate.address))
        self.assertEquals(r.status_code, 200)

        self.assertEquals(Role.objects.filter(group__acronym="ietf", name="delegate", person__email__address=delegate.address).count(), 1)

        # remove delegate again
        r = self.client.post(url,
                             dict(remove_delegate=[delegate.person.pk],
                                  delete="1"))
        self.assertEquals(r.status_code, 200)

        self.assertEquals(Role.objects.filter(group__acronym="ietf", name="delegate", person__email__address=delegate.address).count(), 0)
Beispiel #30
0
    def test_adopt_document(self):
        draft = make_test_data()
        draft.stream = None
        draft.group = Group.objects.get(type="individ")
        draft.save()
        draft.unset_state("draft-stream-ietf")

        url = urlreverse('edit_adopt', kwargs=dict(name=draft.name))
        login_testing_unauthorized(self, "marschairman", url)
        
        # get
        r = self.client.get(url)
        self.assertEquals(r.status_code, 200)
        q = PyQuery(r.content)
        self.assertEquals(len(q('form input[type=submit][value*=adopt]')), 1)
        self.assertEquals(len(q('form select[name="group"] option')), 1) # we can only select "mars"

        # adopt in mars WG
        mailbox_before = len(outbox)
        events_before = draft.docevent_set.count()
        r = self.client.post(url,
                             dict(comment="some comment",
                                  group=Group.objects.get(acronym="mars").pk,
                                  weeks="10"))
        self.assertEquals(r.status_code, 302)

        draft = Document.objects.get(pk=draft.pk)
        self.assertEquals(draft.group.acronym, "mars")
        self.assertEquals(draft.stream_id, "ietf")
        self.assertEquals(draft.docevent_set.count() - events_before, 4)
        self.assertEquals(len(outbox), mailbox_before + 1)
        self.assertTrue("state changed" in outbox[-1]["Subject"].lower())
        self.assertTrue("*****@*****.**" in unicode(outbox[-1]))
        self.assertTrue("*****@*****.**" in unicode(outbox[-1]))
    def test_edit_notices(self):
        doc = Document.objects.get(name='status-change-imaginary-mid-review')
        url = urlreverse('status_change_notices',kwargs=dict(name=doc.name))

        login_testing_unauthorized(self, "ad", url)

        # normal get 
        r = self.client.get(url)
        self.assertEqual(r.status_code, 200)
        q = PyQuery(r.content)
        self.assertEqual(len(q('form input[name=notify]')),1)
        self.assertEqual(doc.notify,q('form input[name=notify]')[0].value)

        # change notice list
        newlist = '"Foo Bar" <*****@*****.**>'
        r = self.client.post(url,dict(notify=newlist,save_addresses="1"))
        self.assertEqual(r.status_code,302)
        doc = Document.objects.get(name='status-change-imaginary-mid-review')
        self.assertEqual(doc.notify,newlist)
        self.assertTrue(doc.latest_event(DocEvent,type="added_comment").desc.startswith('Notification list changed'))       

        # Some additional setup so there's something to put in a generated notify list
        doc.relateddocument_set.create(target=DocAlias.objects.get(name='rfc9999'),relationship_id='tois')
        doc.relateddocument_set.create(target=DocAlias.objects.get(name='rfc9998'),relationship_id='tohist')

        # Ask the form to regenerate the list
        r = self.client.post(url,dict(regenerate_addresses="1"))
        self.assertEqual(r.status_code,200)
        doc = Document.objects.get(name='status-change-imaginary-mid-review')
        # Regenerate does not save!
        self.assertEqual(doc.notify,newlist)
        q = PyQuery(r.content)
        formlist = q('form input[name=notify]')[0].value
        self.assertEqual(None,formlist)
    def test_edit_notices(self):
        doc = Document.objects.get(name='conflict-review-imaginary-irtf-submission')
        url = urlreverse('conflict_review_notices',kwargs=dict(name=doc.name))

        login_testing_unauthorized(self, "ad", url)

        # normal get 
        r = self.client.get(url)
        self.assertEqual(r.status_code, 200)
        q = PyQuery(r.content)
        self.assertEqual(len(q('form input[name=notify]')),1)
        self.assertEqual(doc.notify,q('form input[name=notify]')[0].value)

        # change notice list
        newlist = '"Foo Bar" <*****@*****.**>'
        r = self.client.post(url,dict(notify=newlist,save_addresses="1"))
        self.assertEqual(r.status_code,302)
        doc = Document.objects.get(name='conflict-review-imaginary-irtf-submission')
        self.assertEqual(doc.notify,newlist)
        self.assertTrue(doc.latest_event(DocEvent,type="added_comment").desc.startswith('Notification list changed'))       

        # Ask the form to regenerate the list
        r = self.client.post(url,dict(regenerate_addresses="1"))
        self.assertEqual(r.status_code,200)
        doc = Document.objects.get(name='conflict-review-imaginary-irtf-submission')
        # Regenerate does not save!
        self.assertEqual(doc.notify,newlist)
        q = PyQuery(r.content)
        self.assertEqual(None,q('form input[name=notify]')[0].value)
Beispiel #33
0
    def test_edit_material_presentations(self):
        doc = self.create_slides()
        meeting = make_meeting_test_data()
        meeting.session_set.filter(group__acronym='mars').update(group=doc.group)

        session = meeting.agenda.assignments.filter(session__group__acronym='testteam').first().session

        url = urlreverse(edit_material_presentations,kwargs=dict(name=doc.name,acronym='testteam',seq=1))
        login_testing_unauthorized(self, "secretary", url)
        r = self.client.get(url)
        self.assertEqual(r.status_code, 200)
        
        self.assertEqual(doc.sessionpresentation_set.count(),0)

        # add the materials to a session
        r = self.client.post(url, dict(action="Save",version="00"))
        self.assertEqual(r.status_code, 302)
        self.assertEqual(doc.sessionpresentation_set.first().session , session) 

        # change the version
        r = self.client.post(url, dict(action="Save",version="01"))
        self.assertEqual(r.status_code, 302)
        self.assertEqual(doc.sessionpresentation_set.first().session , session) 

        # take the slides back off that meeting
        r = self.client.post(url, dict(action="Save",version="notpresented"))
        self.assertEqual(r.status_code, 302)
        self.assertEqual(doc.sessionpresentation_set.count(),0)
Beispiel #34
0
    def test_add_comment(self):
        draft = make_test_data()
        url = urlreverse('doc_add_comment', kwargs=dict(name=draft.name))
        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 textarea[name=comment]')), 1)

        # request resurrect
        events_before = draft.docevent_set.count()
        mailbox_before = len(outbox)
        
        r = self.client.post(url, dict(comment="This is a test."))
        self.assertEqual(r.status_code, 302)

        self.assertEqual(draft.docevent_set.count(), events_before + 1)
        self.assertEqual("This is a test.", draft.latest_event().desc)
        self.assertEqual("added_comment", draft.latest_event().type)
        self.assertEqual(len(outbox), mailbox_before + 1)
        self.assertTrue("updated" in outbox[-1]['Subject'])
        self.assertTrue(draft.name in outbox[-1]['Subject'])

        # Make sure we can also do it as IANA
        self.client.login(username="******", password="******")

        # normal get
        r = self.client.get(url)
        self.assertEqual(r.status_code, 200)
        q = PyQuery(r.content)
        self.assertEqual(len(q('form textarea[name=comment]')), 1)
Beispiel #35
0
    def test_edit_wgaction(self):
        from ietf.utils.test_data import make_test_data
        from ietf.person.models import Person
        
        make_test_data()
        
        wga = WGAction.objects.all()[0]
        url = urlreverse('iesg_edit_working_group_action', kwargs=dict(wga_id=wga.pk))
        login_testing_unauthorized(self, "secretary", url)

        # normal get
        r = self.client.get(url)
        self.assertEquals(r.status_code, 200)
        q = PyQuery(r.content)
        self.assertEquals(len(q('form select[name=token_name]')), 1)
        self.assertEquals(len(q('form select[name=telechat_date]')), 1)

        # change
        dates = TelechatDate.objects.active()
        token_name = Person.objects.get(name="Ad No1").plain_name()
        old = wga.pk
        r = self.client.post(url, dict(status_date=dates[0].date.isoformat(),
                                       token_name=token_name,
                                       category="23",
                                       note="Testing.",
                                       telechat_date=dates[3].date.isoformat()))
        self.assertEquals(r.status_code, 302)

        wga = WGAction.objects.get(pk=old)
        self.assertEquals(wga.status_date, dates[0].date)
        self.assertEquals(wga.token_name, token_name)
        self.assertEquals(wga.category, 23)
        self.assertEquals(wga.note, "Testing.")
        self.assertEquals(wga.telechat_date, dates[3].date)
Beispiel #36
0
    def test_material_presentations(self):
        doc = self.create_slides()
        meeting = make_meeting_test_data()
        meeting.session_set.filter(group__acronym='mars').update(group=doc.group)

        url = urlreverse(material_presentations,kwargs=dict(name=doc.name))
        login_testing_unauthorized(self, "secretary", url)

        r = self.client.get(url)
        self.assertEqual(r.status_code, 200)

        url = urlreverse(material_presentations,kwargs=dict(name=doc.name,seq=1))
        r = self.client.get(url)
        self.assertEqual(r.status_code, 200)

        when = meeting.agenda.assignments.filter(session__group__acronym='testteam').first().timeslot.time
        mdw = when.date().isoformat()
        dow = ['mon','tue','wed','thu','fri','sat','sun'][when.weekday()]

        for kw in [ dict(),
                    dict(seq=1),
                    dict(week_day=dow),
                    dict(week_day=dow,seq=1),
                    dict(date=mdw),
                    dict(date=mdw,seq=1),
                    dict(date=mdw+'-0930'),
                    dict(date=mdw+'-0930',seq=1),
                   ]:
            kw['name'] = doc.name
            kw['acronym'] = 'testteam'
            url = urlreverse(material_presentations,kwargs=kw)
            r = self.client.get(url)
            self.assertEqual(r.status_code, 200)
Beispiel #37
0
    def test_make_last_call(self):
        draft = make_test_data()
        draft.set_state(State.objects.get(used=True, type="draft-iesg", slug="lc-req"))

        url = urlreverse('doc_make_last_call', kwargs=dict(name=draft.name))
        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('input[name=last_call_sent_date]')), 1)

        # make last call
        mailbox_before = len(outbox)

        expire_date = q('input[name=last_call_expiration_date]')[0].get("value")
        
        r = self.client.post(url,
                             dict(last_call_sent_date=q('input[name=last_call_sent_date]')[0].get("value"),
                                  last_call_expiration_date=expire_date
                                  ))
        self.assertEqual(r.status_code, 302)

        draft = Document.objects.get(name=draft.name)
        self.assertEqual(draft.get_state_slug("draft-iesg"), "lc")
        self.assertEqual(draft.latest_event(LastCallDocEvent, "sent_last_call").expires.strftime("%Y-%m-%d"), expire_date)
        self.assertEqual(len(outbox), mailbox_before + 4)

        self.assertTrue("Last Call" in outbox[-4]['Subject'])
        # the IANA copy
        self.assertTrue("Last Call" in outbox[-3]['Subject'])
        self.assertTrue("Last Call" in draft.message_set.order_by("-time")[0].subject)
Beispiel #38
0
    def test_edit_wgaction(self):
        wga = WGAction.objects.all()[0]
        url = urlreverse('iesg_edit_working_group_action', kwargs=dict(wga_id=wga.pk))
        login_testing_unauthorized(self, "klm", url)

        # normal get
        r = self.client.get(url)
        self.assertEquals(r.status_code, 200)
        q = PyQuery(r.content)
        self.assertEquals(len(q('form select[name=token_name]')), 1)
        self.assertEquals(len(q('form select[name=telechat_date]')), 1)

        # change
        dates = TelechatDates.objects.all()[0]
        token_name = IESGLogin.active_iesg().exclude(first_name=wga.token_name)[0].first_name
        old = wga.pk
        r = self.client.post(url, dict(status_date=dates.date1.isoformat(),
                                       token_name=token_name,
                                       category="23",
                                       note="Testing.",
                                       telechat_date=dates.date4.isoformat()))
        self.assertEquals(r.status_code, 302)

        wga = WGAction.objects.get(pk=old)
        self.assertEquals(wga.status_date, dates.date1)
        self.assertEquals(wga.token_name, token_name)
        self.assertEquals(wga.category, 23)
        self.assertEquals(wga.note, "Testing.")
        self.assertEquals(wga.telechat_date, dates.date4)
Beispiel #39
0
    def test_conclude(self):
        make_test_data()

        group = Group.objects.get(acronym="mars")

        url = urlreverse('ietf.group.edit.conclude', 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 textarea[name=instructions]')), 1)
        
        # faulty post
        r = self.client.post(url, dict(instructions="")) # No instructions
        self.assertEqual(r.status_code, 200)
        q = PyQuery(r.content)
        self.assertTrue(len(q('form ul.errorlist')) > 0)

        # request conclusion
        mailbox_before = len(outbox)
        r = self.client.post(url, dict(instructions="Test instructions"))
        self.assertEqual(r.status_code, 302)
        self.assertEqual(len(outbox), mailbox_before + 1)
        # the WG remains active until the Secretariat takes action
        group = Group.objects.get(acronym=group.acronym)
        self.assertEqual(group.state_id, "active")
Beispiel #40
0
 def test_approval(self):
     make_test_data()
     liaison = make_liaison_models()
     # has to come from WG to need approval
     liaison.from_group = Group.objects.get(acronym="mars")
     liaison.approved = None
     liaison.save()
     
     url = urlreverse('liaison_approval_detail', kwargs=dict(object_id=liaison.pk))
     # this liaison is for a WG so we need the AD for the area
     login_testing_unauthorized(self, "ad", url)
     
     # normal get
     r = self.client.get(url)
     self.assertEquals(r.status_code, 200)
     q = PyQuery(r.content)
     self.assertEquals(len(q('form input[name=do_approval]')), 1)
     
     # approve
     mailbox_before = len(outbox)
     r = self.client.post(url, dict(do_approval="1"))
     self.assertEquals(r.status_code, 302)
     
     liaison = LiaisonStatement.objects.get(id=liaison.id)
     self.assertTrue(liaison.approved)
     self.assertEquals(len(outbox), mailbox_before + 1)
     self.assertTrue("Liaison Statement" in outbox[-1]["Subject"])
Beispiel #41
0
    def test_edit_lc(self):
        doc = Document.objects.get(name='status-change-imaginary-mid-review')
        url = urlreverse('status_change_last_call', kwargs=dict(name=doc.name))

        login_testing_unauthorized(self, "ad", url)

        # additional setup
        doc.relateddocument_set.create(
            target=DocAlias.objects.get(name='rfc9999'),
            relationship_id='tois')
        doc.relateddocument_set.create(
            target=DocAlias.objects.get(name='rfc9998'),
            relationship_id='tohist')
        doc.ad = Person.objects.get(name='Ad No2')
        doc.save()

        # get
        r = self.client.get(url)
        self.assertEquals(r.status_code, 200)
        q = PyQuery(r.content)
        self.assertEquals(len(q('form.edit-last-call-text')), 1)

        self.assertTrue('RFC9999 from Proposed Standard to Internet Standard'
                        in ''.join(wrap(r.content, 2**16)))
        self.assertTrue('RFC9998 from Informational to Historic' in ''.join(
            wrap(r.content, 2**16)))

        # save
        r = self.client.post(
            url,
            dict(last_call_text="Bogus last call text",
                 save_last_call_text="1"))
        self.assertEquals(r.status_code, 200)

        last_call_event = doc.latest_event(WriteupDocEvent,
                                           type="changed_last_call_text")
        self.assertEquals(last_call_event.text, "Bogus last call text")

        # reset
        r = self.client.post(url, dict(regenerate_last_call_text="1"))
        self.assertEquals(r.status_code, 200)
        self.assertTrue('RFC9999 from Proposed Standard to Internet Standard'
                        in ''.join(wrap(r.content, 2**16)))
        self.assertTrue('RFC9998 from Informational to Historic' in ''.join(
            wrap(r.content, 2**16)))

        # request last call
        messages_before = len(outbox)
        r = self.client.post(
            url,
            dict(last_call_text='stuff',
                 send_last_call_request='Save+and+Request+Last+Call'))
        self.assertEquals(r.status_code, 200)
        self.assertTrue(
            'Last Call Requested' in ''.join(wrap(r.content, 2**16)))
        self.assertEquals(len(outbox), messages_before + 1)
        self.assertTrue('iesg-secretary' in outbox[-1]['To'])
        self.assertTrue('Last Call:' in outbox[-1]['Subject'])
        self.assertTrue('Last Call Request has been submitted' in ''.join(
            wrap(unicode(outbox[-1]), 2**16)))
Beispiel #42
0
    def test_revise(self):
        doc = self.create_slides()

        session = Session.objects.create(
            name = "session-42-mars-1",
            meeting = Meeting.objects.get(number='42'),
            group = Group.objects.get(acronym='mars'),
            status = SessionStatusName.objects.create(slug='scheduled', name='Scheduled'),
            modified = datetime.datetime.now(),
            requested_by = Person.objects.get(user__username="******"),
            type_id="session",
            )
        SessionPresentation.objects.create(session=session, document=doc, rev=doc.rev)

        url = urlreverse('material_edit', kwargs=dict(name=doc.name, action="revise"))
        login_testing_unauthorized(self, "secretary", url)

        content = "some text"
        test_file = StringIO(content)
        test_file.name = "unnamed.txt"

        # post
        r = self.client.post(url, dict(title="New title",
                                       abstract="New abstract",
                                       state=State.objects.get(type="slides", slug="active").pk,
                                       material=test_file))
        self.assertEqual(r.status_code, 302)
        doc = Document.objects.get(name=doc.name)
        self.assertEqual(doc.rev, "02")
        self.assertEqual(doc.title, "New title")
        self.assertEqual(doc.get_state_slug(), "active")

        with open(os.path.join(doc.get_file_path(), doc.name + "-" + doc.rev + ".txt")) as f:
            self.assertEqual(f.read(), content)
Beispiel #43
0
    def test_edit_notices(self):
        doc = Document.objects.get(name='conflict-review-imaginary-irtf-submission')
        url = urlreverse('ietf.doc.views_doc.edit_notify;conflict-review',kwargs=dict(name=doc.name))

        login_testing_unauthorized(self, "ad", url)

        # normal get 
        r = self.client.get(url)
        self.assertEqual(r.status_code, 200)
        q = PyQuery(r.content)
        self.assertEqual(len(q('form input[name=notify]')),1)
        self.assertEqual(doc.notify,q('form input[name=notify]')[0].value)

        # change notice list
        newlist = '"Foo Bar" <*****@*****.**>'
        r = self.client.post(url,dict(notify=newlist,save_addresses="1"))
        self.assertEqual(r.status_code,302)
        doc = Document.objects.get(name='conflict-review-imaginary-irtf-submission')
        self.assertEqual(doc.notify,newlist)
        self.assertTrue(doc.latest_event(DocEvent,type="added_comment").desc.startswith('Notification list changed'))       

        # Ask the form to regenerate the list
        r = self.client.post(url,dict(regenerate_addresses="1"))
        self.assertEqual(r.status_code,200)
        doc = Document.objects.get(name='conflict-review-imaginary-irtf-submission')
        # Regenerate does not save!
        self.assertEqual(doc.notify,newlist)
        q = PyQuery(r.content)
        self.assertEqual(None,q('form input[name=notify]')[0].value)
Beispiel #44
0
    def test_initial_submission(self):
        doc = Document.objects.get(name='conflict-review-imaginary-irtf-submission')
        url = urlreverse('ietf.doc.views_conflict_review.submit',kwargs=dict(name=doc.name))
        login_testing_unauthorized(self, "ad", url)

        # normal get
        r = self.client.get(url)
        self.assertEqual(r.status_code,200)
        q = PyQuery(r.content)
        self.assertTrue(q('textarea[name="content"]')[0].text.strip().startswith("[Edit this page"))
        
        # Faulty posts using textbox
        # Right now, nothing to test - we let people put whatever the web browser will let them put into that textbox

        # sane post using textbox
        path = os.path.join(settings.CONFLICT_REVIEW_PATH, '%s-%s.txt' % (doc.canonical_name(), doc.rev))
        self.assertEqual(doc.rev,u'00')
        self.assertFalse(os.path.exists(path))
        r = self.client.post(url,dict(content="Some initial review text\n",submit_response="1"))
        self.assertEqual(r.status_code,302)
        doc = Document.objects.get(name='conflict-review-imaginary-irtf-submission')
        self.assertEqual(doc.rev,u'00')
        with open(path) as f:
            self.assertEqual(f.read(),"Some initial review text\n")
            f.close()
        self.assertTrue( "submission-00" in doc.latest_event(NewRevisionDocEvent).desc)
Beispiel #45
0
    def test_initial_submission(self):
        doc = Document.objects.get(name='conflict-review-imaginary-irtf-submission')
        url = urlreverse('conflict_review_submit',kwargs=dict(name=doc.name))
        login_testing_unauthorized(self, "ad", url)

        # normal get
        r = self.client.get(url)
        self.assertEqual(r.status_code,200)
        q = PyQuery(r.content)
        self.assertTrue(q('textarea[name="content"]')[0].text.strip().startswith("[Edit this page"))
        
        # Faulty posts using textbox
        # Right now, nothing to test - we let people put whatever the web browser will let them put into that textbox

        # sane post using textbox
        path = os.path.join(settings.CONFLICT_REVIEW_PATH, '%s-%s.txt' % (doc.canonical_name(), doc.rev))
        self.assertEqual(doc.rev,u'00')
        self.assertFalse(os.path.exists(path))
        r = self.client.post(url,dict(content="Some initial review text\n",submit_response="1"))
        self.assertEqual(r.status_code,302)
        doc = Document.objects.get(name='conflict-review-imaginary-irtf-submission')
        self.assertEqual(doc.rev,u'00')
        with open(path) as f:
            self.assertEqual(f.read(),"Some initial review text\n")
            f.close()
        self.assertTrue( "submission-00" in doc.latest_event(NewRevisionDocEvent).desc)
Beispiel #46
0
    def test_manage_stream_delegates(self):
        make_test_data()

        url = urlreverse('stream_delegates', kwargs=dict(stream_name="IETF"))
        login_testing_unauthorized(self, "secretary", url)

        # get
        r = self.client.get(url)
        self.assertEquals(r.status_code, 200)
        q = PyQuery(r.content)
        self.assertEquals(len(q('input[type=submit][value*=Add]')), 1)

        delegate = Email.objects.get(address="*****@*****.**")

        # add delegate
        r = self.client.post(url, dict(email=delegate.address))
        self.assertEquals(r.status_code, 200)

        self.assertEquals(
            Role.objects.filter(
                group__acronym="ietf",
                name="delegate",
                person__email__address=delegate.address).count(), 1)

        # remove delegate again
        r = self.client.post(
            url, dict(remove_delegate=[delegate.person.pk], delete="1"))
        self.assertEquals(r.status_code, 200)

        self.assertEquals(
            Role.objects.filter(
                group__acronym="ietf",
                name="delegate",
                person__email__address=delegate.address).count(), 0)
Beispiel #47
0
    def testAliases(self):
        url = urlreverse('old_group_email_aliases', kwargs=dict(acronym="mars"))
        r = self.client.get(url)
        self.assertEqual(r.status_code, 302)

        for testdict in [dict(acronym="mars"),dict(acronym="mars",group_type="wg")]:
            url = urlreverse('old_group_email_aliases', kwargs=testdict)
            r = self.client.get(url,follow=True)
            self.assertTrue(all([x in unicontent(r) for x in ['mars-ads@','mars-chairs@']]))
            self.assertFalse(any([x in unicontent(r) for x in ['ames-ads@','ames-chairs@']]))

        url = urlreverse('ietf.group.info.email_aliases', kwargs=dict())
        login_testing_unauthorized(self, "plain", url)
        r = self.client.get(url)
        self.assertTrue(r.status_code,200)
        self.assertTrue(all([x in unicontent(r) for x in ['mars-ads@','mars-chairs@','ames-ads@','ames-chairs@']]))

        url = urlreverse('ietf.group.info.email_aliases', kwargs=dict(group_type="wg"))
        r = self.client.get(url)
        self.assertEqual(r.status_code,200)
        self.assertTrue('mars-ads@' in unicontent(r))

        url = urlreverse('ietf.group.info.email_aliases', kwargs=dict(group_type="rg"))
        r = self.client.get(url)
        self.assertEqual(r.status_code,200)
        self.assertFalse('mars-ads@' in unicontent(r))
Beispiel #48
0
    def test_create_rg(self):

        make_test_data()

        url = urlreverse('group_create', kwargs=dict(group_type="rg"))
        login_testing_unauthorized(self, "secretary", url)

        irtf = Group.objects.get(acronym='irtf')
        num_rgs = len(Group.objects.filter(type="rg"))

        proposed_state = GroupStateName.objects.get(slug="proposed")

        # normal get
        r = self.client.get(url)
        self.assertEqual(r.status_code, 200)
        q = PyQuery(r.content)
        self.assertEqual(len(q('form input[name=acronym]')), 1)
        self.assertEqual(q('form input[name=parent]').attr('value'),'%s'%irtf.pk)

        r = self.client.post(url, dict(acronym="testrg", name="Testing RG", state=proposed_state.pk, parent=irtf.pk))
        self.assertEqual(r.status_code, 302)
        self.assertEqual(len(Group.objects.filter(type="rg")), num_rgs + 1)
        group = Group.objects.get(acronym="testrg")
        self.assertEqual(group.name, "Testing RG")
        self.assertEqual(group.charter.name, "charter-irtf-testrg")
        self.assertEqual(group.charter.rev, "00-00")
        self.assertEqual(group.parent.acronym,'irtf')
Beispiel #49
0
    def test_edit_telechat_date(self):
        doc = Document.objects.get(
            name='conflict-review-imaginary-irtf-submission')
        url = urlreverse('conflict_review_telechat_date',
                         kwargs=dict(name=doc.name))

        login_testing_unauthorized(self, "ad", url)

        # normal get
        r = self.client.get(url)
        self.assertEquals(r.status_code, 200)
        q = PyQuery(r.content)
        self.assertEquals(len(q('select[name=telechat_date]')), 1)

        # set a date
        self.assertFalse(
            doc.latest_event(TelechatDocEvent, "scheduled_for_telechat"))
        telechat_date = TelechatDate.objects.active().order_by('date')[0].date
        r = self.client.post(url,
                             dict(telechat_date=telechat_date.isoformat()))
        self.assertEquals(r.status_code, 302)
        doc = Document.objects.get(
            name='conflict-review-imaginary-irtf-submission')
        self.assertEquals(
            doc.latest_event(TelechatDocEvent,
                             "scheduled_for_telechat").telechat_date,
            telechat_date)

        # move it forward a telechat (this should set the returning item bit)
        telechat_date = TelechatDate.objects.active().order_by('date')[1].date
        r = self.client.post(url,
                             dict(telechat_date=telechat_date.isoformat()))
        self.assertEquals(r.status_code, 302)
        doc = Document.objects.get(
            name='conflict-review-imaginary-irtf-submission')
        self.assertTrue(doc.returning_item())

        # clear the returning item bit
        r = self.client.post(url,
                             dict(telechat_date=telechat_date.isoformat()))
        self.assertEquals(r.status_code, 302)
        doc = Document.objects.get(
            name='conflict-review-imaginary-irtf-submission')
        self.assertFalse(doc.returning_item())

        # set the returning item bit without changing the date
        r = self.client.post(
            url,
            dict(telechat_date=telechat_date.isoformat(), returning_item="on"))
        self.assertEquals(r.status_code, 302)
        doc = Document.objects.get(
            name='conflict-review-imaginary-irtf-submission')
        self.assertTrue(doc.returning_item())

        # Take the doc back off any telechat
        r = self.client.post(url, dict(telechat_date=""))
        self.assertEquals(r.status_code, 302)
        self.assertEquals(
            doc.latest_event(TelechatDocEvent,
                             "scheduled_for_telechat").telechat_date, None)
Beispiel #50
0
    def test_edit_telechat_date(self):
        make_test_data()

        group = Group.objects.get(acronym="mars")
        charter = group.charter

        url = urlreverse('charter_telechat_date', kwargs=dict(name=charter.name))
        login_testing_unauthorized(self, "secretary", url)

        # add to telechat
        self.assertTrue(not charter.latest_event(TelechatDocEvent, "scheduled_for_telechat"))
        telechat_date = TelechatDate.objects.active()[0].date
        r = self.client.post(url, dict(name=group.name, acronym=group.acronym, telechat_date=telechat_date.isoformat()))
        self.assertEquals(r.status_code, 302)

        charter = Document.objects.get(name=charter.name)
        self.assertTrue(charter.latest_event(TelechatDocEvent, "scheduled_for_telechat"))
        self.assertEquals(charter.latest_event(TelechatDocEvent, "scheduled_for_telechat").telechat_date, telechat_date)

        # change telechat
        telechat_date = TelechatDate.objects.active()[1].date
        r = self.client.post(url, dict(name=group.name, acronym=group.acronym, telechat_date=telechat_date.isoformat()))
        self.assertEquals(r.status_code, 302)

        charter = Document.objects.get(name=charter.name)
        self.assertEquals(charter.latest_event(TelechatDocEvent, "scheduled_for_telechat").telechat_date, telechat_date)

        # remove from agenda
        telechat_date = ""
        r = self.client.post(url, dict(name=group.name, acronym=group.acronym, telechat_date=telechat_date))
        self.assertEquals(r.status_code, 302)

        charter = Document.objects.get(name=charter.name)
        self.assertTrue(not charter.latest_event(TelechatDocEvent, "scheduled_for_telechat").telechat_date)
Beispiel #51
0
    def test_upload_slides(self):
        group = Group.objects.create(type_id="team",
                                     acronym="testteam",
                                     name="Test Team",
                                     state_id="active")

        url = urlreverse('ietf.doc.views_material.edit_material',
                         kwargs=dict(acronym=group.acronym, doc_type="slides"))
        login_testing_unauthorized(self, "secretary", url)

        # normal get
        r = self.client.get(url)
        self.assertEqual(r.status_code, 200)

        content = "%PDF-1.5\n..."
        test_file = StringIO(content)
        test_file.name = "unnamed.pdf"

        # faulty post
        r = self.client.post(
            url, dict(title="", name="", state="", material=test_file))

        self.assertEqual(r.status_code, 200)
        q = PyQuery(r.content)
        self.assertTrue(len(q('.has-error')) > 0)

        test_file.seek(0)

        # post
        r = self.client.post(
            url,
            dict(title="Test File - with fancy title",
                 abstract="Test Abstract",
                 name="slides-%s-test-file" % group.acronym,
                 state=State.objects.get(type="slides", slug="active").pk,
                 material=test_file))
        self.assertEqual(r.status_code, 302)

        doc = Document.objects.get(name="slides-%s-test-file" % group.acronym)
        self.assertEqual(doc.rev, "00")
        self.assertEqual(doc.title, "Test File - with fancy title")
        self.assertEqual(doc.get_state_slug(), "active")

        with open(
                os.path.join(self.materials_dir, "slides",
                             doc.name + "-" + doc.rev + ".pdf")) as f:
            self.assertEqual(f.read(), content)

        # check that posting same name is prevented
        test_file.seek(0)

        r = self.client.post(
            url,
            dict(title="Test File",
                 name=doc.name,
                 state=State.objects.get(type="slides", slug="active").pk,
                 material=test_file))
        self.assertEqual(r.status_code, 200)
        self.assertTrue(len(q('.has-error')) > 0)
Beispiel #52
0
 def test_notify_page(self):
     # check that we can get the notify page
     url = urlreverse("ietf.sync.views.notify",
                      kwargs=dict(org="iana", notification="changes"))
     login_testing_unauthorized(self, "secretary", url)
     r = self.client.get(url)
     self.assertEqual(r.status_code, 200)
     self.assertTrue("new changes at" in unicontent(r))
Beispiel #53
0
    def test_delete_wgaction(self):
        wga = WGAction.objects.all()[0]
        url = urlreverse('iesg_edit_working_group_action', kwargs=dict(wga_id=wga.pk))
        login_testing_unauthorized(self, "klm", url)

        r = self.client.post(url, dict(delete="1"))
        self.assertEquals(r.status_code, 302)
        self.assertTrue(not WGAction.objects.filter(pk=wga.pk))
Beispiel #54
0
    def test_approve(self):
        doc = Document.objects.get(name='status-change-imaginary-mid-review')
        url = urlreverse('status_change_approve', kwargs=dict(name=doc.name))

        login_testing_unauthorized(self, "secretary", url)

        # Some additional setup
        doc.relateddocument_set.create(
            target=DocAlias.objects.get(name='rfc9999'),
            relationship_id='tois')
        doc.relateddocument_set.create(
            target=DocAlias.objects.get(name='rfc9998'),
            relationship_id='tohist')
        create_ballot_if_not_open(doc, Person.objects.get(name="Sec Retary"),
                                  "statchg")
        doc.set_state(State.objects.get(slug='appr-pend', type='statchg'))
        doc.save()

        # get
        r = self.client.get(url)
        self.assertEquals(r.status_code, 200)
        q = PyQuery(r.content)
        self.assertEquals(len(q('form.approve')), 1)
        # There should be two messages to edit
        self.assertEquals(q('input#id_form-TOTAL_FORMS').val(), '2')
        self.assertTrue('(rfc9999) to Internet Standard' in ''.join(
            wrap(r.content, 2**16)))
        self.assertTrue(
            '(rfc9998) to Historic' in ''.join(wrap(r.content, 2**16)))

        # submit
        messages_before = len(outbox)
        msg0 = default_approval_text(doc, doc.relateddocument_set.all()[0])
        msg1 = default_approval_text(doc, doc.relateddocument_set.all()[1])
        r = self.client.post(
            url, {
                'form-0-announcement_text': msg0,
                'form-1-announcement_text': msg1,
                'form-TOTAL_FORMS': '2',
                'form-INITIAL_FORMS': '2',
                'form-MAX_NUM_FORMS': ''
            })
        self.assertEquals(r.status_code, 302)

        doc = Document.objects.get(name='status-change-imaginary-mid-review')
        self.assertEquals(doc.get_state_slug(), 'appr-sent')
        self.assertFalse(doc.ballot_open("statchg"))

        self.assertEquals(len(outbox), messages_before + 2)
        self.assertTrue('Action:' in outbox[-1]['Subject'])
        self.assertTrue('(rfc9999) to Internet Standard' in ''.join(
            wrap(unicode(outbox[-1]) + unicode(outbox[-2]), 2**16)))
        self.assertTrue('(rfc9998) to Historic' in ''.join(
            wrap(unicode(outbox[-1]) + unicode(outbox[-2]), 2**16)))

        self.assertTrue(
            doc.latest_event(DocEvent, type="added_comment").desc.startswith(
                'The following approval message was sent'))
Beispiel #55
0
    def test_delete_possible_wg(self):
        url = urlreverse('iesg_working_group_actions')
        login_testing_unauthorized(self, "klm", url)
        
        r = self.client.post(url, dict(delete="1",
                                       filename='sieve-charter.txt'))
        self.assertEquals(r.status_code, 200)

        self.assertTrue('(sieve)' not in r.content)
Beispiel #56
0
    def test_edit_approval_text(self):
        draft = make_test_data()
        url = urlreverse('ietf.doc.views_ballot.ballot_approvaltext',
                         kwargs=dict(name=draft.name))
        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=approval_text]')), 1)
        self.assertTrue(q('[type=submit]:contains("Save")'))

        # save
        r = self.client.post(
            url,
            dict(approval_text="This is a simple test.",
                 save_approval_text="1"))
        self.assertEqual(r.status_code, 200)
        draft = Document.objects.get(name=draft.name)
        self.assertTrue("This is a simple test" in draft.latest_event(
            WriteupDocEvent, type="changed_ballot_approval_text").text)

        # test regenerate
        r = self.client.post(url, dict(regenerate_approval_text="1"))
        self.assertEqual(r.status_code, 200)
        self.assertTrue("Subject: Protocol Action" in draft.latest_event(
            WriteupDocEvent, type="changed_ballot_approval_text").text)

        # test regenerate when it's a disapprove
        draft.set_state(
            State.objects.get(used=True, type="draft-iesg", slug="nopubadw"))

        r = self.client.post(url, dict(regenerate_approval_text="1"))
        self.assertEqual(r.status_code, 200)
        self.assertTrue("NOT be published" in draft.latest_event(
            WriteupDocEvent, type="changed_ballot_approval_text").text)

        # test regenerate when it's a conflict review
        draft.group = Group.objects.get(type="individ")
        draft.stream_id = "irtf"
        draft.set_state(
            State.objects.get(used=True, type="draft-iesg", slug="iesg-eva"))
        draft.save_with_history([
            DocEvent.objects.create(
                doc=draft,
                rev=draft.rev,
                type="changed_document",
                by=Person.objects.get(user__username="******"),
                desc="Test")
        ])

        r = self.client.post(url, dict(regenerate_approval_text="1"))
        self.assertEqual(r.status_code, 200)
        self.assertTrue(
            "Subject: Results of IETF-conflict review" in draft.latest_event(
                WriteupDocEvent, type="changed_ballot_approval_text").text)
Beispiel #57
0
    def test_approve_ballot(self):
        draft = make_test_data()
        draft.set_state(
            State.objects.get(used=True, type="draft-iesg",
                              slug="iesg-eva"))  # make sure it's approvable

        url = urlreverse('ietf.doc.views_ballot.approve_ballot',
                         kwargs=dict(name=draft.name))
        login_testing_unauthorized(self, "secretary", url)

        # 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('form pre:contains("Subject: Protocol Action")')), 1)
        self.assertEqual(
            len(q('form pre:contains("This is a note for the RFC Editor")')),
            0)

        # add a note to the RFC Editor
        WriteupDocEvent.objects.create(
            doc=draft,
            rev=draft.rev,
            desc="Changed text",
            type="changed_rfc_editor_note_text",
            text="This is a note for the RFC Editor.",
            by=Person.objects.get(name="(System)"))
        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('form pre:contains("Subject: Protocol Action")')), 1)
        self.assertEqual(
            len(q('form pre:contains("This is a note for the RFC Editor")')),
            1)

        # approve
        mailbox_before = len(outbox)

        r = self.client.post(url, dict(skiprfceditorpost="1"))
        self.assertEqual(r.status_code, 302)

        draft = Document.objects.get(name=draft.name)
        self.assertEqual(draft.get_state_slug("draft-iesg"), "ann")
        self.assertEqual(len(outbox), mailbox_before + 2)
        self.assertTrue("Protocol Action" in outbox[-2]['Subject'])
        self.assertTrue("ietf-announce" in outbox[-2]['To'])
        self.assertTrue("rfc-editor" in outbox[-2]['Cc'])
        # the IANA copy
        self.assertTrue("Protocol Action" in outbox[-1]['Subject'])
        self.assertTrue(not outbox[-1]['CC'])
        self.assertTrue('*****@*****.**' in outbox[-1]['To'])
        self.assertTrue("Protocol Action" in draft.message_set.order_by(
            "-time")[0].subject)