""" 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')