datatracker/ietf/iesg/tests.py
Henrik Levkowetz 815602351f This is a series of 50 migrations that changes the Document and DocAlias
primary keys from character strings to integers, and makes corresponding code
changes.

This was prompted by database limitations discovered when trying to make
DocAlias use a m2m document field; with 255 long strings as primary keys for
Document and DocAlias this violated the MySQL database limitations.

Changing the primary keys to integers should also improve efficiency.  

Due to the data migrations which create the new integer primary keys and adds
corresponding integer foreign keys matching the previous string foreign keys
in all tables having foreign keys to Document and DocAlias, some of these
migrations take a long time.  The total set of migrations are expected to have
a runtime on the order of 2 hours.
 - Legacy-Id: 16237
2019-06-10 11:32:46 +00:00

531 lines
24 KiB
Python

# -*- coding: utf-8 -*-
import os
import shutil
import json
import datetime
from pyquery import PyQuery
from django.conf import settings
from django.urls import reverse as urlreverse
import debug # pyflakes:ignore
from ietf.doc.models import DocEvent, BallotPositionDocEvent, TelechatDocEvent
from ietf.doc.models import Document, DocAlias, State, RelatedDocument
from ietf.doc.factories import WgDraftFactory, IndividualDraftFactory, ConflictReviewFactory, BaseDocumentFactory, CharterFactory, WgRfcFactory, IndividualRfcFactory
from ietf.doc.utils import create_ballot_if_not_open
from ietf.group.factories import RoleFactory, GroupFactory
from ietf.group.models import Group, GroupMilestone, Role
from ietf.iesg.agenda import get_agenda_date, agenda_data
from ietf.iesg.models import TelechatDate
from ietf.name.models import StreamName
from ietf.person.models import Person
from ietf.utils.test_utils import TestCase, login_testing_unauthorized, unicontent
class IESGTests(TestCase):
def test_feed(self):
draft = WgDraftFactory(states=[('draft','active'),('draft-iesg','iesg-eva')],ad=Person.objects.get(user__username='ad'))
ad = Person.objects.get(user__username="ad")
ballot = create_ballot_if_not_open(None, draft, ad, 'approve')
pos = BallotPositionDocEvent()
pos.ballot = ballot
pos.pos_id = "discuss"
pos.type = "changed_ballot_position"
pos.doc = draft
pos.rev = draft.rev
pos.ad = pos.by = Person.objects.get(user__username="ad")
pos.save()
r = self.client.get(urlreverse("ietf.iesg.views.discusses"))
self.assertEqual(r.status_code, 200)
self.assertTrue(draft.name in unicontent(r))
self.assertTrue(pos.ad.plain_name() in unicontent(r))
def test_milestones_needing_review(self):
draft = WgDraftFactory()
RoleFactory(name_id='ad',group=draft.group,person=Person.objects.get(user__username='ad'))
m = GroupMilestone.objects.create(group=draft.group,
state_id="review",
desc="Test milestone",
due=datetime.date.today())
url = urlreverse("ietf.iesg.views.milestones_needing_review")
login_testing_unauthorized(self, "ad", url)
r = self.client.get(url)
self.assertEqual(r.status_code, 200)
self.assertTrue(m.desc in unicontent(r))
draft.group.state_id = 'conclude'
draft.group.save()
r = self.client.get(url)
self.assertEqual(r.status_code, 200)
self.assertFalse(m.desc in unicontent(r))
def test_review_decisions(self):
draft = WgDraftFactory()
e = DocEvent(type="iesg_approved")
e.doc = draft
e.rev = draft.rev
e.by = Person.objects.get(name="Areað Irector")
e.save()
url = urlreverse('ietf.iesg.views.review_decisions')
r = self.client.get(url)
self.assertEqual(r.status_code, 200)
self.assertTrue(draft.name in unicontent(r))
def test_photos(self):
url = urlreverse("ietf.iesg.views.photos")
r = self.client.get(url)
self.assertEqual(r.status_code, 200)
q = PyQuery(r.content)
ads = Role.objects.filter(group__type='area', group__state='active', name_id='ad')
self.assertEqual(len(q('div.photo-thumbnail img')), ads.count())
class IESGAgendaTests(TestCase):
def setUp(self):
mars = GroupFactory(acronym='mars',parent=Group.objects.get(acronym='farfut'))
wgdraft = WgDraftFactory(name='draft-ietf-mars-test', group=mars, intended_std_level_id='ps')
rfc = IndividualRfcFactory.create(stream_id='irtf', other_aliases=['rfc6666',], states=[('draft','rfc'),('draft-iesg','pub')], std_level_id='inf', )
wgdraft.relateddocument_set.create(target=rfc.docalias_set.get(name='rfc6666'), relationship_id='refnorm')
ise_draft = IndividualDraftFactory(name='draft-imaginary-independent-submission')
ise_draft.stream = StreamName.objects.get(slug="ise")
ise_draft.save_with_history([DocEvent(doc=ise_draft, rev=ise_draft.rev, type="changed_stream", by=Person.objects.get(user__username="secretary"), desc="Test")])
ConflictReviewFactory(name='conflict-review-imaginary-irtf-submission', review_of=ise_draft)
BaseDocumentFactory(type_id='statchg',name='status-change-imaginary-mid-review')
WgRfcFactory(std_level_id='inf')
WgRfcFactory(std_level_id='ps')
CharterFactory(states=[('charter','iesgrev')])
self.telechat_docs = {
"ietf_draft": Document.objects.get(name="draft-ietf-mars-test"),
"ise_draft": ise_draft,
"conflrev": Document.objects.get(name="conflict-review-imaginary-irtf-submission"),
"statchg": Document.objects.get(name="status-change-imaginary-mid-review"),
"charter": Document.objects.filter(type="charter")[0],
}
by = Person.objects.get(name="Areað Irector")
date = get_agenda_date()
self.draft_dir = self.tempdir('agenda-draft')
self.saved_internet_draft_path = settings.INTERNET_DRAFT_PATH
settings.INTERNET_DRAFT_PATH = self.draft_dir
for d in self.telechat_docs.values():
TelechatDocEvent.objects.create(type="scheduled_for_telechat",
doc=d,
rev=d.rev,
by=by,
telechat_date=date,
returning_item=True)
def tearDown(self):
settings.INTERNET_DRAFT_PATH = self.saved_internet_draft_path
shutil.rmtree(self.draft_dir)
def test_fill_in_agenda_docs(self):
draft = self.telechat_docs["ietf_draft"]
statchg = self.telechat_docs["statchg"]
conflrev = self.telechat_docs["conflrev"]
charter = self.telechat_docs["charter"]
# put on agenda
date = datetime.date.today() + datetime.timedelta(days=50)
TelechatDate.objects.create(date=date)
telechat_event = TelechatDocEvent.objects.create(
type="scheduled_for_telechat",
doc=draft,
rev=draft.rev,
by=Person.objects.get(name="Areað Irector"),
telechat_date=date,
returning_item=False)
date_str = date.isoformat()
# 2.1 protocol WG submissions
draft.intended_std_level_id = "ps"
draft.group = GroupFactory(acronym="mars")
draft.save_with_history([DocEvent.objects.create(doc=draft, rev=draft.rev, type="changed_group", by=Person.objects.get(user__username="secretary"), desc="Test")])
draft.set_state(State.objects.get(type="draft-iesg", slug="iesg-eva"))
self.assertTrue(draft in agenda_data(date_str)["sections"]["2.1.1"]["docs"])
telechat_event.returning_item = True
telechat_event.save()
self.assertTrue(draft in agenda_data(date_str)["sections"]["2.1.2"]["docs"])
telechat_event.returning_item = False
telechat_event.save()
draft.set_state(State.objects.get(type="draft-iesg", slug="pub-req"))
self.assertTrue(draft in agenda_data(date_str)["sections"]["2.1.3"]["docs"])
# 2.2 protocol individual submissions
draft.group = Group.objects.get(type="individ")
draft.save_with_history([DocEvent.objects.create(doc=draft, rev=draft.rev, type="changed_group", by=Person.objects.get(user__username="secretary"), desc="Test")])
draft.set_state(State.objects.get(type="draft-iesg", slug="iesg-eva"))
self.assertTrue(draft in agenda_data(date_str)["sections"]["2.2.1"]["docs"])
telechat_event.returning_item = True
telechat_event.save()
self.assertTrue(draft in agenda_data(date_str)["sections"]["2.2.2"]["docs"])
telechat_event.returning_item = False
telechat_event.save()
draft.set_state(State.objects.get(type="draft-iesg", slug="pub-req"))
self.assertTrue(draft in agenda_data(date_str)["sections"]["2.2.3"]["docs"])
# 3.1 document WG submissions
draft.intended_std_level_id = "inf"
draft.group = Group.objects.get(acronym="mars")
draft.save_with_history([DocEvent.objects.create(doc=draft, rev=draft.rev, type="changed_group", by=Person.objects.get(user__username="secretary"), desc="Test")])
draft.set_state(State.objects.get(type="draft-iesg", slug="iesg-eva"))
self.assertTrue(draft in agenda_data(date_str)["sections"]["3.1.1"]["docs"])
telechat_event.returning_item = True
telechat_event.save()
self.assertTrue(draft in agenda_data(date_str)["sections"]["3.1.2"]["docs"])
telechat_event.returning_item = False
telechat_event.save()
draft.set_state(State.objects.get(type="draft-iesg", slug="pub-req"))
self.assertTrue(draft in agenda_data(date_str)["sections"]["3.1.3"]["docs"])
# 3.2 document individual submissions
draft.group = Group.objects.get(type="individ")
draft.save_with_history([DocEvent.objects.create(doc=draft, rev=draft.rev, type="changed_group", by=Person.objects.get(user__username="secretary"), desc="Test")])
draft.set_state(State.objects.get(type="draft-iesg", slug="iesg-eva"))
self.assertTrue(draft in agenda_data(date_str)["sections"]["3.2.1"]["docs"])
telechat_event.returning_item = True
telechat_event.save()
self.assertTrue(draft in agenda_data(date_str)["sections"]["3.2.2"]["docs"])
telechat_event.returning_item = False
telechat_event.save()
draft.set_state(State.objects.get(type="draft-iesg", slug="pub-req"))
self.assertTrue(draft in agenda_data(date_str)["sections"]["3.2.3"]["docs"])
# 2.3 protocol status changes
telechat_event.doc = statchg
telechat_event.save()
relation = RelatedDocument.objects.create(
source=statchg,
target=DocAlias.objects.filter(name__startswith='rfc', document__std_level="ps")[0],
relationship_id="tohist")
statchg.group = Group.objects.get(acronym="mars")
statchg.save_with_history([DocEvent.objects.create(doc=statchg, rev=statchg.rev, type="changed_group", by=Person.objects.get(user__username="secretary"), desc="Test")])
statchg.set_state(State.objects.get(type="statchg", slug="iesgeval"))
self.assertTrue(statchg in agenda_data(date_str)["sections"]["2.3.1"]["docs"])
telechat_event.returning_item = True
telechat_event.save()
self.assertTrue(statchg in agenda_data(date_str)["sections"]["2.3.2"]["docs"])
telechat_event.returning_item = False
telechat_event.save()
statchg.set_state(State.objects.get(type="statchg", slug="adrev"))
self.assertTrue(statchg in agenda_data(date_str)["sections"]["2.3.3"]["docs"])
# 3.3 document status changes
relation.target = DocAlias.objects.filter(name__startswith='rfc', document__std_level="inf")[0]
relation.save()
statchg.group = Group.objects.get(acronym="mars")
statchg.save_with_history([DocEvent.objects.create(doc=statchg, rev=statchg.rev, type="changed_group", by=Person.objects.get(user__username="secretary"), desc="Test")])
statchg.set_state(State.objects.get(type="statchg", slug="iesgeval"))
self.assertTrue(statchg in agenda_data(date_str)["sections"]["3.3.1"]["docs"])
telechat_event.returning_item = True
telechat_event.save()
self.assertTrue(statchg in agenda_data(date_str)["sections"]["3.3.2"]["docs"])
telechat_event.returning_item = False
telechat_event.save()
statchg.set_state(State.objects.get(type="statchg", slug="adrev"))
self.assertTrue(statchg in agenda_data(date_str)["sections"]["3.3.3"]["docs"])
# 3.4 IRTF/ISE conflict reviews
telechat_event.doc = conflrev
telechat_event.save()
conflrev.group = Group.objects.get(acronym="mars")
conflrev.save_with_history([DocEvent.objects.create(doc=conflrev, rev=conflrev.rev, type="changed_group", by=Person.objects.get(user__username="secretary"), desc="Test")])
conflrev.set_state(State.objects.get(type="conflrev", slug="iesgeval"))
self.assertTrue(conflrev in agenda_data(date_str)["sections"]["3.4.1"]["docs"])
telechat_event.returning_item = True
telechat_event.save()
self.assertTrue(conflrev in agenda_data(date_str)["sections"]["3.4.2"]["docs"])
telechat_event.returning_item = False
telechat_event.save()
conflrev.set_state(State.objects.get(type="conflrev", slug="needshep"))
self.assertTrue(conflrev in agenda_data(date_str)["sections"]["3.4.3"]["docs"])
# 4 WGs
telechat_event.doc = charter
telechat_event.save()
charter.group = Group.objects.get(acronym="mars")
charter.save_with_history([DocEvent.objects.create(doc=charter, rev=charter.rev, type="changed_group", by=Person.objects.get(user__username="secretary"), desc="Test")])
charter.group.state_id = "bof"
charter.group.save()
charter.set_state(State.objects.get(type="charter", slug="infrev"))
self.assertTrue(charter in agenda_data(date_str)["sections"]["4.1.1"]["docs"])
charter.set_state(State.objects.get(type="charter", slug="iesgrev"))
self.assertTrue(charter in agenda_data(date_str)["sections"]["4.1.2"]["docs"])
charter.group.state_id = "active"
charter.group.save()
charter.set_state(State.objects.get(type="charter", slug="infrev"))
self.assertTrue(charter in agenda_data(date_str)["sections"]["4.2.1"]["docs"])
charter.set_state(State.objects.get(type="charter", slug="iesgrev"))
self.assertTrue(charter in agenda_data(date_str)["sections"]["4.2.2"]["docs"])
#for n, s in agenda_data(date_str)["sections"].iteritems():
# print n, s.get("docs") if "docs" in s else s["title"]
def test_feed(self):
r = self.client.get("/feed/iesg-agenda/")
self.assertEqual(r.status_code, 200)
for d in self.telechat_docs.values():
self.assertTrue(d.name in unicontent(r))
self.assertTrue(d.title in unicontent(r))
def test_agenda_json(self):
r = self.client.get(urlreverse("ietf.iesg.views.agenda_json"))
self.assertEqual(r.status_code, 200)
for k, d in self.telechat_docs.iteritems():
if d.type_id == "charter":
self.assertTrue(d.group.name in unicontent(r), "%s not in response" % k)
self.assertTrue(d.group.acronym in unicontent(r), "%s acronym not in response" % k)
else:
self.assertTrue(d.name in unicontent(r), "%s not in response" % k)
self.assertTrue(d.title in unicontent(r), "%s title not in response" % k)
self.assertTrue(json.loads(r.content))
def test_agenda(self):
r = self.client.get(urlreverse("ietf.iesg.views.agenda"))
self.assertEqual(r.status_code, 200)
for k, d in self.telechat_docs.iteritems():
if d.type_id == "charter":
self.assertTrue(d.group.name in unicontent(r), "%s not in response" % k)
self.assertTrue(d.group.acronym in unicontent(r), "%s acronym not in response" % k)
else:
self.assertTrue(d.name in unicontent(r), "%s not in response" % k)
self.assertTrue(d.title in unicontent(r), "%s title not in response" % k)
def test_agenda_txt(self):
r = self.client.get(urlreverse("ietf.iesg.views.agenda_txt"))
self.assertEqual(r.status_code, 200)
for k, d in self.telechat_docs.iteritems():
if d.type_id == "charter":
self.assertTrue(d.group.name in unicontent(r), "%s not in response" % k)
self.assertTrue(d.group.acronym in unicontent(r), "%s acronym not in response" % k)
else:
self.assertTrue(d.name in unicontent(r), "%s not in response" % k)
self.assertTrue(d.title in unicontent(r), "%s title not in response" % k)
def test_agenda_scribe_template(self):
r = self.client.get(urlreverse("ietf.iesg.views.agenda_scribe_template"))
self.assertEqual(r.status_code, 200)
for k, d in self.telechat_docs.iteritems():
if d.type_id == "charter":
continue # scribe template doesn't contain chartering info
self.assertTrue(d.name in unicontent(r), "%s not in response" % k)
self.assertTrue(d.title in unicontent(r), "%s title not in response" % k)
def test_agenda_moderator_package(self):
url = urlreverse("ietf.iesg.views.agenda_moderator_package")
login_testing_unauthorized(self, "secretary", url)
r = self.client.get(url)
self.assertEqual(r.status_code, 200)
for k, d in self.telechat_docs.iteritems():
if d.type_id == "charter":
self.assertTrue(d.group.name in unicontent(r), "%s not in response" % k)
self.assertTrue(d.group.acronym in unicontent(r), "%s acronym not in response" % k)
else:
if d.type_id == "draft" and d.name == "draft-ietf-mars-test":
self.assertTrue(d.name in unicontent(r), "%s not in response" % k)
self.assertTrue(d.title in unicontent(r), "%s title not in response" % k)
self.assertTrue("Has downref: Yes" in unicontent(r), "%s downref not in response" % k)
self.assertTrue("Add rfc6666" in unicontent(r), "%s downref not in response" % k)
else:
self.assertTrue(d.name in unicontent(r), "%s not in response" % k)
self.assertTrue(d.title in unicontent(r), "%s title not in response" % k)
def test_agenda_package(self):
url = urlreverse("ietf.iesg.views.agenda_package")
login_testing_unauthorized(self, "secretary", url)
r = self.client.get(url)
self.assertEqual(r.status_code, 200)
for k, d in self.telechat_docs.iteritems():
if d.type_id == "charter":
self.assertTrue(d.group.name in unicontent(r), "%s not in response" % k)
self.assertTrue(d.group.acronym in unicontent(r), "%s acronym not in response" % k)
else:
self.assertTrue(d.name in unicontent(r), "%s not in response" % k)
self.assertTrue(d.title in unicontent(r), "%s title not in response" % k)
def test_agenda_documents_txt(self):
url = urlreverse("ietf.iesg.views.agenda_documents_txt")
r = self.client.get(url)
self.assertEqual(r.status_code, 200)
for k, d in self.telechat_docs.iteritems():
self.assertTrue(d.name in unicontent(r), "%s not in response" % k)
def test_agenda_documents(self):
url = urlreverse("ietf.iesg.views.agenda_documents")
r = self.client.get(url)
self.assertEqual(r.status_code, 200)
for k, d in self.telechat_docs.iteritems():
self.assertTrue(d.name in unicontent(r), "%s not in response" % k)
self.assertTrue(d.title in unicontent(r), "%s title not in response" % k)
def test_past_documents(self):
url = urlreverse("ietf.iesg.views.past_documents")
# We haven't put any documents on past telechats, so this should be empty
r = self.client.get(url)
self.assertEqual(r.status_code, 200)
for k, d in self.telechat_docs.iteritems():
self.assertNotIn(d.name, unicontent(r))
self.assertNotIn(d.title, unicontent(r))
# Add the documents to a past telechat
by = Person.objects.get(name="Areað Irector")
date = datetime.date.today() - datetime.timedelta(days=14)
approved = State.objects.get(type='draft-iesg', slug='approved')
iesg_eval = State.objects.get(type='draft-iesg', slug='iesg-eva')
for d in self.telechat_docs.values():
if d.type_id in ['draft', 'charter']:
create_ballot_if_not_open(None, d, by, 'approve')
TelechatDocEvent.objects.create(type="scheduled_for_telechat",
doc=d, rev=d.rev, by=by, telechat_date=date, returning_item=False)
s = d.get_state('draft-iesg')
d.states.clear()
if s and s.slug == 'pub-req':
d.states.add(iesg_eval)
else:
d.states.add(approved)
# Now check that they are present on the past documents page
r = self.client.get(url)
self.assertEqual(r.status_code, 200)
for k, d in self.telechat_docs.iteritems():
if d.states.get(type='draft-iesg').slug in ['approved', 'iesg-eva', ]:
self.assertIn(d.name, unicontent(r))
else:
self.assertNotIn(d.name, unicontent(r))
def test_agenda_telechat_docs(self):
d1 = self.telechat_docs["ietf_draft"]
d2 = self.telechat_docs["ise_draft"]
d1_filename = "%s-%s.txt" % (d1.name, d1.rev)
d2_filename = "%s-%s.txt" % (d2.name, d2.rev)
with open(os.path.join(self.draft_dir, d1_filename), "w") as f:
f.write("test content")
url = urlreverse("ietf.iesg.views.telechat_docs_tarfile", kwargs=dict(date=get_agenda_date().isoformat()))
r = self.client.get(url)
self.assertEqual(r.status_code, 200)
import tarfile, StringIO
tar = tarfile.open(None, fileobj=StringIO.StringIO(r.content))
names = tar.getnames()
self.assertIn(d1_filename, names)
self.assertNotIn(d2_filename, names)
self.assertIn("manifest.txt", names)
f = tar.extractfile(d1_filename)
self.assertEqual(f.read(), "test content")
f = tar.extractfile("manifest.txt")
lines = list(f.readlines())
self.assertTrue("Included" in [l for l in lines if d1_filename in l][0])
self.assertTrue("Not found" in [l for l in lines if d2_filename in l][0])
def test_admin_change(self):
draft = Document.objects.get(name="draft-ietf-mars-test")
today = datetime.date.today()
telechat_date = TelechatDate.objects.get(date=draft.telechat_date())
url = urlreverse('admin:iesg_telechatdate_change', args=(telechat_date.id,))
self.client.login(username="secretary", password="secretary+password")
r = self.client.post(url, {'initial-date': telechat_date.date.strftime('%Y-%m-%d'), 'date':today.strftime('%Y-%m-%d')})
self.assertRedirects(r, urlreverse('admin:iesg_telechatdate_changelist'))
draft = Document.objects.get(name="draft-ietf-mars-test")
self.assertEqual(draft.telechat_date(),today)
class RescheduleOnAgendaTests(TestCase):
def test_reschedule(self):
draft = WgDraftFactory()
# add to schedule
e = TelechatDocEvent(type="scheduled_for_telechat")
e.doc = draft
e.rev = draft.rev
e.by = Person.objects.get(name="Areað Irector")
e.telechat_date = TelechatDate.objects.active()[0].date
e.returning_item = True
e.save()
form_id = draft.name
url = urlreverse('ietf.iesg.views.agenda_documents')
self.client.login(username="secretary", password="secretary+password")
# normal get
r = self.client.get(url)
self.assertEqual(r.status_code, 200)
q = PyQuery(r.content)
self.assertEqual(len(q('form select[name=%s-telechat_date]' % form_id)), 1)
self.assertEqual(len(q('form input[name=%s-clear_returning_item]' % form_id)), 1)
# reschedule
events_before = draft.docevent_set.count()
d = TelechatDate.objects.active()[3].date
r = self.client.post(url, { '%s-telechat_date' % form_id: d.isoformat(),
'%s-clear_returning_item' % form_id: "1" })
self.assertEqual(r.status_code, 302)
# check that it moved below the right header in the DOM on the
# agenda docs page
r = self.client.get(url)
self.assertEqual(r.status_code, 200)
d_header_pos = r.content.find("IESG telechat %s" % d.isoformat())
draft_pos = unicontent(r)[d_header_pos:].find(draft.name)
self.assertTrue(draft_pos>0)
self.assertTrue(draft.latest_event(TelechatDocEvent, "scheduled_for_telechat"))
self.assertEqual(draft.latest_event(TelechatDocEvent, "scheduled_for_telechat").telechat_date, d)
self.assertTrue(not draft.latest_event(TelechatDocEvent, "scheduled_for_telechat").returning_item)
self.assertEqual(draft.docevent_set.count(), events_before + 1)