Done with the second pass focusing on test coverage. Lots of test tweaks, some new tests, a couple of bugs fixed. The session request code views need to be redone to allow testing.

- Legacy-Id: 10035
This commit is contained in:
Robert Sparks 2015-08-21 16:39:00 +00:00
parent 83753dd24e
commit 8a74604a1b
20 changed files with 239 additions and 83 deletions

View file

@ -201,6 +201,8 @@ def generate_approval_mail_approved(request, doc):
)
def generate_approval_mail_rfc_editor(request, doc):
# This is essentially dead code - it is only exercised if the IESG ballots on some other stream's document,
# which does not happen now that we have conflict reviews.
disapproved = doc.get_state_slug("draft-iesg") in DO_NOT_PUBLISH_IESG_STATES
doc_type = "RFC" if doc.get_state_slug() == "rfc" else "Internet Draft"

View file

@ -152,7 +152,7 @@ class EditPositionTests(TestCase):
# send
mailbox_before = len(outbox)
r = self.client.post(url, dict(cc="test@example.com", cc_state_change="1",cc_group_list="1"))
r = self.client.post(url, dict(cc="test298347@example.com", cc_state_change="1",cc_group_list="1"))
self.assertEqual(r.status_code, 302)
self.assertEqual(len(outbox), mailbox_before + 1)
@ -162,16 +162,18 @@ class EditPositionTests(TestCase):
self.assertTrue(draft.name in m['Subject'])
self.assertTrue("clearer title" in str(m))
self.assertTrue("Test!" in str(m))
self.assertTrue("iesg@" in m['To'])
self.assertTrue("somebody@example.com" in m['Cc'])
self.assertTrue("test@example.com" in m['Cc'])
self.assertTrue("test298347@example.com" in m['Cc'])
self.assertTrue(draft.group.list_email)
self.assertTrue(draft.group.list_email in m['Cc'])
r = self.client.post(url, dict(cc=""))
self.assertEqual(r.status_code, 302)
self.assertEqual(len(outbox), mailbox_before + 2)
#TODO this would be a good place to test actual mailtoken expansions
#if we can find a way to get the real, or at least representative, data in place.
m = outbox[-1]
self.assertTrue("iesg@" in m['To'])
self.assertFalse(draft.group.list_email in m['Cc'])
class BallotWriteupsTests(TestCase):
@ -235,6 +237,8 @@ class BallotWriteupsTests(TestCase):
self.assertEqual(len(outbox), mailbox_before + 1)
self.assertTrue("Last Call" in outbox[-1]['Subject'])
self.assertTrue(draft.name in outbox[-1]['Subject'])
self.assertTrue('iesg-secretary@' in outbox[-1]['To'])
self.assertTrue('aread@' in outbox[-1]['Cc'])
def test_edit_ballot_writeup(self):
draft = make_test_data()
@ -389,12 +393,18 @@ class ApproveBallotTests(TestCase):
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('drafts-approval@icann.org' in outbox[-1]['To'])
self.assertTrue("Protocol Action" in draft.message_set.order_by("-time")[0].subject)
def test_disapprove_ballot(self):
# This tests a codepath that is not used in production
# and that has already had some drift from usefulness (it results in a
# older-style conflict review response).
draft = make_test_data()
draft.set_state(State.objects.get(used=True, type="draft-iesg", slug="nopubadw"))
@ -412,7 +422,6 @@ class ApproveBallotTests(TestCase):
self.assertEqual(len(outbox), mailbox_before + 1)
self.assertTrue("NOT be published" in str(outbox[-1]))
class MakeLastCallTests(TestCase):
def test_make_last_call(self):
draft = make_test_data()
@ -441,10 +450,17 @@ class MakeLastCallTests(TestCase):
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 + 2)
self.assertTrue("Last Call" in outbox[-2]['Subject'])
self.assertTrue("ietf-announce@" in outbox[-2]['To'])
for prefix in ['draft-ietf-mars-test','mars-chairs','aread']:
self.assertTrue(prefix+"@" in outbox[-2]['Cc'])
self.assertTrue("Last Call" in outbox[-1]['Subject'])
self.assertTrue("drafts-lastcall@icann.org" in outbox[-1]['To'])
self.assertTrue("Last Call" in draft.message_set.order_by("-time")[0].subject)
class DeferUndeferTestCase(TestCase):
@ -490,11 +506,16 @@ class DeferUndeferTestCase(TestCase):
if doc.type_id in defer_states:
self.assertEqual(doc.get_state(defer_states[doc.type_id][0]).slug,defer_states[doc.type_id][1])
self.assertTrue(doc.active_defer_event())
self.assertEqual(len(outbox), mailbox_before + 2)
#self.assertTrue("State Update" in outbox[-3]['Subject'])
self.assertTrue("Telechat update" in outbox[-2]['Subject'])
self.assertTrue('Telechat update' in outbox[-2]['Subject'])
self.assertTrue('iesg-secretary@' in outbox[-2]['To'])
self.assertTrue('iesg@' in outbox[-2]['To'])
self.assertTrue("Deferred" in outbox[-1]['Subject'])
self.assertTrue(doc.file_tag() in outbox[-1]['Subject'])
self.assertTrue('iesg@' in outbox[-1]['To'])
# Ensure it's not possible to defer again
r = self.client.get(url)
@ -547,8 +568,11 @@ class DeferUndeferTestCase(TestCase):
self.assertFalse(doc.active_defer_event())
self.assertEqual(len(outbox), mailbox_before + 2)
self.assertTrue("Telechat update" in outbox[-2]['Subject'])
self.assertTrue('iesg-secretary@' in outbox[-2]['To'])
self.assertTrue('iesg@' in outbox[-2]['To'])
self.assertTrue("Undeferred" in outbox[-1]['Subject'])
self.assertTrue(doc.file_tag() in outbox[-1]['Subject'])
self.assertTrue('iesg@' in outbox[-1]['To'])
# Ensure it's not possible to undefer again
r = self.client.get(url)

