Skip to content

Commit accf6d4

Browse files
committed
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
1 parent 1a3aa3b commit accf6d4

15 files changed

Lines changed: 166 additions & 84 deletions

ietf/doc/tests.py

Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,144 @@
1+
import os, shutil, datetime
12

3+
import django.test
4+
from django.core.urlresolvers import reverse as urlreverse
5+
from django.conf import settings
26

7+
from pyquery import PyQuery
8+
9+
from ietf.utils.mail import outbox
10+
from ietf.utils.test_utils import login_testing_unauthorized
11+
from ietf.utils.test_data import make_test_data
12+
13+
from ietf.doc.models import *
14+
from ietf.name.models import *
15+
from ietf.group.models import *
16+
from ietf.person.models import *
17+
from ietf.meeting.models import Meeting, MeetingTypeName
18+
from ietf.iesg.models import TelechatDate
19+
20+
# extra tests
321
from ietf.doc.tests_conflict_review import *
22+
23+
24+
class DocTestCase(django.test.TestCase):
25+
fixtures = ['names']
26+
27+
def test_document_draft(self):
28+
draft = make_test_data()
29+
30+
# these tests aren't testing all attributes yet, feel free to
31+
# expand them
32+
33+
34+
# active draft
35+
draft.set_state(State.objects.get(type="draft", slug="active"))
36+
37+
r = self.client.get(urlreverse("doc_view", kwargs=dict(name=draft.name)))
38+
self.assertEqual(r.status_code, 200)
39+
self.assertTrue("Active Internet-Draft" in r.content)
40+
41+
# expired draft
42+
draft.set_state(State.objects.get(type="draft", slug="expired"))
43+
44+
r = self.client.get(urlreverse("doc_view", kwargs=dict(name=draft.name)))
45+
self.assertEqual(r.status_code, 200)
46+
self.assertTrue("Expired Internet-Draft" in r.content)
47+
48+
# replaced draft
49+
draft.set_state(State.objects.get(type="draft", slug="repl"))
50+
51+
replacement = Document.objects.create(
52+
name="draft-ietf-replacement",
53+
time=datetime.datetime.now(),
54+
type_id="draft",
55+
title="Replacement Draft",
56+
stream_id=draft.stream_id, group_id=draft.group_id, abstract=draft.stream, rev=draft.rev,
57+
pages=draft.pages, intended_std_level_id=draft.intended_std_level_id,
58+
shepherd_id=draft.shepherd_id, ad_id=draft.ad_id, expires=draft.expires,
59+
notify=draft.notify, note=draft.note)
60+
DocAlias.objects.create(name=replacement.name, document=replacement)
61+
rel = RelatedDocument.objects.create(source=replacement,
62+
target=draft.docalias_set.get(name__startswith="draft"),
63+
relationship_id="replaces")
64+
65+
r = self.client.get(urlreverse("doc_view", kwargs=dict(name=draft.name)))
66+
self.assertEqual(r.status_code, 200)
67+
self.assertTrue("Replaced Internet-Draft" in r.content)
68+
self.assertTrue(replacement.name in r.content)
69+
rel.delete()
70+
71+
# draft published as RFC
72+
draft.set_state(State.objects.get(type="draft", slug="rfc"))
73+
draft.std_level_id = "bcp"
74+
draft.save()
75+
76+
DocEvent.objects.create(doc=draft, type="published_rfc", by=Person.objects.get(name="(System)"))
77+
78+
rfc_alias = DocAlias.objects.create(name="rfc123456", document=draft)
79+
bcp_alias = DocAlias.objects.create(name="bcp123456", document=draft)
80+
81+
r = self.client.get(urlreverse("doc_view", kwargs=dict(name=draft.name)))
82+
self.assertEqual(r.status_code, 302)
83+
r = self.client.get(urlreverse("doc_view", kwargs=dict(name=bcp_alias.name)))
84+
self.assertEqual(r.status_code, 302)
85+
86+
r = self.client.get(urlreverse("doc_view", kwargs=dict(name=rfc_alias.name)))
87+
self.assertEqual(r.status_code, 200)
88+
self.assertTrue("RFC 123456" in r.content)
89+
self.assertTrue(draft.name in r.content)
90+
91+
# naked RFC
92+
rfc = Document.objects.create(
93+
name="rfc1234567",
94+
type_id="draft",
95+
title="RFC without a Draft",
96+
stream_id="ise",
97+
group=Group.objects.get(type="individ"),
98+
std_level_id="ps")
99+
DocAlias.objects.create(name=rfc.name, document=rfc)
100+
r = self.client.get(urlreverse("doc_view", kwargs=dict(name=rfc.name)))
101+
self.assertEqual(r.status_code, 200)
102+
self.assertTrue("RFC 1234567" in r.content)
103+
104+
# unknown draft
105+
r = self.client.get(urlreverse("doc_view", kwargs=dict(name="draft-xyz123")))
106+
self.assertEqual(r.status_code, 404)
107+
108+
def test_document_charter(self):
109+
make_test_data()
110+
111+
r = self.client.get(urlreverse("doc_view", kwargs=dict(name="charter-ietf-mars")))
112+
self.assertEqual(r.status_code, 200)
113+
114+
def test_document_conflict_review(self):
115+
make_test_data()
116+
117+
r = self.client.get(urlreverse("doc_view", kwargs=dict(name='conflict-review-imaginary-irtf-submission')))
118+
self.assertEqual(r.status_code, 200)
119+
120+
def test_document_ballot(self):
121+
doc = make_test_data()
122+
ballot = doc.active_ballot()
123+
124+
BallotPositionDocEvent.objects.create(
125+
doc=doc,
126+
type="changed_ballot_position",
127+
pos_id="yes",
128+
comment="Looks fine to me",
129+
comment_time=datetime.datetime.now(),
130+
ad=Person.objects.get(user__username="ad"),
131+
by=Person.objects.get(name="(System)"))
132+
133+
r = self.client.get(urlreverse("ietf.doc.views_doc.document_ballot", kwargs=dict(name=doc.name)))
134+
self.assertEqual(r.status_code, 200)
135+
136+
# test popup too while we're at it
137+
r = self.client.get(urlreverse("ietf.doc.views_doc.ballot_for_popup", kwargs=dict(name=doc.name)))
138+
self.assertEqual(r.status_code, 200)
139+
140+
def test_document_json(self):
141+
doc = make_test_data()
142+
143+
r = self.client.get(urlreverse("ietf.doc.views_doc.document_json", kwargs=dict(name=doc.name)))
144+
self.assertEqual(r.status_code, 200)
Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -50,27 +50,27 @@
5050

