Skip to content

Commit 3508f59

Browse files
committed
Merged in [15596] from rjsparks@nostrum.com:
improved coverage for several tests. - Legacy-Id: 15600 Note: SVN reference [15596] has been migrated to Git commit 6f18ae8
2 parents ef3cbf4 + 87bda66 commit 3508f59

12 files changed

Lines changed: 195 additions & 158 deletions

File tree

ietf/doc/factories.py

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
from django.conf import settings
66

7-
from ietf.doc.models import Document, DocEvent, NewRevisionDocEvent, DocAlias, State, DocumentAuthor
7+
from ietf.doc.models import Document, DocEvent, NewRevisionDocEvent, DocAlias, State, DocumentAuthor, StateDocEvent
88
from ietf.group.models import Group
99

1010
def draft_name_generator(type_id,group,n):
@@ -210,3 +210,20 @@ class Meta:
210210
def desc(self):
211211
return 'New version available %s-%s'%(self.doc.name,self.rev)
212212

213+
class StateDocEventFactory(DocEventFactory):
214+
class Meta:
215+
model = StateDocEvent
216+
217+
type = 'changed_state'
218+
state_type_id = 'draft-iesg'
219+
220+
@factory.post_generation
221+
def state(obj, create, extracted, **kwargs):
222+
if not create:
223+
return
224+
if extracted:
225+
(state_type_id, state_slug) = extracted
226+
obj.state = State.objects.get(type_id=state_type_id,slug=state_slug)
227+
else:
228+
obj.state = State.objects.get(type_id='draft-iesg',slug='ad-eval')
229+
obj.save()

ietf/doc/tests.py

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222

2323
from ietf.doc.models import ( Document, DocAlias, DocRelationshipName, RelatedDocument, State,
2424
DocEvent, BallotPositionDocEvent, LastCallDocEvent, WriteupDocEvent, NewRevisionDocEvent )
25-
from ietf.doc.factories import DocumentFactory, DocEventFactory, CharterFactory, ConflictReviewFactory, WgDraftFactory, IndividualDraftFactory, WgRfcFactory, IndividualRfcFactory
25+
from ietf.doc.factories import DocumentFactory, DocEventFactory, CharterFactory, ConflictReviewFactory, WgDraftFactory, IndividualDraftFactory, WgRfcFactory, IndividualRfcFactory, StateDocEventFactory
2626
from ietf.doc.utils import create_ballot_if_not_open
2727
from ietf.group.models import Group
2828
from ietf.group.factories import GroupFactory
@@ -289,7 +289,25 @@ def test_ajax_search_docs(self):
289289
self.assertEqual(r.status_code, 200)
290290
data = json.loads(r.content)
291291
self.assertEqual(data[0]["id"], doc_alias.pk)
292-
292+
293+
def test_recent_drafts(self):
294+
# Three drafts to show with various warnings
295+
drafts = WgDraftFactory.create_batch(3,states=[('draft','active'),('draft-iesg','ad-eval')])
296+
for index, draft in enumerate(drafts):
297+
StateDocEventFactory(doc=draft, state=('draft-iesg','ad-eval'), time=datetime.datetime.now()-datetime.timedelta(days=[1,15,29][index]))
298+
299+
# And one draft that should not show (with the default of 7 days to view)
300+
old = WgDraftFactory()
301+
old.docevent_set.filter(newrevisiondocevent__isnull=False).update(time=datetime.datetime.now()-datetime.timedelta(days=8))
302+
StateDocEventFactory(doc=old, time=datetime.datetime.now()-datetime.timedelta(days=8))
303+
304+
url = urlreverse('ietf.doc.views_search.recent_drafts')
305+
r = self.client.get(url)
306+
self.assertEqual(r.status_code, 200)
307+
q = PyQuery(r.content)
308+
self.assertEqual(len(q('td.doc')),3)
309+
self.assertEqual(q('td.status span.label-warning').text(),"for 15 days")
310+
self.assertEqual(q('td.status span.label-danger').text(),"for 29 days")
293311

