datatracker/ietf/doc/tests_material.py

240 lines
9.9 KiB
Python

# Copyright The IETF Trust 2011, All Rights Reserved
import os
import shutil
import datetime
from StringIO import StringIO
from pyquery import PyQuery
from django.conf import settings
from django.core.urlresolvers import reverse as urlreverse
from ietf.doc.models import Document, State, DocAlias, NewRevisionDocEvent
from ietf.doc.views_material import material_presentations, edit_material_presentations
from ietf.group.models import Group
from ietf.meeting.models import Meeting, Session, SessionPresentation
from ietf.name.models import SessionStatusName
from ietf.person.models import Person
from ietf.utils.test_utils import TestCase, login_testing_unauthorized, unicontent
from ietf.utils.test_data import make_test_data
from ietf.meeting.test_data import make_meeting_test_data
class GroupMaterialTests(TestCase):
def setUp(self):
self.materials_dir = os.path.abspath("tmp-document-dir")
if not os.path.exists(self.materials_dir):
os.makedirs(os.path.join(self.materials_dir, "slides"))
settings.DOCUMENT_PATH_PATTERN = self.materials_dir + "/{doc.type_id}/"
self.agenda_dir = os.path.abspath("tmp-agenda-dir")
if not os.path.exists(self.agenda_dir):
os.makedirs(os.path.join(self.agenda_dir, "42", "slides"))
settings.AGENDA_PATH = self.agenda_dir
def tearDown(self):
shutil.rmtree(self.materials_dir)
shutil.rmtree(self.agenda_dir)
def create_slides(self):
make_test_data()
group = Group.objects.create(type_id="team", acronym="testteam", name="Test Team", state_id="active")
doc = Document.objects.create(name="slides-testteam-test-file", rev="01", type_id="slides", group=group)
doc.set_state(State.objects.get(type="slides", slug="active"))
doc.set_state(State.objects.get(type="reuse_policy", slug="multiple"))
DocAlias.objects.create(name=doc.name, document=doc)
NewRevisionDocEvent.objects.create(doc=doc,by=Person.objects.get(name="(System)"),rev='00',type='new_revision',desc='New revision available')
NewRevisionDocEvent.objects.create(doc=doc,by=Person.objects.get(name="(System)"),rev='01',type='new_revision',desc='New revision available')
return doc
def test_choose_material_type(self):
group = Group.objects.create(type_id="team", acronym="testteam", name="Test Team", state_id="active")
url = urlreverse('ietf.doc.views_material.choose_material_type', kwargs=dict(acronym=group.acronym))
login_testing_unauthorized(self, "secretary", url)
# normal get
r = self.client.get(url)
self.assertEqual(r.status_code, 200)
self.assertTrue("Slides" in unicontent(r))
url = urlreverse('ietf.doc.views_material.choose_material_type', kwargs=dict(acronym='mars'))
r = self.client.get(url)
self.assertEqual(r.status_code, 404)
def test_upload_slides(self):
group = Group.objects.create(type_id="team", acronym="testteam", name="Test Team", state_id="active")
url = urlreverse('group_new_material', kwargs=dict(acronym=group.acronym, doc_type="slides"))
login_testing_unauthorized(self, "secretary", url)
# normal get
r = self.client.get(url)
self.assertEqual(r.status_code, 200)
content = "%PDF-1.5\n..."
test_file = StringIO(content)
test_file.name = "unnamed.pdf"
# faulty post
r = self.client.post(url, dict(title="", name="", state="", material=test_file))
self.assertEqual(r.status_code, 200)
q = PyQuery(r.content)
self.assertTrue(len(q('.has-error')) > 0)
test_file.seek(0)
# post
r = self.client.post(url, dict(title="Test File - with fancy title",
abstract = "Test Abstract",
name="slides-%s-test-file" % group.acronym,
state=State.objects.get(type="slides", slug="active").pk,
material=test_file))
self.assertEqual(r.status_code, 302)
doc = Document.objects.get(name="slides-%s-test-file" % group.acronym)
self.assertEqual(doc.rev, "00")
self.assertEqual(doc.title, "Test File - with fancy title")
self.assertEqual(doc.get_state_slug(), "active")
with open(os.path.join(self.materials_dir, "slides", doc.name + "-" + doc.rev + ".pdf")) as f:
self.assertEqual(f.read(), content)
# check that posting same name is prevented
test_file.seek(0)
r = self.client.post(url, dict(title="Test File",
name=doc.name,
state=State.objects.get(type="slides", slug="active").pk,
material=test_file))
self.assertEqual(r.status_code, 200)
self.assertTrue(len(q('.has-error')) > 0)
def test_change_state(self):
doc = self.create_slides()
url = urlreverse('material_edit', kwargs=dict(name=doc.name, action="state"))
login_testing_unauthorized(self, "secretary", url)
# post
r = self.client.post(url, dict(state=State.objects.get(type="slides", slug="deleted").pk))
self.assertEqual(r.status_code, 302)
doc = Document.objects.get(name=doc.name)
self.assertEqual(doc.get_state_slug(), "deleted")
def test_edit_title(self):
doc = self.create_slides()
url = urlreverse('material_edit', kwargs=dict(name=doc.name, action="title"))
login_testing_unauthorized(self, "secretary", url)
# post
r = self.client.post(url, dict(title="New title"))
self.assertEqual(r.status_code, 302)
doc = Document.objects.get(name=doc.name)
self.assertEqual(doc.title, "New title")
def test_revise(self):
doc = self.create_slides()
session = Session.objects.create(
name = "session-42-mars-1",
meeting = Meeting.objects.get(number='42'),
group = Group.objects.get(acronym='mars'),
status = SessionStatusName.objects.create(slug='scheduled', name='Scheduled'),
modified = datetime.datetime.now(),
requested_by = Person.objects.get(user__username="marschairman"),
type_id="session",
)
SessionPresentation.objects.create(session=session, document=doc, rev=doc.rev)
url = urlreverse('material_edit', kwargs=dict(name=doc.name, action="revise"))
login_testing_unauthorized(self, "secretary", url)
content = "some text"
test_file = StringIO(content)
test_file.name = "unnamed.txt"
# post
r = self.client.post(url, dict(title="New title",
abstract="New abstract",
state=State.objects.get(type="slides", slug="active").pk,
material=test_file))
self.assertEqual(r.status_code, 302)
doc = Document.objects.get(name=doc.name)
self.assertEqual(doc.rev, "02")
self.assertEqual(doc.title, "New title")
self.assertEqual(doc.get_state_slug(), "active")
with open(os.path.join(doc.get_file_path(), doc.name + "-" + doc.rev + ".txt")) as f:
self.assertEqual(f.read(), content)
def test_material_presentations(self):
doc = self.create_slides()
meeting = make_meeting_test_data()
meeting.session_set.filter(group__acronym='mars').update(group=doc.group)
url = urlreverse(material_presentations,kwargs=dict(name=doc.name))
login_testing_unauthorized(self, "secretary", url)
r = self.client.get(url)
self.assertEqual(r.status_code, 200)
url = urlreverse(material_presentations,kwargs=dict(name=doc.name,seq=1))
r = self.client.get(url)
self.assertEqual(r.status_code, 200)
when = meeting.agenda.assignments.filter(session__group__acronym='testteam').first().timeslot.time
mdw = when.date().isoformat()
dow = ['mon','tue','wed','thu','fri','sat','sun'][when.weekday()]
for kw in [ dict(),
dict(seq=1),
dict(week_day=dow),
dict(week_day=dow,seq=1),
dict(date=mdw),
dict(date=mdw,seq=1),
dict(date=mdw+'-0930'),
dict(date=mdw+'-0930',seq=1),
]:
kw['name'] = doc.name
kw['acronym'] = 'testteam'
url = urlreverse(material_presentations,kwargs=kw)
r = self.client.get(url)
self.assertEqual(r.status_code, 200)
def test_edit_material_presentations(self):
doc = self.create_slides()
meeting = make_meeting_test_data()
meeting.session_set.filter(group__acronym='mars').update(group=doc.group)
session = meeting.agenda.assignments.filter(session__group__acronym='testteam').first().session
url = urlreverse(edit_material_presentations,kwargs=dict(name=doc.name,acronym='testteam',seq=1))
login_testing_unauthorized(self, "secretary", url)
r = self.client.get(url)
self.assertEqual(r.status_code, 200)
self.assertEqual(doc.sessionpresentation_set.count(),0)
# add the materials to a session
r = self.client.post(url, dict(action="Save",version="00"))
self.assertEqual(r.status_code, 302)
self.assertEqual(doc.sessionpresentation_set.first().session , session)
# change the version
r = self.client.post(url, dict(action="Save",version="01"))
self.assertEqual(r.status_code, 302)
self.assertEqual(doc.sessionpresentation_set.first().session , session)
# take the slides back off that meeting
r = self.client.post(url, dict(action="Save",version="notpresented"))
self.assertEqual(r.status_code, 302)
self.assertEqual(doc.sessionpresentation_set.count(),0)