diff --git a/ietf/doc/factories.py b/ietf/doc/factories.py index 45103f7b2..5f3f6a4a4 100644 --- a/ietf/doc/factories.py +++ b/ietf/doc/factories.py @@ -1,5 +1,8 @@ import debug # pyflakes:ignore import factory +import datetime + +from django.conf import settings from ietf.doc.models import Document, DocEvent, NewRevisionDocEvent, DocAlias, State, DocumentAuthor from ietf.group.models import Group @@ -21,6 +24,8 @@ class BaseDocumentFactory(factory.DjangoModelFactory): rev = '00' std_level_id = None intended_std_level_id = None + time = datetime.datetime.now() + expires = factory.LazyAttribute(lambda o: o.time+datetime.timedelta(days=settings.INTERNET_DRAFT_DAYS_TO_EXPIRE)) @factory.lazy_attribute_sequence def name(self, n): @@ -98,6 +103,7 @@ class WgDraftFactory(BaseDocumentFactory): type_id = 'draft' group = factory.SubFactory('ietf.group.factories.GroupFactory',type_id='wg') + stream_id = 'ietf' @factory.post_generation def states(obj, create, extracted, **kwargs): diff --git a/ietf/doc/tests.py b/ietf/doc/tests.py index 93998c2bb..271b587be 100644 --- a/ietf/doc/tests.py +++ b/ietf/doc/tests.py @@ -882,7 +882,7 @@ class DocTestCase(TestCase): #other_aliases = ['rfc6020',], states = [('draft','rfc'),('draft-iesg','pub')], std_level_id = 'ps', - time = '2010-10-10', + time = datetime.datetime(2010,10,10), ) num = rfc.rfc_number() DocEventFactory.create(doc=rfc, type='published_rfc', time = '2010-10-10') @@ -902,7 +902,7 @@ class DocTestCase(TestCase): stream_id = 'rse', states = [('draft','rfc'),('draft-iesg','pub')], std_level_id = 'ind', - time = '1990-04-01', + time = datetime.datetime(1990,04,01), ) num = april1.rfc_number() DocEventFactory.create(doc=april1, type='published_rfc', time = '1990-04-01') diff --git a/ietf/doc/tests_draft.py b/ietf/doc/tests_draft.py index ed5b057ad..6b9b8409b 100644 --- a/ietf/doc/tests_draft.py +++ b/ietf/doc/tests_draft.py @@ -10,20 +10,19 @@ from django.conf import settings import debug # pyflakes:ignore -from ietf.doc.factories import DocumentFactory -from ietf.doc.models import ( Document, DocAlias, DocReminder, DocumentAuthor, DocEvent, +from ietf.doc.factories import IndividualDraftFactory, WgDraftFactory, DocEventFactory +from ietf.doc.models import ( Document, DocReminder, DocEvent, ConsensusDocEvent, LastCallDocEvent, RelatedDocument, State, TelechatDocEvent, WriteupDocEvent, DocRelationshipName) from ietf.doc.utils import get_tags_for_stream_id, create_ballot_if_not_open -from ietf.name.models import StreamName, IntendedStdLevelName, DocTagName -from ietf.group.factories import GroupFactory +from ietf.name.models import StreamName, DocTagName +from ietf.group.factories import GroupFactory, RoleFactory from ietf.group.models import Group from ietf.person.factories import PersonFactory from ietf.person.models import Person, Email from ietf.meeting.models import Meeting, MeetingTypeName from ietf.iesg.models import TelechatDate from ietf.utils.test_utils import login_testing_unauthorized, unicontent -from ietf.utils.test_data import make_test_data from ietf.utils.mail import outbox, empty_outbox from ietf.utils.test_utils import TestCase @@ -31,8 +30,9 @@ from ietf.utils.test_utils import TestCase class ChangeStateTests(TestCase): def test_ad_approved(self): # get a draft in iesg evaluation, point raised - draft = make_test_data() - draft.set_state(State.objects.get(used=True, type="draft-iesg", slug="iesg-eva")) + ad = Person.objects.get(user__username="ad") + draft = WgDraftFactory(ad=ad,states=[('draft','active'),('draft-iesg','iesg-eva')]) + DocEventFactory(type='started_iesg_process',by=ad,doc=draft,rev=draft.rev,desc="Started IESG Process") draft.tags.add("point") url = urlreverse('ietf.doc.views_draft.change_state', kwargs=dict(name=draft.name)) @@ -71,8 +71,9 @@ class ChangeStateTests(TestCase): self.assertTrue('iesg@' in outbox[-1]['To']) def test_change_state(self): - draft = make_test_data() - draft.set_state(State.objects.get(used=True, type="draft-iesg", slug="ad-eval")) + ad = Person.objects.get(user__username="ad") + draft = WgDraftFactory(name='draft-ietf-mars-test',group__acronym='mars',ad=ad,states=[('draft','active'),('draft-iesg','ad-eval')]) + DocEventFactory(type='started_iesg_process',by=ad,doc=draft,rev=draft.rev,desc="Started IESG Process") url = urlreverse('ietf.doc.views_draft.change_state', kwargs=dict(name=draft.name)) login_testing_unauthorized(self, "secretary", url) @@ -130,8 +131,9 @@ class ChangeStateTests(TestCase): self.assertEqual(len(q('form [type=submit][value="%s"]' % first_state.name)), 1) def test_pull_from_rfc_queue(self): - draft = make_test_data() - draft.set_state(State.objects.get(used=True, type="draft-iesg", slug="rfcqueue")) + ad = Person.objects.get(user__username="ad") + draft = WgDraftFactory(ad=ad,states=[('draft-iesg','rfcqueue')]) + DocEventFactory(type='started_iesg_process',by=ad,doc=draft,rev=draft.rev,desc="Started IESG Process") url = urlreverse('ietf.doc.views_draft.change_state', kwargs=dict(name=draft.name)) login_testing_unauthorized(self, "secretary", url) @@ -162,7 +164,7 @@ class ChangeStateTests(TestCase): def test_change_iana_state(self): - draft = make_test_data() + draft = WgDraftFactory() first_state = State.objects.get(used=True, type="draft-iana-review", slug="need-rev") next_state = State.objects.get(used=True, type="draft-iana-review", slug="ok-noact") @@ -193,8 +195,9 @@ class ChangeStateTests(TestCase): self.assertEqual(draft.get_state("draft-iana-review"), next_state) def test_request_last_call(self): - draft = make_test_data() - draft.set_state(State.objects.get(used=True, type="draft-iesg", slug="ad-eval")) + ad = Person.objects.get(user__username="ad") + draft = WgDraftFactory(ad=ad,states=[('draft-iesg','ad-eval')]) + DocEventFactory(type='started_iesg_process',by=ad,doc=draft,rev=draft.rev,desc="Started IESG Process") self.client.login(username="secretary", password="secretary+password") url = urlreverse('ietf.doc.views_draft.change_state', kwargs=dict(name=draft.name)) @@ -203,6 +206,7 @@ class ChangeStateTests(TestCase): 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.assertEqual(r.status_code,200) self.assertTrue("Your request to issue" in unicontent(r)) # last call text @@ -240,7 +244,7 @@ class ChangeStateTests(TestCase): class EditInfoTests(TestCase): def test_edit_info(self): - draft = make_test_data() + draft = WgDraftFactory(intended_std_level_id='ps',states=[('draft','active'),('draft-iesg','iesg-eva')]) url = urlreverse('ietf.doc.views_draft.edit_info', kwargs=dict(name=draft.name)) login_testing_unauthorized(self, "secretary", url) @@ -284,7 +288,8 @@ class EditInfoTests(TestCase): self.assertTrue(draft.name in outbox[-1]['Subject']) def test_edit_telechat_date(self): - draft = make_test_data() + ad = Person.objects.get(user__username="ad") + draft = WgDraftFactory(ad=ad,intended_std_level_id='ps',states=[('draft','active'),('draft-iesg','iesg-eva')]) url = urlreverse('ietf.doc.views_draft.edit_info', kwargs=dict(name=draft.name)) login_testing_unauthorized(self, "secretary", url) @@ -367,35 +372,12 @@ class EditInfoTests(TestCase): self.assertTrue("may not leave enough time" in outbox[-1].get_payload()) def test_start_iesg_process_on_draft(self): - make_test_data() - draft = Document.objects.create( + draft = WgDraftFactory( name="draft-ietf-mars-test2", - time=datetime.datetime.now(), - type_id="draft", - title="Testing adding a draft", - stream=None, - group=Group.objects.get(acronym="mars"), - abstract="Test test test.", - rev="01", - pages=2, + group__acronym='mars', intended_std_level_id="ps", - shepherd=None, - ad=None, - expires=datetime.datetime.now() + datetime.timedelta(days=settings.INTERNET_DRAFT_DAYS_TO_EXPIRE), - ) - DocAlias.objects.create( - document=draft, - name=draft.name, - ) - - DocumentAuthor.objects.create( - document=draft, - person=Person.objects.get(email__address="aread@ietf.org"), - email=Email.objects.get(address="aread@ietf.org"), - country="US", - affiliation="", - order=1 + authors=[Person.objects.get(user__username='ad')], ) url = urlreverse('ietf.doc.views_draft.edit_info', kwargs=dict(name=draft.name)) @@ -455,7 +437,7 @@ class EditInfoTests(TestCase): self.assertEqual(draft.get_state_slug('draft-stream-ietf'),'sub-pub') def test_edit_consensus(self): - draft = make_test_data() + draft = WgDraftFactory() url = urlreverse('ietf.doc.views_draft.edit_consensus', kwargs=dict(name=draft.name)) login_testing_unauthorized(self, "secretary", url) @@ -495,8 +477,7 @@ class EditInfoTests(TestCase): class ResurrectTests(TestCase): def test_request_resurrect(self): - draft = make_test_data() - draft.set_state(State.objects.get(used=True, type="draft", slug="expired")) + draft = WgDraftFactory(states=[('draft','expired')]) url = urlreverse('ietf.doc.views_draft.request_resurrect', kwargs=dict(name=draft.name)) @@ -527,12 +508,9 @@ class ResurrectTests(TestCase): self.assertTrue('internet-drafts@' in outbox[-1]['To']) def test_resurrect(self): - draft = make_test_data() - draft.set_state(State.objects.get(used=True, type="draft", slug="expired")) - - DocEvent.objects.create(doc=draft, rev=draft.rev, - type="requested_resurrect", - by=Person.objects.get(name="Areað Irector")) + ad = Person.objects.get(name="Areað Irector") + draft = WgDraftFactory(ad=ad,states=[('draft','expired')]) + DocEventFactory(doc=draft,type="requested_resurrect",by=ad) url = urlreverse('ietf.doc.views_draft.resurrect', kwargs=dict(name=draft.name)) @@ -604,7 +582,9 @@ class ExpireIDsTests(TestCase): def test_warn_expirable_drafts(self): from ietf.doc.expire import get_soon_to_expire_drafts, send_expire_warning_for_draft - draft = make_test_data() + mars = GroupFactory(type_id='wg',acronym='mars') + RoleFactory(group=mars, name_id='ad', person=Person.objects.get(user__username='ad')) + draft = WgDraftFactory(name='draft-ietf-mars-test',group=mars) self.assertEqual(len(list(get_soon_to_expire_drafts(14))), 0) @@ -628,7 +608,10 @@ class ExpireIDsTests(TestCase): def test_expire_drafts(self): from ietf.doc.expire import get_expired_drafts, send_expire_notice_for_draft, expire_draft - draft = make_test_data() + mars = GroupFactory(type_id='wg',acronym='mars') + ad_role = RoleFactory(group=mars, name_id='ad', person=Person.objects.get(user__username='ad')) + draft = WgDraftFactory(name='draft-ietf-mars-test',group=mars) + DocEventFactory(type='started_iesg_process',by=ad_role.person,doc=draft,rev=draft.rev,desc="Started IESG Process") self.assertEqual(len(list(get_expired_drafts())), 0) @@ -672,7 +655,7 @@ class ExpireIDsTests(TestCase): self.assertTrue(os.path.exists(os.path.join(self.archive_dir, txt))) def test_clean_up_draft_files(self): - draft = make_test_data() + draft = WgDraftFactory() from ietf.doc.expire import clean_up_draft_files @@ -737,7 +720,8 @@ class ExpireLastCallTests(TestCase): # check that non-expirable drafts aren't expired - draft = make_test_data() + ad = Person.objects.get(user__username='ad') + draft = WgDraftFactory(ad=ad,name='draft-ietf-mars-test') draft.set_state(State.objects.get(used=True, type="draft-iesg", slug="lc")) secretary = Person.objects.get(name="Sec Retary") @@ -778,7 +762,7 @@ class ExpireLastCallTests(TestCase): class IndividualInfoFormsTests(TestCase): def setUp(self): - doc = make_test_data() + doc = WgDraftFactory(group__acronym='mars',shepherd=PersonFactory(user__username='plain',name=u'Plain Man').email_set.first()) self.docname = doc.name def test_doc_change_stream(self): @@ -1095,10 +1079,9 @@ class IndividualInfoFormsTests(TestCase): class SubmitToIesgTests(TestCase): def setUp(self): - make_test_data() - self.docname='draft-ietf-mars-test' - doc = Document.objects.get(name=self.docname) - doc.unset_state('draft-iesg') + role=RoleFactory(group__acronym='mars',name_id='chair',person=PersonFactory(user__username='marschairman')) + doc=WgDraftFactory(name='draft-ietf-mars-test',group=role.group,ad=Person.objects.get(user__username='ad')) + self.docname=doc.name def test_verify_permissions(self): @@ -1147,7 +1130,12 @@ class SubmitToIesgTests(TestCase): doc = Document.objects.get(name=self.docname) self.assertTrue(doc.get_state('draft-iesg').slug=='pub-req') self.assertTrue(doc.get_state('draft-stream-ietf').slug=='sub-pub') + + # It's not clear what this testing - the view can certainly + # leave the document without an ad. This line as written only + # checks whether the setup document had an ad or not. self.assertTrue(doc.ad!=None) + 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']) @@ -1158,12 +1146,7 @@ class SubmitToIesgTests(TestCase): class RequestPublicationTests(TestCase): def test_request_publication(self): - draft = make_test_data() - draft.stream = StreamName.objects.get(slug="iab") - draft.group = Group.objects.get(acronym="iab") - draft.intended_std_level = IntendedStdLevelName.objects.get(slug="inf") - draft.save_with_history([DocEvent.objects.create(doc=draft, rev=draft.rev, type="changed_document", by=Person.objects.get(user__username="secretary"), desc="Test")]) - draft.set_state(State.objects.get(used=True, type="draft-stream-iab", slug="approved")) + draft = IndividualDraftFactory(stream_id='iab',group__acronym='iab',intended_std_level_id='inf',states=[('draft-stream-iab','approved')]) url = urlreverse('ietf.doc.views_draft.request_publication', kwargs=dict(name=draft.name)) login_testing_unauthorized(self, "iab-chair", url) @@ -1199,11 +1182,8 @@ class RequestPublicationTests(TestCase): class AdoptDraftTests(TestCase): def test_adopt_document(self): - draft = make_test_data() - draft.stream = None - draft.group = Group.objects.get(type="individ") - draft.unset_state("draft-stream-ietf") - draft.save_with_history([DocEvent.objects.create(doc=draft, rev=draft.rev, type="changed_document", by=Person.objects.get(user__username="secretary"), desc="Test")]) + RoleFactory(group__acronym='mars',group__list_email='mars-wg@ietf.org',person__user__username='marschairman',name_id='chair') + draft = IndividualDraftFactory(name='draft-ietf-mars-test',notify='aliens@example.mars') url = urlreverse('ietf.doc.views_draft.adopt_draft', kwargs=dict(name=draft.name)) login_testing_unauthorized(self, "marschairman", url) @@ -1240,7 +1220,7 @@ class AdoptDraftTests(TestCase): self.assertFalse(mars.list_email in draft.notify) def test_right_state_choices_offered(self): - draft = DocumentFactory() + draft = IndividualDraftFactory() wg = GroupFactory(type_id='wg',state_id='active') rg = GroupFactory(type_id='rg',state_id='active') person = PersonFactory(user__username='person') @@ -1283,7 +1263,9 @@ class AdoptDraftTests(TestCase): class ChangeStreamStateTests(TestCase): def test_set_tags(self): - draft = make_test_data() + role = RoleFactory(name_id='chair',group__acronym='mars',group__list_email='mars-wg@ietf.org',person__user__username='marschairman',person__name=u'WG Cháir Man') + RoleFactory(name_id='delegate',group=role.group,person__user__email='marsdelegate@ietf.org') + draft = WgDraftFactory(group=role.group,shepherd=PersonFactory(user__username='plain',user__email='plain@example.com').email_set.first()) draft.tags.set(DocTagName.objects.filter(slug="w-expert")) draft.group.unused_tags.add("w-refdoc") @@ -1323,8 +1305,10 @@ class ChangeStreamStateTests(TestCase): self.assertTrue("plain@example.com" in unicode(outbox[-1])) def test_set_initial_state(self): - draft = make_test_data() - draft.unset_state("draft-stream-%s"%draft.stream_id) + role = RoleFactory(name_id='chair',group__acronym='mars',group__list_email='mars-wg@ietf.org',person__user__username='marschairman',person__name=u'WG Cháir Man') + RoleFactory(name_id='delegate',group=role.group,person__user__email='marsdelegate@ietf.org') + draft = WgDraftFactory(group=role.group) + draft.states.all().delete() url = urlreverse('ietf.doc.views_draft.change_stream_state', kwargs=dict(name=draft.name, state_type="draft-stream-ietf")) login_testing_unauthorized(self, "marschairman", url) @@ -1357,7 +1341,9 @@ class ChangeStreamStateTests(TestCase): self.assertTrue("marsdelegate@ietf.org" in unicode(outbox[0])) def test_set_state(self): - draft = make_test_data() + role = RoleFactory(name_id='chair',group__acronym='mars',group__list_email='mars-wg@ietf.org',person__user__username='marschairman',person__name=u'WG Cháir Man') + RoleFactory(name_id='delegate',group=role.group,person__user__email='marsdelegate@ietf.org') + draft = WgDraftFactory(group=role.group) url = urlreverse('ietf.doc.views_draft.change_stream_state', kwargs=dict(name=draft.name, state_type="draft-stream-ietf")) login_testing_unauthorized(self, "marschairman", url) @@ -1400,7 +1386,9 @@ class ChangeStreamStateTests(TestCase): self.assertTrue("marsdelegate@ietf.org" in unicode(outbox[0])) def test_pubreq_validation(self): - draft = make_test_data() + role = RoleFactory(name_id='chair',group__acronym='mars',group__list_email='mars-wg@ietf.org',person__user__username='marschairman',person__name=u'WG Cháir Man') + RoleFactory(name_id='delegate',group=role.group,person__user__email='marsdelegate@ietf.org') + draft = WgDraftFactory(group=role.group) url = urlreverse('ietf.doc.views_draft.change_stream_state', kwargs=dict(name=draft.name, state_type="draft-stream-ietf")) login_testing_unauthorized(self, "marschairman", url) @@ -1422,56 +1410,43 @@ class ChangeStreamStateTests(TestCase): class ChangeReplacesTests(TestCase): def setUp(self): - make_test_data() + role = RoleFactory(name_id='chair',group__acronym='mars',group__list_email='mars-wg@ietf.org',person__user__username='marschairman',person__name=u'WG Cháir Man') + RoleFactory(name_id='delegate',group=role.group,person__user__email='marsdelegate@ietf.org') + #draft = WgDraftFactory(group=role.group) mars_wg = Group.objects.get(acronym='mars') - self.basea = Document.objects.create( + self.basea = WgDraftFactory( name="draft-test-base-a", - time=datetime.datetime.now(), - type_id="draft", title="Base A", - stream_id="ietf", - expires=datetime.datetime.now() + datetime.timedelta(days=settings.INTERNET_DRAFT_DAYS_TO_EXPIRE), group=mars_wg, ) p = PersonFactory(name=u"basea_author") e = Email.objects.create(address="basea_author@example.com", person=p, origin=p.user.username) self.basea.documentauthor_set.create(person=p, email=e, order=1) - self.baseb = Document.objects.create( + self.baseb = WgDraftFactory( name="draft-test-base-b", - time=datetime.datetime.now()-datetime.timedelta(days=365), - type_id="draft", title="Base B", - stream_id="ietf", - expires=datetime.datetime.now() - datetime.timedelta(days = 365 - settings.INTERNET_DRAFT_DAYS_TO_EXPIRE), group=mars_wg, + expires = datetime.datetime.now() - datetime.timedelta(days = 365 - settings.INTERNET_DRAFT_DAYS_TO_EXPIRE), ) p = PersonFactory(name=u"baseb_author") e = Email.objects.create(address="baseb_author@example.com", person=p, origin=p.user.username) self.baseb.documentauthor_set.create(person=p, email=e, order=1) - self.replacea = Document.objects.create( + self.replacea = WgDraftFactory( name="draft-test-replace-a", - time=datetime.datetime.now(), - type_id="draft", title="Replace Base A", - stream_id="ietf", - expires=datetime.datetime.now() + datetime.timedelta(days = settings.INTERNET_DRAFT_DAYS_TO_EXPIRE), group=mars_wg, ) p = PersonFactory(name=u"replacea_author") e = Email.objects.create(address="replacea_author@example.com", person=p, origin=p.user.username) self.replacea.documentauthor_set.create(person=p, email=e, order=1) - self.replaceboth = Document.objects.create( + self.replaceboth = WgDraftFactory( name="draft-test-replace-both", - time=datetime.datetime.now(), - type_id="draft", title="Replace Base A and Base B", - stream_id="ietf", - expires=datetime.datetime.now() + datetime.timedelta(days = settings.INTERNET_DRAFT_DAYS_TO_EXPIRE), group=mars_wg, ) p = PersonFactory(name=u"replaceboth_author") @@ -1483,10 +1458,6 @@ class ChangeReplacesTests(TestCase): self.replacea.set_state(State.objects.get(used=True, type="draft", slug="active")) self.replaceboth.set_state(State.objects.get(used=True, type="draft", slug="active")) - DocAlias.objects.create(document=self.basea,name=self.basea.name) - DocAlias.objects.create(document=self.baseb,name=self.baseb.name) - DocAlias.objects.create(document=self.replacea,name=self.replacea.name) - DocAlias.objects.create(document=self.replaceboth,name=self.replaceboth.name) def test_change_replaces(self): @@ -1572,9 +1543,9 @@ class MoreReplacesTests(TestCase): def test_stream_state_changes_when_replaced(self): self.client.login(username='secretary',password='secretary+password') for stream in ('iab','irtf','ise'): - old_doc = DocumentFactory(stream_id=stream) + old_doc = IndividualDraftFactory(stream_id=stream) old_doc.set_state(State.objects.get(type_id='draft-stream-%s'%stream, slug='ise-rev' if stream=='ise' else 'active')) - new_doc = DocumentFactory(stream_id=stream) + new_doc = IndividualDraftFactory(stream_id=stream) url = urlreverse('ietf.doc.views_draft.replaces', kwargs=dict(name=new_doc.name)) r = self.client.post(url, dict(replaces=old_doc.name)) @@ -1582,5 +1553,3 @@ class MoreReplacesTests(TestCase): old_doc = Document.objects.get(name=old_doc.name) self.assertEqual(old_doc.get_state_slug('draft'),'repl') self.assertEqual(old_doc.get_state_slug('draft-stream-%s'%stream),'repl') - -