datatracker/ietf/nomcom/tests.py
Emilio Jiménez 5e3e4bfd2e Add a test to check encrypted feedback
Ver #913
 - Legacy-Id: 5157
2012-12-27 11:57:36 +00:00

175 lines
6.7 KiB
Python

import os
import tempfile
from django.conf import settings
from django.test import TestCase
from django.db import IntegrityError
from django.core.urlresolvers import reverse
from django.core.files import File
from ietf.utils.test_utils import login_testing_unauthorized
from ietf.utils.pipe import pipe
from ietf.nomcom.test_data import nomcom_test_data
from ietf.nomcom.models import NomineePosition, Position, Nominee, \
NomineePositionState, Feedback, FeedbackType
class NomcomViewsTest(TestCase):
"""Tests to create a new nomcom"""
fixtures = ['names', 'nomcom_templates']
def check_url_status(self, url, status):
response = self.client.get(url)
self.assertEqual(response.status_code, status)
def setUp(self):
nomcom_test_data()
self.year = 2013
def test_home_view(self):
"""Verify home view"""
url = reverse('nomcom_index', kwargs={'year': self.year})
self.check_url_status(url, 200)
def test_nominate_view(self):
"""Verify nominate view"""
url = reverse('nomcom_nominate', kwargs={'year': self.year})
login_testing_unauthorized(self, 'kaligula', url)
self.check_url_status(url, 200)
def test_requirements_view(self):
"""Verify requirements view"""
url = reverse('nomcom_requirements', kwargs={'year': self.year})
self.check_url_status(url, 200)
def test_questionnaires_view(self):
"""Verify questionnaires view"""
url = reverse('nomcom_questionnaires', kwargs={'year': self.year})
self.check_url_status(url, 200)
def test_comments_view(self):
"""Verify comments view"""
url = reverse('nomcom_comments', kwargs={'year': self.year})
login_testing_unauthorized(self, 'plain', url)
self.check_url_status(url, 200)
class NomineePositionStateSaveTest(TestCase):
"""Tests for the NomineePosition save override method"""
fixtures = ['names', 'nomcom_templates']
def setUp(self):
nomcom_test_data()
self.nominee = Nominee.objects.get(email__address="plain@example.com")
def test_state_autoset(self):
"""Verify state is autoset correctly"""
position = Position.objects.get(name='APP')
nominee_position = NomineePosition.objects.create(position=position,
nominee=self.nominee)
self.assertEqual(nominee_position.state.slug, 'pending')
def test_state_specified(self):
"""Verify state if specified"""
position = Position.objects.get(name='INT')
nominee_position = NomineePosition.objects.create(position=position,
nominee=self.nominee,
state=NomineePositionState.objects.get(slug='accepted'))
self.assertEqual(nominee_position.state.slug, 'accepted')
def test_nomine_position_unique(self):
"""Verify nomine and position are unique together"""
position = Position.objects.get(name='OAM')
NomineePosition.objects.create(position=position,
nominee=self.nominee)
nominee_position = NomineePosition(position=position, nominee=self.nominee)
self.assertRaises(IntegrityError, nominee_position.save)
class FeedbackTest(TestCase):
fixtures = ['names', 'nomcom_templates']
def setUp(self):
nomcom_test_data()
self.generate_cert()
def generate_cert(self):
"""Function to generate cert"""
config = """
[ req ]
distinguished_name = req_distinguished_name
string_mask = utf8only
x509_extensions = ss_v3_ca
[ req_distinguished_name ]
commonName = Common Name (e.g., NomComYY)
commonName_default = NomCom12
[ ss_v3_ca ]
subjectKeyIdentifier = hash
keyUsage = critical, digitalSignature, keyEncipherment, dataEncipherment
basicConstraints = critical, CA:true
subjectAltName = email:nomcom12@ietf.org
extendedKeyUsage= emailProtection"""
self.config_file = tempfile.NamedTemporaryFile(delete=False)
self.privatekey_file = tempfile.NamedTemporaryFile(delete=False)
self.cert_file = tempfile.NamedTemporaryFile(delete=False)
self.config_file.write(config)
self.config_file.close()
command = "%s req -config %s -x509 -new -newkey rsa:2048 -sha256 -days 730 -nodes \
-keyout %s -out %s -batch"
code, out, error = pipe(command % (settings.OPENSSL_COMMAND,
self.config_file.name,
self.privatekey_file.name,
self.cert_file.name))
self.privatekey_file.close()
self.cert_file.close()
def test_encrypted_comments(self):
nominee = Nominee.objects.get(email__address="plain@example.com")
position = Position.objects.get(name='OAM')
nomcom = position.nomcom
# save the cert file in tmp
nomcom.public_key.storage.location = tempfile.gettempdir()
nomcom.public_key.save('cert', File(open(self.cert_file.name, 'r')))
comments = 'plain text'
feedback = Feedback.objects.create(position=position,
nominee=nominee,
comments=comments,
type=FeedbackType.objects.get(slug='nomina'))
# to check feedback comments are saved like enrypted data
self.assertNotEqual(feedback.comments, comments)
encrypted_file = tempfile.NamedTemporaryFile(delete=False)
encrypted_file.write(feedback.comments)
encrypted_file.close()
# to decrypt comments was encryped and check they are equal to the plain comments
decrypted_file = tempfile.NamedTemporaryFile(delete=False)
command = "%s smime -decrypt -in %s -out %s -inkey %s"
code, out, error = pipe(command % (settings.OPENSSL_COMMAND,
encrypted_file.name,
decrypted_file.name,
self.privatekey_file.name))
decrypted_file.close()
encrypted_file.close()
self.assertEqual(open(decrypted_file.name, 'r').read(), comments)
# delete tmps
os.unlink(self.config_file.name)
os.unlink(self.privatekey_file.name)
os.unlink(self.cert_file.name)
os.unlink(encrypted_file.name)
os.unlink(decrypted_file.name)