5151
def render_document_top(request, doc, tab, name):
5252
tabs = []
53-
tabs.append(("Document", "document", urlreverse("ietf.idrfc.views_doc.document_main", kwargs=dict(name=name)), True))
53+
tabs.append(("Document", "document", urlreverse("doc_view", kwargs=dict(name=name)), True))
5454

5555
ballot = doc.latest_event(BallotDocEvent, type="created_ballot")
5656
if doc.type_id in ("draft","conflrev"):
5757
# if doc.in_ietf_process and doc.ietf_process.has_iesg_ballot:
58-
tabs.append(("IESG Evaluation Record", "ballot", urlreverse("ietf.idrfc.views_doc.document_ballot", kwargs=dict(name=name)), ballot))
58+
tabs.append(("IESG Evaluation Record", "ballot", urlreverse("doc_ballot", kwargs=dict(name=name)), ballot))
5959
elif doc.type_id == "charter":
60-
tabs.append(("IESG Review", "ballot", urlreverse("ietf.idrfc.views_doc.document_ballot", kwargs=dict(name=name)), ballot))
60+
tabs.append(("IESG Review", "ballot", urlreverse("doc_ballot", kwargs=dict(name=name)), ballot))
6161

6262
# FIXME: if doc.in_ietf_process and doc.ietf_process.has_iesg_ballot:
6363
if doc.type_id != "conflrev":
64-
tabs.append(("IESG Writeups", "writeup", urlreverse("ietf.idrfc.views_doc.document_writeup", kwargs=dict(name=name)), True))
64+
tabs.append(("IESG Writeups", "writeup", urlreverse("doc_writeup", kwargs=dict(name=name)), True))
6565

66-
tabs.append(("History", "history", urlreverse("ietf.idrfc.views_doc.document_history", kwargs=dict(name=name)), True))
66+
tabs.append(("History", "history", urlreverse("doc_history", kwargs=dict(name=name)), True))
6767