View file

@ -14,7 +14,7 @@ from ietf.group.models import Group, GroupMilestone
from ietf.iesg.models import TelechatDate
from ietf.person.models import Person
from ietf.utils.test_utils import TestCase
from ietf.utils.mail import outbox
from ietf.utils.mail import outbox, empty_outbox
from ietf.utils.test_data import make_test_data
from ietf.utils.test_utils import login_testing_unauthorized
@ -97,7 +97,12 @@ class EditCharterTests(TestCase):
self.assertTrue(find_event("created_ballot"))
self.assertEqual(len(outbox), mailbox_before + 2)
self.assertTrue("state changed" in outbox[-2]['Subject'].lower())
self.assertTrue("iesg-secretary@" in outbox[-2]['To'])
self.assertTrue("State Update Notice" in outbox[-1]['Subject'])
self.assertTrue("ames-chairs@" in outbox[-1]['To'])
def test_edit_telechat_date(self):
make_test_data()
@ -285,6 +290,9 @@ class EditCharterTests(TestCase):
announcement_text=default_review_text(draft.group, charter, by).text,
send_text="1"))
self.assertEqual(len(outbox), mailbox_before + 1)
self.assertTrue('WG Review' in outbox[-1]['Subject'])
self.assertTrue('ietf-announce@' in outbox[-1]['To'])
self.assertTrue('mars-wg@' in outbox[-1]['Cc'])
# save
r = self.client.post(url, dict(
@ -333,11 +341,12 @@ class EditCharterTests(TestCase):
self.assertTrue("This is a simple test" in charter.latest_event(WriteupDocEvent, type="changed_ballot_writeup_text").text)
# send
mailbox_before = len(outbox)
empty_outbox()
r = self.client.post(url, dict(
ballot_writeup="This is a simple test.",
send_ballot="1"))
self.assertEqual(len(outbox), mailbox_before + 1)
self.assertEqual(len(outbox), 1)
self.assertTrue('Evaluation' in outbox[0]['Subject'])
def test_approve(self):
make_test_data()
@ -393,7 +402,7 @@ class EditCharterTests(TestCase):
self.assertEqual(len(q('pre')), 1)
# approve
mailbox_before = len(outbox)
empty_outbox()
r = self.client.post(url, dict())
self.assertEqual(r.status_code, 302)
@ -405,9 +414,12 @@ class EditCharterTests(TestCase):
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), mailbox_before + 2)
self.assertTrue("WG Action" in outbox[-1]['Subject'])
self.assertTrue("approved" in outbox[-2]['Subject'].lower())
self.assertEqual(len(outbox), 2)
self.assertTrue("approved" in outbox[0]['Subject'].lower())
self.assertTrue("iesg-secretary" in outbox[0]['To'])
self.assertTrue("WG Action" in outbox[1]['Subject'])
self.assertTrue("ietf-announce" in outbox[1]['To'])
self.assertTrue("ames-wg@ietf.org" in outbox[1]['Cc'])
self.assertEqual(group.groupmilestone_set.filter(state="charter").count(), 0)
self.assertEqual(group.groupmilestone_set.filter(state="active").count(), 2)

View file

@ -15,7 +15,7 @@ from ietf.group.models import Person
from ietf.iesg.models import TelechatDate
from ietf.name.models import StreamName
from ietf.utils.test_utils import TestCase
from ietf.utils.mail import outbox
from ietf.utils.mail import outbox, empty_outbox
from ietf.utils.test_data import make_test_data
from ietf.utils.test_utils import login_testing_unauthorized
@ -115,10 +115,14 @@ class ConflictReviewTests(TestCase):
self.assertEquals(review_doc.notify,u'ipu@ietf.org')
doc = Document.objects.get(name='draft-imaginary-independent-submission')
self.assertTrue(doc in [x.target.document for x in review_doc.relateddocument_set.filter(relationship__slug='conflrev')])
self.assertEqual(len(outbox), messages_before + 2)
self.assertTrue('Conflict Review requested' in outbox[-1]['Subject'])
#self.assertTrue(any('iesg-secretary@ietf.org' in x['To'] for x in outbox[-2:]))
#self.assertTrue(any(settings.IANA_EVAL_EMAIL in x['To'] for x in outbox[-2:]))
self.assertTrue('drafts-eval@icann.org' in outbox[-1]['To'])
self.assertTrue('Conflict Review requested' in outbox[-2]['Subject'])
self.assertTrue('iesg-secretary@' in outbox[-2]['To'])
def test_change_state(self):
@ -278,7 +282,7 @@ class ConflictReviewTests(TestCase):
self.assertTrue( 'NOT be published' in ''.join(wrap(r.content,2**16)))
# submit
messages_before = len(outbox)
empty_outbox()
r = self.client.post(url,dict(announcement_text=default_approval_text(doc)))
self.assertEqual(r.status_code, 302)
@ -286,12 +290,15 @@ class ConflictReviewTests(TestCase):
self.assertEqual(doc.get_state_slug(),approve_type+'-sent')
self.assertFalse(doc.ballot_open("conflrev"))
self.assertEqual(len(outbox), messages_before + 1)
self.assertTrue('Results of IETF-conflict review' in outbox[-1]['Subject'])
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[-1]),2**16)))
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[-1]),2**16)))
self.assertTrue( 'NOT be published' in ''.join(wrap(unicode(outbox[0]),2**16)))
def test_approve_reqnopub(self):

