From 8616b2d6c991bd1e91cc076c84ba05fc4bb3257d Mon Sep 17 00:00:00 2001 From: Jan Dittberner Date: Sun, 6 Dec 2015 15:35:23 +0100 Subject: [PATCH] Add tests for osusers.forms This commit adds test classes for osusers.forms in osusers.tests.test_forms. --- gnuviechadmin/osusers/tests/test_forms.py | 195 ++++++++++++++++++++++ 1 file changed, 195 insertions(+) create mode 100644 gnuviechadmin/osusers/tests/test_forms.py diff --git a/gnuviechadmin/osusers/tests/test_forms.py b/gnuviechadmin/osusers/tests/test_forms.py new file mode 100644 index 0000000..a5dec33 --- /dev/null +++ b/gnuviechadmin/osusers/tests/test_forms.py @@ -0,0 +1,195 @@ +""" +This module provides tests for :py:mod:`osusers.forms`. + +""" +from __future__ import absolute_import, unicode_literals + +from mock import MagicMock, Mock, patch + +from django import forms +from django.core.urlresolvers import reverse +from django.test import TestCase + +from django.contrib.auth import get_user_model + +from passlib.hash import sha512_crypt + +from osusers.forms import ( + AddSshPublicKeyForm, + ChangeOsUserPasswordForm, + DUPLICATE_SSH_PUBLIC_KEY_FOR_USER, + EditSshPublicKeyCommentForm, + INVALID_SSH_PUBLIC_KEY, +) + +Customer = get_user_model() + +from osusers.models import SshPublicKey, User + + +class AddSshPublicKeyFormTest(TestCase): + """ + Test for :py:class:`osusers.forms.AddSshPublicKeyForm`. + + """ + + def _setup_hostingpackage(self): + customer = Customer.objects.create_user('test') + user = User.objects.create_user(customer=customer) + self.hostingpackage = Mock(id=42, osuser=user) + + def test_constructor_needs_hostingpackage(self): + instance = MagicMock() + with self.assertRaises(KeyError) as ke: + AddSshPublicKeyForm(instance) + self.assertEqual(ke.exception.args[0], 'hostingpackage') + + def test_constructor(self): + self._setup_hostingpackage() + instance = MagicMock() + form = AddSshPublicKeyForm( + instance, hostingpackage=self.hostingpackage) + self.assertTrue(hasattr(form, 'osuser')) + self.assertEqual(form.osuser, self.hostingpackage.osuser) + self.assertTrue(hasattr(form, 'helper')) + self.assertEqual(form.helper.form_action, reverse( + 'add_ssh_key', kwargs={'package': self.hostingpackage.id})) + self.assertIn('publickeytext', form.fields) + self.assertEqual(form.helper.inputs[0].name, 'submit') + + @patch('osusers.forms.SshPublicKey.objects.parse_keytext') + def test_clean_publickeytext_invalid(self, parse_keytext): + self._setup_hostingpackage() + instance = MagicMock() + form = AddSshPublicKeyForm( + instance, hostingpackage=self.hostingpackage) + form.cleaned_data = {'publickeytext': 'a bad key'} + parse_keytext.side_effect = ValueError + with self.assertRaises(forms.ValidationError) as ve: + form.clean_publickeytext() + self.assertEqual(ve.exception.message, INVALID_SSH_PUBLIC_KEY) + + @patch('osusers.forms.SshPublicKey.objects.parse_keytext') + def test_clean_publickeytext_valid(self, parse_keytext): + self._setup_hostingpackage() + instance = MagicMock() + form = AddSshPublicKeyForm( + instance, hostingpackage=self.hostingpackage) + form.cleaned_data = {'publickeytext': 'good key comment'} + retval = form.clean_publickeytext() + self.assertEqual(retval, 'good key comment') + + def test_clean_none(self): + self._setup_hostingpackage() + instance = MagicMock() + form = AddSshPublicKeyForm( + instance, hostingpackage=self.hostingpackage) + form.cleaned_data = {'publickeytext': None} + form.clean() + self.assertIsNone(form.cleaned_data['publickeytext']) + + @patch('osusers.forms.SshPublicKey.objects.parse_keytext') + def test_clean_fresh(self, parse_keytext): + self._setup_hostingpackage() + instance = MagicMock() + form = AddSshPublicKeyForm( + instance, hostingpackage=self.hostingpackage) + sshpubkey = 'good key comment' + form.cleaned_data = {'publickeytext': sshpubkey} + parse_keytext.return_value = sshpubkey.split(' ') + form.clean() + self.assertEqual( + form.cleaned_data['publickeytext'], 'good key comment') + + @patch('osusers.forms.SshPublicKey.objects.parse_keytext') + def test_clean_duplicate(self, parse_keytext): + self._setup_hostingpackage() + instance = MagicMock() + form = AddSshPublicKeyForm( + instance, hostingpackage=self.hostingpackage) + SshPublicKey.objects.create( + user=self.hostingpackage.osuser, algorithm='good', data='key', + comment='comment') + sshpubkey = 'good key comment' + form.cleaned_data = {'publickeytext': sshpubkey} + parse_keytext.return_value = sshpubkey.split(' ') + form.clean() + self.assertIn('publickeytext', form.errors) + self.assertIn( + DUPLICATE_SSH_PUBLIC_KEY_FOR_USER, + form.errors['publickeytext']) + + @patch('osusers.admin.SshPublicKey.objects.parse_keytext') + def test_save(self, parse_keytext): + self._setup_hostingpackage() + instance = MagicMock() + form = AddSshPublicKeyForm( + instance, hostingpackage=self.hostingpackage) + sshpubkey = 'good key comment' + form.cleaned_data = {'publickeytext': sshpubkey} + parse_keytext.return_value = sshpubkey.split(' ') + retval = form.save() + self.assertTrue(isinstance(retval, SshPublicKey)) + self.assertEqual(retval.algorithm, 'good') + self.assertEqual(retval.data, 'key') + self.assertEqual(retval.comment, 'comment') + + +class ChangeOsUserPasswordFormTest(TestCase): + """ + Test for :py:class:`osusers.forms.ChangeOsUserPasswordForm`. + + """ + + def _setup_user(self): + customer = Customer.objects.create_user('test') + self.user = User.objects.create_user(customer=customer) + + def test_constructor(self): + self._setup_user() + form = ChangeOsUserPasswordForm(instance=self.user) + self.assertTrue(hasattr(form, 'instance')) + self.assertEqual(form.instance, self.user) + self.assertTrue(hasattr(form, 'helper')) + self.assertEqual(form.helper.form_action, reverse( + 'set_osuser_password', kwargs={'slug': self.user.username})) + self.assertEqual(form.helper.inputs[0].name, 'submit') + + def test_save(self): + self._setup_user() + form = ChangeOsUserPasswordForm(instance=self.user) + form.cleaned_data = {'password1': 'test'} + user = form.save() + self.assertTrue(sha512_crypt.verify('test', user.shadow.passwd)) + + +class EditSshPublicKeyCommentFormTest(TestCase): + """ + Test for :py:class:`osusers.forms.EditSshPublicKeyCommentForm`. + + """ + + def _setup_hostingpackage(self): + customer = Customer.objects.create_user('test') + user = User.objects.create_user(customer=customer) + self.hostingpackage = Mock(id=42, osuser=user) + + def test_constructor_needs_hostingpackage(self): + instance = MagicMock() + with self.assertRaises(KeyError) as ke: + EditSshPublicKeyCommentForm(instance) + self.assertEqual(ke.exception.args[0], 'hostingpackage') + + def test_constructor(self): + self._setup_hostingpackage() + instance = MagicMock(id=1) + form = EditSshPublicKeyCommentForm( + instance=instance, hostingpackage=self.hostingpackage) + self.assertTrue(hasattr(form, 'osuser')) + self.assertEqual(form.osuser, self.hostingpackage.osuser) + self.assertIn('comment', form.fields) + self.assertTrue(hasattr(form, 'helper')) + self.assertEqual(form.helper.form_action, reverse( + 'edit_ssh_key_comment', + kwargs={'package': self.hostingpackage.id, 'pk': instance.id})) + self.assertEqual(form.helper.inputs[0].name, 'submit')