6868
if name.startswith("rfc"):
6969
name = "RFC %s" % name[3:]
7070
else:
7171
name += "-" + doc.rev
7272

73-
return render_to_string("idrfc/document_top.html",
73+
return render_to_string("doc/document_top.html",
7474
dict(doc=doc,
7575
tabs=tabs,
7676
selected=tab,
@@ -298,7 +298,7 @@ def document_main(request, name, rev=None):
298298
if doc.get_state_slug() != "expired" and doc.stream_id in ("ietf",) and can_edit and not iesg_state:
299299
actions.append(("Begin IESG Processing", urlreverse('doc_edit_info', kwargs=dict(name=doc.name)) + "?new=1"))
300300

301-
return render_to_response("idrfc/document_draft.html",
301+
return render_to_response("doc/document_draft.html",
302302
dict(doc=doc,
303303
group=group,
304304
top=top,
@@ -368,7 +368,7 @@ def document_main(request, name, rev=None):
368368
if chartering and not snapshot:
369369
milestones = doc.group.groupmilestone_set.filter(state="charter")
370370

371-
return render_to_response("idrfc/document_charter.html",
371+
return render_to_response("doc/document_charter.html",
372372
dict(doc=doc,
373373
top=top,
374374
chartering=chartering,
@@ -397,7 +397,7 @@ def document_main(request, name, rev=None):
397397
if doc.get_state_slug() in ("iesgeval"):
398398
ballot_summary = needed_ballot_positions(doc, doc.active_ballot().active_ad_positions().values())
399399

400-
return render_to_response("idrfc/document_conflict_review.html",
400+
return render_to_response("doc/document_conflict_review.html",
401401
dict(doc=doc,
402402
top=top,
403403
content=content,
@@ -450,7 +450,7 @@ def document_history(request, name):
450450
augment_events_with_revision(doc, events)
451451
add_links_in_new_revision_events(doc, events, diff_revisions)
452452

453-
return render_to_response("idrfc/document_history.html",
453+
return render_to_response("doc/document_history.html",
454454
dict(doc=doc,
455455
top=top,
456456
diff_revisions=diff_revisions,
@@ -510,7 +510,7 @@ def text_from_writeup(event_type):
510510
if not sections:
511511
raise Http404()
512512

513-
return render_to_response("idrfc/document_writeup.html",
513+
return render_to_response("doc/document_writeup.html",
514514
dict(doc=doc,
515515
top=top,
516516
sections=sections,
@@ -562,7 +562,7 @@ def document_ballot_content(request, doc, ballot_id, editable=True):
562562
if not ballot_open:
563563
editable = False
564564

565-
return render_to_string("idrfc/document_ballot_content.html",
565+
return render_to_string("doc/document_ballot_content.html",
566566
dict(doc=doc,
567567
ballot=ballot,
568568
position_groups=position_groups,
@@ -581,7 +581,7 @@ def document_ballot(request, name, ballot_id=None):
581581

582582
c = document_ballot_content(request, doc, ballot_id, editable=True)
583583

584-
return render_to_response("idrfc/document_ballot.html",
584+
return render_to_response("doc/document_ballot.html",
585585
dict(doc=doc,
586586
top=top,
587587
ballot_content=c,

ietf/idrfc/idrfc_wrapper.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -395,7 +395,7 @@ def filename(self):
395395

396396
@models.permalink
397397
def get_absolute_url(self):
398-
return ('ietf.idrfc.views_doc.document_main', ['rfc%s' % (str(self.rfc_number))])
398+
return ('ietf.doc.views_doc.document_main', ['rfc%s' % (str(self.rfc_number))])
399399
def displayname_with_link(self):
400400
return '<a href="%s">RFC %d</a>' % (self.get_absolute_url(), self.rfc_number)
401401

ietf/idrfc/testurlREDESIGN.list

Lines changed: 0 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -3,71 +3,12 @@
33
200,heavy /doc/all/
44
200,heavy /doc/active/
55

6-
# draft that's now RFC
7-
200 /doc/draft-ietf-avt-rtp-atrac-family/
8-
200 /doc/draft-ietf-avt-rtp-atrac-family/doc.json
9-
200 /doc/draft-ietf-avt-rtp-atrac-family/ballot.json
10-
200 /doc/draft-ietf-avt-rtp-atrac-family/ballotpopup/
11-
12-
# replaced draft, never went to IESG
13-
200 /doc/draft-eronen-mobike-mopo/
14-
404 /doc/draft-eronen-mobike-mopo/ballot.json
15-
404 /doc/draft-eronen-mobike-mopo/ballotpopup/
16-
17-
# expired draft
18-
200 /doc/draft-eronen-eap-sim-aka-80211/
19-
20-
# Normal RFC
21-
200 /doc/rfc4739/
22-
200 /doc/rfc4739/doc.json
23-
200 /doc/rfc4739/ballot.json # has ballot from I-D
24-
200 /doc/rfc4739/ballotpopup/
25-
26-
# RFC that's evaluated in IESG
27-
200 /doc/rfc3852/
28-
200 /doc/rfc3852/doc.json
29-
200 /doc/rfc3852/ballot.json
30-
200 /doc/rfc3852/ballotpopup/
31-
32-
# old RFC
33-
200 /doc/rfc822/
34-
200 /doc/rfc822/doc.json
35-
36-
# ballot sets
37-
200 /doc/rfc3550/ballot.json
38-
200 /doc/rfc3550/ballotpopup/
39-
200 /doc/rfc3551/ballot.json
40-
200 /doc/rfc3551/ballotpopup/
41-
200 /doc/draft-irtf-dtnrg-ltp/ballot.json
42-
200 /doc/draft-irtf-dtnrg-ltp/ballotpopup/
43-
44-
# file formats
45-
200 /doc/rfc9/ # PDF only
46-
200 /doc/rfc2490/ # TXT+PDF+PS
47-
200 /doc/rfc500/ # not online
48-
49-
404 /doc/draft-no-such-draft/
50-
404 /doc/rfc4637/
51-
52-
200 /doc/rfc2444/doc.json # foreignkey problem with Django 1.x
53-
546
# current AD -- needs to be updated at some point
557
200 /doc/ad/robert.sparks/
568
# former AD
579
200 /doc/ad/sam.hartman/
5810
404 /doc/ad/no.body/
5911

60-
# ballot exists, but it's not issued
61-
404 /doc/draft-ietf-aaa-diameter-api/ballot.json
62-
404 /doc/draft-ietf-aaa-diameter-api/ballotpopup/
63-
# ballot does not exist
64-
404 /doc/draft-zeilenga-cldap/ballot.json
65-
404 /doc/draft-zeilenga-cldap/ballotpopup/
66-
# comment with created_by=999
67-
200 /doc/draft-ietf-l3vpn-2547bis-mcast-bgp/
68-
# comment with created_by=0 (and no idinternal entry)
69-
200 /doc/draft-ietf-proto-wgdocument-states/
70-
7112
200 /doc/search/
7213
200 /doc/search/?rfcs=on&name=snmp
7314
200 /doc/search/?rfcs=on&name=nfs&by=ad&ad=112773

ietf/idrfc/urls.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,9 @@
3131
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3232

3333
from django.conf.urls.defaults import patterns, url, include
34-
from ietf.idrfc import views_doc, views_search, views_edit, views_ballot, views
34+
from ietf.idrfc import views_search, views_edit, views_ballot, views
3535
from ietf.doc.models import State
36+
from ietf.doc import views_doc
3637

3738
urlpatterns = patterns('',
3839
(r'^/?$', views_search.search_main),
File renamed without changes.

ietf/templates/idrfc/document_charter.html renamed to ietf/templates/doc/document_charter.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
{% if snapshot %}Snapshot of{% endif %}
2626
{% if doc.get_state_slug != "approved" %}Proposed{% endif %}
2727
Charter for "{{ group.name }}"
28-
(<a href="{% url wginfo.views.wg_charter acronym=group.acronym %}">{{ group.acronym }}</a>) {{ group.type.name }}
28+
(<a href="{% url ietf.wginfo.views.wg_charter acronym=group.acronym %}">{{ group.acronym }}</a>) {{ group.type.name }}
2929
</div>
3030

3131
<table id="metatable" width="100%">
File renamed without changes.

0 commit comments

Comments
 (0)