From dcf9e6b40f65f1ca93cea6a5e252e9327cc4f7dc Mon Sep 17 00:00:00 2001
From: Robert Sparks <rjsparks@nostrum.com>
Date: Wed, 6 Jun 2018 17:59:40 +0000
Subject: [PATCH] Use factories for ietf.doc.tests_ballots. Fixed a long-hidden
 bug in test_edit_verify_permissions where non-existing usernames were used
 and passed the tests accidently. Added list_email to the GroupFactory. Commit
 ready for merge.  - Legacy-Id: 15219

---
 ietf/doc/tests.py        |  1 -
 ietf/doc/tests_ballot.py | 69 ++++++++++++++++++++++++----------------
 ietf/group/factories.py  |  1 +
 3 files changed, 42 insertions(+), 29 deletions(-)

diff --git a/ietf/doc/tests.py b/ietf/doc/tests.py
index a16f0fe9d..93998c2bb 100644
--- a/ietf/doc/tests.py
+++ b/ietf/doc/tests.py
@@ -32,7 +32,6 @@ from ietf.name.models import SessionStatusName
 from ietf.person.models import Person
 from ietf.person.factories import PersonFactory
 from ietf.utils.mail import outbox
-#from ietf.utils.test_data import make_test_data
 from ietf.utils.test_utils import login_testing_unauthorized, unicontent
 from ietf.utils.test_utils import TestCase
 
diff --git a/ietf/doc/tests_ballot.py b/ietf/doc/tests_ballot.py
index 5894f52f9..b25f73772 100644
--- a/ietf/doc/tests_ballot.py
+++ b/ietf/doc/tests_ballot.py
@@ -8,22 +8,23 @@ from django.urls import reverse as urlreverse
 
 from ietf.doc.models import ( Document, State, DocEvent,
     BallotPositionDocEvent, LastCallDocEvent, WriteupDocEvent, TelechatDocEvent )
-from ietf.doc.factories import DocumentFactory
+from ietf.doc.factories import DocumentFactory, IndividualDraftFactory, IndividualRfcFactory, WgDraftFactory
 from ietf.doc.utils import create_ballot_if_not_open
 from ietf.group.models import Group, Role
+from ietf.group.factories import GroupFactory, RoleFactory
 from ietf.name.models import BallotPositionName
 from ietf.iesg.models import TelechatDate
 from ietf.person.models import Person, PersonalApiKey
+from ietf.person.factories import PersonFactory
 from ietf.utils.test_utils import TestCase, unicontent
 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
 
 
 class EditPositionTests(TestCase):
     def test_edit_position(self):
-        draft = make_test_data()
         ad = Person.objects.get(user__username="ad")
+        draft = IndividualDraftFactory(ad=ad)
         ballot = create_ballot_if_not_open(None, draft, ad, 'approve')
         url = urlreverse('ietf.doc.views_ballot.edit_position', kwargs=dict(name=draft.name,
                                                           ballot_id=ballot.pk))
@@ -89,9 +90,9 @@ class EditPositionTests(TestCase):
         self.assertTrue("Ballot comment text updated" in pos.desc)
         
     def test_api_set_position(self):
-        draft = make_test_data()
-        url = urlreverse('ietf.doc.views_ballot.api_set_position')
         ad = Person.objects.get(name="Areaư Irector")
+        draft = WgDraftFactory(ad=ad)
+        url = urlreverse('ietf.doc.views_ballot.api_set_position')
         create_ballot_if_not_open(None, draft, ad, 'approve')
         ad.user.last_login = datetime.datetime.now()
         ad.user.save()
@@ -172,7 +173,7 @@ class EditPositionTests(TestCase):
 
 
     def test_edit_position_as_secretary(self):
-        draft = make_test_data()
+        draft = IndividualDraftFactory()
         ad = Person.objects.get(user__username="ad")
         ballot = create_ballot_if_not_open(None, draft, ad, 'approve')
         url = urlreverse('ietf.doc.views_ballot.edit_position', kwargs=dict(name=draft.name, ballot_id=ballot.pk))
@@ -198,7 +199,7 @@ class EditPositionTests(TestCase):
         self.assertTrue("by Sec" in pos.desc)
 
     def test_cannot_edit_position_as_pre_ad(self):
-        draft = make_test_data()
+        draft = IndividualDraftFactory()
         ad = Person.objects.get(user__username="ad")
         ballot = create_ballot_if_not_open(None, draft, ad, 'approve')
         url = urlreverse('ietf.doc.views_ballot.edit_position', kwargs=dict(name=draft.name, ballot_id=ballot.pk))
@@ -216,11 +217,11 @@ class EditPositionTests(TestCase):
         self.assertEqual(r.status_code, 403)
         
     def test_send_ballot_comment(self):
-        draft = make_test_data()
+        ad = Person.objects.get(user__username="ad")
+        draft = WgDraftFactory(ad=ad,group__acronym='mars')
         draft.notify = "somebody@example.com"
         draft.save_with_history([DocEvent.objects.create(doc=draft, rev=draft.rev, type="changed_document", by=Person.objects.get(user__username="secretary"), desc="Test")])
 