294312
class DocDraftTestCase(TestCase):
295313
draft_text = """

ietf/meeting/factories.py

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
from django.core.files.base import ContentFile
66

7-
from ietf.meeting.models import Meeting, Session, Schedule, TimeSlot, SessionPresentation, FloorPlan
7+
from ietf.meeting.models import Meeting, Session, Schedule, TimeSlot, SessionPresentation, FloorPlan, Room
88
from ietf.group.factories import GroupFactory
99
from ietf.person.factories import PersonFactory
1010

@@ -100,12 +100,29 @@ class Meta:
100100
name = factory.Sequence(lambda n: 'schedule_%d'%n)
101101
owner = factory.SubFactory(PersonFactory)
102102

103+
class RoomFactory(factory.DjangoModelFactory):
104+
class Meta:
105+
model = Room
106+
107+
meeting = factory.SubFactory(MeetingFactory)
108+
name = factory.Faker('name')
109+
110+
103111
class TimeSlotFactory(factory.DjangoModelFactory):
104112
class Meta:
105113
model = TimeSlot
106114

107115
meeting = factory.SubFactory(MeetingFactory)
108116
type_id = 'session'
117+
118+
@factory.post_generation
119+
def location(obj, create, extracted, **kwargs): # pylint: disable=no-self-argument
120+
if create:
121+
if extracted:
122+
obj.location = extracted
123+
else:
124+
obj.location = RoomFactory(meeting=obj.meeting)
125+
obj.save()
109126

110127
@factory.lazy_attribute
111128
def time(self):
@@ -140,4 +157,3 @@ class Meta:
140157
), 'floorplan.jpg'
141158
)
142159
)
143-

ietf/secr/drafts/email.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
import glob
33
import os
44

5+
import debug # pyflakes:ignore
6+
57
from django.conf import settings
68
from django.template.loader import render_to_string
79

ietf/secr/drafts/tests_views.py

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,15 @@
1111
import debug # pyflakes:ignore
1212

1313
from ietf.doc.expire import expire_draft
14-
from ietf.doc.factories import DocumentFactory
14+
from ietf.doc.factories import WgDraftFactory
1515
from ietf.doc.models import Document
16+
from ietf.group.factories import RoleFactory
1617
from ietf.meeting.factories import MeetingFactory
17-
from ietf.person.factories import PersonFactory
18+
from ietf.person.factories import PersonFactory, EmailFactory
1819
from ietf.person.models import Person
1920
from ietf.submit.models import Preapproval
2021
from ietf.utils.mail import outbox
2122
from ietf.utils.test_utils import TestCase, login_testing_unauthorized
22-
from ietf.utils.test_data import make_test_data
2323
from ietf.secr.drafts.email import get_email_initial
2424

2525

@@ -48,14 +48,13 @@ def tearDown(self):
4848
settings.IDSUBMIT_MANUAL_STAGING_DIR = self.saved_idsubmit_manual_staging_dir
4949

5050
def test_abstract(self):
51-
draft = make_test_data()
51+
draft = WgDraftFactory()
5252
url = urlreverse('ietf.secr.drafts.views.abstract', kwargs={'id':draft.name})
5353
self.client.login(username="secretary", password="secretary+password")
5454
response = self.client.get(url)
5555
self.assertEqual(response.status_code, 200)
5656

5757
def test_approvals(self):
58-
make_test_data()
5958
Preapproval.objects.create(name='draft-dummy',
6059
by=Person.objects.get(name="(System)"))
6160
url = urlreverse('ietf.secr.drafts.views.approvals')
@@ -65,7 +64,7 @@ def test_approvals(self):
6564
self.assertTrue('draft-dummy' in response.content)
6665

6766
def test_edit(self):
68-
draft = make_test_data()
67+
draft = WgDraftFactory(states=[('draft','active'),('draft-stream-ietf','wg-doc'),('draft-iesg','ad-eval')], shepherd=EmailFactory())
6968
url = urlreverse('ietf.secr.drafts.views.edit', kwargs={'id':draft.name})
7069
self.client.login(username="secretary", password="secretary+password")
7170
response = self.client.get(url)
@@ -83,20 +82,23 @@ def test_email(self):
8382
def test_get_email_initial(self):
8483
# Makes sure that a manual posting by the Secretariat of an I-D that is
8584
# in the RFC Editor Queue will result in notification of the RFC Editor
86-
draft = make_test_data()
85+
draft = WgDraftFactory(authors=PersonFactory.create_batch(1),shepherd=EmailFactory())
86+
RoleFactory(group=draft.group, name_id='chair')
8787
data = get_email_initial(draft,action='extend',input={'expiration_date': '2050-01-01'})
8888
self.assertTrue('Extension of Expiration Date' in data['subject'])
8989

9090
def test_makerfc(self):
91-
draft = make_test_data()
91+
draft = WgDraftFactory(intended_std_level_id='ps')
9292
url = urlreverse('ietf.secr.drafts.views.edit', kwargs={'id':draft.name})
9393
self.client.login(username="secretary", password="secretary+password")
9494
response = self.client.get(url)
9595
self.assertEqual(response.status_code, 200)
96+
# It's not clear what this is testing. Was there supposed to be a POST here?
9697
self.assertTrue(draft.intended_std_level)
9798

9899
def test_search(self):
99-
draft = make_test_data()
100+
WgDraftFactory() # Test exercises branch that requires >1 doc found
101+
draft = WgDraftFactory()
100102
url = urlreverse('ietf.secr.drafts.views.search')
101103
self.client.login(username="secretary", password="secretary+password")
102104
response = self.client.get(url)
@@ -108,14 +110,14 @@ def test_search(self):
108110
self.assertTrue(draft.name in response.content)
109111

110112
def test_view(self):
111-
draft = make_test_data()
113+
draft = WgDraftFactory()
112114
url = urlreverse('ietf.secr.drafts.views.view', kwargs={'id':draft.name})
113115
self.client.login(username="secretary", password="secretary+password")
114116
response = self.client.get(url)
115117
self.assertEqual(response.status_code, 200)
116118

117119
def test_author_delete(self):
118-
draft = make_test_data()
120+
draft = WgDraftFactory(authors=PersonFactory.create_batch(2))
119121
author = draft.documentauthor_set.first()
120122
id = author.id
121123
url = urlreverse('ietf.secr.drafts.views.author_delete', kwargs={'id':draft.name, 'oid':id})
@@ -128,7 +130,7 @@ def test_author_delete(self):
128130
self.assertFalse(draft.documentauthor_set.filter(id=id))
129131

130132
def test_resurrect(self):
131-
draft = make_test_data()
133+
draft = WgDraftFactory()
132134
path = os.path.join(self.repository_dir, draft.filename_with_rev())
133135
with open(path, 'w') as file:
134136
file.write('test')
@@ -164,7 +166,7 @@ def test_resurrect(self):
164166
self.assertEqual(recv['Subject'], subject)
165167

166168
def test_extend(self):
167-
draft = make_test_data()
169+
draft = WgDraftFactory()
168170
url = urlreverse('ietf.secr.drafts.views.extend', kwargs={'id':draft.name})
169171
email_url = urlreverse('ietf.secr.drafts.views.email', kwargs={'id':draft.name})
170172
confirm_url = urlreverse('ietf.secr.drafts.views.confirm', kwargs={'id':draft.name})
@@ -203,7 +205,7 @@ def test_extend(self):
203205
self.assertEqual(recv['Subject'], subject)
204206

205207
def test_withdraw(self):
206-
draft = make_test_data()
208+
draft = WgDraftFactory()
207209
url = urlreverse('ietf.secr.drafts.views.withdraw', kwargs={'id':draft.name})
208210
email_url = urlreverse('ietf.secr.drafts.views.email', kwargs={'id':draft.name})
209211
confirm_url = urlreverse('ietf.secr.drafts.views.confirm', kwargs={'id':draft.name})
@@ -237,7 +239,7 @@ def test_withdraw(self):
237239
self.assertEqual(recv['Subject'], subject)
238240

239241
def test_authors(self):
240-
draft = DocumentFactory()
242+
draft = WgDraftFactory()
241243
person = PersonFactory()
242244
url = urlreverse('ietf.secr.drafts.views.authors',kwargs={'id':draft.name})
243245
login_testing_unauthorized(self, "secretary", url)

ietf/secr/groups/tests.py

Lines changed: 21 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -3,23 +3,25 @@
33
from ietf.utils.test_utils import TestCase
44
from ietf.group.models import Group
55
from ietf.secr.groups.forms import get_parent_group_choices
6-
from ietf.group.factories import GroupFactory
6+
from ietf.group.factories import GroupFactory, RoleFactory
7+
from ietf.meeting.factories import MeetingFactory
8+
from ietf.person.factories import PersonFactory
79
from ietf.person.models import Person
8-
from ietf.utils.test_data import make_test_data
910
import debug # pyflakes:ignore
1011

1112
class GroupsTest(TestCase):
1213
def test_get_parent_group_choices(self):
13-
make_test_data()
14+
GroupFactory(type_id='area')
1415
choices = get_parent_group_choices()
1516
area = Group.objects.filter(type='area',state='active').first()
17+
# This is opaque. Can it be rewritten to be more self-documenting?
1618
self.assertEqual(choices[0][1][0][0],area.id)
1719

1820
# ------- Test Search -------- #
1921
def test_search(self):
2022
"Test Search"
21-
make_test_data()
22-
group = Group.objects.all()[0]
23+
MeetingFactory(type_id='ietf')
24+
group = GroupFactory()
2325
url = reverse('ietf.secr.groups.views.search')
2426
post_data = {'group_acronym':group.acronym,'submit':'Search'}
2527
self.client.login(username="secretary", password="secretary+password")
@@ -50,9 +52,8 @@ def test_add_group_invalid(self):
5052
self.assertTrue('This field is required' in response.content)
5153

5254
def test_add_group_dupe(self):
53-
make_test_data()
54-
group = Group.objects.all()[0]
55-
area = Group.objects.filter(type='area')[0]
55+
group = GroupFactory()
56+
area = GroupFactory(type_id='area')
5657
url = reverse('ietf.secr.groups.views.add')
5758
post_data = {'acronym':group.acronym,
5859
'name':'Test Group',
@@ -69,8 +70,7 @@ def test_add_group_dupe(self):
6970
self.assertTrue('Group with this Acronym already exists' in response.content)
7071

7172
def test_add_group_success(self):
72-
make_test_data()
73-
area = Group.objects.filter(type='area')[0]
73+
area = GroupFactory(type_id='area')
7474
url = reverse('ietf.secr.groups.views.add')
7575
post_data = {'acronym':'test',
7676
'name':'Test Group',
@@ -86,19 +86,19 @@ def test_add_group_success(self):
8686

8787
# ------- Test View -------- #
8888
def test_view(self):
89-
make_test_data()
90-
group = Group.objects.all()[0]
89+
MeetingFactory(type_id='ietf')
90+
group = GroupFactory()
9191
url = reverse('ietf.secr.groups.views.view', kwargs={'acronym':group.acronym})
9292
self.client.login(username="secretary", password="secretary+password")
9393
response = self.client.get(url)
9494
self.assertEqual(response.status_code, 200)
9595

9696
# ------- Test Edit -------- #
9797
def test_edit_valid(self):
98-
make_test_data()
99-
group = Group.objects.filter(acronym='mars')[0]
100-
area = Group.objects.filter(acronym='farfut')[0]
101-
ad = Person.objects.get(name='Areað Irector')
98+
group = GroupFactory()
99+
area = GroupFactory(type_id='area')
100+
ad = Person.objects.get(name='Areað Irector')
101+
MeetingFactory(type_id='ietf')
102102
url = reverse('ietf.secr.groups.views.edit', kwargs={'acronym':group.acronym})
103103
target = reverse('ietf.secr.groups.views.view', kwargs={'acronym':group.acronym})
104104
post_data = {'acronym':group.acronym,
@@ -116,9 +116,9 @@ def test_edit_valid(self):
116116
self.assertTrue('changed successfully' in response.content)
117117

118118
def test_edit_non_wg_group(self):
119-
make_test_data()
120119
parent_sdo = GroupFactory.create(type_id='sdo',state_id='active')
121120
child_sdo = GroupFactory.create(type_id='sdo',state_id='active',parent=parent_sdo)
121+
MeetingFactory(type_id='ietf')
122122
url = reverse('ietf.secr.groups.views.edit', kwargs={'acronym':child_sdo.acronym})
123123
target = reverse('ietf.secr.groups.views.view', kwargs={'acronym':child_sdo.acronym})
124124
post_data = {'acronym':child_sdo.acronym,
@@ -137,9 +137,8 @@ def test_edit_non_wg_group(self):
137137

138138
# ------- Test People -------- #
139139
def test_people_delete(self):
140-
make_test_data()
141-
group = Group.objects.filter(acronym='mars')[0]
142-
role = group.role_set.all()[0]
140+
role = RoleFactory(name_id='member')
141+
group = role.group
143142
id = role.id
144143
url = reverse('ietf.secr.groups.views.delete_role', kwargs={'acronym':group.acronym,'id':role.id})
145144
target = reverse('ietf.secr.groups.views.people', kwargs={'acronym':group.acronym})
@@ -151,9 +150,8 @@ def test_people_delete(self):
151150
self.assertFalse(group.role_set.filter(id=id))
152151

153152
def test_people_add(self):
154-
make_test_data()
155-
person = Person.objects.get(name='Areað Irector')
156-
group = Group.objects.filter(acronym='mars')[0]
153+
person = PersonFactory()
154+
group = GroupFactory()
157155
url = reverse('ietf.secr.groups.views.people', kwargs={'acronym':group.acronym})
158156
post_data = {'group_acronym':group.acronym,
159157
'name':'chair',

0 commit comments

Comments
 (0)