View file

@ -20,7 +20,7 @@ from ietf.meeting.models import Meeting, MeetingTypeName
from ietf.iesg.models import TelechatDate
from ietf.utils.test_utils import login_testing_unauthorized
from ietf.utils.test_data import make_test_data
from ietf.utils.mail import outbox
from ietf.utils.mail import outbox, empty_outbox
from ietf.utils.test_utils import TestCase
@ -74,7 +74,9 @@ class ChangeStateTests(TestCase):
self.assertTrue("IESG state changed" in draft.docevent_set.all()[1].desc)
self.assertEqual(len(outbox), mailbox_before + 1)
self.assertTrue("State Update Notice" in outbox[-1]['Subject'])
self.assertTrue('draft-ietf-mars-test@' in outbox[-1]['To'])
self.assertTrue('mars-chairs@' in outbox[-1]['To'])
self.assertTrue('aread@' in outbox[-1]['To'])
# check that we got a previous state now
r = self.client.get(url)
@ -100,11 +102,19 @@ class ChangeStateTests(TestCase):
draft = Document.objects.get(name=draft.name)
self.assertEqual(draft.get_state_slug("draft-iesg"), "review-e")
self.assertEqual(len(outbox), mailbox_before + 2)
self.assertTrue(draft.name in outbox[-1]['Subject'])
self.assertTrue("changed state" in outbox[-1]['Subject'])
self.assertTrue("is no longer" in str(outbox[-1]))
self.assertTrue("Test comment" in str(outbox[-1]))
self.assertTrue("rfc-editor@" in outbox[-1]['To'])
self.assertTrue("iana@" in outbox[-1]['To'])
self.assertTrue("ID Tracker State Update Notice:" in outbox[-2]['Subject'])
self.assertTrue("aread@" in outbox[-2]['To'])
def test_change_iana_state(self):
draft = make_test_data()
@ -144,8 +154,8 @@ class ChangeStateTests(TestCase):
self.client.login(username="secretary", password="secretary+password")
url = urlreverse('doc_change_state', kwargs=dict(name=draft.name))
mailbox_before = len(outbox)
empty_outbox()
self.assertTrue(not draft.latest_event(type="changed_ballot_writeup_text"))
r = self.client.post(url, dict(state=State.objects.get(used=True, type="draft-iesg", slug="lc-req").pk))
self.assertTrue("Your request to issue" in r.content)
@ -170,8 +180,14 @@ class ChangeStateTests(TestCase):
self.assertTrue("Technical Summary" in e.text)
# mail notice
self.assertTrue(len(outbox) > mailbox_before)
self.assertTrue("Last Call:" in outbox[-1]['Subject'])
self.assertEqual(len(outbox), 2)
self.assertTrue("ID Tracker State Update" in outbox[0]['Subject'])
self.assertTrue("aread@" in outbox[0]['To'])
self.assertTrue("Last Call:" in outbox[1]['Subject'])
self.assertTrue('iesg-secretary@' in outbox[1]['To'])
self.assertTrue('aread@' in outbox[1]['Cc'])
# comment
self.assertTrue("Last call was requested" in draft.latest_event().desc)
@ -251,6 +267,8 @@ class EditInfoTests(TestCase):
self.assertEqual(draft.latest_event(TelechatDocEvent, type="scheduled_for_telechat").telechat_date, TelechatDate.objects.active()[0].date)
self.assertEqual(len(outbox),mailbox_before+1)
self.assertTrue("Telechat update" in outbox[-1]['Subject'])
self.assertTrue('iesg@' in outbox[-1]['To'])
self.assertTrue('iesg-secretary@' in outbox[-1]['To'])
# change telechat
mailbox_before=len(outbox)
@ -430,6 +448,7 @@ class ResurrectTests(TestCase):
self.assertTrue("Resurrection" in e.desc)
self.assertEqual(len(outbox), mailbox_before + 1)
self.assertTrue("Resurrection" in outbox[-1]['Subject'])
self.assertTrue('internet-drafts@' in outbox[-1]['To'])
def test_resurrect(self):
draft = make_test_data()
@ -462,6 +481,9 @@ class ResurrectTests(TestCase):
self.assertEqual(draft.get_state_slug(), "active")
self.assertTrue(draft.expires >= datetime.datetime.now() + datetime.timedelta(days=settings.INTERNET_DRAFT_DAYS_TO_EXPIRE - 1))
self.assertEqual(len(outbox), mailbox_before + 1)
self.assertTrue('Resurrection Completed' in outbox[-1]['Subject'])
self.assertTrue('iesg-secretary' in outbox[-1]['To'])
self.assertTrue('aread' in outbox[-1]['To'])
class ExpireIDsTests(TestCase):
@ -523,8 +545,9 @@ class ExpireIDsTests(TestCase):
send_expire_warning_for_draft(draft)
self.assertEqual(len(outbox), mailbox_before + 1)
self.assertTrue("aread@ietf.org" in str(outbox[-1])) # author
self.assertTrue("mars-chairs@ietf.org" in str(outbox[-1]))
self.assertTrue('draft-ietf-mars-test@' in outbox[-1]['To']) # Gets the authors
self.assertTrue('mars-chairs@ietf.org' in outbox[-1]['Cc'])
self.assertTrue('aread@' in outbox[-1]['Cc'])
def test_expire_drafts(self):
from ietf.doc.expire import get_expired_drafts, send_expire_notice_for_draft, expire_draft
@ -555,6 +578,9 @@ class ExpireIDsTests(TestCase):
self.assertEqual(len(outbox), mailbox_before + 1)
self.assertTrue("expired" in outbox[-1]["Subject"])
self.assertTrue('draft-ietf-mars-test@' in outbox[-1]['To']) # gets authors
self.assertTrue('mars-chairs@ietf.org' in outbox[-1]['Cc'])
self.assertTrue('aread@' in outbox[-1]['Cc'])
# test expiry
txt = "%s-%s.txt" % (draft.name, draft.rev)
@ -679,7 +705,9 @@ class ExpireLastCallTests(TestCase):
self.assertEqual(draft.docevent_set.count(), events_before + 1)
self.assertEqual(len(outbox), mailbox_before + 1)
self.assertTrue("Last Call Expired" in outbox[-1]["Subject"])
self.assertTrue('iesg-secretary@' in outbox[-1]['Cc'])
self.assertTrue('iesg@' in outbox[-1]['To'])
self.assertTrue('draft-ietf-mars-test@' in outbox[-1]['To'])
class IndividualInfoFormsTests(TestCase):
def test_doc_change_stream(self):
@ -693,22 +721,25 @@ class IndividualInfoFormsTests(TestCase):
self.assertEqual(len(q('[type=submit]:contains("Save")')), 1)
# shift to ISE stream
messages_before = len(outbox)
empty_outbox()
r = self.client.post(url,dict(stream="ise",comment="7gRMTjBM"))
self.assertEqual(r.status_code,302)
self.doc = Document.objects.get(name=self.docname)
self.assertEqual(self.doc.stream_id,'ise')
self.assertEqual(len(outbox),messages_before+1)
self.assertTrue('Stream Change Notice' in outbox[-1]['Subject'])
self.assertTrue('7gRMTjBM' in str(outbox[-1]))
self.assertEqual(len(outbox), 1)
self.assertTrue('Stream Change Notice' in outbox[0]['Subject'])
self.assertTrue('rfc-ise@' in outbox[0]['To'])
self.assertTrue('iesg@' in outbox[0]['To'])
self.assertTrue('7gRMTjBM' in str(outbox[0]))
self.assertTrue('7gRMTjBM' in self.doc.latest_event(DocEvent,type='added_comment').desc)
# Would be nice to test that the stream managers were in the To header...
# shift to an unknown stream (it must be possible to throw a document out of any stream)
empty_outbox()
r = self.client.post(url,dict(stream=""))
self.assertEqual(r.status_code,302)
self.doc = Document.objects.get(name=self.docname)
self.assertEqual(self.doc.stream,None)
self.assertTrue('rfc-ise@' in outbox[0]['To'])
def test_doc_change_notify(self):
url = urlreverse('doc_change_notify', kwargs=dict(name=self.docname))
@ -772,12 +803,17 @@ class IndividualInfoFormsTests(TestCase):
self.assertEqual(len(q('[type=submit]:contains("Save")')), 1)
# set a date
empty_outbox()
self.assertFalse(self.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.assertEqual(r.status_code,302)
self.doc = Document.objects.get(name=self.docname)
self.assertEqual(self.doc.latest_event(TelechatDocEvent, "scheduled_for_telechat").telechat_date,telechat_date)
self.assertEqual(len(outbox), 1)
self.assertTrue('Telechat update notice' in outbox[0]['Subject'])
self.assertTrue('iesg@' in outbox[0]['To'])
self.assertTrue('iesg-secretary@' in outbox[0]['To'])
# Take the doc back off any telechat
r = self.client.post(url,dict(telechat_date=""))
@ -1013,6 +1049,8 @@ class SubmitToIesgTests(TestCase):
self.assertTrue(doc.docevent_set.count() != docevent_count_pre)
self.assertEqual(len(outbox), mailbox_before + 1)
self.assertTrue("Publication has been requested" in outbox[-1]['Subject'])
self.assertTrue("aread@" in outbox[-1]['To'])
self.assertTrue("iesg-secretary@" in outbox[-1]['Cc'])
def setUp(self):
make_test_data()
@ -1051,12 +1089,16 @@ class RequestPublicationTests(TestCase):
draft = Document.objects.get(name=draft.name)
self.assertEqual(draft.get_state_slug("draft-stream-iab"), "rfc-edit")
self.assertEqual(len(outbox), mailbox_before + 2)
self.assertTrue("Document Action" in outbox[-2]['Subject'])
self.assertTrue("Document Action" in draft.message_set.order_by("-time")[0].subject)
# the IANA copy
self.assertTrue("rfc-editor@" in outbox[-2]['To'])
self.assertTrue("Document Action" in outbox[-1]['Subject'])
self.assertTrue(not outbox[-1]['CC'])
self.assertTrue("drafts-approval@icann.org" in outbox[-1]['To'])
self.assertTrue("Document Action" in draft.message_set.order_by("-time")[0].subject)
class AdoptDraftTests(TestCase):
def test_adopt_document(self):
@ -1160,7 +1202,7 @@ class ChangeStreamStateTests(TestCase):
old_state = draft.get_state("draft-stream-%s" % draft.stream_id )
new_state = State.objects.get(used=True, type="draft-stream-%s" % draft.stream_id, slug="parked")
self.assertNotEqual(old_state, new_state)
mailbox_before = len(outbox)
empty_outbox()
events_before = draft.docevent_set.count()
r = self.client.post(url,
@ -1178,10 +1220,10 @@ class ChangeStreamStateTests(TestCase):
self.assertEqual(len(reminder), 1)
due = datetime.datetime.now() + datetime.timedelta(weeks=10)
self.assertTrue(due - datetime.timedelta(days=1) <= reminder[0].due <= due + datetime.timedelta(days=1))
self.assertEqual(len(outbox), mailbox_before + 1)
self.assertTrue("state changed" in outbox[-1]["Subject"].lower())
self.assertTrue("mars-chairs@ietf.org" in unicode(outbox[-1]))
self.assertTrue("marsdelegate@ietf.org" in unicode(outbox[-1]))
self.assertEqual(len(outbox), 1)
self.assertTrue("state changed" in outbox[0]["Subject"].lower())
self.assertTrue("mars-chairs@ietf.org" in unicode(outbox[0]))
self.assertTrue("marsdelegate@ietf.org" in unicode(outbox[0]))
class ChangeReplacesTests(TestCase):
def setUp(self):
@ -1252,6 +1294,7 @@ class ChangeReplacesTests(TestCase):
self.assertEqual(len(q('[type=submit]:contains("Save")')), 1)
# Post that says replacea replaces base a
empty_outbox()
RelatedDocument.objects.create(source=self.replacea, target=self.basea.docalias_set.first(),
relationship=DocRelationshipName.objects.get(slug="possibly-replaces"))
self.assertEqual(self.basea.get_state().slug,'active')
@ -1260,7 +1303,12 @@ class ChangeReplacesTests(TestCase):
self.assertEqual(RelatedDocument.objects.filter(relationship__slug='replaces',source=self.replacea).count(),1)
self.assertEqual(Document.objects.get(name='draft-test-base-a').get_state().slug,'repl')
self.assertTrue(not RelatedDocument.objects.filter(relationship='possibly-replaces', source=self.replacea))
self.assertEqual(len(outbox), 1)
self.assertTrue('replacement status updated' in outbox[-1]['Subject'])
self.assertTrue('base-a@' in outbox[-1]['To'])
self.assertTrue('replace-a@' in outbox[-1]['To'])
empty_outbox()
# Post that says replaceboth replaces both base a and base b
url = urlreverse('doc_change_replaces', kwargs=dict(name=self.replaceboth.name))
self.assertEqual(self.baseb.get_state().slug,'expired')
@ -1268,18 +1316,31 @@ class ChangeReplacesTests(TestCase):
self.assertEqual(r.status_code, 302)
self.assertEqual(Document.objects.get(name='draft-test-base-a').get_state().slug,'repl')
self.assertEqual(Document.objects.get(name='draft-test-base-b').get_state().slug,'repl')
self.assertEqual(len(outbox), 1)
self.assertTrue('base-a@' in outbox[-1]['To'])
self.assertTrue('base-b@' in outbox[-1]['To'])
self.assertTrue('replace-both@' in outbox[-1]['To'])
# Post that undoes replaceboth
empty_outbox()
r = self.client.post(url, dict(replaces=""))
self.assertEqual(r.status_code, 302)
self.assertEqual(Document.objects.get(name='draft-test-base-a').get_state().slug,'repl') # Because A is still also replaced by replacea
self.assertEqual(Document.objects.get(name='draft-test-base-b').get_state().slug,'expired')
self.assertEqual(len(outbox), 1)
self.assertTrue('base-a@' in outbox[-1]['To'])
self.assertTrue('base-b@' in outbox[-1]['To'])
self.assertTrue('replace-both@' in outbox[-1]['To'])
# Post that undoes replacea
empty_outbox()
url = urlreverse('doc_change_replaces', kwargs=dict(name=self.replacea.name))
r = self.client.post(url, dict(replaces=""))
self.assertEqual(r.status_code, 302)
self.assertEqual(Document.objects.get(name='draft-test-base-a').get_state().slug,'active')
self.assertTrue('base-a@' in outbox[-1]['To'])
self.assertTrue('replace-a@' in outbox[-1]['To'])
def test_review_possibly_replaces(self):
replaced = self.basea.docalias_set.first()

View file

@ -322,8 +322,10 @@ class StatusChangeTests(TestCase):
self.assertEqual(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('ietf-announce' in outbox[-1]['To'])
self.assertTrue('rfc-editor' in outbox[-1]['Cc'])
self.assertTrue('(rfc9998) to Historic' in ''.join(wrap(unicode(outbox[-1])+unicode(outbox[-2]),2**16)))
self.assertTrue('(rfc9999) to Internet Standard' 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'))

View file

@ -260,7 +260,9 @@ def default_approval_text(review):
conflictdoc = conflictdoc,
conflictdoc_url = settings.IDTRACKER_BASE_URL+conflictdoc.get_absolute_url(),
receiver=receiver,
approved_review = current_text
approved_review = current_text,
to = gather_addresses('ballot_approved_conflrev',doc=review),
cc = gather_addresses('ballot_approved_conflrev_cc',doc=review),
)
)

View file

@ -92,8 +92,8 @@ def email_milestone_review_reminder(group, grace_period=7):
milestones=milestones,
reviewer=milestone_reviewer_for_group_type(group.type_id),
url=settings.IDTRACKER_BASE_URL + urlreverse("group_edit_milestones", kwargs=dict(group_type=group.type_id, acronym=group.acronym)),
cc=cc,
)
),
cc=cc,
)
return True

