Move idrfc/views_doc.py to doc/ with associated templates, replace the

somewhat fragile simple URL tests for views_doc.py with ordinary unit
tests. The new tests are still fairly basic but at least test more
than the URL tests did.
 - Legacy-Id: 5295
This commit is contained in:
Ole Laursen 2013-01-18 13:17:00 +00:00
parent 1a3aa3b443
commit accf6d4470
15 changed files with 166 additions and 84 deletions

View file

@ -1,3 +1,144 @@
import os, shutil, datetime
import django.test
from django.core.urlresolvers import reverse as urlreverse
from django.conf import settings
from pyquery import PyQuery
from ietf.utils.mail import outbox
from ietf.utils.test_utils import login_testing_unauthorized
from ietf.utils.test_data import make_test_data
from ietf.doc.models import *
from ietf.name.models import *
from ietf.group.models import *
from ietf.person.models import *
from ietf.meeting.models import Meeting, MeetingTypeName
from ietf.iesg.models import TelechatDate
# extra tests
from ietf.doc.tests_conflict_review import *
class DocTestCase(django.test.TestCase):
fixtures = ['names']
def test_document_draft(self):
draft = make_test_data()
# these tests aren't testing all attributes yet, feel free to
# expand them
# active draft
draft.set_state(State.objects.get(type="draft", slug="active"))
r = self.client.get(urlreverse("doc_view", kwargs=dict(name=draft.name)))
self.assertEqual(r.status_code, 200)
self.assertTrue("Active Internet-Draft" in r.content)
# expired draft
draft.set_state(State.objects.get(type="draft", slug="expired"))
r = self.client.get(urlreverse("doc_view", kwargs=dict(name=draft.name)))
self.assertEqual(r.status_code, 200)
self.assertTrue("Expired Internet-Draft" in r.content)
# replaced draft
draft.set_state(State.objects.get(type="draft", slug="repl"))
replacement = Document.objects.create(
name="draft-ietf-replacement",
time=datetime.datetime.now(),
type_id="draft",
title="Replacement Draft",
stream_id=draft.stream_id, group_id=draft.group_id, abstract=draft.stream, rev=draft.rev,
pages=draft.pages, intended_std_level_id=draft.intended_std_level_id,
shepherd_id=draft.shepherd_id, ad_id=draft.ad_id, expires=draft.expires,
notify=draft.notify, note=draft.note)
DocAlias.objects.create(name=replacement.name, document=replacement)
rel = RelatedDocument.objects.create(source=replacement,
target=draft.docalias_set.get(name__startswith="draft"),
relationship_id="replaces")
r = self.client.get(urlreverse("doc_view", kwargs=dict(name=draft.name)))
self.assertEqual(r.status_code, 200)
self.assertTrue("Replaced Internet-Draft" in r.content)
self.assertTrue(replacement.name in r.content)
rel.delete()
# draft published as RFC
draft.set_state(State.objects.get(type="draft", slug="rfc"))
draft.std_level_id = "bcp"
draft.save()
DocEvent.objects.create(doc=draft, type="published_rfc", by=Person.objects.get(name="(System)"))
rfc_alias = DocAlias.objects.create(name="rfc123456", document=draft)
bcp_alias = DocAlias.objects.create(name="bcp123456", document=draft)
r = self.client.get(urlreverse("doc_view", kwargs=dict(name=draft.name)))
self.assertEqual(r.status_code, 302)
r = self.client.get(urlreverse("doc_view", kwargs=dict(name=bcp_alias.name)))
self.assertEqual(r.status_code, 302)
r = self.client.get(urlreverse("doc_view", kwargs=dict(name=rfc_alias.name)))
self.assertEqual(r.status_code, 200)
self.assertTrue("RFC 123456" in r.content)
self.assertTrue(draft.name in r.content)
# naked RFC
rfc = Document.objects.create(
name="rfc1234567",
type_id="draft",
title="RFC without a Draft",
stream_id="ise",
group=Group.objects.get(type="individ"),
std_level_id="ps")
DocAlias.objects.create(name=rfc.name, document=rfc)
r = self.client.get(urlreverse("doc_view", kwargs=dict(name=rfc.name)))
self.assertEqual(r.status_code, 200)
self.assertTrue("RFC 1234567" in r.content)
# unknown draft
r = self.client.get(urlreverse("doc_view", kwargs=dict(name="draft-xyz123")))
self.assertEqual(r.status_code, 404)
def test_document_charter(self):
make_test_data()
r = self.client.get(urlreverse("doc_view", kwargs=dict(name="charter-ietf-mars")))
self.assertEqual(r.status_code, 200)
def test_document_conflict_review(self):
make_test_data()
r = self.client.get(urlreverse("doc_view", kwargs=dict(name='conflict-review-imaginary-irtf-submission')))
self.assertEqual(r.status_code, 200)
def test_document_ballot(self):
doc = make_test_data()
ballot = doc.active_ballot()
BallotPositionDocEvent.objects.create(
doc=doc,
type="changed_ballot_position",
pos_id="yes",
comment="Looks fine to me",
comment_time=datetime.datetime.now(),
ad=Person.objects.get(user__username="ad"),
by=Person.objects.get(name="(System)"))
r = self.client.get(urlreverse("ietf.doc.views_doc.document_ballot", kwargs=dict(name=doc.name)))
self.assertEqual(r.status_code, 200)
# test popup too while we're at it
r = self.client.get(urlreverse("ietf.doc.views_doc.ballot_for_popup", kwargs=dict(name=doc.name)))
self.assertEqual(r.status_code, 200)
def test_document_json(self):
doc = make_test_data()
r = self.client.get(urlreverse("ietf.doc.views_doc.document_json", kwargs=dict(name=doc.name)))
self.assertEqual(r.status_code, 200)

