Improved test coverage (from 66 to 87%) - checkpointing before removing move_to_default
- Legacy-Id: 10602
This commit is contained in:
parent
bf54e2b3f5
commit
df571c2fcc
|
@ -92,18 +92,20 @@ class NomComFactory(factory.DjangoModelFactory):
|
|||
if extracted is None:
|
||||
extracted = True
|
||||
if create and extracted:
|
||||
nominees = [Nominee.objects.create(nomcom=self, email=PersonFactory().email_set.first()) for i in range(2)]
|
||||
nominees = [Nominee.objects.create(nomcom=self, email=PersonFactory().email_set.first()) for i in range(4)]
|
||||
positions = [PositionFactory(nomcom=self) for i in range(3)]
|
||||
|
||||
def npc(x,y):
|
||||
return NomineePosition.objects.create(position=x,
|
||||
nominee=y,
|
||||
state_id='accepted')
|
||||
def npc(position,nominee,state_id):
|
||||
return NomineePosition.objects.create(position=position,
|
||||
nominee=nominee,
|
||||
state_id=state_id)
|
||||
# This gives us positions with 0, 1 and 2 nominees, and
|
||||
# one person who's been nomminated for more than one position
|
||||
npc(positions[0],nominees[0])
|
||||
npc(positions[1],nominees[0])
|
||||
npc(positions[1],nominees[1])
|
||||
# one person who's been nominated for more than one position
|
||||
npc(positions[0],nominees[0],'accepted')
|
||||
npc(positions[1],nominees[0],'accepted')
|
||||
npc(positions[1],nominees[1],'accepted')
|
||||
npc(positions[0],nominees[2],'pending')
|
||||
npc(positions[0],nominees[3],'declined')
|
||||
|
||||
@factory.post_generation
|
||||
def populate_personnel(self, create, extracted, **kwargs):
|
||||
|
|
|
@ -31,7 +31,8 @@ from ietf.nomcom.utils import get_nomcom_by_year, get_or_create_nominee, get_has
|
|||
from ietf.nomcom.management.commands.send_reminders import Command, is_time_to_send
|
||||
|
||||
from ietf.nomcom.factories import NomComFactory, FeedbackFactory, \
|
||||
nomcom_kwargs_for_year, provide_private_key_to_test_client
|
||||
nomcom_kwargs_for_year, provide_private_key_to_test_client, \
|
||||
key
|
||||
from ietf.person.factories import PersonFactory
|
||||
from ietf.dbtemplate.factories import DBTemplateFactory
|
||||
|
||||
|
@ -1199,6 +1200,37 @@ class NewActiveNomComTests(TestCase):
|
|||
response = self.client.get(url)
|
||||
self.assertEqual(response.status_code,200)
|
||||
|
||||
def test_accept_reject_nomination_edges(self):
|
||||
|
||||
np = self.nc.nominee_set.first().nomineeposition_set.first()
|
||||
|
||||
kwargs={'year':self.nc.year(),
|
||||
'nominee_position_id':np.id,
|
||||
'state':'accepted',
|
||||
'date':np.time.strftime("%Y%m%d"),
|
||||
'hash':get_hash_nominee_position(np.time.strftime("%Y%m%d"),np.id),
|
||||
}
|
||||
url = reverse('nomcom_process_nomination_status', kwargs=kwargs)
|
||||
response = self.client.get(url)
|
||||
self.assertEqual(response.status_code,403)
|
||||
self.assertTrue('already was' in unicontent(response))
|
||||
|
||||
settings.DAYS_TO_EXPIRE_NOMINATION_LINK = 2
|
||||
np.time = np.time - datetime.timedelta(days=3)
|
||||
np.save()
|
||||
kwargs['date'] = np.time.strftime("%Y%m%d")
|
||||
kwargs['hash'] = get_hash_nominee_position(np.time.strftime("%Y%m%d"),np.id)
|
||||
url = reverse('nomcom_process_nomination_status', kwargs=kwargs)
|
||||
response = self.client.get(url)
|
||||
self.assertEqual(response.status_code,403)
|
||||
self.assertTrue('Link expired' in unicontent(response))
|
||||
|
||||
kwargs['hash'] = 'bad'
|
||||
url = reverse('nomcom_process_nomination_status', kwargs=kwargs)
|
||||
response = self.client.get(url)
|
||||
self.assertEqual(response.status_code,403)
|
||||
self.assertTrue('Bad hash!' in unicontent(response))
|
||||
|
||||
def test_accept_reject_nomination_comment(self):
|
||||
np = self.nc.nominee_set.first().nomineeposition_set.first()
|
||||
hash = get_hash_nominee_position(np.time.strftime("%Y%m%d"),np.id)
|
||||
|
@ -1224,4 +1256,188 @@ class NewActiveNomComTests(TestCase):
|
|||
response = self.client.post(url,{'comments':'A nonempty comment'})
|
||||
self.assertEqual(response.status_code,200)
|
||||
self.assertEqual(Feedback.objects.count(),feedback_count_before+1)
|
||||
|
||||
def test_provide_private_key(self):
|
||||
url = reverse('nomcom_private_key',kwargs={'year':self.nc.year()})
|
||||
login_testing_unauthorized(self,self.chair.user.username,url)
|
||||
response = self.client.get(url)
|
||||
self.assertEqual(response.status_code,200)
|
||||
response = self.client.post(url,{'key':key})
|
||||
self.assertEqual(response.status_code,302)
|
||||
|
||||
def test_email_pasting(self):
|
||||
url = reverse('nomcom_private_feedback_email',kwargs={'year':self.nc.year()})
|
||||
login_testing_unauthorized(self,self.chair.user.username,url)
|
||||
response = self.client.get(url)
|
||||
self.assertTrue(response.status_code,200)
|
||||
fb_count_before = Feedback.objects.count()
|
||||
response = self.client.post(url,{'email_text':"""To: rjsparks@nostrum.com
|
||||
From: Robert Sparks <rjsparks@nostrum.com>
|
||||
Subject: Junk message for feedback testing
|
||||
Message-ID: <566F2FE5.1050401@nostrum.com>
|
||||
Date: Mon, 14 Dec 2015 15:08:53 -0600
|
||||
Content-Type: text/plain; charset=utf-8; format=flowed
|
||||
Content-Transfer-Encoding: 7bit
|
||||
|
||||
Junk body for testing
|
||||
|
||||
"""})
|
||||
self.assertEqual(response.status_code,200)
|
||||
self.assertEqual(Feedback.objects.count(),fb_count_before+1)
|
||||
|
||||
def test_simple_feedback_pending(self):
|
||||
url = reverse('nomcom_view_feedback_pending',kwargs={'year':self.nc.year() })
|
||||
login_testing_unauthorized(self, self.chair.user.username, url)
|
||||
provide_private_key_to_test_client(self)
|
||||
|
||||
# test simple classification when there's only one thing to classify
|
||||
|
||||
# junk is the only category you can set directly from the first form the view presents
|
||||
fb = FeedbackFactory(nomcom=self.nc,type_id=None)
|
||||
response = self.client.get(url)
|
||||
self.assertEqual(response.status_code,200)
|
||||
|
||||
response = self.client.post(url, {'form-TOTAL_FORMS': 1,
|
||||
'form-INITIAL_FORMS': 1,
|
||||
'form-0-id': fb.id,
|
||||
'form-0-type': 'junk',
|
||||
})
|
||||
self.assertEqual(response.status_code,302)
|
||||
fb = Feedback.objects.get(id=fb.id)
|
||||
self.assertEqual(fb.type_id,'junk')
|
||||
|
||||
# comments, nominations, and questionnare responses are catagorized via a second
|
||||
# formset presented by the view (signaled by having 'end' appear in the POST)
|
||||
fb = FeedbackFactory(nomcom=self.nc,type_id=None)
|
||||
np = NomineePosition.objects.filter(position__nomcom = self.nc,state='accepted').first()
|
||||
fb_count_before = np.nominee.feedback_set.count()
|
||||
response = self.client.post(url, {'form-TOTAL_FORMS':1,
|
||||
'form-INITIAL_FORMS':1,
|
||||
'end':'Save feedback',
|
||||
'form-0-id': fb.id,
|
||||
'form-0-type': 'comment',
|
||||
'form-0-nominee': '%s_%s'%(np.position.id,np.nominee.id),
|
||||
})
|
||||
self.assertEqual(response.status_code,302)
|
||||
fb = Feedback.objects.get(id=fb.id)
|
||||
self.assertEqual(fb.type_id,'comment')
|
||||
self.assertEqual(np.nominee.feedback_set.count(),fb_count_before+1)
|
||||
|
||||
fb = FeedbackFactory(nomcom=self.nc,type_id=None)
|
||||
nominee = self.nc.nominee_set.first()
|
||||
position = self.nc.position_set.exclude(nomineeposition__nominee=nominee).first()
|
||||
self.assertIsNotNone(position)
|
||||
fb_count_before = nominee.feedback_set.count()
|
||||
response = self.client.post(url, {'form-TOTAL_FORMS':1,
|
||||
'form-INITIAL_FORMS':1,
|
||||
'end':'Save feedback',
|
||||
'form-0-id': fb.id,
|
||||
'form-0-type': 'nomina',
|
||||
'form-0-position': position.id,
|
||||
'form-0-candidate_name' : nominee.name(),
|
||||
'form-0-candidate_email' : nominee.email.address,
|
||||
})
|
||||
self.assertEqual(response.status_code,302)
|
||||
fb = Feedback.objects.get(id=fb.id)
|
||||
self.assertEqual(fb.type_id,'nomina')
|
||||
self.assertEqual(nominee.feedback_set.count(),fb_count_before+1)
|
||||
|
||||
fb = FeedbackFactory(nomcom=self.nc,type_id=None)
|
||||
np = NomineePosition.objects.filter(position__nomcom = self.nc,state='accepted').first()
|
||||
fb_count_before = np.nominee.feedback_set.count()
|
||||
response = self.client.post(url, {'form-TOTAL_FORMS':1,
|
||||
'form-INITIAL_FORMS':1,
|
||||
'end':'Save feedback',
|
||||
'form-0-id': fb.id,
|
||||
'form-0-type': 'questio',
|
||||
'form-0-nominee': '%s_%s'%(np.position.id,np.nominee.id),
|
||||
})
|
||||
self.assertEqual(response.status_code,302)
|
||||
fb = Feedback.objects.get(id=fb.id)
|
||||
self.assertEqual(fb.type_id,'questio')
|
||||
self.assertEqual(np.nominee.feedback_set.count(),fb_count_before+1)
|
||||
|
||||
def test_complicated_feedback_pending(self):
|
||||
url = reverse('nomcom_view_feedback_pending',kwargs={'year':self.nc.year() })
|
||||
login_testing_unauthorized(self, self.chair.user.username, url)
|
||||
provide_private_key_to_test_client(self)
|
||||
|
||||
# Test having multiple things to classify
|
||||
# The view has some complicated to handle having some forms in the initial form formset
|
||||
# being categorized as 'junk' and others being categorized as something that requires
|
||||
# more information. The second formset presented will have forms for any others initially
|
||||
# categorized as nominations, then a third formset will be presented with any that were
|
||||
# initially categorized as comments or questionnaire responses. The following exercises
|
||||
# all the gears that glue these three formset presentations together.
|
||||
|
||||
fb0 = FeedbackFactory(nomcom=self.nc,type_id=None)
|
||||
fb1 = FeedbackFactory(nomcom=self.nc,type_id=None)
|
||||
fb2 = FeedbackFactory(nomcom=self.nc,type_id=None)
|
||||
nominee = self.nc.nominee_set.first()
|
||||
new_position_for_nominee = self.nc.position_set.exclude(nomineeposition__nominee=nominee).first()
|
||||
|
||||
# Initial formset
|
||||
response = self.client.post(url, {'form-TOTAL_FORMS': 3,
|
||||
'form-INITIAL_FORMS': 3,
|
||||
'form-0-id': fb0.id,
|
||||
'form-0-type': 'junk',
|
||||
'form-1-id': fb1.id,
|
||||
'form-1-type': 'nomina',
|
||||
'form-2-id': fb2.id,
|
||||
'form-2-type': 'comment',
|
||||
})
|
||||
self.assertEqual(response.status_code,200) # Notice that this is not a 302
|
||||
fb0 = Feedback.objects.get(id=fb0.id)
|
||||
self.assertEqual(fb0.type_id,'junk')
|
||||
q = PyQuery(response.content)
|
||||
self.assertEqual(q('input[name=\"form-0-type\"]').attr['value'],'nomina')
|
||||
self.assertEqual(q('input[name=\"extra_ids\"]').attr['value'],'%s:comment' % fb2.id)
|
||||
|
||||
# Second formset
|
||||
response = self.client.post(url, {'form-TOTAL_FORMS':1,
|
||||
'form-INITIAL_FORMS':1,
|
||||
'end':'Save feedback',
|
||||
'form-0-id': fb1.id,
|
||||
'form-0-type': 'nomina',
|
||||
'form-0-position': new_position_for_nominee.id,
|
||||
'form-0-candidate_name' : nominee.name(),
|
||||
'form-0-candidate_email' : nominee.email.address,
|
||||
'extra_ids': '%s:comment' % fb2.id,
|
||||
})
|
||||
self.assertEqual(response.status_code,200) # Notice that this is also is not a 302
|
||||
fb1 = Feedback.objects.get(id=fb1.id)
|
||||
self.assertEqual(fb1.type_id,'nomina')
|
||||
q = PyQuery(response.content)
|
||||
self.assertEqual(q('input[name=\"form-0-type\"]').attr['value'],'comment')
|
||||
self.assertFalse(q('input[name=\"extra_ids\"]'))
|
||||
|
||||
# Exercising the resulting third formset is identical to the simple test above
|
||||
# that categorizes a single thing as a comment. Note that it returns a 302.
|
||||
|
||||
# There is yet another code-path for transitioning to the second form when
|
||||
# nothing was classified as a nomination.
|
||||
fb0 = FeedbackFactory(nomcom=self.nc,type_id=None)
|
||||
fb1 = FeedbackFactory(nomcom=self.nc,type_id=None)
|
||||
np = NomineePosition.objects.filter(position__nomcom = self.nc,state='accepted').first()
|
||||
response = self.client.post(url, {'form-TOTAL_FORMS': 2,
|
||||
'form-INITIAL_FORMS': 2,
|
||||
'form-0-id': fb0.id,
|
||||
'form-0-type': 'junk',
|
||||
'form-1-id': fb1.id,
|
||||
'form-1-type': 'comment',
|
||||
})
|
||||
self.assertEqual(response.status_code,200)
|
||||
q = PyQuery(response.content)
|
||||
self.assertEqual(q('input[name=\"form-0-type\"]').attr['value'],'comment')
|
||||
self.assertFalse(q('input[name=\"extra_ids\"]'))
|
||||
|
||||
|
||||
class NomComIndexTests(TestCase):
|
||||
def setUp(self):
|
||||
for year in range(2000,2014):
|
||||
NomComFactory.create(**nomcom_kwargs_for_year(year=year,populate_positions=False,populate_personnel=False))
|
||||
|
||||
def testIndex(self):
|
||||
url = reverse('ietf.nomcom.views.index')
|
||||
response = self.client.get(url)
|
||||
self.assertEqual(response.status_code,200)
|
||||
|
|
|
@ -533,7 +533,7 @@ def process_nomination_status(request, year, nominee_position_id, state, date, h
|
|||
expiration_days = getattr(settings, 'DAYS_TO_EXPIRE_NOMINATION_LINK', None)
|
||||
if expiration_days:
|
||||
request_date = datetime.date(int(date[:4]), int(date[4:6]), int(date[6:]))
|
||||
if datetime.date.today() > (request_date + datetime.timedelta(days=settings.DAYS_TO_EXPIRE_REGISTRATION_LINK)):
|
||||
if datetime.date.today() > (request_date + datetime.timedelta(days=settings.DAYS_TO_EXPIRE_NOMINATION_LINK)):
|
||||
return HttpResponseForbidden("Link expired")
|
||||
|
||||
need_confirmation = True
|
||||
|
|
Loading…
Reference in a new issue