-        ad = Person.objects.get(user__username="ad")
         ballot = create_ballot_if_not_open(None, draft, ad, 'approve')
 
         BallotPositionDocEvent.objects.create(
@@ -274,7 +275,7 @@ class EditPositionTests(TestCase):
 
 class BallotWriteupsTests(TestCase):
     def test_edit_last_call_text(self):
-        draft = make_test_data()
+        draft = IndividualDraftFactory(ad=Person.objects.get(user__username='ad'),states=[('draft','active'),('draft-iesg','ad-eval')])
         url = urlreverse('ietf.doc.views_ballot.lastcalltext', kwargs=dict(name=draft.name))
         login_testing_unauthorized(self, "secretary", url)
 
@@ -314,7 +315,8 @@ class BallotWriteupsTests(TestCase):
 
 
     def test_request_last_call(self):
-        draft = make_test_data()
+        ad = Person.objects.get(user__username="ad")
+        draft = IndividualDraftFactory(ad=ad,states=[('draft-iesg','iesg-eva')])
         url = urlreverse('ietf.doc.views_ballot.lastcalltext', kwargs=dict(name=draft.name))
         login_testing_unauthorized(self, "secretary", url)
 
@@ -339,7 +341,7 @@ class BallotWriteupsTests(TestCase):
         self.assertTrue('aread@' in outbox[-1]['Cc'])
 
     def test_edit_ballot_writeup(self):
-        draft = make_test_data()
+        draft = IndividualDraftFactory()
         url = urlreverse('ietf.doc.views_ballot.ballot_writeupnotes', kwargs=dict(name=draft.name))
         login_testing_unauthorized(self, "secretary", url)
 
@@ -369,7 +371,7 @@ class BallotWriteupsTests(TestCase):
         self.assertTrue("This is a simple test" in draft.latest_event(WriteupDocEvent, type="changed_ballot_writeup_text").text)
 
     def test_edit_ballot_rfceditornote(self):
-        draft = make_test_data()
+        draft = IndividualDraftFactory()
         url = urlreverse('ietf.doc.views_ballot.ballot_rfceditornote', kwargs=dict(name=draft.name))
         login_testing_unauthorized(self, "secretary", url)
 
@@ -409,7 +411,8 @@ class BallotWriteupsTests(TestCase):
         self.assertFalse(draft.has_rfc_editor_note())
 
     def test_issue_ballot(self):
-        draft = make_test_data()
+        ad = Person.objects.get(user__username="ad")
+        draft = IndividualDraftFactory(ad=ad)
         url = urlreverse('ietf.doc.views_ballot.ballot_writeupnotes', kwargs=dict(name=draft.name))
         login_testing_unauthorized(self, "ad", url)
 
@@ -431,7 +434,8 @@ class BallotWriteupsTests(TestCase):
         self.assertTrue('X-IETF-Draft-string' in outbox[-1])
 
     def test_edit_approval_text(self):
-        draft = make_test_data()
+        ad = Person.objects.get(user__username="ad")
+        draft = WgDraftFactory(ad=ad,states=[('draft','active'),('draft-iesg','iesg-eva')],intended_std_level_id='ps')
         url = urlreverse('ietf.doc.views_ballot.ballot_approvaltext', kwargs=dict(name=draft.name))
         login_testing_unauthorized(self, "secretary", url)
 
@@ -489,7 +493,12 @@ class BallotWriteupsTests(TestCase):
             q = PyQuery(r.content)
             self.assertEqual(len(q("<textarea class=\"form-control\"")),1) 
 
-        draft = make_test_data()
+        for username in ['plain','marschairman']:
+            PersonFactory(user__username=username)
+        mars = GroupFactory(acronym='mars',type_id='wg')
+        RoleFactory(group=mars,person=Person.objects.get(user__username='marschairman'),name_id='chair')
+        ad = Person.objects.get(user__username="ad")
+        draft = WgDraftFactory(group=mars,ad=ad,states=[('draft','active'),('draft-iesg','ad-eval')])
 
         events = []
         
@@ -527,7 +536,7 @@ class BallotWriteupsTests(TestCase):
         for p in ['ietf.doc.views_ballot.ballot_approvaltext','ietf.doc.views_ballot.ballot_writeupnotes','ietf.doc.views_ballot.ballot_rfceditornote']:
             url = urlreverse(p, kwargs=dict(name=draft.name))
 
-            for username in ['plain','marschairman','iab chair','irtf chair','ise','iana']:
+            for username in ['plain','marschairman','iab-chair','irtf-chair','ise','iana']:
                 verify_fail(username, url)
 
             for username in ['secretary','ad']:
@@ -538,10 +547,10 @@ class BallotWriteupsTests(TestCase):
         draft.save_with_history(events)
         url = urlreverse('ietf.doc.views_ballot.ballot_rfceditornote', kwargs=dict(name=draft.name))
 
-        for username in ['plain','marschairman','ad','irtf chair','ise','iana']:
+        for username in ['plain','marschairman','ad','irtf-chair','ise','iana']:
             verify_fail(username, url)
 
-        for username in ['secretary','iab chair']:
+        for username in ['secretary','iab-chair']:
             verify_can_see(username, url)
 
         # RFC Editor Notes for documents in the IRTF Stream
@@ -553,7 +562,7 @@ class BallotWriteupsTests(TestCase):
         draft.save_with_history([e])
         url = urlreverse('ietf.doc.views_ballot.ballot_rfceditornote', kwargs=dict(name=draft.name))
 
-        for username in ['plain','marschairman','ad','iab chair','ise','iana']:
+        for username in ['plain','marschairman','ad','iab-chair','ise','iana']:
             verify_fail(username, url)
 
         for username in ['secretary','irtf chair']:
@@ -568,7 +577,7 @@ class BallotWriteupsTests(TestCase):
         draft.save_with_history([e])
         url = urlreverse('ietf.doc.views_ballot.ballot_rfceditornote', kwargs=dict(name=draft.name))
 
-        for username in ['plain','marschairman','ad','iab chair','irtf chair','iana']:
+        for username in ['plain','marschairman','ad','iab-chair','irtf-chair','iana']:
             verify_fail(username, url)
 
         for username in ['secretary','ise']:
@@ -576,7 +585,8 @@ class BallotWriteupsTests(TestCase):
 
 class ApproveBallotTests(TestCase):
     def test_approve_ballot(self):
-        draft = make_test_data()
+        ad = Person.objects.get(name="Areaư Irector")
+        draft = IndividualDraftFactory(ad=ad, intended_std_level_id='ps')
         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))