View file

@ -50,27 +50,27 @@ from ietf.ietfauth.utils import *
def render_document_top(request, doc, tab, name):
tabs = []
tabs.append(("Document", "document", urlreverse("ietf.idrfc.views_doc.document_main", kwargs=dict(name=name)), True))
tabs.append(("Document", "document", urlreverse("doc_view", kwargs=dict(name=name)), True))
ballot = doc.latest_event(BallotDocEvent, type="created_ballot")
if doc.type_id in ("draft","conflrev"):
# if doc.in_ietf_process and doc.ietf_process.has_iesg_ballot:
tabs.append(("IESG Evaluation Record", "ballot", urlreverse("ietf.idrfc.views_doc.document_ballot", kwargs=dict(name=name)), ballot))
tabs.append(("IESG Evaluation Record", "ballot", urlreverse("doc_ballot", kwargs=dict(name=name)), ballot))
elif doc.type_id == "charter":
tabs.append(("IESG Review", "ballot", urlreverse("ietf.idrfc.views_doc.document_ballot", kwargs=dict(name=name)), ballot))
tabs.append(("IESG Review", "ballot", urlreverse("doc_ballot", kwargs=dict(name=name)), ballot))
# FIXME: if doc.in_ietf_process and doc.ietf_process.has_iesg_ballot:
if doc.type_id != "conflrev":
tabs.append(("IESG Writeups", "writeup", urlreverse("ietf.idrfc.views_doc.document_writeup", kwargs=dict(name=name)), True))
tabs.append(("IESG Writeups", "writeup", urlreverse("doc_writeup", kwargs=dict(name=name)), True))
tabs.append(("History", "history", urlreverse("ietf.idrfc.views_doc.document_history", kwargs=dict(name=name)), True))
tabs.append(("History", "history", urlreverse("doc_history", kwargs=dict(name=name)), True))
if name.startswith("rfc"):
name = "RFC %s" % name[3:]
else:
name += "-" + doc.rev
return render_to_string("idrfc/document_top.html",
return render_to_string("doc/document_top.html",
dict(doc=doc,
tabs=tabs,
selected=tab,
@ -298,7 +298,7 @@ def document_main(request, name, rev=None):
if doc.get_state_slug() != "expired" and doc.stream_id in ("ietf",) and can_edit and not iesg_state:
actions.append(("Begin IESG Processing", urlreverse('doc_edit_info', kwargs=dict(name=doc.name)) + "?new=1"))
return render_to_response("idrfc/document_draft.html",
return render_to_response("doc/document_draft.html",
dict(doc=doc,
group=group,
top=top,
@ -368,7 +368,7 @@ def document_main(request, name, rev=None):
if chartering and not snapshot:
milestones = doc.group.groupmilestone_set.filter(state="charter")
return render_to_response("idrfc/document_charter.html",
return render_to_response("doc/document_charter.html",
dict(doc=doc,
top=top,
chartering=chartering,
@ -397,7 +397,7 @@ def document_main(request, name, rev=None):
if doc.get_state_slug() in ("iesgeval"):
ballot_summary = needed_ballot_positions(doc, doc.active_ballot().active_ad_positions().values())
return render_to_response("idrfc/document_conflict_review.html",
return render_to_response("doc/document_conflict_review.html",
dict(doc=doc,
top=top,
content=content,
@ -450,7 +450,7 @@ def document_history(request, name):
augment_events_with_revision(doc, events)
add_links_in_new_revision_events(doc, events, diff_revisions)
return render_to_response("idrfc/document_history.html",
return render_to_response("doc/document_history.html",
dict(doc=doc,
top=top,
diff_revisions=diff_revisions,
@ -510,7 +510,7 @@ def document_writeup(request, name):
if not sections:
raise Http404()
return render_to_response("idrfc/document_writeup.html",
return render_to_response("doc/document_writeup.html",
dict(doc=doc,
top=top,
sections=sections,
@ -562,7 +562,7 @@ def document_ballot_content(request, doc, ballot_id, editable=True):
if not ballot_open:
editable = False
return render_to_string("idrfc/document_ballot_content.html",
return render_to_string("doc/document_ballot_content.html",
dict(doc=doc,
ballot=ballot,
position_groups=position_groups,
@ -581,7 +581,7 @@ def document_ballot(request, name, ballot_id=None):
c = document_ballot_content(request, doc, ballot_id, editable=True)
return render_to_response("idrfc/document_ballot.html",
return render_to_response("doc/document_ballot.html",
dict(doc=doc,
top=top,
ballot_content=c,

View file

@ -395,7 +395,7 @@ class RfcWrapper:
@models.permalink
def get_absolute_url(self):
return ('ietf.idrfc.views_doc.document_main', ['rfc%s' % (str(self.rfc_number))])
return ('ietf.doc.views_doc.document_main', ['rfc%s' % (str(self.rfc_number))])
def displayname_with_link(self):
return '<a href="%s">RFC %d</a>' % (self.get_absolute_url(), self.rfc_number)

View file

@ -3,71 +3,12 @@
200,heavy /doc/all/
200,heavy /doc/active/
# draft that's now RFC
200 /doc/draft-ietf-avt-rtp-atrac-family/
200 /doc/draft-ietf-avt-rtp-atrac-family/doc.json
200 /doc/draft-ietf-avt-rtp-atrac-family/ballot.json
200 /doc/draft-ietf-avt-rtp-atrac-family/ballotpopup/
# replaced draft, never went to IESG
200 /doc/draft-eronen-mobike-mopo/
404 /doc/draft-eronen-mobike-mopo/ballot.json
404 /doc/draft-eronen-mobike-mopo/ballotpopup/
# expired draft
200 /doc/draft-eronen-eap-sim-aka-80211/
# Normal RFC
200 /doc/rfc4739/
200 /doc/rfc4739/doc.json
200 /doc/rfc4739/ballot.json # has ballot from I-D
200 /doc/rfc4739/ballotpopup/
# RFC that's evaluated in IESG
200 /doc/rfc3852/
200 /doc/rfc3852/doc.json
200 /doc/rfc3852/ballot.json
200 /doc/rfc3852/ballotpopup/
# old RFC
200 /doc/rfc822/
200 /doc/rfc822/doc.json
# ballot sets
200 /doc/rfc3550/ballot.json
200 /doc/rfc3550/ballotpopup/
200 /doc/rfc3551/ballot.json
200 /doc/rfc3551/ballotpopup/
200 /doc/draft-irtf-dtnrg-ltp/ballot.json
200 /doc/draft-irtf-dtnrg-ltp/ballotpopup/
# file formats
200 /doc/rfc9/ # PDF only
200 /doc/rfc2490/ # TXT+PDF+PS
200 /doc/rfc500/ # not online
404 /doc/draft-no-such-draft/
404 /doc/rfc4637/
200 /doc/rfc2444/doc.json # foreignkey problem with Django 1.x
# current AD -- needs to be updated at some point
200 /doc/ad/robert.sparks/
# former AD
200 /doc/ad/sam.hartman/
404 /doc/ad/no.body/
# ballot exists, but it's not issued
404 /doc/draft-ietf-aaa-diameter-api/ballot.json
404 /doc/draft-ietf-aaa-diameter-api/ballotpopup/
# ballot does not exist
404 /doc/draft-zeilenga-cldap/ballot.json
404 /doc/draft-zeilenga-cldap/ballotpopup/
# comment with created_by=999
200 /doc/draft-ietf-l3vpn-2547bis-mcast-bgp/
# comment with created_by=0 (and no idinternal entry)
200 /doc/draft-ietf-proto-wgdocument-states/
200 /doc/search/
200 /doc/search/?rfcs=on&name=snmp
200 /doc/search/?rfcs=on&name=nfs&by=ad&ad=112773

View file

@ -31,8 +31,9 @@
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
from django.conf.urls.defaults import patterns, url, include
from ietf.idrfc import views_doc, views_search, views_edit, views_ballot, views
from ietf.idrfc import views_search, views_edit, views_ballot, views
from ietf.doc.models import State
from ietf.doc import views_doc
urlpatterns = patterns('',
(r'^/?$', views_search.search_main),

View file

@ -25,7 +25,7 @@
{% if snapshot %}Snapshot of{% endif %}
{% if doc.get_state_slug != "approved" %}Proposed{% endif %}
Charter for "{{ group.name }}"
(<a href="{% url wginfo.views.wg_charter acronym=group.acronym %}">{{ group.acronym }}</a>) {{ group.type.name }}
(<a href="{% url ietf.wginfo.views.wg_charter acronym=group.acronym %}">{{ group.acronym }}</a>) {{ group.type.name }}
</div>
<table id="metatable" width="100%">

View file

@ -77,7 +77,7 @@ is occasionally incorrect.</span>
{% else %}
none
{% if user|has_role:"Area Director,Secretariat" %}
- <a href="{% url wginfo.edit.submit_initial_charter acronym=wg.acronym %}">Submit Charter</a>
- <a href="{% url ietf.wginfo.edit.submit_initial_charter acronym=wg.acronym %}">Submit Charter</a>
{% endif %}
{% endif %}
</td>

View file

@ -391,18 +391,17 @@ def make_test_data():
)
# an independent submission before review
doc = Document.objects.create(name='draft-imaginary-independent-submission',type_id='draft')
DocAlias.objects.create( name='draft-imaginary-independent-submission',document=doc)
doc = Document.objects.create(name='draft-imaginary-independent-submission', type_id='draft')
DocAlias.objects.create(name=doc.name, document=doc)
# an irtf submission mid review
doc = Document.objects.create( name='draft-imaginary-irtf-submission',type_id='draft')
docalias = DocAlias.objects.create(name='draft-imaginary-irtf-submission',document=doc)
doc = Document.objects.create(name='draft-imaginary-irtf-submission', type_id='draft')
docalias = DocAlias.objects.create(name=doc.name, document=doc)
doc.stream = StreamName.objects.get(slug='irtf')
doc.save()
crdoc = Document.objects.create(name='conflict-review-imaginary-irtf-submission',type_id='conflrev',rev='00',notify="fsm@ietf.org")
DocAlias.objects.create( name='conflict-review-imaginary-irtf-submission',document=crdoc)
crdoc.set_state(State.objects.get(name='Needs Shepherd',type__slug='conflrev'))
crdoc.save()
crdoc = Document.objects.create(name='conflict-review-imaginary-irtf-submission', type_id='conflrev', rev='00', notify="fsm@ietf.org")
DocAlias.objects.create(name=crdoc.name, document=crdoc)
crdoc.set_state(State.objects.get(name='Needs Shepherd', type__slug='conflrev'))
crdoc.relateddocument_set.create(target=docalias,relationship_id='conflrev')
return draft