View file

@ -17,7 +17,7 @@ from ietf.group.utils import save_group_in_history
from ietf.name.models import DocTagName, GroupStateName
from ietf.person.models import Person, Email
from ietf.utils.test_utils import TestCase
from ietf.utils.mail import outbox
from ietf.utils.mail import outbox, empty_outbox
from ietf.utils.test_data import make_test_data
from ietf.utils.test_utils import login_testing_unauthorized
from ietf.group.mails import ( email_milestone_review_reminder, email_milestones_due,
@ -444,6 +444,7 @@ class GroupEditTests(TestCase):
area = group.parent
ad = Person.objects.get(name="Aread Irector")
state = GroupStateName.objects.get(slug="bof")
empty_outbox()
r = self.client.post(url,
dict(name="Mars Not Special Interest Group",
acronym="mars",
@ -474,6 +475,10 @@ class GroupEditTests(TestCase):
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_conclude(self):
make_test_data()
@ -500,6 +505,7 @@ class GroupEditTests(TestCase):
r = self.client.post(url, dict(instructions="Test instructions"))
self.assertEqual(r.status_code, 302)
self.assertEqual(len(outbox), mailbox_before + 1)
self.assertTrue('iesg-secretary@' in outbox[-1]['To'])
# the WG remains active until the Secretariat takes action
group = Group.objects.get(acronym=group.acronym)
self.assertEqual(group.state_id, "active")
@ -602,6 +608,11 @@ class MilestoneTests(TestCase):
self.assertTrue("Added milestone" in m.milestonegroupevent_set.all()[0].desc)
self.assertEqual(len(outbox),mailbox_before+2)
self.assertFalse(any('Review Required' in x['Subject'] for x in outbox[-2:]))
self.assertTrue('Milestones changed' in outbox[-2]['Subject'])
self.assertTrue('mars-chairs@' in outbox[-2]['To'])
self.assertTrue('aread@' in outbox[-2]['To'])
self.assertTrue('Milestones changed' in outbox[-1]['Subject'])
self.assertTrue('mars-wg@' in outbox[-1]['To'])
def test_add_milestone_as_chair(self):
m1, m2, group = self.create_test_milestones()

View file

@ -14,7 +14,7 @@ from ietf.ipr.utils import get_genitive, get_ipr_summary
from ietf.message.models import Message
from ietf.utils.test_utils import TestCase, login_testing_unauthorized
from ietf.utils.test_data import make_test_data
from ietf.utils.mail import outbox
from ietf.utils.mail import outbox, empty_outbox
from ietf.mailtoken.utils import gather_addresses
@ -251,6 +251,7 @@ class IprTests(TestCase):
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",
@ -262,6 +263,9 @@ class IprTests(TestCase):
})
self.assertEqual(r.status_code, 200)
self.assertTrue("Your IPR disclosure has been submitted" in r.content)
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)
@ -277,6 +281,7 @@ class IprTests(TestCase):
url = urlreverse("ietf.ipr.views.new", kwargs={ "type": "specific" })
# successful post
empty_outbox()
r = self.client.post(url, {
"holder_legal_name": "Test Legal",
"holder_contact_name": "Test Holder",
@ -305,6 +310,9 @@ class IprTests(TestCase):
self.assertEqual(ipr.holder_legal_name, "Test Legal")
self.assertEqual(ipr.state.slug, 'pending')
self.assertTrue(isinstance(ipr.get_child(),HolderIprDisclosure))
self.assertEqual(len(outbox),1)
self.assertTrue('New IPR Submission' in outbox[0]['Subject'])
self.assertTrue('ietf-ipr@' in outbox[0]['To'])
def test_new_thirdparty(self):
"""Add a new third-party disclosure. Note: submitter does not need to be logged in.
@ -313,6 +321,7 @@ class IprTests(TestCase):
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",
@ -338,6 +347,9 @@ class IprTests(TestCase):
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_update(self):
draft = make_test_data()
@ -345,6 +357,7 @@ class IprTests(TestCase):
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",
@ -374,6 +387,9 @@ class IprTests(TestCase):
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_addcomment(self):
make_test_data()
@ -484,7 +500,10 @@ I would like to revoke this declaration.
name = 'form-%d-type' % i
data[name] = q('form input[name=%s]'%name).val()
text_name = 'form-%d-text' % i
data[text_name] = q('form textarea[name=%s]'%text_name).text()
data[text_name] = q('form textarea[name=%s]'%text_name).html().strip()
# Do not try to use
#data[text_name] = q('form textarea[name=%s]'%text_name).text()
# .text does not work - the field will likely contain <> characters
r = self.client.post(url, data )
self.assertEqual(r.status_code,302)
self.assertEqual(len(outbox),len_before+2)
@ -506,6 +525,7 @@ I would like to revoke this declaration.
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)
@ -513,6 +533,8 @@ I would like to revoke this declaration.
self.assertEqual(q.count(),1)
event = q[0].msgevents.first()
self.assertTrue(event.response_past_due())
self.assertEqual(len(outbox), 1)
self.assertTrue('joe@test.com' in outbox[0]['To'])
# test process response uninteresting message
message_string = """To: {}

View file

@ -333,6 +333,8 @@ class LiaisonManagementTests(TestCase):
self.assertEqual(len(outbox), mailbox_before + 1)
self.assertTrue("Liaison Statement" in outbox[-1]["Subject"])
self.assertTrue('marschairman@' in outbox[-1]['To'])
self.assertTrue('cc@' in outbox[-1]['Cc'])
def test_add_outgoing_liaison(self):
make_test_data()
@ -407,6 +409,7 @@ class LiaisonManagementTests(TestCase):
self.assertEqual(len(outbox), mailbox_before + 1)
self.assertTrue("Liaison Statement" in outbox[-1]["Subject"])
self.assertTrue('statements@ietf.org' in outbox[-1]['To'])
# try adding statement to non-predefined organization
r = self.client.post(url,
@ -441,6 +444,7 @@ class LiaisonManagementTests(TestCase):
send_sdo_reminder(Group.objects.filter(type="sdo")[0])
self.assertEqual(len(outbox), mailbox_before + 1)
self.assertTrue("authorized individuals" in outbox[-1]["Subject"])
self.assertTrue('zrk@ulm.mars' in outbox[-1]['To'])
def test_send_liaison_deadline_reminder(self):
make_test_data()

View file

@ -476,7 +476,7 @@ def make_mailtokens(apps):
mt_factory(slug='doc_telechat_details_changed',
desc="Recipients when a document's telechat date or other telechat specific details are changed",
recipient_slugs=['iesg',
'iesg-secretary',
'iesg_secretary',
'doc_notify',
'doc_authors',
'doc_shepherd',
@ -494,7 +494,7 @@ def make_mailtokens(apps):
mt_factory(slug='doc_pulled_from_rfc_queue_cc',
desc="Recipients when a document is taken out of the RFC's editor queue before publication",
recipient_slugs=['iesg-secretary',
recipient_slugs=['iesg_secretary',
'doc_ad',
'doc_notify',
'doc_authors',

View file

@ -2,7 +2,6 @@ from django.core.urlresolvers import reverse as urlreverse
from ietf.utils.test_utils import TestCase
from ietf.utils.test_data import make_test_data
from ietf.mailtoken.models import Recipient
class EventMailTests(TestCase):
@ -33,11 +32,3 @@ class EventMailTests(TestCase):
self.assertEqual(r.status_code, 200)
self.assertTrue('doc_group_mail_list' in r.content)
class RecipientTests(TestCase):
def test_recipient_functions(self):
draft = make_test_data()
recipient = Recipient.objects.first()
for funcname in [name for name in dir(recipient) if name.startswith('gather_')]:
func=getattr(recipient,funcname)
func(**{'doc':draft,'group':draft.group})

View file

@ -5076,7 +5076,8 @@
"doc_authors",
"doc_group_chairs",
"doc_notify",
"doc_shepherd"
"doc_shepherd",
"iesg_secretary"
],
"desc": "Recipients when a document is taken out of the RFC's editor queue before publication"
},
@ -5148,7 +5149,8 @@
"doc_group_chairs",
"doc_notify",
"doc_shepherd",
"iesg"
"iesg",
"iesg_secretary"
],
"desc": "Recipients when a document's telechat date or other telechat specific details are changed"
},

View file

@ -501,6 +501,19 @@ class NomcomViewsTest(TestCase):
return self.nominate_view(public=False)
self.client.logout()
def test_public_nominate_with_automatic_questionnaire(self):
nomcom = get_nomcom_by_year(self.year)
nomcom.send_questionnaire = True
nomcom.save()
login_testing_unauthorized(self, COMMUNITY_USER, self.public_nominate_url)
empty_outbox()
self.nominate_view(public=True)
self.assertEqual(len(outbox), 4)
# test_public_nominate checks the other messages
self.assertTrue('Questionnaire' in outbox[2]['Subject'])
self.assertTrue('nominee@' in outbox[2]['To'])
def nominate_view(self, *args, **kwargs):
public = kwargs.pop('public', True)
nominee_email = kwargs.pop('nominee_email', u'nominee@example.com')
@ -640,7 +653,7 @@ class NomcomViewsTest(TestCase):
empty_outbox()
self.feedback_view(public=True)
self.assertTrue(len(outbox),1)
self.assertEqual(len(outbox),1)
self.assertFalse('confirmation' in outbox[0]['Subject'])
def test_private_feedback(self):
@ -897,6 +910,8 @@ class ReminderTest(TestCase):
response = self.client.post(url, test_data)
self.assertEqual(response.status_code, 200)
self.assertEqual(len(outbox), messages_before + 2)
self.assertTrue('nominee1@' in outbox[-2]['To'])
self.assertTrue('nominee2@' in outbox[-1]['To'])
def test_remind_questionnaire_view(self):
url = reverse('nomcom_send_reminder_mail', kwargs={'year': NOMCOM_YEAR,'type':'questionnaire'})
@ -906,4 +921,5 @@ class ReminderTest(TestCase):
response = self.client.post(url, test_data)
self.assertEqual(response.status_code, 200)
self.assertEqual(len(outbox), messages_before + 1)
self.assertTrue('nominee1@' in outbox[-1]['To'])

View file

@ -5,6 +5,7 @@ from ietf.group.models import Group
#from ietf.meeting.models import Session
#from ietf.utils.test_data import make_test_data
from ietf.meeting.test_data import make_meeting_test_data as make_test_data
from ietf.utils.mail import outbox, empty_outbox
from pyquery import PyQuery
@ -108,6 +109,8 @@ class NotMeetingCase(TestCase):
url = reverse('sessions_no_session',kwargs={'acronym':group.acronym})
self.client.login(username="secretary", password="secretary+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
@ -121,6 +124,10 @@ class NotMeetingCase(TestCase):
self.assertEqual(r.status_code, 200)
self.assertTrue('is already marked as not meeting' in r.content)
self.assertEqual(len(outbox),1)
self.assertTrue('Not having a session' in outbox[0]['Subject'])
self.assertTrue('session-request@' in outbox[0]['To'])
class RetrievePreviousCase(TestCase):
pass

View file

@ -324,6 +324,7 @@ class SubmitTests(TestCase):
self.assertTrue((u"I-D Action: %s" % name) in outbox[-3]["Subject"])
self.assertTrue((u"I-D Action: %s" % name) in draft.message_set.order_by("-time")[0].subject)
self.assertTrue("Author Name" in unicode(outbox[-3]))
self.assertTrue("ietf-announce@" in outbox[-3]['To'])
self.assertTrue("New Version Notification" in outbox[-2]["Subject"])
self.assertTrue(name in unicode(outbox[-2]))
self.assertTrue("mars" in unicode(outbox[-2]))
@ -648,6 +649,9 @@ class SubmitTests(TestCase):
self.assertTrue("Full URL for managing submission" in outbox[-1]["Subject"])
self.assertTrue(name in outbox[-1]["Subject"])
# This could use a test on an 01 from a new author to make sure the logic on
# who gets the management url behaves as expected
def test_submit_all_file_types(self):
make_test_data()

View file

@ -12,7 +12,7 @@ from ietf.doc.models import Document, DocAlias, DocEvent, DeletedEvent, DocTagNa
from ietf.doc.utils import add_state_change_event
from ietf.person.models import Person
from ietf.sync import iana, rfceditor
from ietf.utils.mail import outbox
from ietf.utils.mail import outbox, empty_outbox
from ietf.utils.test_data import make_test_data
from ietf.utils.test_utils import login_testing_unauthorized
from ietf.utils.test_utils import TestCase
@ -71,7 +71,7 @@ class IANASyncTests(TestCase):
# check sorting
self.assertEqual(changes[0]["time"], "2011-10-09 11:00:00")
mailbox_before = len(outbox)
empty_outbox()
added_events, warnings = iana.update_history_with_changes(changes)
self.assertEqual(len(added_events), 3)
@ -81,8 +81,9 @@ class IANASyncTests(TestCase):
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), mailbox_before + 3 )
# TODO look sensibly at the message here
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)

View file

@ -1,6 +1,6 @@
{% load mail_filters %}{% autoescape off %}From: The IESG <iesg-secretary@ietf.org>
To: {{ review.notify }}
Cc: The IESG <iesg@ietf.org>, <iana@iana.org>, <ietf-announce@ietf.org>
To: {{ to }}
Cc: {{ cc }}
Subject: Results of IETF-conflict review for {{conflictdoc.canonical_name}}-{{conflictdoc.rev}}
{% filter wordwrap:73 %}The IESG has completed a review of {{conflictdoc.canonical_name}}-{{conflictdoc.rev}} consistent with RFC5742.

View file

@ -330,16 +330,4 @@ def make_test_data():
other_doc_factory('minutes','minutes-42-mars')
other_doc_factory('slides','slides-42-mars-1')
# Trying the fixture route instead
# EventMail tokens used by the views
# This won't allow testing the results of the production configuration - if we want to do that, we'll need to
# extract the production data either directly, or as a fixture
# recipient = Recipient.objects.create(slug='bogus_recipient',desc='Bogus Recipient',template='bogus@example.com')
# for slug in ['ballot_approved_charter', 'ballot_approved_charter_cc', 'ballot_approved_conflrev', 'ballot_approved_conflrev_cc', 'ballot_approved_ietf_stream', 'ballot_approved_ietf_stream_cc', 'ballot_approved_ietf_stream_iana', 'ballot_approved_status_change', 'ballot_approved_status_change_cc', 'ballot_deferred', 'ballot_saved', 'ballot_saved_cc', 'charter_external_review', 'charter_external_review_cc', 'conflrev_requested', 'conflrev_requested_cc', 'conflrev_requested_iana', 'doc_stream_changed', 'last_call_expired', 'last_call_expired_cc', 'last_call_issued', 'last_call_issued_cc', 'last_call_issued_iana', 'last_call_requested', 'last_call_requested_cc', 'pubreq_iesg', 'pubreq_iesg_cc', 'pubreq_rfced', 'pubreq_rfced_iana']:
# m = MailToken.objects.create(slug=slug,desc=slug)
# m.recipients=[recipient]
# # Well, this isn't working out so well - Recipients that have code backing up their gather sometimes refer to other Recipients...
# for slug in ['doc_authors','doc_group_chairs','doc_notify','doc_stream_owner','stream_managers']:
# Recipient.objects.create(slug=slug,desc="Bogus Recipient",template='bogus@example.com')
return draft