@@ -627,7 +637,7 @@ class ApproveBallotTests(TestCase):
         # 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 = IndividualDraftFactory()
         draft.set_state(State.objects.get(used=True, type="draft-iesg", slug="nopubadw"))
 
         url = urlreverse('ietf.doc.views_ballot.approve_ballot', kwargs=dict(name=draft.name))
@@ -645,7 +655,7 @@ class ApproveBallotTests(TestCase):
         self.assertTrue("NOT be published" in str(outbox[-1]))
 
     def test_clear_ballot(self):
-        draft = make_test_data()
+        draft = IndividualDraftFactory()
         ad = Person.objects.get(user__username="ad")
         ballot = create_ballot_if_not_open(None, draft, ad, 'approve')
         old_ballot_id = ballot.id
@@ -663,7 +673,8 @@ class ApproveBallotTests(TestCase):
 
 class MakeLastCallTests(TestCase):
     def test_make_last_call(self):
-        draft = make_test_data()
+        ad = Person.objects.get(user__username="ad")
+        draft = WgDraftFactory(name='draft-ietf-mars-test',group__acronym='mars',ad=ad)
         draft.set_state(State.objects.get(used=True, type="draft-iesg", slug="lc-req"))
 
         url = urlreverse('ietf.doc.views_ballot.make_last_call', kwargs=dict(name=draft.name))
@@ -841,12 +852,14 @@ class DeferUndeferTestCase(TestCase):
     # when charters support being deferred, be sure to test them here
 
     def setUp(self):
-        make_test_data()
+        IndividualDraftFactory(name='draft-ietf-mars-test',states=[('draft','active'),('draft-iesg','iesg-eva')])
+        DocumentFactory(type_id='statchg',name='status-change-imaginary-mid-review',states=[('statchg','iesgeval')])
+        DocumentFactory(type_id='conflrev',name='conflict-review-imaginary-irtf-submission',states=[('conflrev','iesgeval')])
 
 class RegenerateLastCallTestCase(TestCase):
 
     def test_regenerate_last_call(self):
-        draft = DocumentFactory.create(
+        draft = WgDraftFactory.create(
                     stream_id='ietf',
                     states=[('draft','active'),('draft-iesg','pub-req')],
                     intended_std_level_id='ps',
@@ -864,7 +877,7 @@ class RegenerateLastCallTestCase(TestCase):
         self.assertTrue("Subject: Last Call" in lc_text)
         self.assertFalse("contains these normative down" in lc_text)
 
-        rfc = DocumentFactory.create(
+        rfc = IndividualRfcFactory.create(
                   stream_id='ise',
                   other_aliases=['rfc6666',],
                   states=[('draft','rfc'),('draft-iesg','pub')],
diff --git a/ietf/group/factories.py b/ietf/group/factories.py
index 27338e50d..df7f752c4 100644
--- a/ietf/group/factories.py
+++ b/ietf/group/factories.py
@@ -13,6 +13,7 @@ class GroupFactory(factory.DjangoModelFactory):
     acronym = factory.Sequence(lambda n: 'acronym%d' %n)
     state_id = 'active'
     type_id = 'wg'
+    list_email = factory.LazyAttribute(lambda a: '%s@ietf.org'% a.acronym)
 
 class ReviewTeamFactory(factory.DjangoModelFactory):
     class Meta: