""" This module provides tests for :py:mod:`userdbs.forms`. """ from __future__ import unicode_literals from django import forms from django.contrib.auth import get_user_model from django.core.urlresolvers import reverse from django.test import TestCase from userdbs.forms import AddUserDatabaseForm, ChangeDatabaseUserPasswordForm from userdbs.models import DB_TYPES try: from unittest.mock import MagicMock, Mock, patch except ImportError: from mock import MagicMock, Mock, patch Customer = get_user_model() class AddUserDatabaseFormTest(TestCase): """ Test class for :py:class:`userdbs.forms.AddUserDatabaseForm`. """ def _setup_hostingpackage(self): self.hostingpackage = Mock(id=42) def test_constructor_needs_hostingpackage(self): with self.assertRaises(KeyError) as ke: AddUserDatabaseForm(instance=Mock()) self.assertEqual(ke.exception.args[0], 'hostingpackage') def test_constructor_needs_dbtypes(self): with self.assertRaises(KeyError) as ke: AddUserDatabaseForm(instance=Mock(), hostingpackage=Mock()) self.assertEqual(ke.exception.args[0], 'dbtypes') def test_constructor_one_dbtype(self): self._setup_hostingpackage() dbtypes = [(DB_TYPES.pgsql, DB_TYPES[DB_TYPES.pgsql])] form = AddUserDatabaseForm( instance=MagicMock(), hostingpackage=self.hostingpackage, dbtypes=dbtypes) self.assertIn('db_type', form.fields) self.assertEqual(form.fields['db_type'].choices, dbtypes) self.assertTrue(isinstance( form.fields['db_type'].widget, forms.HiddenInput)) self.assertTrue(hasattr(form, 'helper')) self.assertEqual(form.helper.form_action, reverse( 'add_userdatabase', kwargs={'package': self.hostingpackage.id})) self.assertEqual(form.helper.inputs[0].name, 'submit') def test_constructor_multiple_dbtypes(self): self._setup_hostingpackage() dbtypes = [ (DB_TYPES.pgsql, DB_TYPES[DB_TYPES.pgsql]), (DB_TYPES.mysql, DB_TYPES[DB_TYPES.mysql]) ] form = AddUserDatabaseForm( instance=MagicMock(), hostingpackage=self.hostingpackage, dbtypes=dbtypes) self.assertIn('db_type', form.fields) self.assertEqual(form.fields['db_type'].choices, dbtypes) self.assertTrue(isinstance( form.fields['db_type'].widget, forms.RadioSelect)) self.assertTrue(hasattr(form, 'helper')) self.assertEqual(form.helper.form_action, reverse( 'add_userdatabase', kwargs={'package': self.hostingpackage.id})) self.assertEqual(form.helper.inputs[0].name, 'submit') @patch('userdbs.forms.UserDatabase.objects.create_userdatabase_with_user') def test_save(self, create_userdatabase_with_user): self._setup_hostingpackage() dbtypes = [ (DB_TYPES.pgsql, DB_TYPES[DB_TYPES.pgsql]), (DB_TYPES.mysql, DB_TYPES[DB_TYPES.mysql]) ] form = AddUserDatabaseForm( instance=MagicMock(), hostingpackage=self.hostingpackage, dbtypes=dbtypes) form.cleaned_data = { 'db_type': DB_TYPES.pgsql, 'password1': 'secret', } form.save() self.assertTrue(create_userdatabase_with_user.called_with( DB_TYPES.pgsql, self.hostingpackage.osuser, password='secret', commit=True)) class ChangeDatabaseUserPasswordFormTest(TestCase): """ Test class for :py:class:`userdbs.forms.ChangeDatabaseUserPasswordForm`. """ def _setup_hostingpackage(self): self.hostingpackage = Mock(id=42) def test_constructor_needs_hostingpackage(self): with self.assertRaises(KeyError) as ke: ChangeDatabaseUserPasswordForm(instance=Mock()) self.assertEqual(ke.exception.args[0], 'hostingpackage') def test_constructor(self): self._setup_hostingpackage() instance = MagicMock() instance.name = 'test' form = ChangeDatabaseUserPasswordForm( instance=instance, hostingpackage=self.hostingpackage) self.assertIn('password1', form.fields) self.assertIn('password2', form.fields) self.assertTrue(hasattr(form, 'helper')) self.assertEqual(form.helper.form_action, reverse( 'change_dbuser_password', kwargs={ 'slug': 'test', 'package': 42 })) self.assertEqual(form.helper.inputs[0].name, 'submit') def test_save(self): instance = MagicMock() instance.name = 'test' self._setup_hostingpackage() form = ChangeDatabaseUserPasswordForm( instance=instance, hostingpackage=self.hostingpackage) form.cleaned_data = {'password1': 'secret'} form.save() self.assertTrue(instance.set_password.called_with('secret'))