Fix tests for Python 3

- drop Python 2 __future__ imports
- fix tests to handle new Django and Python 3 module names
- reformat changed files with black
This commit is contained in:
Jan Dittberner 2019-01-30 21:27:25 +01:00
parent ddec6b4184
commit 3d18392b67
32 changed files with 2707 additions and 2675 deletions

View file

@ -2,26 +2,18 @@
Tests for :py:mod:`contact_form.forms`.
"""
from __future__ import absolute_import, unicode_literals
from unittest.mock import MagicMock, Mock, patch
import mock
from mock import MagicMock, Mock
from django.core.urlresolvers import reverse
from django.test import TestCase
from django.contrib.sites.models import Site
from django.test import TestCase
from django.urls import reverse
from contact_form.forms import ContactForm
TEST_DATA = {
'name': 'Test User',
'email': 'test@example.org',
'body': 'Test message'
}
TEST_DATA = {"name": "Test User", "email": "test@example.org", "body": "Test message"}
class ContactFormTest(TestCase):
def test_constructor_needs_request(self):
with self.assertRaises(KeyError):
ContactForm()
@ -29,63 +21,63 @@ class ContactFormTest(TestCase):
def test_constructor(self):
request = MagicMock()
form = ContactForm(request=request)
self.assertTrue(hasattr(form, 'request'))
self.assertTrue(hasattr(form, "request"))
self.assertEqual(form.request, request)
self.assertTrue(hasattr(form, 'helper'))
self.assertEqual(form.helper.form_action, reverse('contact_form'))
self.assertTrue(hasattr(form, "helper"))
self.assertEqual(form.helper.form_action, reverse("contact_form"))
self.assertEqual(len(form.helper.inputs), 1)
self.assertEqual(form.helper.inputs[0].name, 'submit')
self.assertEqual(form.helper.inputs[0].name, "submit")
def test_constructor_fields(self):
request = MagicMock()
form = ContactForm(request=request)
self.assertEqual(len(form.fields), 3)
self.assertIn('email', form.fields)
self.assertIn('name', form.fields)
self.assertIn('body', form.fields)
self.assertIn("email", form.fields)
self.assertIn("name", form.fields)
self.assertIn("body", form.fields)
self.assertEqual(len(form.data), 0)
def test_get_context_invalid(self):
request = MagicMock()
form = ContactForm(request=request)
with self.assertRaisesMessage(
ValueError,
'Cannot generate context from invalid contact form'):
ValueError, "Cannot generate context from invalid contact form"
):
form.get_context()
def test_get_context_valid_site_installed(self):
request = MagicMock()
form = ContactForm(request=request, data=TEST_DATA)
context = form.get_context()
self.assertIn('site', context)
self.assertIn('name', context)
self.assertIn('email', context)
self.assertIn('body', context)
self.assertIn("site", context)
self.assertIn("name", context)
self.assertIn("email", context)
self.assertIn("body", context)
def test_get_context_valid_site_not_installed(self):
request = MagicMock()
form = ContactForm(request=request, data=TEST_DATA)
with mock.patch('contact_form.forms.Site') as sitemock:
with patch("contact_form.forms.Site") as sitemock:
sitemock._meta.installed = False
context = form.get_context()
self.assertIn('site', context)
self.assertIn('name', context)
self.assertIn('email', context)
self.assertIn('body', context)
self.assertIn("site", context)
self.assertIn("name", context)
self.assertIn("email", context)
self.assertIn("body", context)
def test_message(self):
request = Mock()
request.META = {'REMOTE_ADDR': '127.0.0.1'}
request.META = {"REMOTE_ADDR": "127.0.0.1"}
form = ContactForm(request=request, data=TEST_DATA)
message = form.message()
self.assertIn(TEST_DATA['name'], message)
self.assertIn(TEST_DATA['email'], message)
self.assertIn(TEST_DATA['body'], message)
self.assertIn('127.0.0.1', message)
self.assertIn(TEST_DATA["name"], message)
self.assertIn(TEST_DATA["email"], message)
self.assertIn(TEST_DATA["body"], message)
self.assertIn("127.0.0.1", message)
def test_subject(self):
request = Mock()
form = ContactForm(request=request, data=TEST_DATA)
subject = form.subject()
self.assertIn(Site.objects.get_current().name, subject)
self.assertIn(TEST_DATA['name'], subject)
self.assertIn(TEST_DATA["name"], subject)

View file

@ -2,126 +2,122 @@
Tests for :py:mod:`contact_form.views`.
"""
from __future__ import absolute_import, unicode_literals
from django.core import mail
from django.core.urlresolvers import reverse
from django.test import TestCase
from django.contrib.auth import get_user_model
from django.core import mail
from django.test import TestCase
from django.urls import reverse
User = get_user_model()
TEST_USER = 'test'
TEST_PASSWORD = 'secret'
TEST_EMAIL = 'test@example.org'
TEST_NAME = 'Example Tester'.split()
TEST_MESSAGE = '''
TEST_USER = "test"
TEST_PASSWORD = "secret"
TEST_EMAIL = "test@example.org"
TEST_NAME = "Example Tester".split()
TEST_MESSAGE = """
This is a really unimportant test message.
'''
"""
class ContactFormViewTest(TestCase):
def _setup_user(self, **kwargs):
return User.objects.create_user(
TEST_USER, email=TEST_EMAIL, password=TEST_PASSWORD,
**kwargs)
TEST_USER, email=TEST_EMAIL, password=TEST_PASSWORD, **kwargs
)
def test_get_contact_form_template(self):
response = self.client.get(reverse('contact_form'))
self.assertTemplateUsed(response, 'contact_form/contact_form.html')
response = self.client.get(reverse("contact_form"))
self.assertTemplateUsed(response, "contact_form/contact_form.html")
def test_get_contact_form_anonymous_status(self):
response = self.client.get(reverse('contact_form'))
response = self.client.get(reverse("contact_form"))
self.assertEqual(response.status_code, 200)
def test_get_contact_form_anonymous_has_empty_form(self):
response = self.client.get(reverse('contact_form'))
self.assertIn('form', response.context)
form = response.context['form']
response = self.client.get(reverse("contact_form"))
self.assertIn("form", response.context)
form = response.context["form"]
self.assertEqual(len(form.initial), 0)
def test_get_contact_form_fields_anonymous(self):
response = self.client.get(reverse('contact_form'))
for name in ('name', 'email', 'body'):
self.assertIn(name, response.context['form'].fields)
response = self.client.get(reverse("contact_form"))
for name in ("name", "email", "body"):
self.assertIn(name, response.context["form"].fields)
def test_post_empty_form_template(self):
response = self.client.post(reverse('contact_form'), {})
self.assertTemplateUsed(response, 'contact_form/contact_form.html')
response = self.client.post(reverse("contact_form"), {})
self.assertTemplateUsed(response, "contact_form/contact_form.html")
def test_post_empty_form_status(self):
response = self.client.post(reverse('contact_form'), {})
response = self.client.post(reverse("contact_form"), {})
self.assertEqual(response.status_code, 200)
def test_post_empty_form_validation_errors(self):
response = self.client.post(reverse('contact_form'), {})
self.assertIn('form', response.context)
form = response.context['form']
response = self.client.post(reverse("contact_form"), {})
self.assertIn("form", response.context)
form = response.context["form"]
self.assertFalse(form.is_valid())
self.assertEqual(len(form.errors), 3)
def test_post_empty_form_no_mail(self):
self.client.post(reverse('contact_form'), {})
self.client.post(reverse("contact_form"), {})
self.assertEqual(len(mail.outbox), 0)
def test_get_contact_form_logged_in_no_fullname_initial(self):
self._setup_user()
self.client.login(username=TEST_USER, password=TEST_PASSWORD)
response = self.client.get(reverse('contact_form'))
self.assertIn('form', response.context)
form = response.context['form']
self.assertEqual(
form.initial, {'name': TEST_USER, 'email': TEST_EMAIL})
response = self.client.get(reverse("contact_form"))
self.assertIn("form", response.context)
form = response.context["form"]
self.assertEqual(form.initial, {"name": TEST_USER, "email": TEST_EMAIL})
def test_get_contact_form_logged_in_fullname_initial(self):
self._setup_user(
first_name=TEST_NAME[0], last_name=TEST_NAME[1])
self._setup_user(first_name=TEST_NAME[0], last_name=TEST_NAME[1])
self.client.login(username=TEST_USER, password=TEST_PASSWORD)
response = self.client.get(reverse('contact_form'))
self.assertIn('form', response.context)
form = response.context['form']
response = self.client.get(reverse("contact_form"))
self.assertIn("form", response.context)
form = response.context["form"]
self.assertEqual(
form.initial,
{'name': " ".join(TEST_NAME), 'email': TEST_EMAIL})
form.initial, {"name": " ".join(TEST_NAME), "email": TEST_EMAIL}
)
def test_post_filled_form_anonymous_redirects(self):
response = self.client.post(reverse('contact_form'), {
'name': TEST_USER, 'email': TEST_EMAIL, 'body': TEST_MESSAGE})
self.assertRedirects(response, reverse('contact_success'))
response = self.client.post(
reverse("contact_form"),
{"name": TEST_USER, "email": TEST_EMAIL, "body": TEST_MESSAGE},
)
self.assertRedirects(response, reverse("contact_success"))
def test_post_filled_form_anonymous_mail(self):
self.client.post(reverse('contact_form'), {
'name': TEST_USER, 'email': TEST_EMAIL, 'body': TEST_MESSAGE})
self.client.post(
reverse("contact_form"),
{"name": TEST_USER, "email": TEST_EMAIL, "body": TEST_MESSAGE},
)
self.assertEqual(len(mail.outbox), 1)
def test_post_filled_form_logged_in_redirects(self):
self._setup_user(
first_name=TEST_NAME[0], last_name=TEST_NAME[1])
self._setup_user(first_name=TEST_NAME[0], last_name=TEST_NAME[1])
self.client.login(username=TEST_USER, password=TEST_PASSWORD)
response = self.client.post(reverse('contact_form'), {
'name': " ".join(TEST_NAME), 'email': TEST_EMAIL,
'body': TEST_MESSAGE})
self.assertRedirects(response, reverse('contact_success'))
response = self.client.post(
reverse("contact_form"),
{"name": " ".join(TEST_NAME), "email": TEST_EMAIL, "body": TEST_MESSAGE},
)
self.assertRedirects(response, reverse("contact_success"))
def test_post_filled_form_logged_in_mail(self):
self._setup_user(
first_name=TEST_NAME[0], last_name=TEST_NAME[1])
self._setup_user(first_name=TEST_NAME[0], last_name=TEST_NAME[1])
self.client.login(username=TEST_USER, password=TEST_PASSWORD)
self.client.post(reverse('contact_form'), {
'name': " ".join(TEST_NAME), 'email': TEST_EMAIL,
'body': TEST_MESSAGE})
self.client.post(
reverse("contact_form"),
{"name": " ".join(TEST_NAME), "email": TEST_EMAIL, "body": TEST_MESSAGE},
)
self.assertEqual(len(mail.outbox), 1)
class ContactSuccessViewTest(TestCase):
def test_get_template(self):
response = self.client.get(reverse('contact_success'))
self.assertTemplateUsed(response, 'contact_form/contact_success.html')
response = self.client.get(reverse("contact_success"))
self.assertTemplateUsed(response, "contact_form/contact_success.html")
def test_get_status(self):
response = self.client.get(reverse('contact_success'))
response = self.client.get(reverse("contact_success"))
self.assertEqual(response.status_code, 200)

View file

@ -3,66 +3,65 @@ Tests for :py:mod:`dashboard.views`.
"""
from django.core.urlresolvers import reverse
from django.test import TestCase
from django.contrib.auth import get_user_model
from django.test import TestCase
from django.urls import reverse
User = get_user_model()
TEST_USER = 'test'
TEST_PASSWORD = 'secret'
TEST_USER = "test"
TEST_PASSWORD = "secret"
class IndexViewTest(TestCase):
def test_index_view(self):
response = self.client.get(reverse('dashboard'))
response = self.client.get(reverse("dashboard"))
self.assertEqual(response.status_code, 200)
self.assertTemplateUsed(response, 'dashboard/index.html')
self.assertTemplateUsed(response, "dashboard/index.html")
class UserDashboardViewTest(TestCase):
def _create_test_user(self):
self.user = User.objects.create(username=TEST_USER)
self.user.set_password(TEST_PASSWORD)
self.user.save()
def test_user_dashboard_view_no_user(self):
response = self.client.get(reverse(
'customer_dashboard', kwargs={'slug': TEST_USER}))
response = self.client.get(
reverse("customer_dashboard", kwargs={"slug": TEST_USER})
)
self.assertEqual(response.status_code, 404)
def test_user_dashboard_view_anonymous(self):
User.objects.create(username=TEST_USER)
response = self.client.get(reverse(
'customer_dashboard', kwargs={'slug': TEST_USER}))
response = self.client.get(
reverse("customer_dashboard", kwargs={"slug": TEST_USER})
)
self.assertEqual(response.status_code, 403)
def test_user_dashboard_view_logged_in_ok(self):
self._create_test_user()
self.assertTrue(
self.client.login(username=TEST_USER, password=TEST_PASSWORD))
response = self.client.get(reverse(
'customer_dashboard', kwargs={'slug': TEST_USER}))
self.assertTrue(self.client.login(username=TEST_USER, password=TEST_PASSWORD))
response = self.client.get(
reverse("customer_dashboard", kwargs={"slug": TEST_USER})
)
self.assertEqual(response.status_code, 200)
def test_user_dashboard_view_logged_in_template(self):
self._create_test_user()
self.assertTrue(
self.client.login(username=TEST_USER, password=TEST_PASSWORD))
response = self.client.get(reverse(
'customer_dashboard', kwargs={'slug': TEST_USER}))
self.assertTemplateUsed(response, 'dashboard/user_dashboard.html')
self.assertTrue(self.client.login(username=TEST_USER, password=TEST_PASSWORD))
response = self.client.get(
reverse("customer_dashboard", kwargs={"slug": TEST_USER})
)
self.assertTemplateUsed(response, "dashboard/user_dashboard.html")
def test_user_dashboard_view_logged_in_context_fresh(self):
self._create_test_user()
self.assertTrue(
self.client.login(username=TEST_USER, password=TEST_PASSWORD))
response = self.client.get(reverse(
'customer_dashboard', kwargs={'slug': TEST_USER}))
self.assertIn('dashboard_user', response.context)
self.assertEqual(self.user, response.context['dashboard_user'])
self.assertIn('hosting_packages', response.context)
self.assertEqual(len(response.context['hosting_packages']), 0)
self.assertTrue(self.client.login(username=TEST_USER, password=TEST_PASSWORD))
response = self.client.get(
reverse("customer_dashboard", kwargs={"slug": TEST_USER})
)
self.assertIn("dashboard_user", response.context)
self.assertEqual(self.user, response.context["dashboard_user"])
self.assertIn("hosting_packages", response.context)
self.assertEqual(len(response.context["hosting_packages"]), 0)

View file

@ -1,8 +1,8 @@
from django.test import TestCase
from django.core.urlresolvers import reverse
from django.urls import reverse
class TestMailDomainAdmin(TestCase):
def test_admin_for_maildomain(self):
admin_url = reverse('admin:domains_maildomain_changelist')
admin_url = reverse("admin:domains_maildomain_changelist")
self.assertIsNotNone(admin_url)

View file

@ -2,51 +2,42 @@
Tests for :py:mod:`domains.forms`.
"""
from __future__ import absolute_import, unicode_literals
from unittest.mock import MagicMock, Mock, patch
from mock import MagicMock, Mock, patch
from django.core.urlresolvers import reverse
from django.forms import ValidationError
from django.test import TestCase
from django.urls import reverse
from django.utils.translation import ugettext as _
from domains.forms import relative_domain_validator, CreateHostingDomainForm
class RelativeDomainValidatorTest(TestCase):
def test_valid_domainname(self):
relative_domain_validator('example.org')
relative_domain_validator("example.org")
def test_domain_name_too_long(self):
with self.assertRaisesMessage(
ValidationError, _('host name too long')):
relative_domain_validator('e' * 255)
with self.assertRaisesMessage(ValidationError, _("host name too long")):
relative_domain_validator("e" * 255)
def test_domain_name_part_too_long(self):
with self.assertRaisesMessage(
ValidationError, _('invalid domain name')):
relative_domain_validator('a' * 64 + '.org')
with self.assertRaisesMessage(ValidationError, _("invalid domain name")):
relative_domain_validator("a" * 64 + ".org")
def test_domain_name_illegal_characters(self):
with self.assertRaisesMessage(
ValidationError, _('invalid domain name')):
relative_domain_validator('eXampl3.org')
with self.assertRaisesMessage(ValidationError, _("invalid domain name")):
relative_domain_validator("eXampl3.org")
def test_domain_name_starts_with_dash(self):
with self.assertRaisesMessage(
ValidationError, _('invalid domain name')):
relative_domain_validator('-example.org')
with self.assertRaisesMessage(ValidationError, _("invalid domain name")):
relative_domain_validator("-example.org")
def test_domain_name_ends_with_dash(self):
with self.assertRaisesMessage(
ValidationError, _('invalid domain name')):
relative_domain_validator('example-.org')
with self.assertRaisesMessage(ValidationError, _("invalid domain name")):
relative_domain_validator("example-.org")
class CreateHostingDomainFormTest(TestCase):
def test_constructor_needs_hostingpackage(self):
instance = MagicMock()
with self.assertRaises(KeyError):
@ -56,50 +47,53 @@ class CreateHostingDomainFormTest(TestCase):
hostingpackage = Mock(id=42)
instance = MagicMock()
form = CreateHostingDomainForm(instance, hostingpackage=hostingpackage)
self.assertTrue(hasattr(form, 'hosting_package'))
self.assertTrue(hasattr(form, "hosting_package"))
self.assertEqual(form.hosting_package, hostingpackage)
self.assertTrue(hasattr(form, 'helper'))
self.assertEqual(form.helper.form_action, reverse(
'create_hosting_domain', kwargs={'package': 42}))
self.assertTrue(hasattr(form, "helper"))
self.assertEqual(
form.helper.form_action,
reverse("create_hosting_domain", kwargs={"package": 42}),
)
self.assertEqual(len(form.helper.layout.fields), 2)
self.assertEqual(form.helper.layout.fields[1].name, 'submit')
self.assertEqual(form.helper.layout.fields[1].name, "submit")
def test_domain_field_has_relative_domain_validator(self):
hostingpackage = Mock(id=42)
instance = MagicMock()
form = CreateHostingDomainForm(instance, hostingpackage=hostingpackage)
self.assertIn(
relative_domain_validator, form.fields['domain'].validators)
self.assertIn(relative_domain_validator, form.fields["domain"].validators)
def test_clean(self):
hostingpackage = Mock(id=42)
instance = MagicMock()
form = CreateHostingDomainForm(
instance, hostingpackage=hostingpackage,
data={'domain': 'example.org'})
instance, hostingpackage=hostingpackage, data={"domain": "example.org"}
)
self.assertTrue(form.is_valid())
self.assertIn('hosting_package', form.cleaned_data)
self.assertEqual(hostingpackage, form.cleaned_data['hosting_package'])
self.assertIn("hosting_package", form.cleaned_data)
self.assertEqual(hostingpackage, form.cleaned_data["hosting_package"])
def test_save(self):
hostingpackage = Mock(id=42)
instance = MagicMock()
form = CreateHostingDomainForm(
instance, hostingpackage=hostingpackage,
data={'domain': 'example.org'})
instance, hostingpackage=hostingpackage, data={"domain": "example.org"}
)
self.assertTrue(form.is_valid())
with patch('domains.forms.HostingDomain') as domain:
with patch("domains.forms.HostingDomain") as domain:
form.save()
domain.objects.create_for_hosting_package.assert_called_with(
commit=True, **form.cleaned_data)
commit=True, **form.cleaned_data
)
form.save(commit=False)
domain.objects.create_for_hosting_package.assert_called_with(
commit=False, **form.cleaned_data)
commit=False, **form.cleaned_data
)
def test_save_m2m(self):
hostingpackage = Mock(id=42)
instance = MagicMock()
form = CreateHostingDomainForm(
instance, hostingpackage=hostingpackage,
data={'domain': 'example.org'})
instance, hostingpackage=hostingpackage, data={"domain": "example.org"}
)
form.save_m2m()

View file

@ -2,9 +2,7 @@
Tests for :py:mod:`domains.models`.
"""
from __future__ import absolute_import, unicode_literals
from mock import patch
from unittest.mock import patch
from django.test import TestCase
from django.contrib.auth import get_user_model
@ -20,41 +18,38 @@ from domains.models import (
HostingDomain,
MailDomain,
)
from hostingpackages.models import (
CustomerHostingPackage,
HostingPackageTemplate,
)
from hostingpackages.models import CustomerHostingPackage, HostingPackageTemplate
User = get_user_model()
TEST_USER = 'test'
TEST_USER = "test"
class MailDomainTest(TestCase):
def test___str__(self):
md = MailDomain.objects.create(domain='example.org')
self.assertEqual(str(md), 'example.org')
md = MailDomain.objects.create(domain="example.org")
self.assertEqual(str(md), "example.org")
def test_get_mailaddresses(self):
md = MailDomain.objects.create(domain='example.org')
md = MailDomain.objects.create(domain="example.org")
from managemails.models import MailAddress
addrmock = MailAddress.objects.create(localpart='info', domain=md)
addrmock = MailAddress.objects.create(localpart="info", domain=md)
self.assertIn(addrmock, md.get_mailaddresses())
self.assertIn(addrmock, md.mailaddresses)
class HostingDomainManagerTest(TestCase):
def _setup_hosting_package(self):
template = HostingPackageTemplate.objects.create(
name='testpackagetemplate', mailboxcount=0, diskspace=1,
diskspace_unit=0)
name="testpackagetemplate", mailboxcount=0, diskspace=1, diskspace_unit=0
)
customer = User.objects.create_user(username=TEST_USER)
package = CustomerHostingPackage.objects.create_from_template(
customer, template, 'testpackage')
with patch('hostingpackages.models.settings') as hmsettings:
customer, template, "testpackage"
)
with patch("hostingpackages.models.settings") as hmsettings:
hmsettings.OSUSER_DEFAULT_GROUPS = []
package.save()
return package
@ -62,7 +57,8 @@ class HostingDomainManagerTest(TestCase):
def test_create_for_hosting_package_with_commit(self):
package = self._setup_hosting_package()
hostingdomain = HostingDomain.objects.create_for_hosting_package(
package, 'example.org', True)
package, "example.org", True
)
self.assertIsNotNone(hostingdomain)
self.assertTrue(hostingdomain.customer, package.customer)
@ -70,70 +66,60 @@ class HostingDomainManagerTest(TestCase):
def test_create_for_hosting_package_no_commit(self):
package = self._setup_hosting_package()
hostingdomain = HostingDomain.objects.create_for_hosting_package(
package, 'example.org', False)
package, "example.org", False
)
self.assertIsNotNone(hostingdomain)
self.assertTrue(hostingdomain.customer, package.customer)
class HostingDomainTest(TestCase):
def test___str__(self):
hostingdomain = HostingDomain(domain='test')
self.assertEqual(str(hostingdomain), 'test')
hostingdomain = HostingDomain(domain="test")
self.assertEqual(str(hostingdomain), "test")
class DNSDomainTest(TestCase):
def test___str__(self):
dnsdomain = DNSDomain(domain='test')
self.assertEqual(str(dnsdomain), 'test')
dnsdomain = DNSDomain(domain="test")
self.assertEqual(str(dnsdomain), "test")
class DNSRecordTest(TestCase):
def test___str__(self):
dnsrecord = DNSRecord(
name='localhost', recordtype='A', content='127.0.0.1')
self.assertEqual(str(dnsrecord), 'localhost IN A 127.0.0.1')
dnsrecord = DNSRecord(name="localhost", recordtype="A", content="127.0.0.1")
self.assertEqual(str(dnsrecord), "localhost IN A 127.0.0.1")
class DNSSupermasterTest(TestCase):
def test___str__(self):
dnssupermaster = DNSSupermaster(
ip='127.0.0.1', nameserver='dns.example.org')
self.assertEqual(str(dnssupermaster), '127.0.0.1 dns.example.org')
dnssupermaster = DNSSupermaster(ip="127.0.0.1", nameserver="dns.example.org")
self.assertEqual(str(dnssupermaster), "127.0.0.1 dns.example.org")
class DNSCommentTest(TestCase):
def test___str__(self):
dnscomment = DNSComment(
name='localhost', commenttype='A', comment='good stuff')
self.assertEqual(str(dnscomment), 'localhost IN A: good stuff')
dnscomment = DNSComment(name="localhost", commenttype="A", comment="good stuff")
self.assertEqual(str(dnscomment), "localhost IN A: good stuff")
class DNSDomainMetadataTest(TestCase):
def test___str__(self):
dnsdomain = DNSDomain(domain='test')
dnsdomain = DNSDomain(domain="test")
dnsdomainmetadata = DNSDomainMetadata(
domain=dnsdomain, kind='SOA-EDIT', content='INCEPTION')
self.assertEqual(str(dnsdomainmetadata), 'test SOA-EDIT INCEPTION')
domain=dnsdomain, kind="SOA-EDIT", content="INCEPTION"
)
self.assertEqual(str(dnsdomainmetadata), "test SOA-EDIT INCEPTION")
class DNSCryptoKeyTest(TestCase):
def test___str__(self):
dnsdomain = DNSDomain(domain='test')
dnscryptokey = DNSCryptoKey(domain=dnsdomain, content='testvalue')
self.assertEqual(str(dnscryptokey), 'test testvalue')
dnsdomain = DNSDomain(domain="test")
dnscryptokey = DNSCryptoKey(domain=dnsdomain, content="testvalue")
self.assertEqual(str(dnscryptokey), "test testvalue")
class DNSTSIGKeyTest(TestCase):
def test___str__(self):
dnstsigkey = DNSTSIGKey(
name='testkey', algorithm='hmac-md5', secret='dummykey')
self.assertEqual(str(dnstsigkey), 'testkey hmac-md5 XXXX')
dnstsigkey = DNSTSIGKey(name="testkey", algorithm="hmac-md5", secret="dummykey")
self.assertEqual(str(dnstsigkey), "testkey hmac-md5 XXXX")

View file

@ -2,149 +2,152 @@
Tests for :py:mod:`domains.views`.
"""
from __future__ import absolute_import, unicode_literals
from mock import patch, MagicMock
from django.core.urlresolvers import reverse
from django.test import TestCase
from unittest.mock import MagicMock, patch
from django.contrib.auth import get_user_model
from hostingpackages.models import (
CustomerHostingPackage,
HostingPackageTemplate,
)
from django.test import TestCase
from django.urls import reverse
from domains.views import CreateHostingDomain
from hostingpackages.models import CustomerHostingPackage, HostingPackageTemplate
User = get_user_model()
TEST_USER = 'test'
TEST_PASSWORD = 'secret'
TEST_EMAIL = 'test@example.org'
TEST_NAME = 'Example Tester'.split()
TEST_USER = "test"
TEST_PASSWORD = "secret"
TEST_EMAIL = "test@example.org"
TEST_NAME = "Example Tester".split()
class CreateHostingDomainTest(TestCase):
def _setup_hosting_package(self, customer):
template = HostingPackageTemplate.objects.create(
name='testpackagetemplate', mailboxcount=0, diskspace=1,
diskspace_unit=0)
name="testpackagetemplate", mailboxcount=0, diskspace=1, diskspace_unit=0
)
package = CustomerHostingPackage.objects.create_from_template(
customer, template, 'testpackage')
with patch('hostingpackages.models.settings') as hmsettings:
customer, template, "testpackage"
)
with patch("hostingpackages.models.settings") as hmsettings:
hmsettings.OSUSER_DEFAULT_GROUPS = []
package.save()
return package
def test_get_anonymous(self):
response = self.client.get(
reverse('create_hosting_domain', kwargs={'package': 1}))
reverse("create_hosting_domain", kwargs={"package": 1})
)
self.assertEqual(response.status_code, 403)
def test_get_regular_user(self):
customer = User.objects.create_user(
TEST_USER, email=TEST_EMAIL, password=TEST_PASSWORD)
TEST_USER, email=TEST_EMAIL, password=TEST_PASSWORD
)
package = self._setup_hosting_package(customer)
self.client.login(username=TEST_USER, password=TEST_PASSWORD)
response = self.client.get(
reverse('create_hosting_domain',
kwargs={'package': package.id}))
reverse("create_hosting_domain", kwargs={"package": package.id})
)
self.assertEqual(response.status_code, 403)
def test_get_staff_user(self):
customer = User.objects.create_user('customer')
customer = User.objects.create_user("customer")
package = self._setup_hosting_package(customer)
User.objects.create_superuser(
TEST_USER, email=TEST_EMAIL, password=TEST_PASSWORD)
TEST_USER, email=TEST_EMAIL, password=TEST_PASSWORD
)
self.client.login(username=TEST_USER, password=TEST_PASSWORD)
response = self.client.get(
reverse('create_hosting_domain',
kwargs={'package': package.id}))
reverse("create_hosting_domain", kwargs={"package": package.id})
)
self.assertEqual(response.status_code, 200)
def test_get_template(self):
customer = User.objects.create_user('customer')
customer = User.objects.create_user("customer")
package = self._setup_hosting_package(customer)
User.objects.create_superuser(
TEST_USER, email=TEST_EMAIL, password=TEST_PASSWORD)
TEST_USER, email=TEST_EMAIL, password=TEST_PASSWORD
)
self.client.login(username=TEST_USER, password=TEST_PASSWORD)
response = self.client.get(
reverse('create_hosting_domain',
kwargs={'package': package.id}))
self.assertTemplateUsed(response, 'domains/hostingdomain_create.html')
reverse("create_hosting_domain", kwargs={"package": package.id})
)
self.assertTemplateUsed(response, "domains/hostingdomain_create.html")
def test_get_no_package_found(self):
User.objects.create_superuser(
TEST_USER, email=TEST_EMAIL, password=TEST_PASSWORD)
TEST_USER, email=TEST_EMAIL, password=TEST_PASSWORD
)
self.client.login(username=TEST_USER, password=TEST_PASSWORD)
response = self.client.get(
reverse('create_hosting_domain',
kwargs={'package': 1}))
reverse("create_hosting_domain", kwargs={"package": 1})
)
self.assertEqual(response.status_code, 404)
def test_get_get_form_kwargs(self):
customer = User.objects.create_user('customer')
customer = User.objects.create_user("customer")
package = self._setup_hosting_package(customer)
User.objects.create_superuser(
TEST_USER, email=TEST_EMAIL, password=TEST_PASSWORD)
TEST_USER, email=TEST_EMAIL, password=TEST_PASSWORD
)
self.client.login(username=TEST_USER, password=TEST_PASSWORD)
view = CreateHostingDomain(
request=MagicMock(), kwargs={'package': str(package.id)})
request=MagicMock(), kwargs={"package": str(package.id)}
)
the_kwargs = view.get_form_kwargs()
self.assertIn('hostingpackage', the_kwargs)
self.assertEqual(the_kwargs['hostingpackage'], package)
self.assertIn("hostingpackage", the_kwargs)
self.assertEqual(the_kwargs["hostingpackage"], package)
def test_get_context_data_has_hosting_package(self):
customer = User.objects.create_user('customer')
customer = User.objects.create_user("customer")
package = self._setup_hosting_package(customer)
User.objects.create_superuser(
TEST_USER, email=TEST_EMAIL, password=TEST_PASSWORD)
TEST_USER, email=TEST_EMAIL, password=TEST_PASSWORD
)
self.client.login(username=TEST_USER, password=TEST_PASSWORD)
response = self.client.get(
reverse('create_hosting_domain',
kwargs={'package': package.id}))
self.assertIn('hostingpackage', response.context)
self.assertEqual(response.context['hostingpackage'], package)
reverse("create_hosting_domain", kwargs={"package": package.id})
)
self.assertIn("hostingpackage", response.context)
self.assertEqual(response.context["hostingpackage"], package)
def test_get_context_data_has_customer(self):
customer = User.objects.create_user('customer')
customer = User.objects.create_user("customer")
package = self._setup_hosting_package(customer)
User.objects.create_superuser(
TEST_USER, email=TEST_EMAIL, password=TEST_PASSWORD)
TEST_USER, email=TEST_EMAIL, password=TEST_PASSWORD
)
self.client.login(username=TEST_USER, password=TEST_PASSWORD)
response = self.client.get(
reverse('create_hosting_domain',
kwargs={'package': package.id}))
self.assertIn('customer', response.context)
self.assertEqual(response.context['customer'], customer)
reverse("create_hosting_domain", kwargs={"package": package.id})
)
self.assertIn("customer", response.context)
self.assertEqual(response.context["customer"], customer)
def test_form_valid_redirect(self):
customer = User.objects.create_user('customer')
customer = User.objects.create_user("customer")
package = self._setup_hosting_package(customer)
User.objects.create_superuser(
TEST_USER, email=TEST_EMAIL, password=TEST_PASSWORD)
TEST_USER, email=TEST_EMAIL, password=TEST_PASSWORD
)
self.client.login(username=TEST_USER, password=TEST_PASSWORD)
response = self.client.post(
reverse('create_hosting_domain',
kwargs={'package': package.id}),
data={'domain': 'example.org'})
reverse("create_hosting_domain", kwargs={"package": package.id}),
data={"domain": "example.org"},
)
self.assertRedirects(response, package.get_absolute_url())
def test_form_valid_message(self):
customer = User.objects.create_user('customer')
customer = User.objects.create_user("customer")
package = self._setup_hosting_package(customer)
User.objects.create_superuser(
TEST_USER, email=TEST_EMAIL, password=TEST_PASSWORD)
TEST_USER, email=TEST_EMAIL, password=TEST_PASSWORD
)
self.client.login(username=TEST_USER, password=TEST_PASSWORD)
response = self.client.post(
reverse('create_hosting_domain',
kwargs={'package': package.id}), follow=True,
data={'domain': 'example.org'})
messages = list(response.context['messages'])
reverse("create_hosting_domain", kwargs={"package": package.id}),
follow=True,
data={"domain": "example.org"},
)
messages = list(response.context["messages"])
self.assertEqual(len(messages), 1)
self.assertEqual(
'Successfully created domain example.org', str(messages[0]))
self.assertEqual("Successfully created domain example.org", str(messages[0]))

View file

@ -5,54 +5,49 @@ This module defines views related to domains.
from __future__ import absolute_import, unicode_literals
from braces.views import StaffuserRequiredMixin
from django.contrib.auth.mixins import LoginRequiredMixin
from django.shortcuts import redirect, get_object_or_404
from django.views.generic.edit import CreateView
from django.utils.translation import ugettext as _
from django.contrib import messages
from django.shortcuts import get_object_or_404, redirect
from django.utils.translation import ugettext as _
from django.views.generic.edit import CreateView
from hostingpackages.models import CustomerHostingPackage
from .forms import CreateHostingDomainForm
from .models import HostingDomain
class CreateHostingDomain(
LoginRequiredMixin, StaffuserRequiredMixin, CreateView
):
class CreateHostingDomain(StaffuserRequiredMixin, CreateView):
"""
This view is used for creating a new HostingDomain instance for an existing
hosting package.
"""
model = HostingDomain
raise_exception = True
template_name_suffix = '_create'
template_name_suffix = "_create"
form_class = CreateHostingDomainForm
def _get_hosting_package(self):
return get_object_or_404(
CustomerHostingPackage, pk=int(self.kwargs['package']))
return get_object_or_404(CustomerHostingPackage, pk=int(self.kwargs["package"]))
def get_form_kwargs(self):
kwargs = super(CreateHostingDomain, self).get_form_kwargs()
kwargs['hostingpackage'] = self._get_hosting_package()
kwargs["hostingpackage"] = self._get_hosting_package()
return kwargs
def get_context_data(self, **kwargs):
context = super(CreateHostingDomain, self).get_context_data(**kwargs)
hosting_package = self._get_hosting_package()
context.update({
'hostingpackage': hosting_package,
'customer': hosting_package.customer,
})
context.update(
{"hostingpackage": hosting_package, "customer": hosting_package.customer}
)
return context
def form_valid(self, form):
hostingdomain = form.save()
messages.success(
self.request,
_('Successfully created domain {domainname}').format(
domainname=hostingdomain.domain)
_("Successfully created domain {domainname}").format(
domainname=hostingdomain.domain
),
)
return redirect(self._get_hosting_package())

View file

@ -38,8 +38,10 @@ DEBUG = False
# ######### MANAGER CONFIGURATION
# See: https://docs.djangoproject.com/en/dev/ref/settings/#admins
ADMINS = (
(get_env_variable('GVA_ADMIN_NAME', default='Admin'),
get_env_variable('GVA_ADMIN_EMAIL', default='admin@example.org')),
(
get_env_variable("GVA_ADMIN_NAME", default="Admin"),
get_env_variable("GVA_ADMIN_EMAIL", default="admin@example.org"),
),
)
# See: https://docs.djangoproject.com/en/dev/ref/settings/#managers
@ -50,13 +52,13 @@ MANAGERS = ADMINS
# ######### DATABASE CONFIGURATION
# See: https://docs.djangoproject.com/en/dev/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': get_env_variable('GVA_PGSQL_DATABASE', default='gnuviechadmin'),
'USER': get_env_variable('GVA_PGSQL_USER', default='gnuviechadmin'),
'PASSWORD': get_env_variable('GVA_PGSQL_PASSWORD'),
'HOST': get_env_variable('GVA_PGSQL_HOSTNAME', default='db'),
'PORT': get_env_variable('GVA_PGSQL_PORT', int, default=5432),
"default": {
"ENGINE": "django.db.backends.postgresql",
"NAME": get_env_variable("GVA_PGSQL_DATABASE", default="gnuviechadmin"),
"USER": get_env_variable("GVA_PGSQL_USER", default="gnuviechadmin"),
"PASSWORD": get_env_variable("GVA_PGSQL_PASSWORD"),
"HOST": get_env_variable("GVA_PGSQL_HOSTNAME", default="db"),
"PORT": get_env_variable("GVA_PGSQL_PORT", int, default=5432),
}
}
# ######### END DATABASE CONFIGURATION
@ -64,15 +66,15 @@ DATABASES = {
# ######### GENERAL CONFIGURATION
# See: https://docs.djangoproject.com/en/dev/ref/settings/#time-zone
TIME_ZONE = 'Europe/Berlin'
TIME_ZONE = "Europe/Berlin"
# See: https://docs.djangoproject.com/en/dev/ref/settings/#language-code
LANGUAGE_CODE = 'en-us'
LANGUAGE_CODE = "en-us"
# See: https://docs.djangoproject.com/en/dev/ref/settings/#site-id
SITE_ID = 1
SITES_DOMAIN_NAME = get_env_variable('GVA_DOMAIN_NAME')
SITES_SITE_NAME = get_env_variable('GVA_SITE_NAME')
SITES_DOMAIN_NAME = get_env_variable("GVA_DOMAIN_NAME")
SITES_SITE_NAME = get_env_variable("GVA_SITE_NAME")
# See: https://docs.djangoproject.com/en/dev/ref/settings/#use-i18n
USE_I18N = True
@ -85,33 +87,28 @@ USE_TZ = True
# ######### END GENERAL CONFIGURATION
LOCALE_PATHS = (
normpath(join(SITE_ROOT, 'gnuviechadmin', 'locale')),
)
LOCALE_PATHS = (normpath(join(SITE_ROOT, "gnuviechadmin", "locale")),)
# ######### MEDIA CONFIGURATION
# See: https://docs.djangoproject.com/en/dev/ref/settings/#media-root
MEDIA_ROOT = normpath(join(SITE_ROOT, 'media'))
MEDIA_ROOT = normpath(join(SITE_ROOT, "media"))
# See: https://docs.djangoproject.com/en/dev/ref/settings/#media-url
MEDIA_URL = '/media/'
MEDIA_URL = "/media/"
# ######### END MEDIA CONFIGURATION
# See: https://docs.djangoproject.com/en/dev/ref/settings/#static-url
STATIC_URL = '/static/'
STATIC_URL = "/static/"
# See: https://docs.djangoproject.com/en/dev/ref/contrib/staticfiles/#std:setting-STATICFILES_DIRS # noqa
STATICFILES_DIRS = (
normpath(join(SITE_ROOT, 'gnuviechadmin', 'assets')),
)
STATICFILES_DIRS = (normpath(join(SITE_ROOT, "gnuviechadmin", "assets")),)
# See: https://docs.djangoproject.com/en/dev/ref/contrib/staticfiles/#staticfiles-finders # noqa
STATICFILES_FINDERS = (
'django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
"django.contrib.staticfiles.finders.FileSystemFinder",
"django.contrib.staticfiles.finders.AppDirectoriesFinder",
)
# ######### END STATIC FILE CONFIGURATION
@ -119,7 +116,7 @@ STATICFILES_FINDERS = (
# ######### SECRET CONFIGURATION
# See: https://docs.djangoproject.com/en/dev/ref/settings/#secret-key
# Note: This key should only be used for development and testing.
SECRET_KEY = get_env_variable('GVA_SITE_SECRET')
SECRET_KEY = get_env_variable("GVA_SITE_SECRET")
# ######### END SECRET CONFIGURATION
@ -132,9 +129,7 @@ ALLOWED_HOSTS = []
# ######### FIXTURE CONFIGURATION
# See: https://docs.djangoproject.com/en/dev/ref/settings/#std:setting-FIXTURE_DIRS # noqa
FIXTURE_DIRS = (
normpath(join(SITE_ROOT, 'fixtures')),
)
FIXTURE_DIRS = (normpath(join(SITE_ROOT, "fixtures")),)
# ######### END FIXTURE CONFIGURATION
@ -142,27 +137,25 @@ FIXTURE_DIRS = (
# See: https://docs.djangoproject.com/en/1.9/ref/settings/#std:setting-TEMPLATES # noqa
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [
normpath(join(DJANGO_ROOT, 'templates')),
],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.contrib.auth.context_processors.auth',
'django.template.context_processors.debug',
'django.template.context_processors.i18n',
'django.template.context_processors.media',
'django.template.context_processors.static',
'django.template.context_processors.tz',
'django.contrib.messages.context_processors.messages',
'django.template.context_processors.request',
"BACKEND": "django.template.backends.django.DjangoTemplates",
"DIRS": [normpath(join(DJANGO_ROOT, "templates"))],
"APP_DIRS": True,
"OPTIONS": {
"context_processors": [
"django.contrib.auth.context_processors.auth",
"django.template.context_processors.debug",
"django.template.context_processors.i18n",
"django.template.context_processors.media",
"django.template.context_processors.static",
"django.template.context_processors.tz",
"django.contrib.messages.context_processors.messages",
"django.template.context_processors.request",
# custom context processors
'gnuviechadmin.context_processors.navigation',
'gnuviechadmin.context_processors.version_info',
],
"gnuviechadmin.context_processors.navigation",
"gnuviechadmin.context_processors.version_info",
]
},
},
}
]
# ######### END TEMPLATE CONFIGURATION
@ -171,14 +164,14 @@ TEMPLATES = [
# See: https://docs.djangoproject.com/en/dev/ref/settings/#middleware-classes
MIDDLEWARE = [
# Default Django middleware.
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.middleware.locale.LocaleMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
"django.middleware.common.CommonMiddleware",
"django.contrib.sessions.middleware.SessionMiddleware",
"django.middleware.csrf.CsrfViewMiddleware",
"django.contrib.auth.middleware.AuthenticationMiddleware",
"django.middleware.locale.LocaleMiddleware",
"django.contrib.messages.middleware.MessageMiddleware",
# uncomment next line to enable translation to browser locale
'django.middleware.clickjacking.XFrameOptionsMiddleware',
"django.middleware.clickjacking.XFrameOptionsMiddleware",
]
# ######### END MIDDLEWARE CONFIGURATION
@ -186,7 +179,6 @@ MIDDLEWARE = [
AUTHENTICATION_BACKENDS = (
# Needed to login by username in Django admin, regardless of `allauth`
"django.contrib.auth.backends.ModelBackend",
# `allauth` specific authentication methods, such as login by e-mail
"allauth.account.auth_backends.AuthenticationBackend",
)
@ -194,87 +186,83 @@ AUTHENTICATION_BACKENDS = (
# ######### URL CONFIGURATION
# See: https://docs.djangoproject.com/en/dev/ref/settings/#root-urlconf
ROOT_URLCONF = '%s.urls' % SITE_NAME
ROOT_URLCONF = "%s.urls" % SITE_NAME
# ######### END URL CONFIGURATION
# ######### TEST RUNNER CONFIGURATION
TEST_RUNNER = 'django.test.runner.DiscoverRunner'
TEST_RUNNER = "django.test.runner.DiscoverRunner"
# ######### END TEST RUNNER CONFIGURATION
# ######### APP CONFIGURATION
DJANGO_APPS = (
# Default Django apps:
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.staticfiles',
"django.contrib.auth",
"django.contrib.contenttypes",
"django.contrib.sessions",
"django.contrib.sites",
"django.contrib.messages",
"django.contrib.staticfiles",
# Useful template tags:
'django.contrib.humanize',
"django.contrib.humanize",
# Admin panel and documentation:
'django.contrib.admin',
"django.contrib.admin",
# Flatpages for about page
'django.contrib.flatpages',
'crispy_forms',
"django.contrib.flatpages",
"crispy_forms",
)
ALLAUTH_APPS = (
'allauth',
'allauth.account',
'allauth.socialaccount',
'allauth.socialaccount.providers.google',
'allauth.socialaccount.providers.linkedin_oauth2',
'allauth.socialaccount.providers.twitter',
"allauth",
"allauth.account",
"allauth.socialaccount",
"allauth.socialaccount.providers.google",
"allauth.socialaccount.providers.linkedin_oauth2",
"allauth.socialaccount.providers.twitter",
)
# Apps specific for this project go here.
LOCAL_APPS = (
'dashboard',
'taskresults',
'ldaptasks',
'mysqltasks',
'pgsqltasks',
'fileservertasks',
'webtasks',
'domains',
'osusers',
'managemails',
'userdbs',
'hostingpackages',
'websites',
'contact_form',
"dashboard",
"taskresults",
"ldaptasks",
"mysqltasks",
"pgsqltasks",
"fileservertasks",
"webtasks",
"domains",
"osusers",
"managemails",
"userdbs",
"hostingpackages",
"websites",
"contact_form",
)
# See: https://docs.djangoproject.com/en/dev/ref/settings/#installed-apps
INSTALLED_APPS = DJANGO_APPS + ALLAUTH_APPS + LOCAL_APPS
MESSAGE_TAGS = {
messages.DEBUG: '',
messages.ERROR: 'alert-danger',
messages.INFO: 'alert-info',
messages.SUCCESS: 'alert-success',
messages.WARNING: 'alert-warning',
messages.DEBUG: "",
messages.ERROR: "alert-danger",
messages.INFO: "alert-info",
messages.SUCCESS: "alert-success",
messages.WARNING: "alert-warning",
}
# ######### END APP CONFIGURATION
# ######### ALLAUTH CONFIGURATION
ACCOUNT_EMAIL_REQUIRED = True
ACCOUNT_EMAIL_VERIFICATION = 'mandatory'
LOGIN_REDIRECT_URL = '/'
ACCOUNT_EMAIL_VERIFICATION = "mandatory"
LOGIN_REDIRECT_URL = "/"
SOCIALACCOUNT_QUERY_EMAIL = True
# ######### END ALLAUTH CONFIGURATION
# ######### CRISPY FORMS CONFIGURATION
CRISPY_TEMPLATE_PACK = 'bootstrap3'
CRISPY_TEMPLATE_PACK = "bootstrap3"
# ######### END CRISPY_FORMS CONFIGURATION
@ -286,170 +274,197 @@ CRISPY_TEMPLATE_PACK = 'bootstrap3'
# See http://docs.djangoproject.com/en/dev/topics/logging for
# more details on how to customize your logging configuration.
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'verbose': {
'format': '%(levelname)s %(asctime)s %(name)s '
'%(module)s:%(lineno)d %(process)d %(thread)d %(message)s',
},
'simple': {
'format': '%(levelname)s %(name)s:%(lineno)d %(message)s',
"version": 1,
"disable_existing_loggers": False,
"formatters": {
"verbose": {
"format": "%(levelname)s %(asctime)s %(name)s "
"%(module)s:%(lineno)d %(process)d %(thread)d %(message)s"
},
"simple": {"format": "%(levelname)s %(name)s:%(lineno)d %(message)s"},
},
'filters': {
'require_debug_false': {
'()': 'django.utils.log.RequireDebugFalse'
"filters": {"require_debug_false": {"()": "django.utils.log.RequireDebugFalse"}},
"handlers": {
"mail_admins": {
"level": "ERROR",
"filters": ["require_debug_false"],
"class": "django.utils.log.AdminEmailHandler",
}
},
'handlers': {
'mail_admins': {
'level': 'ERROR',
'filters': ['require_debug_false'],
'class': 'django.utils.log.AdminEmailHandler'
"loggers": {
"django.request": {
"handlers": ["mail_admins"],
"level": "ERROR",
"propagate": True,
}
},
'loggers': {
'django.request': {
'handlers': ['mail_admins'],
'level': 'ERROR',
'propagate': True,
},
}
}
# ######### END LOGGING CONFIGURATION
# ######### WSGI CONFIGURATION
# See: https://docs.djangoproject.com/en/dev/ref/settings/#wsgi-application
WSGI_APPLICATION = '%s.wsgi.application' % SITE_NAME
WSGI_APPLICATION = "%s.wsgi.application" % SITE_NAME
# ######### END WSGI CONFIGURATION
# ######### CELERY CONFIGURATION
BROKER_URL = get_env_variable(
'GVA_BROKER_URL',
default='amqp://gnuviechadmin:gnuviechadmin@mq/gnuviechadmin')
CELERY_RESULT_BACKEND = get_env_variable(
'GVA_RESULTS_REDIS_URL',
default='redis://:gnuviechadmin@redis:6379/0')
CELERY_TASK_RESULT_EXPIRES = None
CELERY_ROUTES = (
'gvacommon.celeryrouters.GvaRouter',
"GVA_BROKER_URL", default="amqp://gnuviechadmin:gnuviechadmin@mq/gnuviechadmin"
)
CELERY_TIMEZONE = 'Europe/Berlin'
BROKER_TRANSPORT_OPTIONS = {
"max_retries": 3,
"interval_start": 0,
"interval_step": 0.2,
"interval_max": 0.2,
}
CELERY_RESULT_BACKEND = get_env_variable(
"GVA_RESULTS_REDIS_URL", default="redis://:gnuviechadmin@redis:6379/0"
)
CELERY_TASK_RESULT_EXPIRES = None
CELERY_ROUTES = ("gvacommon.celeryrouters.GvaRouter",)
CELERY_TIMEZONE = "Europe/Berlin"
CELERY_ENABLE_UTC = True
CELERY_ACCEPT_CONTENT = ['json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_ACCEPT_CONTENT = ["json"]
CELERY_TASK_SERIALIZER = "json"
CELERY_RESULT_SERIALIZER = "json"
# ######### END CELERY CONFIGURATION
# ######### CUSTOM APP CONFIGURATION
OSUSER_MINUID = get_env_variable('GVA_MIN_OS_UID', int, default=10000)
OSUSER_MINGID = get_env_variable('GVA_MIN_OS_GID', int, default=10000)
OSUSER_USERNAME_PREFIX = get_env_variable('GVA_OSUSER_PREFIX', default='usr')
OSUSER_HOME_BASEPATH = get_env_variable(
'GVA_OSUSER_HOME_BASEPATH', default='/home')
OSUSER_MINUID = get_env_variable("GVA_MIN_OS_UID", int, default=10000)
OSUSER_MINGID = get_env_variable("GVA_MIN_OS_GID", int, default=10000)
OSUSER_USERNAME_PREFIX = get_env_variable("GVA_OSUSER_PREFIX", default="usr")
OSUSER_HOME_BASEPATH = get_env_variable("GVA_OSUSER_HOME_BASEPATH", default="/home")
OSUSER_DEFAULT_SHELL = get_env_variable(
'GVA_OSUSER_DEFAULT_SHELL', default='/usr/bin/rssh')
OSUSER_SFTP_GROUP = 'sftponly'
OSUSER_SSH_GROUP = 'sshusers'
"GVA_OSUSER_DEFAULT_SHELL", default="/usr/bin/rssh"
)
OSUSER_SFTP_GROUP = "sftponly"
OSUSER_SSH_GROUP = "sshusers"
OSUSER_DEFAULT_GROUPS = [OSUSER_SFTP_GROUP]
OSUSER_UPLOAD_SERVER = get_env_variable(
'GVA_OSUSER_UPLOADSERVER', default='file')
OSUSER_UPLOAD_SERVER = get_env_variable("GVA_OSUSER_UPLOADSERVER", default="file")
GVA_LINK_WEBMAIL = get_env_variable(
'GVA_WEBMAIL_URL', default='https://webmail.example.org/')
"GVA_WEBMAIL_URL", default="https://webmail.example.org/"
)
GVA_LINK_PHPMYADMIN = get_env_variable(
'GVA_PHPMYADMIN_URL', default='https://phpmyadmin.example.org/')
"GVA_PHPMYADMIN_URL", default="https://phpmyadmin.example.org/"
)
GVA_LINK_PHPPGADMIN = get_env_variable(
'GVA_PHPPGADMIN_URL', default='https://phppgadmin.example.org/')
"GVA_PHPPGADMIN_URL", default="https://phppgadmin.example.org/"
)
# ######### END CUSTOM APP CONFIGURATION
GVA_ENVIRONMENT = get_env_variable('GVA_ENVIRONMENT', default='prod')
GVA_ENVIRONMENT = get_env_variable("GVA_ENVIRONMENT", default="prod")
# ######### STATIC FILE CONFIGURATION
# See: https://docs.djangoproject.com/en/dev/ref/settings/#static-root
STATIC_ROOT = '/srv/gnuviechadmin/static/'
STATIC_ROOT = "/srv/gnuviechadmin/static/"
def show_debug_toolbar(request):
return DEBUG == True and GVA_ENVIRONMENT == 'local'
return DEBUG == True and GVA_ENVIRONMENT == "local"
if GVA_ENVIRONMENT == 'local':
if GVA_ENVIRONMENT == "local":
# ######### DEBUG CONFIGURATION
# See: https://docs.djangoproject.com/en/dev/ref/settings/#debug
DEBUG = True
# See: https://docs.djangoproject.com/en/dev/ref/settings/#template-debug
TEMPLATES[0]['OPTIONS']['debug'] = DEBUG
TEMPLATES[0]["OPTIONS"]["debug"] = DEBUG
# ######### END DEBUG CONFIGURATION
# ######### EMAIL CONFIGURATION
# See: https://docs.djangoproject.com/en/dev/ref/settings/#email-backend
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
EMAIL_BACKEND = "django.core.mail.backends.console.EmailBackend"
# ######### END EMAIL CONFIGURATION
# ######### CACHE CONFIGURATION
# See: https://docs.djangoproject.com/en/dev/ref/settings/#caches
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
}
}
CACHES = {"default": {"BACKEND": "django.core.cache.backends.locmem.LocMemCache"}}
# ######### END CACHE CONFIGURATION
# ######### TOOLBAR CONFIGURATION
# See: http://django-debug-toolbar.readthedocs.org/en/latest/installation.html#explicit-setup # noqa
INSTALLED_APPS += (
'debug_toolbar',
)
MIDDLEWARE += [
'debug_toolbar.middleware.DebugToolbarMiddleware',
]
LOGGING['handlers'].update({
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler',
'formatter': 'simple',
INSTALLED_APPS += ("debug_toolbar",)
MIDDLEWARE += ["debug_toolbar.middleware.DebugToolbarMiddleware"]
LOGGING["handlers"].update(
{
"console": {
"level": "DEBUG",
"class": "logging.StreamHandler",
"formatter": "simple",
}
}
})
LOGGING['loggers'].update(dict(
[(key, {'handlers': ['console'], 'level': 'DEBUG', 'propagate': True, })
for key in [
'dashboard', 'domains', 'fileservertasks', 'gvacommon',
'gvawebcore', 'hostingpackages', 'ldaptasks', 'managemails',
'mysqltasks', 'osusers', 'pgsqltasks', 'taskresults',
'userdbs', 'websites']]))
)
LOGGING["loggers"].update(
dict(
[
(key, {"handlers": ["console"], "level": "DEBUG", "propagate": True})
for key in [
"dashboard",
"domains",
"fileservertasks",
"gvacommon",
"gvawebcore",
"hostingpackages",
"ldaptasks",
"managemails",
"mysqltasks",
"osusers",
"pgsqltasks",
"taskresults",
"userdbs",
"websites",
]
]
)
)
DEBUG_TOOLBAR_PATCH_SETTINGS = False
DEBUG_TOOLBAR_CONFIG = {
'SHOW_TOOLBAR_CALLBACK': 'gnuviechadmin.settings.show_debug_toolbar',
"SHOW_TOOLBAR_CALLBACK": "gnuviechadmin.settings.show_debug_toolbar"
}
# ######### END TOOLBAR CONFIGURATION
elif GVA_ENVIRONMENT == 'test':
PASSWORD_HASHERS = (
'django.contrib.auth.hashers.MD5PasswordHasher',
)
LOGGING['handlers'].update({
'console': {
'level': 'ERROR',
'class': 'logging.StreamHandler',
'formatter': 'simple',
elif GVA_ENVIRONMENT == "test":
PASSWORD_HASHERS = ("django.contrib.auth.hashers.MD5PasswordHasher",)
LOGGING["handlers"].update(
{
"console": {
"level": "ERROR",
"class": "logging.StreamHandler",
"formatter": "simple",
}
}
})
LOGGING['loggers'].update(dict(
[(key, {'handlers': ['console'], 'level': 'ERROR', 'propagate': True, })
for key in [
'dashboard', 'domains', 'fileservertasks', 'gvacommon',
'gvawebcore', 'hostingpackages', 'ldaptasks', 'managemails',
'mysqltasks', 'osusers', 'pgsqltasks', 'taskresults',
'userdbs', 'websites']]))
BROKER_URL = BROKER_URL + '_test'
)
LOGGING["loggers"].update(
dict(
[
(key, {"handlers": ["console"], "level": "ERROR", "propagate": True})
for key in [
"dashboard",
"domains",
"fileservertasks",
"gvacommon",
"gvawebcore",
"hostingpackages",
"ldaptasks",
"managemails",
"mysqltasks",
"osusers",
"pgsqltasks",
"taskresults",
"userdbs",
"websites",
]
]
)
)
BROKER_URL = BROKER_URL + "_test"
CELERY_RESULT_PERSISTENT = False
else:
# ######### HOST CONFIGURATION
@ -459,18 +474,18 @@ else:
# ######### EMAIL CONFIGURATION
# See: https://docs.djangoproject.com/en/dev/ref/settings/#email-backend
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_BACKEND = "django.core.mail.backends.smtp.EmailBackend"
# See: https://docs.djangoproject.com/en/dev/ref/settings/#email-subject-prefix
EMAIL_SUBJECT_PREFIX = '[%s] ' % SITE_NAME
EMAIL_SUBJECT_PREFIX = "[%s] " % SITE_NAME
# See: https://docs.djangoproject.com/en/dev/ref/settings/#default-from-email
DEFAULT_FROM_EMAIL = get_env_variable(
'GVA_SITE_ADMINMAIL', default='admin@example.org')
"GVA_SITE_ADMINMAIL", default="admin@example.org"
)
# See: https://docs.djangoproject.com/en/dev/ref/settings/#server-email
SERVER_EMAIL = get_env_variable(
'GVA_SITE_ADMINMAIL', default='admin@example.org')
SERVER_EMAIL = get_env_variable("GVA_SITE_ADMINMAIL", default="admin@example.org")
# ######### END EMAIL CONFIGURATION
# ######### CACHE CONFIGURATION
@ -479,6 +494,6 @@ else:
# ######### END CACHE CONFIGURATION
# ######### ALLAUTH PRODUCTION CONFIGURATION
ACCOUNT_EMAIL_SUBJECT_PREFIX = '[Jan Dittberner IT-Consulting & -Solutions] '
ACCOUNT_DEFAULT_HTTP_PROTOCOL = 'https'
ACCOUNT_EMAIL_SUBJECT_PREFIX = "[Jan Dittberner IT-Consulting & -Solutions] "
ACCOUNT_DEFAULT_HTTP_PROTOCOL = "https"
# ######### END ALLAUTH PRODUCTION CONFIGURATION

View file

@ -5,14 +5,13 @@ This module contains tests for :py:mod:`gnuviechadmin.context_processors`.
"""
from mock import MagicMock
from unittest.mock import MagicMock
from django.conf import settings
from django.core.urlresolvers import reverse
from django.contrib.auth import get_user_model
from django.http import HttpRequest
from django.test import TestCase
from django.contrib.auth import get_user_model
from django.urls import reverse
from gnuviechadmin import __version__ as gvaversion
from gnuviechadmin.context_processors import navigation
@ -22,48 +21,40 @@ User = get_user_model()
class NavigationContextProcessorTest(TestCase):
EXPECTED_ITEMS = (
'webmail_url', 'phpmyadmin_url', 'phppgadmin_url',
'active_item'
)
EXPECTED_ITEMS = ("webmail_url", "phpmyadmin_url", "phppgadmin_url", "active_item")
def test_ajax_request(self):
response = self.client.get(
'/', HTTP_X_REQUESTED_WITH='XMLHttpRequest')
response = self.client.get("/", HTTP_X_REQUESTED_WITH="XMLHttpRequest")
for item in self.EXPECTED_ITEMS:
self.assertNotIn(item, response.context)
def _check_static_urls(self, context):
self.assertEqual(
context['webmail_url'], settings.GVA_LINK_WEBMAIL)
self.assertEqual(
context['phpmyadmin_url'], settings.GVA_LINK_PHPMYADMIN)
self.assertEqual(
context['phppgadmin_url'], settings.GVA_LINK_PHPPGADMIN)
self.assertEqual(context["webmail_url"], settings.GVA_LINK_WEBMAIL)
self.assertEqual(context["phpmyadmin_url"], settings.GVA_LINK_PHPMYADMIN)
self.assertEqual(context["phppgadmin_url"], settings.GVA_LINK_PHPPGADMIN)
def test_index_page_context(self):
response = self.client.get('/')
response = self.client.get("/")
for item in self.EXPECTED_ITEMS:
self.assertIn(item, response.context)
self._check_static_urls(response.context)
self.assertEqual(response.context['active_item'], 'dashboard')
self.assertEqual(response.context["active_item"], "dashboard")
def test_contact_page_context(self):
response = self.client.get(reverse('contact_form'))
response = self.client.get(reverse("contact_form"))
for item in self.EXPECTED_ITEMS:
self.assertIn(item, response.context)
self._check_static_urls(response.context)
self.assertEqual(response.context['active_item'], 'contact')
self.assertEqual(response.context["active_item"], "contact")
def test_hostingpackage_page_context(self):
User.objects.create_user('test', password='test')
self.client.login(username='test', password='test')
response = self.client.get(
reverse('hosting_packages', kwargs={'user': 'test'}))
User.objects.create_user("test", password="test")
self.client.login(username="test", password="test")
response = self.client.get(reverse("hosting_packages", kwargs={"user": "test"}))
for item in self.EXPECTED_ITEMS:
self.assertIn(item, response.context)
self._check_static_urls(response.context)
self.assertEqual(response.context['active_item'], 'hostingpackage')
self.assertEqual(response.context["active_item"], "hostingpackage")
def _test_page_context_by_viewmodule(self, viewmodule, expecteditem):
request = HttpRequest()
@ -73,57 +64,48 @@ class NavigationContextProcessorTest(TestCase):
for item in self.EXPECTED_ITEMS:
self.assertIn(item, context)
self._check_static_urls(context)
self.assertEqual(context['active_item'], expecteditem)
self.assertEqual(context["active_item"], expecteditem)
def test_osusers_page_context(self):
self._test_page_context_by_viewmodule(
'osusers.views', 'hostingpackage')
self._test_page_context_by_viewmodule("osusers.views", "hostingpackage")
def test_userdbs_page_context(self):
self._test_page_context_by_viewmodule(
'userdbs.views', 'hostingpackage')
self._test_page_context_by_viewmodule("userdbs.views", "hostingpackage")
def test_managemails_page_context(self):
self._test_page_context_by_viewmodule(
'managemails.views', 'hostingpackage')
self._test_page_context_by_viewmodule("managemails.views", "hostingpackage")
def test_websites_page_context(self):
self._test_page_context_by_viewmodule(
'websites.views', 'hostingpackage')
self._test_page_context_by_viewmodule("websites.views", "hostingpackage")
def test_domains_page_context(self):
self._test_page_context_by_viewmodule(
'domains.views', 'hostingpackage')
self._test_page_context_by_viewmodule("domains.views", "hostingpackage")
def test_allauth_account_page_context(self):
self._test_page_context_by_viewmodule(
'allauth.account.views', 'account')
self._test_page_context_by_viewmodule("allauth.account.views", "account")
def test_allauth_socialaccount_page_context(self):
self._test_page_context_by_viewmodule(
'allauth.socialaccount.views', 'account')
self._test_page_context_by_viewmodule("allauth.socialaccount.views", "account")
def test_imprint_page_context(self):
response = self.client.get(reverse('imprint'))
response = self.client.get(reverse("imprint"))
for item in self.EXPECTED_ITEMS:
self.assertIn(item, response.context)
self._check_static_urls(response.context)
self.assertEqual(response.context['active_item'], 'imprint')
self.assertEqual(response.context["active_item"], "imprint")
def test_no_resolver_match(self):
request = HttpRequest()
context = navigation(request)
self._check_static_urls(context)
self.assertEqual(context['active_item'], 'dashboard')
self.assertEqual(context["active_item"], "dashboard")
def test_admin_module(self):
self._test_page_context_by_viewmodule(
'django.contrib.admin.foo', 'dashboard')
self._test_page_context_by_viewmodule("django.contrib.admin.foo", "dashboard")
class VersionInfoContextProcessorTest(TestCase):
def test_version_info_in_context(self):
response = self.client.get('/')
self.assertIn('gnuviechadmin_version', response.context)
self.assertEqual(response.context['gnuviechadmin_version'], gvaversion)
response = self.client.get("/")
self.assertIn("gnuviechadmin_version", response.context)
self.assertEqual(response.context["gnuviechadmin_version"], gvaversion)

View file

@ -5,25 +5,26 @@ This module contains tests for :py:mod:`gvawebcore.forms`.
from unittest import TestCase
from gvawebcore.forms import PasswordModelFormMixin, PASSWORD_MISMATCH_ERROR
from gvawebcore.forms import PASSWORD_MISMATCH_ERROR, PasswordModelFormMixin
class PasswordModelFormMixinTest(TestCase):
def test_form_properties(self):
form = PasswordModelFormMixin()
self.assertIn('password1', form.fields)
self.assertIn('password2', form.fields)
self.assertIn("password1", form.fields)
self.assertIn("password2", form.fields)
def test_clean_password_same(self):
form = PasswordModelFormMixin(data={
'password1': 'secret', 'password2': 'secret'})
form = PasswordModelFormMixin(
data={"password1": "secret", "password2": "secret"}
)
self.assertTrue(form.is_valid())
self.assertEqual('secret', form.clean_password2())
self.assertEqual("secret", form.clean_password2())
def test_clean_password_different(self):
form = PasswordModelFormMixin(data={
'password1': 'onesecret', 'password2': 'other'})
form = PasswordModelFormMixin(
data={"password1": "onesecret", "password2": "other"}
)
self.assertFalse(form.is_valid())
self.assertIn('password2', form.errors)
self.assertIn(PASSWORD_MISMATCH_ERROR, form.errors['password2'])
self.assertIn("password2", form.errors)
self.assertIn(PASSWORD_MISMATCH_ERROR, form.errors["password2"])

View file

@ -4,31 +4,29 @@ This model contains tests for :py:mod:`gvawebcore.views`.
"""
from unittest import TestCase
from mock import patch, Mock
from unittest.mock import Mock, patch
from gvawebcore.views import HostingPackageAndCustomerMixin
class HostingPackageAndCustomerMixinTest(TestCase):
class TestView(HostingPackageAndCustomerMixin):
kwargs = {'package': '1'}
kwargs = {"package": "1"}
@patch('gvawebcore.views.get_object_or_404')
@patch("gvawebcore.views.get_object_or_404")
def test_get_hosting_package(self, get_object_or_404):
get_object_or_404.return_value = 'A package'
get_object_or_404.return_value = "A package"
view = self.TestView()
self.assertEqual('A package', view.get_hosting_package())
self.assertEqual("A package", view.get_hosting_package())
def test_get_hosting_package_cached(self):
view = self.TestView()
view.hostingpackage = 'Cached package'
self.assertEqual('Cached package', view.get_hosting_package())
view.hostingpackage = "Cached package"
self.assertEqual("Cached package", view.get_hosting_package())
@patch('gvawebcore.views.get_object_or_404')
@patch("gvawebcore.views.get_object_or_404")
def test_get_customer_object(self, get_object_or_404):
get_object_or_404.return_value = Mock(customer='A customer')
get_object_or_404.return_value = Mock(customer="A customer")
view = self.TestView()
self.assertEqual('A customer', view.get_customer_object())
self.assertEqual("A customer", view.get_customer_object())

View file

@ -16,37 +16,24 @@ from model_utils.models import TimeStampedModel
from domains.models import HostingDomain
from managemails.models import Mailbox
from osusers.models import (
AdditionalGroup,
Group,
User as OsUser,
)
from userdbs.models import (
DB_TYPES,
UserDatabase,
)
from osusers.models import AdditionalGroup, Group, User as OsUser
from userdbs.models import DB_TYPES, UserDatabase
DISK_SPACE_UNITS = Choices(
(0, 'M', _('MiB')),
(1, 'G', _('GiB')),
(2, 'T', _('TiB')),
)
DISK_SPACE_UNITS = Choices((0, "M", _("MiB")), (1, "G", _("GiB")), (2, "T", _("TiB")))
DISK_SPACE_FACTORS = (
(1, None, None),
(1024, 1, None),
(1024 * 1024, 1024, 1),
)
DISK_SPACE_FACTORS = ((1, None, None), (1024, 1, None), (1024 * 1024, 1024, 1))
@python_2_unicode_compatible
class HostingPackageBase(TimeStampedModel):
description = models.TextField(_('description'), blank=True)
mailboxcount = models.PositiveIntegerField(_('mailbox count'))
description = models.TextField(_("description"), blank=True)
mailboxcount = models.PositiveIntegerField(_("mailbox count"))
diskspace = models.PositiveIntegerField(
_('disk space'), help_text=_('disk space for the hosting package'))
_("disk space"), help_text=_("disk space for the hosting package")
)
diskspace_unit = models.PositiveSmallIntegerField(
_('unit of disk space'), choices=DISK_SPACE_UNITS)
_("unit of disk space"), choices=DISK_SPACE_UNITS
)
class Meta:
abstract = True
@ -56,11 +43,11 @@ class HostingPackageBase(TimeStampedModel):
class HostingPackageTemplate(HostingPackageBase):
name = models.CharField(_('name'), max_length=128, unique=True)
name = models.CharField(_("name"), max_length=128, unique=True)
class Meta:
verbose_name = _('Hosting package')
verbose_name_plural = _('Hosting packages')
verbose_name = _("Hosting package")
verbose_name_plural = _("Hosting packages")
class HostingOption(TimeStampedModel):
@ -72,19 +59,21 @@ class HostingOption(TimeStampedModel):
@python_2_unicode_compatible
class DiskSpaceOptionBase(models.Model):
diskspace = models.PositiveIntegerField(_('disk space'))
diskspace = models.PositiveIntegerField(_("disk space"))
diskspace_unit = models.PositiveSmallIntegerField(
_('unit of disk space'), choices=DISK_SPACE_UNITS)
_("unit of disk space"), choices=DISK_SPACE_UNITS
)
class Meta:
abstract = True
ordering = ['diskspace_unit', 'diskspace']
verbose_name = _('Disk space option')
verbose_name_plural = _('Disk space options')
ordering = ["diskspace_unit", "diskspace"]
verbose_name = _("Disk space option")
verbose_name_plural = _("Disk space options")
def __str__(self):
return _("Additional disk space {space} {unit}").format(
space=self.diskspace, unit=self.get_diskspace_unit_display())
space=self.diskspace, unit=self.get_diskspace_unit_display()
)
class DiskSpaceOption(DiskSpaceOptionBase, HostingOption):
@ -95,30 +84,24 @@ class DiskSpaceOption(DiskSpaceOptionBase, HostingOption):
"""
class Meta:
unique_together = ['diskspace', 'diskspace_unit']
unique_together = ["diskspace", "diskspace_unit"]
@python_2_unicode_compatible
class UserDatabaseOptionBase(models.Model):
number = models.PositiveIntegerField(
_('number of databases'), default=1)
db_type = models.PositiveSmallIntegerField(
_('database type'), choices=DB_TYPES)
number = models.PositiveIntegerField(_("number of databases"), default=1)
db_type = models.PositiveSmallIntegerField(_("database type"), choices=DB_TYPES)
class Meta:
abstract = True
ordering = ['db_type', 'number']
verbose_name = _('Database option')
verbose_name_plural = _('Database options')
ordering = ["db_type", "number"]
verbose_name = _("Database option")
verbose_name_plural = _("Database options")
def __str__(self):
return ungettext(
'{type} database',
'{count} {type} databases',
self.number
).format(
type=self.get_db_type_display(), count=self.number
)
"{type} database", "{count} {type} databases", self.number
).format(type=self.get_db_type_display(), count=self.number)
class UserDatabaseOption(UserDatabaseOptionBase, HostingOption):
@ -129,7 +112,7 @@ class UserDatabaseOption(UserDatabaseOptionBase, HostingOption):
"""
class Meta:
unique_together = ['number', 'db_type']
unique_together = ["number", "db_type"]
@python_2_unicode_compatible
@ -138,23 +121,19 @@ class MailboxOptionBase(models.Model):
Base class for mailbox options.
"""
number = models.PositiveIntegerField(
_('number of mailboxes'), unique=True)
number = models.PositiveIntegerField(_("number of mailboxes"), unique=True)
class Meta:
abstract = True
ordering = ['number']
verbose_name = _('Mailbox option')
verbose_name_plural = _('Mailbox options')
ordering = ["number"]
verbose_name = _("Mailbox option")
verbose_name_plural = _("Mailbox options")
def __str__(self):
return ungettext(
'{count} additional mailbox',
'{count} additional mailboxes',
self.number
).format(
count=self.number
)
"{count} additional mailbox", "{count} additional mailboxes", self.number
).format(count=self.number)
class MailboxOption(MailboxOptionBase, HostingOption):
@ -189,10 +168,11 @@ class CustomerHostingPackageManager(models.Manager):
"""
package = CustomerHostingPackage(
customer=customer, template=template, name=name)
customer=customer, template=template, name=name
)
package.description = template.description
package.copy_template_attributes()
if 'commit' in kwargs and kwargs['commit'] is True:
if "commit" in kwargs and kwargs["commit"] is True:
package.save(**kwargs)
return package
@ -203,45 +183,49 @@ class CustomerHostingPackage(HostingPackageBase):
This class defines customer specific hosting packages.
"""
customer = models.ForeignKey(
settings.AUTH_USER_MODEL, verbose_name=_('customer'),
on_delete=models.CASCADE)
settings.AUTH_USER_MODEL, verbose_name=_("customer"), on_delete=models.CASCADE
)
template = models.ForeignKey(
HostingPackageTemplate, verbose_name=_('hosting package template'),
HostingPackageTemplate,
verbose_name=_("hosting package template"),
help_text=_(
'The hosting package template that this hosting package is based'
' on'
"The hosting package template that this hosting package is based" " on"
),
on_delete=models.CASCADE)
name = models.CharField(_('name'), max_length=128)
on_delete=models.CASCADE,
)
name = models.CharField(_("name"), max_length=128)
osuser = models.OneToOneField(
OsUser, verbose_name=_('Operating system user'),
blank=True, null=True, on_delete=models.CASCADE)
OsUser,
verbose_name=_("Operating system user"),
blank=True,
null=True,
on_delete=models.CASCADE,
)
objects = CustomerHostingPackageManager()
class Meta:
unique_together = ['customer', 'name']
verbose_name = _('customer hosting package')
verbose_name_plural = _('customer hosting packages')
unique_together = ["customer", "name"]
verbose_name = _("customer hosting package")
verbose_name_plural = _("customer hosting packages")
def __str__(self):
return _("{name} for {customer}").format(
name=self.name, customer=self.customer
)
return _("{name} for {customer}").format(name=self.name, customer=self.customer)
def get_absolute_url(self):
return reverse('hosting_package_details', kwargs={
'user': self.customer.username,
'pk': self.id,
})
return reverse(
"hosting_package_details",
kwargs={"user": self.customer.username, "pk": self.id},
)
def copy_template_attributes(self):
"""
Copy the attributes of the hosting package's template to the package.
"""
for attrname in ('diskspace', 'diskspace_unit', 'mailboxcount'):
for attrname in ("diskspace", "diskspace_unit", "mailboxcount"):
setattr(self, attrname, getattr(self.template, attrname))
def get_hostingoptions(self):
@ -249,7 +233,7 @@ class CustomerHostingPackage(HostingPackageBase):
for opt_type in [
CustomerDiskSpaceOption,
CustomerMailboxOption,
CustomerUserDatabaseOption
CustomerUserDatabaseOption,
]:
opts.extend(opt_type.objects.filter(hosting_package=self))
return opts
@ -276,13 +260,13 @@ class CustomerHostingPackage(HostingPackageBase):
diskspace += option.diskspace
elif option.diskspace_unit > min_unit:
diskspace += (
DISK_SPACE_FACTORS[option.diskspace_unit][min_unit] *
option.diskspace)
DISK_SPACE_FACTORS[option.diskspace_unit][min_unit]
* option.diskspace
)
else:
diskspace = (
DISK_SPACE_FACTORS[min_unit][
option.diskspace_unit] *
diskspace) + option.diskspace
DISK_SPACE_FACTORS[min_unit][option.diskspace_unit] * diskspace
) + option.diskspace
min_unit = option.diskspace_unit
if unit is None:
return DISK_SPACE_FACTORS[min_unit][0] * diskspace * 1024 ** 2
@ -302,16 +286,16 @@ class CustomerHostingPackage(HostingPackageBase):
"""
if unit is None:
return (DISK_SPACE_FACTORS[self.diskspace_unit][0] *
self.diskspace * 1024 ** 2)
return (
DISK_SPACE_FACTORS[self.diskspace_unit][0] * self.diskspace * 1024 ** 2
)
if unit > self.diskspace_unit:
return (DISK_SPACE_FACTORS[unit][self.diskspace_unit] *
self.diskspace)
return DISK_SPACE_FACTORS[unit][self.diskspace_unit] * self.diskspace
return DISK_SPACE_FACTORS[self.diskspace_unit][unit] * self.diskspace
def get_quota(self):
soft = 1024 * self.get_disk_space(DISK_SPACE_UNITS.M)
hard = soft * 105 / 100
hard = soft * 105 // 100
return (soft, hard)
def get_mailboxes(self):
@ -337,12 +321,10 @@ class CustomerHostingPackage(HostingPackageBase):
of its mailbox options.
"""
result = CustomerMailboxOption.objects.filter(
hosting_package=self
).aggregate(
mailbox_sum=models.Sum('number')
result = CustomerMailboxOption.objects.filter(hosting_package=self).aggregate(
mailbox_sum=models.Sum("number")
)
return self.mailboxcount + (result['mailbox_sum'] or 0)
return self.mailboxcount + (result["mailbox_sum"] or 0)
mailbox_count = property(get_mailbox_count)
@ -355,25 +337,23 @@ class CustomerHostingPackage(HostingPackageBase):
options for this hosting package.
"""
return CustomerUserDatabaseOption.objects.values(
'db_type'
).filter(hosting_package=self).annotate(
number=models.Sum('number')
).all()
return (
CustomerUserDatabaseOption.objects.values("db_type")
.filter(hosting_package=self)
.annotate(number=models.Sum("number"))
.all()
)
def get_databases_flat(self):
if self.osuser:
return UserDatabase.objects.filter(
db_user__osuser=self.osuser).all()
return UserDatabase.objects.filter(db_user__osuser=self.osuser).all()
databases = property(get_databases_flat)
def may_add_database(self):
return (
CustomerUserDatabaseOption.objects.filter(
hosting_package=self).count() >
UserDatabase.objects.filter(
db_user__osuser=self.osuser).count()
CustomerUserDatabaseOption.objects.filter(hosting_package=self).count()
> UserDatabase.objects.filter(db_user__osuser=self.osuser).count()
)
@transaction.atomic
@ -409,12 +389,16 @@ class CustomerHostingPackageDomain(TimeStampedModel):
domain.
"""
hosting_package = models.ForeignKey(
CustomerHostingPackage, verbose_name=_('hosting package'),
related_name='domains', on_delete=models.CASCADE)
CustomerHostingPackage,
verbose_name=_("hosting package"),
related_name="domains",
on_delete=models.CASCADE,
)
domain = models.OneToOneField(
HostingDomain, verbose_name=_('hosting domain'),
on_delete=models.CASCADE)
HostingDomain, verbose_name=_("hosting domain"), on_delete=models.CASCADE
)
def __str__(self):
return self.domain.domain
@ -432,60 +416,62 @@ class CustomerHostingPackageOption(TimeStampedModel):
This class defines options for customer hosting packages.
"""
hosting_package = models.ForeignKey(
CustomerHostingPackage, verbose_name=_('hosting package'),
on_delete=models.CASCADE)
CustomerHostingPackage,
verbose_name=_("hosting package"),
on_delete=models.CASCADE,
)
class Meta:
verbose_name = _('customer hosting option')
verbose_name_plural = _('customer hosting options')
verbose_name = _("customer hosting option")
verbose_name_plural = _("customer hosting options")
class CustomerDiskSpaceOption(DiskSpaceOptionBase,
CustomerHostingPackageOption):
class CustomerDiskSpaceOption(DiskSpaceOptionBase, CustomerHostingPackageOption):
"""
This is a class for customer hosting package options adding additional disk
space to existing customer hosting package.
"""
template = models.ForeignKey(
DiskSpaceOption,
verbose_name=_('disk space option template'),
verbose_name=_("disk space option template"),
help_text=_(
'The disk space option template that this disk space option is'
' based on'
"The disk space option template that this disk space option is" " based on"
),
on_delete=models.CASCADE)
on_delete=models.CASCADE,
)
class CustomerUserDatabaseOption(UserDatabaseOptionBase,
CustomerHostingPackageOption):
class CustomerUserDatabaseOption(UserDatabaseOptionBase, CustomerHostingPackageOption):
"""
This is a class for customer hosting package options adding user databases
to existing customer hosting packages.
"""
template = models.ForeignKey(
UserDatabaseOption,
verbose_name=_('user database option template'),
verbose_name=_("user database option template"),
help_text=_(
'The user database option template that this database option is'
' based on'
"The user database option template that this database option is" " based on"
),
on_delete=models.CASCADE)
on_delete=models.CASCADE,
)
class CustomerMailboxOption(MailboxOptionBase,
CustomerHostingPackageOption):
class CustomerMailboxOption(MailboxOptionBase, CustomerHostingPackageOption):
"""
This is a class for customer hosting package options adding additional
mailboxes to existing customer hosting packages.
"""
template = models.ForeignKey(
MailboxOption,
verbose_name=_('mailbox option template'),
help_text=_(
'The mailbox option template that this mailbox option is based on'
),
on_delete=models.CASCADE)
verbose_name=_("mailbox option template"),
help_text=_("The mailbox option template that this mailbox option is based on"),
on_delete=models.CASCADE,
)

View file

@ -5,10 +5,7 @@ Test for models.
from django.test import TestCase
from hostingpackages.models import (
DISK_SPACE_UNITS,
CustomerHostingPackage,
)
from hostingpackages.models import DISK_SPACE_UNITS, CustomerHostingPackage
class CustomerHostingPackageTest(TestCase):
@ -16,7 +13,7 @@ class CustomerHostingPackageTest(TestCase):
package = CustomerHostingPackage(
diskspace=10, diskspace_unit=DISK_SPACE_UNITS.G
)
self.assertEqual(package.get_disk_space(), 10 * 1024 * 1024**2)
self.assertEqual(package.get_disk_space(), 10 * 1024 ** 3)
def test_get_disk_space_mib(self):
package = CustomerHostingPackage(

View file

@ -1,14 +1,14 @@
from django import forms
from django.core.urlresolvers import reverse
from django.test import TestCase
from django.test.utils import override_settings
from django.urls import reverse
from django.utils.html import format_html
from django.utils.translation import ugettext as _
from django.contrib.admin import AdminSite
from django.contrib.auth import get_user_model
from mock import Mock
from unittest.mock import Mock
from osusers.models import User
@ -21,9 +21,7 @@ from managemails.admin import (
ReadOnlyPasswordHashField,
ReadOnlyPasswordHashWidget,
)
from managemails.models import (
Mailbox,
)
from managemails.models import Mailbox
Customer = get_user_model()
@ -31,14 +29,14 @@ Customer = get_user_model()
class ReadOnlyPasswordHashWidgetTest(TestCase):
def test_render(self):
widget = ReadOnlyPasswordHashWidget()
rendered = widget.render('password', 'secret', {'class': 'test'})
rendered = widget.render("password", "secret", {"class": "test"})
self.assertEqual(
rendered,
format_html(
'<div class="test">{0}</div>',
format_html('<strong>{0}</strong>: secret ',
_('Hash'))
))
format_html("<strong>{0}</strong>: secret ", _("Hash")),
),
)
class ReadOnlyPasswordHashFieldTest(TestCase):
@ -48,24 +46,24 @@ class ReadOnlyPasswordHashFieldTest(TestCase):
def test_bound_data(self):
field = ReadOnlyPasswordHashField()
self.assertEqual(field.bound_data('new', 'old'), 'old')
self.assertEqual(field.bound_data("new", "old"), "old")
def test__has_changed(self):
field = ReadOnlyPasswordHashField()
self.assertFalse(field.has_changed('new', 'old'))
self.assertFalse(field.has_changed("new", "old"))
class CustomerTestCase(TestCase):
def setUp(self):
super(CustomerTestCase, self).setUp()
self.customer = Customer.objects.create(username='test')
self.customer = Customer.objects.create(username="test")
class MailboxCreationFormTest(CustomerTestCase):
def test_clean_password2_same(self):
form = MailboxCreationForm()
form.cleaned_data = {'password1': 'secret', 'password2': 'secret'}
self.assertEqual(form.clean_password2(), 'secret')
form.cleaned_data = {"password1": "secret", "password2": "secret"}
self.assertEqual(form.clean_password2(), "secret")
def test_clean_password2_empty(self):
form = MailboxCreationForm()
@ -74,59 +72,47 @@ class MailboxCreationFormTest(CustomerTestCase):
def test_clean_password2_mismatch(self):
form = MailboxCreationForm()
form.cleaned_data = {'password1': 'secretx', 'password2': 'secrety'}
form.cleaned_data = {"password1": "secretx", "password2": "secrety"}
with self.assertRaises(forms.ValidationError) as cm:
form.clean_password2()
self.assertEqual(cm.exception.message, PASSWORD_MISMATCH_ERROR)
@override_settings(
CELERY_ALWAYS_EAGER=True,
CELERY_CACHE_BACKEND='memory',
BROKER_BACKEND='memory'
CELERY_ALWAYS_EAGER=True, CELERY_CACHE_BACKEND="memory", BROKER_BACKEND="memory"
)
def test_save_commit(self):
user = User.objects.create_user(customer=self.customer)
form = MailboxCreationForm(data={
'osuser': user.uid,
'password1': 'secret',
'password2': 'secret',
})
form = MailboxCreationForm(
data={"osuser": user.uid, "password1": "secret", "password2": "secret"}
)
mailbox = form.save()
self.assertIsNotNone(mailbox)
self.assertEqual(
len(Mailbox.objects.filter(osuser=user)), 1)
self.assertEqual(len(Mailbox.objects.filter(osuser=user)), 1)
@override_settings(
CELERY_ALWAYS_EAGER=True,
CELERY_CACHE_BACKEND='memory',
BROKER_BACKEND='memory'
CELERY_ALWAYS_EAGER=True, CELERY_CACHE_BACKEND="memory", BROKER_BACKEND="memory"
)
def test_save_no_commit(self):
user = User.objects.create_user(customer=self.customer)
form = MailboxCreationForm(data={
'osuser': user.uid,
'password1': 'secret',
'password2': 'secret',
})
form = MailboxCreationForm(
data={"osuser": user.uid, "password1": "secret", "password2": "secret"}
)
mailbox = form.save(commit=False)
self.assertIsNotNone(mailbox)
self.assertEqual(
len(Mailbox.objects.filter(osuser=user)), 0)
self.assertEqual(len(Mailbox.objects.filter(osuser=user)), 0)
class MailboxChangeFormTest(CustomerTestCase):
@override_settings(
CELERY_ALWAYS_EAGER=True,
CELERY_CACHE_BACKEND='memory',
BROKER_BACKEND='memory'
CELERY_ALWAYS_EAGER=True, CELERY_CACHE_BACKEND="memory", BROKER_BACKEND="memory"
)
def test_clean_password(self):
mailbox = Mailbox(
username='test',
osuser=User.objects.create_user(customer=self.customer))
mailbox.set_password('test')
username="test", osuser=User.objects.create_user(customer=self.customer)
)
mailbox.set_password("test")
mailbox.save()
form = MailboxChangeForm(instance=mailbox, data={'password': 'blub'})
form = MailboxChangeForm(instance=mailbox, data={"password": "blub"})
self.assertEqual(form.clean_password(), mailbox.password)
@ -151,55 +137,43 @@ class MailBoxAdminTest(CustomerTestCase):
self.mbadmin = MailboxAdmin(Mailbox, site)
def test_get_fieldsets_without_object(self):
self.assertEqual(
self.mbadmin.get_fieldsets(Mock()),
self.mbadmin.add_fieldsets)
self.assertEqual(self.mbadmin.get_fieldsets(Mock()), self.mbadmin.add_fieldsets)
@override_settings(
CELERY_ALWAYS_EAGER=True,
CELERY_CACHE_BACKEND='memory',
BROKER_BACKEND='memory'
CELERY_ALWAYS_EAGER=True, CELERY_CACHE_BACKEND="memory", BROKER_BACKEND="memory"
)
def test_get_fieldsets_with_object(self):
mailbox = Mailbox(
username='test',
osuser=User.objects.create_user(customer=self.customer))
mailbox.set_password('test')
username="test", osuser=User.objects.create_user(customer=self.customer)
)
mailbox.set_password("test")
mailbox.save()
self.assertEqual(
self.mbadmin.get_fieldsets(Mock(), mailbox),
self.mbadmin.fieldsets)
self.mbadmin.get_fieldsets(Mock(), mailbox), self.mbadmin.fieldsets
)
def test_get_form_without_object(self):
form = self.mbadmin.get_form(Mock)
self.assertEqual(
form.Meta.fields,
['osuser', 'password1', 'password2']
)
self.assertEqual(form.Meta.fields, ["osuser", "password1", "password2"])
@override_settings(
CELERY_ALWAYS_EAGER=True,
CELERY_CACHE_BACKEND='memory',
BROKER_BACKEND='memory'
CELERY_ALWAYS_EAGER=True, CELERY_CACHE_BACKEND="memory", BROKER_BACKEND="memory"
)
def test_get_form_with_object(self):
mailbox = Mailbox(
username='test',
osuser=User.objects.create_user(customer=self.customer))
mailbox.set_password('test')
username="test", osuser=User.objects.create_user(customer=self.customer)
)
mailbox.set_password("test")
mailbox.save()
form = self.mbadmin.get_form(Mock, mailbox)
self.assertEqual(
form.Meta.fields,
['osuser', 'username', 'password', 'active']
)
self.assertEqual(form.Meta.fields, ["osuser", "username", "password", "active"])
def test_admin_for_mailbox(self):
admin_url = reverse('admin:managemails_mailaddress_changelist')
admin_url = reverse("admin:managemails_mailaddress_changelist")
self.assertIsNotNone(admin_url)
class MailAddressAdminTest(TestCase):
def test_admin_for_mailaddress(self):
admin_url = reverse('admin:managemails_mailaddress_changelist')
admin_url = reverse("admin:managemails_mailaddress_changelist")
self.assertIsNotNone(admin_url)

View file

@ -2,13 +2,11 @@
This module provides tests for :py:mod:`managemails.forms`.
"""
from __future__ import absolute_import, unicode_literals
from unittest.mock import MagicMock, Mock, patch, ANY
from mock import MagicMock, Mock, patch, ANY
from django.core.urlresolvers import reverse
from django.forms import ValidationError
from django.test import TestCase
from django.urls import reverse
from managemails.forms import (
AddMailAddressForm,
@ -22,7 +20,6 @@ from managemails.forms import (
class CreateMailboxFormTest(TestCase):
def test_constructor_needs_hostingpackage(self):
instance = MagicMock()
with self.assertRaises(KeyError):
@ -32,33 +29,35 @@ class CreateMailboxFormTest(TestCase):
hostingpackage = Mock(id=42)
instance = MagicMock()
form = CreateMailboxForm(instance, hostingpackage=hostingpackage)
self.assertTrue(hasattr(form, 'hosting_package'))
self.assertTrue(hasattr(form, "hosting_package"))
self.assertEqual(form.hosting_package, hostingpackage)
self.assertTrue(hasattr(form, 'helper'))
self.assertEqual(form.helper.form_action, reverse(
'create_mailbox', kwargs={'package': 42}))
self.assertIn('password1', form.fields)
self.assertIn('password2', form.fields)
self.assertEqual(form.helper.inputs[0].name, 'submit')
self.assertTrue(hasattr(form, "helper"))
self.assertEqual(
form.helper.form_action, reverse("create_mailbox", kwargs={"package": 42})
)
self.assertIn("password1", form.fields)
self.assertIn("password2", form.fields)
self.assertEqual(form.helper.inputs[0].name, "submit")
@patch('managemails.forms.Mailbox.objects')
@patch("managemails.forms.Mailbox.objects")
def test_save(self, mailbox_objects):
osuser = MagicMock()
hostingpackage = Mock(id=42, osuser=osuser)
instance = MagicMock()
form = CreateMailboxForm(
instance=instance, hostingpackage=hostingpackage,
data={'password1': 'secret', 'password2': 'secret'})
mailbox_objects.get_next_mailbox_name.return_value = 'mailbox23'
instance=instance,
hostingpackage=hostingpackage,
data={"password1": "secret", "password2": "secret"},
)
mailbox_objects.get_next_mailbox_name.return_value = "mailbox23"
self.assertTrue(form.is_valid())
form.save(commit=False)
self.assertEqual(osuser, form.instance.osuser)
self.assertEqual('mailbox23', form.instance.username)
instance.set_password.assert_called_with('secret')
self.assertEqual("mailbox23", form.instance.username)
instance.set_password.assert_called_with("secret")
class ChangeMailboxPasswordFormTest(TestCase):
def test_constructor_needs_hostingpackage(self):
instance = MagicMock()
with self.assertRaises(KeyError):
@ -66,72 +65,75 @@ class ChangeMailboxPasswordFormTest(TestCase):
def test_constructor(self):
hostingpackage = Mock(id=42)
instance = MagicMock(username='testuser')
instance = MagicMock(username="testuser")
form = ChangeMailboxPasswordForm(
instance=instance, hostingpackage=hostingpackage)
self.assertTrue(hasattr(form, 'hosting_package'))
instance=instance, hostingpackage=hostingpackage
)
self.assertTrue(hasattr(form, "hosting_package"))
self.assertEqual(form.hosting_package, hostingpackage)
self.assertTrue(hasattr(form, 'helper'))
self.assertEqual(form.helper.form_action, reverse(
'change_mailbox_password', kwargs={
'package': 42, 'slug': 'testuser'}))
self.assertIn('password1', form.fields)
self.assertIn('password2', form.fields)
self.assertEqual(form.helper.inputs[0].name, 'submit')
self.assertTrue(hasattr(form, "helper"))
self.assertEqual(
form.helper.form_action,
reverse(
"change_mailbox_password", kwargs={"package": 42, "slug": "testuser"}
),
)
self.assertIn("password1", form.fields)
self.assertIn("password2", form.fields)
self.assertEqual(form.helper.inputs[0].name, "submit")
def test_save(self):
hostingpackage = Mock(id=42)
instance = MagicMock(username='testuser')
instance = MagicMock(username="testuser")
form = ChangeMailboxPasswordForm(
instance=instance, hostingpackage=hostingpackage,
data={'password1': 'newsecret', 'password2': 'newsecret'})
instance=instance,
hostingpackage=hostingpackage,
data={"password1": "newsecret", "password2": "newsecret"},
)
self.assertTrue(form.is_valid())
form.save(commit=False)
instance.set_password.assert_called_with('newsecret')
instance.set_password.assert_called_with("newsecret")
class MultipleEmailValidatorTest(TestCase):
def test_valid_single_address(self):
self.assertEqual(
'test@example.org',
multiple_email_validator('test@example.org'))
"test@example.org", multiple_email_validator("test@example.org")
)
def test_valid_multiple_addresses(self):
self.assertEqual(
'test1@example.org,test2@example.org',
multiple_email_validator('test1@example.org,test2@example.org'))
"test1@example.org,test2@example.org",
multiple_email_validator("test1@example.org,test2@example.org"),
)
def test_empty(self):
self.assertEqual(
'', multiple_email_validator(''))
self.assertEqual("", multiple_email_validator(""))
def test_none(self):
self.assertIsNone(multiple_email_validator(None))
def test_invalid_single_address(self):
with self.assertRaises(ValidationError):
multiple_email_validator('no@ddress')
multiple_email_validator("no@ddress")
def test_invalid_multiple_addresses(self):
with self.assertRaises(ValidationError):
multiple_email_validator('test1@example.org,no@ddress')
multiple_email_validator("test1@example.org,no@ddress")
class MailAddressFieldMixinTest(TestCase):
def test_fields_defined(self):
form = MailAddressFieldMixin()
self.assertIn('mailbox_or_forwards', form.fields)
self.assertIn('mailbox', form.fields)
self.assertIn('forwards', form.fields)
self.assertIn("mailbox_or_forwards", form.fields)
self.assertIn("mailbox", form.fields)
self.assertIn("forwards", form.fields)
class AddMailAddressFormTest(TestCase):
def setUp(self):
self.patcher1 = patch('managemails.forms.Mailbox.objects')
self.patcher2 = patch('managemails.forms.MailAddress.objects')
self.patcher1 = patch("managemails.forms.Mailbox.objects")
self.patcher2 = patch("managemails.forms.MailAddress.objects")
self.mailbox_objects = self.patcher1.start()
self.mailaddress_objects = self.patcher2.start()
@ -151,175 +153,192 @@ class AddMailAddressFormTest(TestCase):
def test_constructor(self):
instance = MagicMock()
osuser = Mock(username='testuser')
osuser = Mock(username="testuser")
hostingpackage = MagicMock(id=42, osuser=osuser)
maildomain = MagicMock(domain='example.org')
maildomain = MagicMock(domain="example.org")
form = AddMailAddressForm(
instance=instance, hostingpackage=hostingpackage,
maildomain=maildomain)
instance=instance, hostingpackage=hostingpackage, maildomain=maildomain
)
self.mailbox_objects.unused.assert_called_with(osuser=osuser)
self.assertIn('mailbox_or_forwards', form.fields)
self.assertIn('mailbox', form.fields)
self.assertIn('forwards', form.fields)
self.assertTrue(hasattr(form, 'hosting_package'))
self.assertIn("mailbox_or_forwards", form.fields)
self.assertIn("mailbox", form.fields)
self.assertIn("forwards", form.fields)
self.assertTrue(hasattr(form, "hosting_package"))
self.assertEqual(form.hosting_package, hostingpackage)
self.assertTrue(hasattr(form, 'maildomain'))
self.assertTrue(hasattr(form, "maildomain"))
self.assertEqual(form.maildomain, maildomain)
self.assertTrue(hasattr(form, 'helper'))
self.assertEqual(form.helper.form_action, reverse(
'add_mailaddress', kwargs={
'package': 42, 'domain': 'example.org'}))
self.assertTrue(hasattr(form, "helper"))
self.assertEqual(
form.helper.form_action,
reverse("add_mailaddress", kwargs={"package": 42, "domain": "example.org"}),
)
self.assertEqual(len(form.helper.layout), 2)
self.assertEqual(form.helper.layout[1].name, 'submit')
self.assertEqual(form.helper.layout[1].name, "submit")
def test_clean_localpart_valid(self):
instance = MagicMock()
osuser = Mock(username='testuser')
osuser = Mock(username="testuser")
hostingpackage = MagicMock(id=42, osuser=osuser)
maildomain = MagicMock(domain='example.org')
maildomain = MagicMock(domain="example.org")
form = AddMailAddressForm(
instance=instance, hostingpackage=hostingpackage,
instance=instance,
hostingpackage=hostingpackage,
maildomain=maildomain,
data={
'localpart': 'test',
'mailbox_or_forwards': MAILBOX_OR_FORWARDS.forwards,
'forwards': 'test2@example.org'
})
"localpart": "test",
"mailbox_or_forwards": MAILBOX_OR_FORWARDS.forwards,
"forwards": "test2@example.org",
},
)
self.mailaddress_objects.filter(
domain=maildomain, localpart='test'
domain=maildomain, localpart="test"
).exists.return_value = False
self.assertTrue(form.is_valid())
self.assertEqual('test', form.clean_localpart())
self.assertEqual("test", form.clean_localpart())
def test_clean_localpart_duplicate(self):
instance = MagicMock()
osuser = Mock(username='testuser')
osuser = Mock(username="testuser")
hostingpackage = MagicMock(id=42, osuser=osuser)
maildomain = MagicMock(domain='example.org')
maildomain = MagicMock(domain="example.org")
form = AddMailAddressForm(
instance=instance, hostingpackage=hostingpackage,
instance=instance,
hostingpackage=hostingpackage,
maildomain=maildomain,
data={
'localpart': 'test',
'mailbox_or_forwards': MAILBOX_OR_FORWARDS.forwards,
'forwards': 'test2@example.org'
})
"localpart": "test",
"mailbox_or_forwards": MAILBOX_OR_FORWARDS.forwards,
"forwards": "test2@example.org",
},
)
self.mailaddress_objects.filter(
domain=maildomain, localpart='test'
domain=maildomain, localpart="test"
).exists.return_value = True
self.assertFalse(form.is_valid())
self.assertIn('localpart', form.errors)
self.assertIn("localpart", form.errors)
def test_clean_no_mailbox_choice(self):
instance = MagicMock()
osuser = Mock(username='testuser')
osuser = Mock(username="testuser")
hostingpackage = MagicMock(id=42, osuser=osuser)
maildomain = MagicMock(domain='example.org')
maildomain = MagicMock(domain="example.org")
form = AddMailAddressForm(
instance=instance, hostingpackage=hostingpackage,
instance=instance,
hostingpackage=hostingpackage,
maildomain=maildomain,
data={
'localpart': 'test',
'mailbox_or_forwards': MAILBOX_OR_FORWARDS.mailbox,
})
"localpart": "test",
"mailbox_or_forwards": MAILBOX_OR_FORWARDS.mailbox,
},
)
self.mailaddress_objects.filter(
domain=maildomain, localpart='test'
domain=maildomain, localpart="test"
).exists.return_value = False
self.assertFalse(form.is_valid())
self.assertIn('mailbox', form.errors)
self.assertIn("mailbox", form.errors)
def test_clean_no_forward_address_choice(self):
instance = MagicMock()
osuser = Mock(username='testuser')
osuser = Mock(username="testuser")
hostingpackage = MagicMock(id=42, osuser=osuser)
maildomain = MagicMock(domain='example.org')
maildomain = MagicMock(domain="example.org")
form = AddMailAddressForm(
instance=instance, hostingpackage=hostingpackage,
instance=instance,
hostingpackage=hostingpackage,
maildomain=maildomain,
data={
'localpart': 'test',
'mailbox_or_forwards': MAILBOX_OR_FORWARDS.forwards,
})
"localpart": "test",
"mailbox_or_forwards": MAILBOX_OR_FORWARDS.forwards,
},
)
self.mailaddress_objects.filter(
domain=maildomain, localpart='test'
domain=maildomain, localpart="test"
).exists.return_value = False
self.assertFalse(form.is_valid())
self.assertIn('forwards', form.errors)
self.assertIn("forwards", form.errors)
def test_save_with_forwards_no_commit(self):
instance = MagicMock()
osuser = Mock(username='testuser')
osuser = Mock(username="testuser")
hostingpackage = MagicMock(id=42, osuser=osuser)
maildomain = MagicMock(domain='example.org')
maildomain = MagicMock(domain="example.org")
form = AddMailAddressForm(
instance=instance, hostingpackage=hostingpackage,
instance=instance,
hostingpackage=hostingpackage,
maildomain=maildomain,
data={
'localpart': 'test',
'mailbox_or_forwards': MAILBOX_OR_FORWARDS.forwards,
'forwards': 'test2@example.org,test3@example.org'
})
"localpart": "test",
"mailbox_or_forwards": MAILBOX_OR_FORWARDS.forwards,
"forwards": "test2@example.org,test3@example.org",
},
)
self.mailaddress_objects.filter(
domain=maildomain, localpart='test'
domain=maildomain, localpart="test"
).exists.return_value = False
self.assertTrue(form.is_valid())
address1 = MagicMock(mailaddress='test2@example.org')
address2 = MagicMock(mailaddress='test3@example.org')
address1 = MagicMock(mailaddress="test2@example.org")
address2 = MagicMock(mailaddress="test3@example.org")
instance.set_forward_addresses.return_value = [address1, address2]
form.save(commit=False)
self.assertEqual(maildomain, instance.domain)
instance.set_forward_addresses.assert_called_with([
'test2@example.org', 'test3@example.org'], commit=False)
instance.set_forward_addresses.assert_called_with(
["test2@example.org", "test3@example.org"], commit=False
)
address1.save.assert_not_called()
address2.save.assert_not_called()
instance.save.assert_not_called()
def test_save_with_forwards_commit(self):
instance = MagicMock()
osuser = Mock(username='testuser')
osuser = Mock(username="testuser")
hostingpackage = MagicMock(id=42, osuser=osuser)
maildomain = MagicMock(domain='example.org')
maildomain = MagicMock(domain="example.org")
form = AddMailAddressForm(
instance=instance, hostingpackage=hostingpackage,
instance=instance,
hostingpackage=hostingpackage,
maildomain=maildomain,
data={
'localpart': 'test',
'mailbox_or_forwards': MAILBOX_OR_FORWARDS.forwards,
'forwards': 'test2@example.org,test3@example.org'
})
"localpart": "test",
"mailbox_or_forwards": MAILBOX_OR_FORWARDS.forwards,
"forwards": "test2@example.org,test3@example.org",
},
)
self.mailaddress_objects.filter(
domain=maildomain, localpart='test'
domain=maildomain, localpart="test"
).exists.return_value = False
self.assertTrue(form.is_valid())
address1 = MagicMock(mailaddress='test2@example.org')
address2 = MagicMock(mailaddress='test3@example.org')
address1 = MagicMock(mailaddress="test2@example.org")
address2 = MagicMock(mailaddress="test3@example.org")
instance.set_forward_addresses.return_value = [address1, address2]
form.save(commit=True)
self.assertEqual(maildomain, instance.domain)
instance.set_forward_addresses.assert_called_with([
'test2@example.org', 'test3@example.org'], commit=False)
instance.set_forward_addresses.assert_called_with(
["test2@example.org", "test3@example.org"], commit=False
)
address1.save.assert_called_with()
address2.save.assert_called_with()
instance.save.assert_called_with()
def test_save_with_mailbox_no_commit(self):
instance = MagicMock()
osuser = Mock(username='testuser')
osuser = Mock(username="testuser")
hostingpackage = MagicMock(id=42, osuser=osuser)
maildomain = MagicMock(domain='example.org')
maildomain = MagicMock(domain="example.org")
form = AddMailAddressForm(
instance=instance, hostingpackage=hostingpackage,
instance=instance,
hostingpackage=hostingpackage,
maildomain=maildomain,
data={
'localpart': 'test',
'mailbox_or_forwards': MAILBOX_OR_FORWARDS.mailbox,
'mailbox': 'mailbox23',
})
"localpart": "test",
"mailbox_or_forwards": MAILBOX_OR_FORWARDS.mailbox,
"mailbox": "mailbox23",
},
)
self.mailaddress_objects.filter(
domain=maildomain, localpart='test'
domain=maildomain, localpart="test"
).exists.return_value = False
self.assertTrue(form.is_valid())
mailbox = MagicMock(osuser=osuser, username='testuserp01')
mailbox = MagicMock(osuser=osuser, username="testuserp01")
instance.set_mailbox.return_value = mailbox
form.save(commit=False)
self.assertEqual(maildomain, instance.domain)
@ -329,22 +348,24 @@ class AddMailAddressFormTest(TestCase):
def test_save_with_mailbox_commit(self):
instance = MagicMock()
osuser = Mock(username='testuser')
osuser = Mock(username="testuser")
hostingpackage = MagicMock(id=42, osuser=osuser)
maildomain = MagicMock(domain='example.org')
maildomain = MagicMock(domain="example.org")
form = AddMailAddressForm(
instance=instance, hostingpackage=hostingpackage,
instance=instance,
hostingpackage=hostingpackage,
maildomain=maildomain,
data={
'localpart': 'test',
'mailbox_or_forwards': MAILBOX_OR_FORWARDS.mailbox,
'mailbox': 'mailbox23',
})
"localpart": "test",
"mailbox_or_forwards": MAILBOX_OR_FORWARDS.mailbox,
"mailbox": "mailbox23",
},
)
self.mailaddress_objects.filter(
domain=maildomain, localpart='test'
domain=maildomain, localpart="test"
).exists.return_value = False
self.assertTrue(form.is_valid())
mailbox = MagicMock(osuser=osuser, username='testuserp01')
mailbox = MagicMock(osuser=osuser, username="testuserp01")
instance.set_mailbox.return_value = mailbox
form.save(commit=True)
self.assertEqual(maildomain, instance.domain)
@ -355,26 +376,28 @@ class AddMailAddressFormTest(TestCase):
def test_save_with_other_choice(self):
instance = MagicMock()
osuser = Mock(username='testuser')
osuser = Mock(username="testuser")
hostingpackage = MagicMock(id=42, osuser=osuser)
maildomain = MagicMock(domain='example.org')
maildomain = MagicMock(domain="example.org")
form = AddMailAddressForm(
instance=instance, hostingpackage=hostingpackage,
instance=instance,
hostingpackage=hostingpackage,
maildomain=maildomain,
data={
'localpart': 'test',
'mailbox_or_forwards': MAILBOX_OR_FORWARDS.mailbox,
'mailbox': 'mailbox23',
})
"localpart": "test",
"mailbox_or_forwards": MAILBOX_OR_FORWARDS.mailbox,
"mailbox": "mailbox23",
},
)
self.mailaddress_objects.filter(
domain=maildomain, localpart='test'
domain=maildomain, localpart="test"
).exists.return_value = False
self.assertTrue(form.is_valid())
form.cleaned_data['mailbox_or_forwards'] = -1
address1 = MagicMock(mailaddress='test2@example.org')
address2 = MagicMock(mailaddress='test3@example.org')
form.cleaned_data["mailbox_or_forwards"] = -1
address1 = MagicMock(mailaddress="test2@example.org")
address2 = MagicMock(mailaddress="test3@example.org")
instance.set_forward_addresses.return_value = [address1, address2]
mailbox = MagicMock(osuser=osuser, username='testuserp01')
mailbox = MagicMock(osuser=osuser, username="testuserp01")
instance.set_mailbox.return_value = mailbox
form.save(commit=True)
instance.set_mailbox.assert_not_called()
@ -386,10 +409,9 @@ class AddMailAddressFormTest(TestCase):
class EditMailAddressFormTest(TestCase):
def setUp(self):
self.patcher1 = patch('managemails.forms.Mailbox.objects')
self.patcher2 = patch('managemails.forms.MailAddress.objects')
self.patcher1 = patch("managemails.forms.Mailbox.objects")
self.patcher2 = patch("managemails.forms.MailAddress.objects")
self.mailbox_objects = self.patcher1.start()
self.mailaddress_objects = self.patcher2.start()
@ -409,115 +431,125 @@ class EditMailAddressFormTest(TestCase):
def test_constructor(self):
instance = MagicMock(id=23)
osuser = Mock(username='testuser')
osuser = Mock(username="testuser")
hostingpackage = MagicMock(id=42, osuser=osuser)
maildomain = MagicMock(domain='example.org')
maildomain = MagicMock(domain="example.org")
form = EditMailAddressForm(
instance=instance, maildomain=maildomain,
hostingpackage=hostingpackage)
instance=instance, maildomain=maildomain, hostingpackage=hostingpackage
)
self.mailbox_objects.unused_or_own.assert_called_with(instance, osuser)
self.assertIn('mailbox_or_forwards', form.fields)
self.assertIn('mailbox', form.fields)
self.assertIn('forwards', form.fields)
self.assertTrue(hasattr(form, 'hosting_package'))
self.assertIn("mailbox_or_forwards", form.fields)
self.assertIn("mailbox", form.fields)
self.assertIn("forwards", form.fields)
self.assertTrue(hasattr(form, "hosting_package"))
self.assertEqual(form.hosting_package, hostingpackage)
self.assertTrue(hasattr(form, 'maildomain'))
self.assertTrue(hasattr(form, "maildomain"))
self.assertEqual(form.maildomain, maildomain)
self.assertTrue(hasattr(form, 'helper'))
self.assertEqual(form.helper.form_action, reverse(
'edit_mailaddress', kwargs={
'package': 42,
'domain': 'example.org',
'pk': 23}))
self.assertTrue(hasattr(form, "helper"))
self.assertEqual(
form.helper.form_action,
reverse(
"edit_mailaddress",
kwargs={"package": 42, "domain": "example.org", "pk": 23},
),
)
self.assertEqual(len(form.helper.layout), 2)
self.assertEqual(form.helper.layout[1].name, 'submit')
self.assertEqual(form.helper.layout[1].name, "submit")
def test_clean_no_mailbox_choice(self):
instance = MagicMock(id=23)
osuser = Mock(username='testuser')
osuser = Mock(username="testuser")
hostingpackage = MagicMock(id=42, osuser=osuser)
maildomain = MagicMock(domain='example.org')
maildomain = MagicMock(domain="example.org")
form = EditMailAddressForm(
instance=instance, maildomain=maildomain,
instance=instance,
maildomain=maildomain,
hostingpackage=hostingpackage,
data={
'mailbox_or_forwards': MAILBOX_OR_FORWARDS.mailbox,
})
data={"mailbox_or_forwards": MAILBOX_OR_FORWARDS.mailbox},
)
self.assertFalse(form.is_valid())
self.assertIn('mailbox', form.errors)
self.assertIn("mailbox", form.errors)
def test_clean_no_forward_address_choice(self):
instance = MagicMock(id=23)
osuser = Mock(username='testuser')
osuser = Mock(username="testuser")
hostingpackage = MagicMock(id=42, osuser=osuser)
maildomain = MagicMock(domain='example.org')
maildomain = MagicMock(domain="example.org")
form = EditMailAddressForm(
instance=instance, maildomain=maildomain,
instance=instance,
maildomain=maildomain,
hostingpackage=hostingpackage,
data={
'mailbox_or_forwards': MAILBOX_OR_FORWARDS.forwards,
})
data={"mailbox_or_forwards": MAILBOX_OR_FORWARDS.forwards},
)
self.assertFalse(form.is_valid())
self.assertIn('forwards', form.errors)
self.assertIn("forwards", form.errors)
def test_save_with_forwards_no_commit(self):
instance = MagicMock(id=23)
osuser = Mock(username='testuser')
osuser = Mock(username="testuser")
hostingpackage = MagicMock(id=42, osuser=osuser)
maildomain = MagicMock(domain='example.org')
maildomain = MagicMock(domain="example.org")
form = EditMailAddressForm(
instance=instance, maildomain=maildomain,
instance=instance,
maildomain=maildomain,
hostingpackage=hostingpackage,
data={
'mailbox_or_forwards': MAILBOX_OR_FORWARDS.forwards,
'forwards': 'test2@example.org,test3@example.org'
})
"mailbox_or_forwards": MAILBOX_OR_FORWARDS.forwards,
"forwards": "test2@example.org,test3@example.org",
},
)
self.assertTrue(form.is_valid())
address1 = MagicMock(mailaddress='test2@example.org')
address2 = MagicMock(mailaddress='test3@example.org')
address1 = MagicMock(mailaddress="test2@example.org")
address2 = MagicMock(mailaddress="test3@example.org")
instance.set_forward_addresses.return_value = [address1, address2]
form.save(commit=False)
instance.set_forward_addresses.assert_called_with(
['test2@example.org', 'test3@example.org'], False)
["test2@example.org", "test3@example.org"], False
)
address1.save.assert_not_called()
address2.save.assert_not_called()
instance.save.assert_not_called()
def test_save_with_forwards_commit(self):
instance = MagicMock(id=23)
osuser = Mock(username='testuser')
osuser = Mock(username="testuser")
hostingpackage = MagicMock(id=42, osuser=osuser)
maildomain = MagicMock(domain='example.org')
maildomain = MagicMock(domain="example.org")
form = EditMailAddressForm(
instance=instance, maildomain=maildomain,
instance=instance,
maildomain=maildomain,
hostingpackage=hostingpackage,
data={
'mailbox_or_forwards': MAILBOX_OR_FORWARDS.forwards,
'forwards': 'test2@example.org,test3@example.org'
})
"mailbox_or_forwards": MAILBOX_OR_FORWARDS.forwards,
"forwards": "test2@example.org,test3@example.org",
},
)
self.assertTrue(form.is_valid())
address1 = MagicMock(mailaddress='test2@example.org')
address2 = MagicMock(mailaddress='test3@example.org')
address1 = MagicMock(mailaddress="test2@example.org")
address2 = MagicMock(mailaddress="test3@example.org")
instance.set_forward_addresses.return_value = [address1, address2]
form.save(commit=True)
instance.set_forward_addresses.assert_called_with(
['test2@example.org', 'test3@example.org'], True)
["test2@example.org", "test3@example.org"], True
)
instance.save.assert_called_with()
def test_save_with_mailbox_no_commit(self):
instance = MagicMock(id=23)
osuser = Mock(username='testuser')
osuser = Mock(username="testuser")
hostingpackage = MagicMock(id=42, osuser=osuser)
maildomain = MagicMock(domain='example.org')
maildomain = MagicMock(domain="example.org")
form = EditMailAddressForm(
instance=instance, maildomain=maildomain,
instance=instance,
maildomain=maildomain,
hostingpackage=hostingpackage,
data={
'mailbox_or_forwards': MAILBOX_OR_FORWARDS.mailbox,
'mailbox': 'mailbox23',
})
"mailbox_or_forwards": MAILBOX_OR_FORWARDS.mailbox,
"mailbox": "mailbox23",
},
)
self.assertTrue(form.is_valid())
mailbox = MagicMock(osuser=osuser, username='testuserp01')
mailbox = MagicMock(osuser=osuser, username="testuserp01")
instance.set_mailbox.return_value = mailbox
form.save(commit=False)
instance.set_mailbox.assert_called_with(ANY, False)
@ -526,18 +558,20 @@ class EditMailAddressFormTest(TestCase):
def test_save_with_mailbox_commit(self):
instance = MagicMock(id=23)
osuser = Mock(username='testuser')
osuser = Mock(username="testuser")
hostingpackage = MagicMock(id=42, osuser=osuser)
maildomain = MagicMock(domain='example.org')
maildomain = MagicMock(domain="example.org")
form = EditMailAddressForm(
instance=instance, maildomain=maildomain,
instance=instance,
maildomain=maildomain,
hostingpackage=hostingpackage,
data={
'mailbox_or_forwards': MAILBOX_OR_FORWARDS.mailbox,
'mailbox': 'mailbox23',
})
"mailbox_or_forwards": MAILBOX_OR_FORWARDS.mailbox,
"mailbox": "mailbox23",
},
)
self.assertTrue(form.is_valid())
mailbox = MagicMock(osuser=osuser, username='testuserp01')
mailbox = MagicMock(osuser=osuser, username="testuserp01")
instance.set_mailbox.return_value = mailbox
self.mailbox_objects.unused_or_own.get.return_value = mailbox
form.save(commit=True)
@ -546,18 +580,20 @@ class EditMailAddressFormTest(TestCase):
def test_save_with_other_choice(self):
instance = MagicMock(id=23)
osuser = Mock(username='testuser')
osuser = Mock(username="testuser")
hostingpackage = MagicMock(id=42, osuser=osuser)
maildomain = MagicMock(domain='example.org')
maildomain = MagicMock(domain="example.org")
form = EditMailAddressForm(
instance=instance, maildomain=maildomain,
instance=instance,
maildomain=maildomain,
hostingpackage=hostingpackage,
data={
'mailbox_or_forwards': MAILBOX_OR_FORWARDS.mailbox,
'mailbox': 'mailbox23',
})
"mailbox_or_forwards": MAILBOX_OR_FORWARDS.mailbox,
"mailbox": "mailbox23",
},
)
self.assertTrue(form.is_valid())
form.cleaned_data['mailbox_or_forwards'] = -1
form.cleaned_data["mailbox_or_forwards"] = -1
form.save(commit=True)
instance.set_mailbox.assert_not_called()
instance.save.assert_called_with()

View file

@ -1,9 +1,7 @@
"""
This module contains tests for :py:mod:`managemails.models`
"""
from __future__ import unicode_literals
from mock import patch
from unittest.mock import patch
from django.test import TestCase, TransactionTestCase
from django.test.utils import override_settings
@ -14,59 +12,51 @@ from passlib.hash import sha512_crypt
from domains.models import MailDomain
from osusers.models import User
from managemails.models import (
MailAddress,
Mailbox,
)
from managemails.models import MailAddress, Mailbox
Customer = get_user_model()
@override_settings(
CELERY_ALWAYS_EAGER=True,
CELERY_CACHE_BACKEND='memory',
BROKER_BACKEND='memory'
CELERY_ALWAYS_EAGER=True, CELERY_CACHE_BACKEND="memory", BROKER_BACKEND="memory"
)
class MailboxTest(TestCase):
def setUp(self):
super(MailboxTest, self).setUp()
self.customer = Customer.objects.create_user('test')
self.customer = Customer.objects.create_user("test")
def test_set_password(self):
user = User.objects.create_user(self.customer)
mb = Mailbox.objects.create(username='test', osuser=user)
mb.set_password('test')
self.assertTrue(sha512_crypt.verify('test', mb.password))
mb = Mailbox.objects.create(username="test", osuser=user)
mb.set_password("test")
self.assertTrue(sha512_crypt.verify("test", mb.password))
def test___str__(self):
user = User.objects.create_user(self.customer)
mb = Mailbox.objects.create(username='test', osuser=user)
mb.set_password('test')
self.assertEqual(str(mb), 'test')
mb = Mailbox.objects.create(username="test", osuser=user)
mb.set_password("test")
self.assertEqual(str(mb), "test")
@patch('managemails.models.create_file_mailbox')
@patch("managemails.models.create_file_mailbox")
def test_save(self, create_file_mailbox_task):
user = User.objects.create_user(self.customer)
mb = Mailbox.objects.create_mailbox(user)
self.assertIsNotNone(mb.pk)
create_file_mailbox_task.delay.assert_called_with(
user.username, mb.username)
create_file_mailbox_task.delay.assert_called_with(user.username, mb.username)
@patch('managemails.models.delete_file_mailbox')
@patch("managemails.models.delete_file_mailbox")
def test_delete(self, delete_file_mailbox_task):
user = User.objects.create_user(self.customer)
mb = Mailbox.objects.create_mailbox(user)
mb.delete()
self.assertIsNone(mb.pk)
delete_file_mailbox_task.delay.assert_called_with(
user.username, mb.username)
delete_file_mailbox_task.delay.assert_called_with(user.username, mb.username)
def test_get_mailaddresses(self):
user = User.objects.create_user(self.customer)
mb = Mailbox.objects.create_mailbox(user)
md = MailDomain.objects.create(domain='example.org')
address = MailAddress.objects.create(localpart='test', domain=md)
md = MailDomain.objects.create(domain="example.org")
address = MailAddress.objects.create(localpart="test", domain=md)
address.set_mailbox(mb)
mailaddresses = mb.get_mailaddresses()
self.assertEqual(len(mailaddresses), 1)
@ -74,31 +64,28 @@ class MailboxTest(TestCase):
@override_settings(
CELERY_ALWAYS_EAGER=True,
CELERY_CACHE_BACKEND='memory',
BROKER_BACKEND='memory'
CELERY_ALWAYS_EAGER=True, CELERY_CACHE_BACKEND="memory", BROKER_BACKEND="memory"
)
class MailAddressTest(TransactionTestCase):
def test__str__(self):
md = MailDomain.objects.create(domain='example.org')
ma = MailAddress.objects.create(localpart='test', domain=md)
self.assertEqual(str(ma), 'test@example.org')
md = MailDomain.objects.create(domain="example.org")
ma = MailAddress.objects.create(localpart="test", domain=md)
self.assertEqual(str(ma), "test@example.org")
def test_set_mailbox_fresh(self):
customer = Customer.objects.create_user('test')
customer = Customer.objects.create_user("test")
user = User.objects.create_user(customer)
md = MailDomain.objects.create(domain='example.org')
ma = MailAddress.objects.create(localpart='test', domain=md)
md = MailDomain.objects.create(domain="example.org")
ma = MailAddress.objects.create(localpart="test", domain=md)
mb = Mailbox.objects.create_mailbox(user)
ma.set_mailbox(mb)
self.assertIn(ma, mb.get_mailaddresses())
def test_set_mailbox_reassing(self):
customer = Customer.objects.create_user('test')
customer = Customer.objects.create_user("test")
user = User.objects.create_user(customer)
md = MailDomain.objects.create(domain='example.org')
ma = MailAddress.objects.create(localpart='test', domain=md)
md = MailDomain.objects.create(domain="example.org")
ma = MailAddress.objects.create(localpart="test", domain=md)
mb = Mailbox.objects.create_mailbox(user)
ma.set_mailbox(mb)
mb2 = Mailbox.objects.create_mailbox(user)
@ -107,168 +94,178 @@ class MailAddressTest(TransactionTestCase):
self.assertNotIn(ma, mb.get_mailaddresses())
def test_set_mailbox_with_forwards(self):
customer = Customer.objects.create_user('test')
customer = Customer.objects.create_user("test")
user = User.objects.create_user(customer)
md = MailDomain.objects.create(domain='example.org')
ma = MailAddress.objects.create(localpart='test', domain=md)
md = MailDomain.objects.create(domain="example.org")
ma = MailAddress.objects.create(localpart="test", domain=md)
mb = Mailbox.objects.create_mailbox(user)
ma.set_forward_addresses(['test2@example.org'])
ma.set_forward_addresses(["test2@example.org"])
ma.set_mailbox(mb)
self.assertEqual(ma.mailaddressforward_set.count(), 0)
self.assertIn(ma, mb.get_mailaddresses())
def test_set_mailbox_with_unsaved_address(self):
customer = Customer.objects.create_user('test')
customer = Customer.objects.create_user("test")
user = User.objects.create_user(customer)
md = MailDomain.objects.create(domain='example.org')
ma = MailAddress(localpart='test', domain=md)
md = MailDomain.objects.create(domain="example.org")
ma = MailAddress(localpart="test", domain=md)
mb = Mailbox.objects.create_mailbox(user)
ma.set_mailbox(mb)
self.assertIn(ma, mb.get_mailaddresses())
def test_set_mailbox_fresh_no_commit(self):
customer = Customer.objects.create_user('test')
customer = Customer.objects.create_user("test")
user = User.objects.create_user(customer)
md = MailDomain.objects.create(domain='example.org')
ma = MailAddress.objects.create(localpart='test', domain=md)
md = MailDomain.objects.create(domain="example.org")
ma = MailAddress.objects.create(localpart="test", domain=md)
mb = Mailbox.objects.create_mailbox(user)
ma.set_mailbox(mb, commit=False)
self.assertNotIn(ma, mb.get_mailaddresses())
def test_set_mailbox_with_unsaved_address_no_commit(self):
customer = Customer.objects.create_user('test')
customer = Customer.objects.create_user("test")
user = User.objects.create_user(customer)
md = MailDomain.objects.create(domain='example.org')
ma = MailAddress(localpart='test', domain=md)
md = MailDomain.objects.create(domain="example.org")
ma = MailAddress(localpart="test", domain=md)
mb = Mailbox.objects.create_mailbox(user)
ma.set_mailbox(mb, commit=False)
self.assertNotIn(ma, mb.get_mailaddresses())
def test_set_forward_addresses_fresh(self):
md = MailDomain.objects.create(domain='example.org')
ma = MailAddress.objects.create(localpart='test', domain=md)
ma.set_forward_addresses(['test2@example.org'])
md = MailDomain.objects.create(domain="example.org")
ma = MailAddress.objects.create(localpart="test", domain=md)
ma.set_forward_addresses(["test2@example.org"])
def get_target(maf):
return maf.target
self.assertQuerysetEqual(
ma.mailaddressforward_set.all(), ['test2@example.org'],
lambda(maf): maf.target)
ma.mailaddressforward_set.all(), ["test2@example.org"], get_target
)
def test_set_forward_addresses_unsaved(self):
md = MailDomain.objects.create(domain='example.org')
ma = MailAddress(localpart='test', domain=md)
ma.set_forward_addresses(['test2@example.org'])
md = MailDomain.objects.create(domain="example.org")
ma = MailAddress(localpart="test", domain=md)
ma.set_forward_addresses(["test2@example.org"])
def get_target(maf):
return maf.target
self.assertQuerysetEqual(
ma.mailaddressforward_set.all(), ['test2@example.org'],
lambda(maf): maf.target)
ma.mailaddressforward_set.all(), ["test2@example.org"], get_target
)
def test_set_forward_addresses_replace_forwards(self):
md = MailDomain.objects.create(domain='example.org')
ma = MailAddress.objects.create(localpart='test', domain=md)
ma.set_forward_addresses(['test2@example.org'])
ma.set_forward_addresses(['test3@example.org'])
md = MailDomain.objects.create(domain="example.org")
ma = MailAddress.objects.create(localpart="test", domain=md)
ma.set_forward_addresses(["test2@example.org"])
ma.set_forward_addresses(["test3@example.org"])
def get_target(maf):
return maf.target
self.assertQuerysetEqual(
ma.mailaddressforward_set.all(), ['test3@example.org'],
lambda(maf): maf.target)
ma.mailaddressforward_set.all(), ["test3@example.org"], get_target
)
def test_set_forward_addresses_add_forwards(self):
md = MailDomain.objects.create(domain='example.org')
ma = MailAddress.objects.create(localpart='test', domain=md)
ma.set_forward_addresses(['test2@example.org'])
ma.set_forward_addresses(['test2@example.org', 'test3@example.org'])
md = MailDomain.objects.create(domain="example.org")
ma = MailAddress.objects.create(localpart="test", domain=md)
ma.set_forward_addresses(["test2@example.org"])
ma.set_forward_addresses(["test2@example.org", "test3@example.org"])
def get_target(maf):
return maf.target
self.assertQuerysetEqual(
ma.mailaddressforward_set.all(),
['test2@example.org', 'test3@example.org'],
lambda(maf): maf.target,
ordered=False)
["test2@example.org", "test3@example.org"],
get_target,
ordered=False,
)
def test_set_forward_addresses_replace_mailbox(self):
customer = Customer.objects.create_user('test')
customer = Customer.objects.create_user("test")
user = User.objects.create_user(customer)
md = MailDomain.objects.create(domain='example.org')
ma = MailAddress.objects.create(localpart='test', domain=md)
md = MailDomain.objects.create(domain="example.org")
ma = MailAddress.objects.create(localpart="test", domain=md)
mb = Mailbox.objects.create_mailbox(user)
ma.set_mailbox(mb)
ma.set_forward_addresses(['test2@example.org'])
ma.set_forward_addresses(["test2@example.org"])
self.assertNotIn(ma, mb.get_mailaddresses())
def get_target(maf):
return maf.target
self.assertQuerysetEqual(
ma.mailaddressforward_set.all(), ['test2@example.org'],
lambda(maf): maf.target)
ma.mailaddressforward_set.all(), ["test2@example.org"], get_target
)
def test_set_forward_addresses_fresh_no_commit(self):
md = MailDomain.objects.create(domain='example.org')
ma = MailAddress.objects.create(localpart='test', domain=md)
mafwds = ma.set_forward_addresses(['test2@example.org'], commit=False)
md = MailDomain.objects.create(domain="example.org")
ma = MailAddress.objects.create(localpart="test", domain=md)
mafwds = ma.set_forward_addresses(["test2@example.org"], commit=False)
self.assertEqual(ma.mailaddressforward_set.count(), 0)
self.assertEqual(mafwds[0].target, 'test2@example.org')
self.assertEqual(mafwds[0].target, "test2@example.org")
def test_set_forward_address_unsaved_no_commit(self):
md = MailDomain.objects.create(domain='example.org')
ma = MailAddress(localpart='test', domain=md)
mafwds = ma.set_forward_addresses(['test2@example.org'], commit=False)
md = MailDomain.objects.create(domain="example.org")
ma = MailAddress(localpart="test", domain=md)
mafwds = ma.set_forward_addresses(["test2@example.org"], commit=False)
self.assertEqual(ma.mailaddressforward_set.count(), 0)
self.assertEqual(mafwds[0].target, 'test2@example.org')
self.assertEqual(mafwds[0].target, "test2@example.org")
@override_settings(
CELERY_ALWAYS_EAGER=True,
CELERY_CACHE_BACKEND='memory',
BROKER_BACKEND='memory'
CELERY_ALWAYS_EAGER=True, CELERY_CACHE_BACKEND="memory", BROKER_BACKEND="memory"
)
class MailboxManagerTest(TransactionTestCase):
def setUp(self):
super(MailboxManagerTest, self).setUp()
self.customer = Customer.objects.create_user('test')
self.customer = Customer.objects.create_user("test")
self.user = User.objects.create_user(self.customer)
def test_get_next_mailbox_name_fresh(self):
mailboxname = Mailbox.objects.get_next_mailbox_name(self.user)
self.assertEqual(mailboxname, '{}p01'.format(self.user.username))
self.assertEqual(mailboxname, "{}p01".format(self.user.username))
def test_get_next_mailbox_name_second(self):
Mailbox.objects.create_mailbox(self.user)
mailboxname = Mailbox.objects.get_next_mailbox_name(self.user)
self.assertEqual(mailboxname, '{}p02'.format(self.user.username))
self.assertEqual(mailboxname, "{}p02".format(self.user.username))
def test_get_next_mailbox_name_gap_detection(self):
mailboxes = [
Mailbox.objects.create_mailbox(self.user) for i in range(3)
]
mailboxes = [Mailbox.objects.create_mailbox(self.user) for _ in range(3)]
mailboxes[1].delete()
mailboxname = Mailbox.objects.get_next_mailbox_name(self.user)
self.assertEqual(mailboxname, '{}p02'.format(self.user.username))
self.assertEqual(mailboxname, "{}p02".format(self.user.username))
def test_unused_or_own_fresh(self):
md = MailDomain.objects.create(domain='example.org')
address = MailAddress.objects.create(localpart='test', domain=md)
md = MailDomain.objects.create(domain="example.org")
address = MailAddress.objects.create(localpart="test", domain=md)
mailboxes = Mailbox.objects.unused_or_own(address, self.user)
self.assertQuerysetEqual(mailboxes, [])
def test_unused_or_own_unassigned(self):
md = MailDomain.objects.create(domain='example.org')
address = MailAddress.objects.create(localpart='test', domain=md)
mailboxes = [
Mailbox.objects.create_mailbox(self.user) for i in range(2)
]
md = MailDomain.objects.create(domain="example.org")
address = MailAddress.objects.create(localpart="test", domain=md)
mailboxes = [Mailbox.objects.create_mailbox(self.user) for _ in range(2)]
assignable = Mailbox.objects.unused_or_own(address, self.user)
self.assertQuerysetEqual(assignable, [repr(mb) for mb in mailboxes])
def test_unused_or_own_assigned(self):
md = MailDomain.objects.create(domain='example.org')
address = MailAddress.objects.create(localpart='test', domain=md)
mailboxes = [
Mailbox.objects.create_mailbox(self.user) for i in range(2)
]
md = MailDomain.objects.create(domain="example.org")
address = MailAddress.objects.create(localpart="test", domain=md)
mailboxes = [Mailbox.objects.create_mailbox(self.user) for _ in range(2)]
address.set_mailbox(mailboxes[0])
assignable = Mailbox.objects.unused_or_own(address, self.user)
self.assertQuerysetEqual(assignable, [repr(mb) for mb in mailboxes])
def test_unused_or_own_assigned_other(self):
md = MailDomain.objects.create(domain='example.org')
address = MailAddress.objects.create(localpart='test', domain=md)
address2 = MailAddress.objects.create(localpart='test2', domain=md)
mailboxes = [
Mailbox.objects.create_mailbox(self.user) for i in range(2)
]
md = MailDomain.objects.create(domain="example.org")
address = MailAddress.objects.create(localpart="test", domain=md)
address2 = MailAddress.objects.create(localpart="test2", domain=md)
mailboxes = [Mailbox.objects.create_mailbox(self.user) for _ in range(2)]
address2.set_mailbox(mailboxes[0])
assignable = Mailbox.objects.unused_or_own(address, self.user)
self.assertQuerysetEqual(assignable, [repr(mailboxes[1])])
@ -283,11 +280,9 @@ class MailboxManagerTest(TransactionTestCase):
self.assertQuerysetEqual(mailboxes, [repr(mailbox)])
def test_unused_assigned(self):
md = MailDomain.objects.create(domain='example.org')
address = MailAddress.objects.create(localpart='test', domain=md)
mailboxes = [
Mailbox.objects.create_mailbox(self.user) for i in range(2)
]
md = MailDomain.objects.create(domain="example.org")
address = MailAddress.objects.create(localpart="test", domain=md)
mailboxes = [Mailbox.objects.create_mailbox(self.user) for _ in range(2)]
address.set_mailbox(mailboxes[0])
assignable = Mailbox.objects.unused(self.user)
self.assertQuerysetEqual(assignable, [repr(mailboxes[1])])
@ -295,31 +290,28 @@ class MailboxManagerTest(TransactionTestCase):
def test_create_mailbox_no_password(self):
mailbox = Mailbox.objects.create_mailbox(self.user)
self.assertEqual(mailbox.osuser, self.user)
self.assertEqual(mailbox.username, '{}p01'.format(self.user.username))
self.assertEqual(mailbox.password, '')
self.assertEqual(mailbox.username, "{}p01".format(self.user.username))
self.assertEqual(mailbox.password, "")
def test_create_mailbox_with_password(self):
mailbox = Mailbox.objects.create_mailbox(self.user, 'test')
mailbox = Mailbox.objects.create_mailbox(self.user, "test")
self.assertEqual(mailbox.osuser, self.user)
self.assertEqual(mailbox.username, '{}p01'.format(self.user.username))
self.assertTrue(sha512_crypt.verify('test', mailbox.password))
self.assertEqual(mailbox.username, "{}p01".format(self.user.username))
self.assertTrue(sha512_crypt.verify("test", mailbox.password))
@override_settings(
CELERY_ALWAYS_EAGER=True,
CELERY_CACHE_BACKEND='memory',
BROKER_BACKEND='memory'
CELERY_ALWAYS_EAGER=True, CELERY_CACHE_BACKEND="memory", BROKER_BACKEND="memory"
)
class MailAddressMailboxTest(TestCase):
def setUp(self):
super(MailAddressMailboxTest, self).setUp()
self.customer = Customer.objects.create_user('test')
self.customer = Customer.objects.create_user("test")
def test___str__(self):
user = User.objects.create_user(self.customer)
md = MailDomain.objects.create(domain='example.org')
ma = MailAddress(localpart='test', domain=md)
md = MailDomain.objects.create(domain="example.org")
ma = MailAddress(localpart="test", domain=md)
mb = Mailbox.objects.create_mailbox(user)
ma.set_mailbox(mb)
self.assertEqual(str(ma.mailaddressmailbox), mb.username)

File diff suppressed because it is too large Load diff

View file

@ -7,26 +7,14 @@ The module starts Celery_ tasks.
"""
from django import forms
from django.utils.translation import ugettext_lazy as _
from django.contrib import admin
from django.utils.translation import ugettext_lazy as _
from fileservertasks.tasks import set_file_ssh_authorized_keys
from gvawebcore.forms import (
PASSWORD_MISMATCH_ERROR
)
from gvawebcore.forms import PASSWORD_MISMATCH_ERROR
from taskresults.models import TaskResult
from .forms import (
INVALID_SSH_PUBLIC_KEY,
DUPLICATE_SSH_PUBLIC_KEY_FOR_USER,
)
from .models import (
AdditionalGroup,
Group,
Shadow,
SshPublicKey,
User,
)
from .forms import DUPLICATE_SSH_PUBLIC_KEY_FOR_USER, INVALID_SSH_PUBLIC_KEY
from .models import AdditionalGroup, Group, Shadow, SshPublicKey, User
class AdditionalGroupInline(admin.TabularInline):
@ -34,6 +22,7 @@ class AdditionalGroupInline(admin.TabularInline):
Inline for :py:class:`osusers.models.AdditionalGroup` instances.
"""
model = AdditionalGroup
@ -42,8 +31,9 @@ class ShadowInline(admin.TabularInline):
Inline for :py:class:`osusers.models.ShadowInline` instances.
"""
model = Shadow
readonly_fields = ['passwd']
readonly_fields = ["passwd"]
can_delete = False
@ -53,18 +43,17 @@ class UserCreationForm(forms.ModelForm):
<osusers.models.User>`.
"""
password1 = forms.CharField(
label=_('Password'), widget=forms.PasswordInput,
required=False,
label=_("Password"), widget=forms.PasswordInput, required=False
)
password2 = forms.CharField(
label=_('Password (again)'), widget=forms.PasswordInput,
required=False,
label=_("Password (again)"), widget=forms.PasswordInput, required=False
)
class Meta:
model = User
fields = ['customer']
fields = ["customer"]
def clean_password2(self):
"""
@ -74,8 +63,8 @@ class UserCreationForm(forms.ModelForm):
:rtype: str or None
"""
password1 = self.cleaned_data.get('password1')
password2 = self.cleaned_data.get('password2')
password1 = self.cleaned_data.get("password1")
password2 = self.cleaned_data.get("password2")
if password1 and password2 and password1 != password2:
raise forms.ValidationError(PASSWORD_MISMATCH_ERROR)
return password2
@ -90,8 +79,10 @@ class UserCreationForm(forms.ModelForm):
"""
user = User.objects.create_user(
customer=self.cleaned_data['customer'],
password=self.cleaned_data['password1'], commit=commit)
customer=self.cleaned_data["customer"],
password=self.cleaned_data["password1"],
commit=commit,
)
return user
def save_m2m(self):
@ -108,14 +99,16 @@ class UserAdmin(admin.ModelAdmin):
<osusers.models.User>`.
"""
actions = ['perform_delete_selected']
actions = ["perform_delete_selected"]
add_form = UserCreationForm
inlines = [AdditionalGroupInline, ShadowInline]
add_fieldsets = (
(None, {
'classes': ('wide',),
'fields': ('customer', 'password1', 'password2')}),
(
None,
{"classes": ("wide",), "fields": ("customer", "password1", "password2")},
),
)
def get_form(self, request, obj=None, **kwargs):
@ -132,10 +125,12 @@ class UserAdmin(admin.ModelAdmin):
"""
defaults = {}
if obj is None:
defaults.update({
'form': self.add_form,
'fields': admin.options.flatten_fieldsets(self.add_fieldsets),
})
defaults.update(
{
"form": self.add_form,
"fields": admin.options.flatten_fieldsets(self.add_fieldsets),
}
)
defaults.update(kwargs)
return super(UserAdmin, self).get_form(request, obj, **defaults)
@ -151,7 +146,7 @@ class UserAdmin(admin.ModelAdmin):
"""
if obj:
return ['uid']
return ["uid"]
return []
def perform_delete_selected(self, request, queryset):
@ -167,7 +162,8 @@ class UserAdmin(admin.ModelAdmin):
"""
for user in queryset.all():
user.delete()
perform_delete_selected.short_description = _('Delete selected users')
perform_delete_selected.short_description = _("Delete selected users")
def get_actions(self, request):
"""
@ -182,8 +178,8 @@ class UserAdmin(admin.ModelAdmin):
"""
actions = super(UserAdmin, self).get_actions(request)
if 'delete_selected' in actions: # pragma: no cover
del actions['delete_selected']
if "delete_selected" in actions: # pragma: no cover
del actions["delete_selected"]
return actions
@ -193,7 +189,8 @@ class GroupAdmin(admin.ModelAdmin):
<osusers.models.Group>`.
"""
actions = ['perform_delete_selected']
actions = ["perform_delete_selected"]
def perform_delete_selected(self, request, queryset):
"""
@ -208,7 +205,8 @@ class GroupAdmin(admin.ModelAdmin):
"""
for group in queryset.all():
group.delete()
perform_delete_selected.short_description = _('Delete selected groups')
perform_delete_selected.short_description = _("Delete selected groups")
def get_actions(self, request):
"""
@ -223,8 +221,8 @@ class GroupAdmin(admin.ModelAdmin):
"""
actions = super(GroupAdmin, self).get_actions(request)
if 'delete_selected' in actions: # pragma: no cover
del actions['delete_selected']
if "delete_selected" in actions: # pragma: no cover
del actions["delete_selected"]
return actions
@ -234,33 +232,37 @@ class SshPublicKeyCreationForm(forms.ModelForm):
<osusers.models.SshPublicKey>`.
"""
publickeytext = forms.CharField(
label=_('Key text'), widget=forms.Textarea,
help_text=_('A SSH public key in either OpenSSH or RFC 4716 format'))
label=_("Key text"),
widget=forms.Textarea,
help_text=_("A SSH public key in either OpenSSH or RFC 4716 format"),
)
class Meta:
model = SshPublicKey
fields = ['user']
fields = ["user"]
def clean_publickeytext(self):
keytext = self.cleaned_data.get('publickeytext')
keytext = self.cleaned_data.get("publickeytext")
try:
SshPublicKey.objects.parse_keytext(keytext)
SshPublicKey.objects.parse_key_text(keytext)
except:
raise forms.ValidationError(INVALID_SSH_PUBLIC_KEY)
return keytext
def clean(self):
user = self.cleaned_data.get('user')
keytext = self.cleaned_data.get('publickeytext')
user = self.cleaned_data.get("user")
keytext = self.cleaned_data.get("publickeytext")
if user and keytext:
alg, data, comment = SshPublicKey.objects.parse_keytext(keytext)
alg, data, comment = SshPublicKey.objects.parse_key_text(keytext)
if SshPublicKey.objects.filter(
user=user, algorithm=alg, data=data
).exists():
self.add_error(
'publickeytext',
forms.ValidationError(DUPLICATE_SSH_PUBLIC_KEY_FOR_USER))
"publickeytext",
forms.ValidationError(DUPLICATE_SSH_PUBLIC_KEY_FOR_USER),
)
super(SshPublicKeyCreationForm, self).clean()
def save(self, commit=True):
@ -272,8 +274,9 @@ class SshPublicKeyCreationForm(forms.ModelForm):
:rtype: :py:class:`osusers.models.SshPublicKey`
"""
algorithm, keydata, comment = SshPublicKey.objects.parse_keytext(
self.cleaned_data.get('publickeytext'))
algorithm, keydata, comment = SshPublicKey.objects.parse_key_text(
self.cleaned_data.get("publickeytext")
)
self.instance.algorithm = algorithm
self.instance.data = keydata
self.instance.comment = comment
@ -286,14 +289,13 @@ class SshPublicKeyAdmin(admin.ModelAdmin):
<osusers.models.SshPublicKey>`.
"""
actions = ['perform_delete_selected']
actions = ["perform_delete_selected"]
add_form = SshPublicKeyCreationForm
list_display = ['user', 'algorithm', 'comment']
list_display = ["user", "algorithm", "comment"]
add_fieldsets = (
(None, {
'classes': ('wide',),
'fields': ('user', 'publickeytext')}),
(None, {"classes": ("wide",), "fields": ("user", "publickeytext")}),
)
def get_form(self, request, obj=None, **kwargs):
@ -311,13 +313,14 @@ class SshPublicKeyAdmin(admin.ModelAdmin):
"""
defaults = {}
if obj is None:
defaults.update({
'form': self.add_form,
'fields': admin.options.flatten_fieldsets(self.add_fieldsets),
})
defaults.update(
{
"form": self.add_form,
"fields": admin.options.flatten_fieldsets(self.add_fieldsets),
}
)
defaults.update(kwargs)
return super(SshPublicKeyAdmin, self).get_form(
request, obj, **defaults)
return super(SshPublicKeyAdmin, self).get_form(request, obj, **defaults)
def get_readonly_fields(self, request, obj=None):
"""
@ -332,7 +335,7 @@ class SshPublicKeyAdmin(admin.ModelAdmin):
"""
if obj:
return ['algorithm', 'data']
return ["algorithm", "data"]
return []
def perform_delete_selected(self, request, queryset):
@ -370,23 +373,19 @@ class SshPublicKeyAdmin(admin.ModelAdmin):
}
"""
users = set([
item['user'] for item in
queryset.values('user').distinct()
])
users = set([item["user"] for item in queryset.values("user").distinct()])
queryset.delete()
for user in users:
# TODO: move to model/signal
TaskResult.objects.create_task_result(
'perform_delete_selected',
"perform_delete_selected",
set_file_ssh_authorized_keys.s(
User.objects.get(uid=user).username,
[str(key) for key in SshPublicKey.objects.filter(
user_id=user)]
)
[str(key) for key in SshPublicKey.objects.filter(user_id=user)],
),
)
perform_delete_selected.short_description = _(
'Delete selected SSH public keys')
perform_delete_selected.short_description = _("Delete selected SSH public keys")
def get_actions(self, request):
"""
@ -401,8 +400,8 @@ class SshPublicKeyAdmin(admin.ModelAdmin):
"""
actions = super(SshPublicKeyAdmin, self).get_actions(request)
if 'delete_selected' in actions: # pragma: no cover
del actions['delete_selected']
if "delete_selected" in actions: # pragma: no cover
del actions["delete_selected"]
return actions

View file

@ -13,14 +13,12 @@ from crispy_forms.layout import Submit
from gvawebcore.forms import PasswordModelFormMixin
from .models import (
SshPublicKey,
User,
)
from .models import SshPublicKey, User
INVALID_SSH_PUBLIC_KEY = _('Invalid SSH public key data format.')
INVALID_SSH_PUBLIC_KEY = _("Invalid SSH public key data format.")
DUPLICATE_SSH_PUBLIC_KEY_FOR_USER = _(
'This SSH public key is already assigned to this user.')
"This SSH public key is already assigned to this user."
)
class ChangeOsUserPasswordForm(PasswordModelFormMixin, forms.ModelForm):
@ -28,6 +26,7 @@ class ChangeOsUserPasswordForm(PasswordModelFormMixin, forms.ModelForm):
A form for setting an OS user's password.
"""
class Meta:
model = User
fields = []
@ -36,8 +35,9 @@ class ChangeOsUserPasswordForm(PasswordModelFormMixin, forms.ModelForm):
self.helper = FormHelper()
super(ChangeOsUserPasswordForm, self).__init__(*args, **kwargs)
self.helper.form_action = reverse(
'set_osuser_password', kwargs={'slug': self.instance.username})
self.helper.add_input(Submit('submit', _('Set password')))
"set_osuser_password", kwargs={"slug": self.instance.username}
)
self.helper.add_input(Submit("submit", _("Set password")))
def save(self, commit=True):
"""
@ -48,7 +48,7 @@ class ChangeOsUserPasswordForm(PasswordModelFormMixin, forms.ModelForm):
:rtype: :py:class:`osusers.models.User`
"""
self.instance.set_password(self.cleaned_data['password1'])
self.instance.set_password(self.cleaned_data["password1"])
return super(ChangeOsUserPasswordForm, self).save(commit=commit)
@ -58,41 +58,45 @@ class AddSshPublicKeyForm(forms.ModelForm):
<osusers.models.SshPublicKey>`.
"""
publickeytext = forms.CharField(
label=_('Key text'), widget=forms.Textarea,
help_text=_('A SSH public key in either OpenSSH or RFC 4716 format'))
label=_("Key text"),
widget=forms.Textarea,
help_text=_("A SSH public key in either OpenSSH or RFC 4716 format"),
)
class Meta:
model = SshPublicKey
fields = []
def __init__(self, *args, **kwargs):
hosting_package = kwargs.pop('hostingpackage')
hosting_package = kwargs.pop("hostingpackage")
self.osuser = hosting_package.osuser
super(AddSshPublicKeyForm, self).__init__(*args, **kwargs)
self.helper = FormHelper()
self.helper.form_action = reverse(
'add_ssh_key', kwargs={'package': hosting_package.id})
self.helper.add_input(Submit('submit', _('Add SSH public key')))
"add_ssh_key", kwargs={"package": hosting_package.id}
)
self.helper.add_input(Submit("submit", _("Add SSH public key")))
def clean_publickeytext(self):
keytext = self.cleaned_data.get('publickeytext')
keytext = self.cleaned_data.get("publickeytext")
try:
SshPublicKey.objects.parse_keytext(keytext)
SshPublicKey.objects.parse_key_text(keytext)
except ValueError:
raise forms.ValidationError(INVALID_SSH_PUBLIC_KEY)
return keytext
def clean(self):
keytext = self.cleaned_data.get('publickeytext')
keytext = self.cleaned_data.get("publickeytext")
if keytext is not None:
alg, data, comment = SshPublicKey.objects.parse_keytext(keytext)
alg, data, comment = SshPublicKey.objects.parse_key_text(keytext)
if SshPublicKey.objects.filter(
user=self.osuser, algorithm=alg, data=data
).exists():
self.add_error(
'publickeytext',
forms.ValidationError(DUPLICATE_SSH_PUBLIC_KEY_FOR_USER)
"publickeytext",
forms.ValidationError(DUPLICATE_SSH_PUBLIC_KEY_FOR_USER),
)
def save(self, commit=True):
@ -104,8 +108,9 @@ class AddSshPublicKeyForm(forms.ModelForm):
:rtype: :py:class:`osusers.models.SshPublicKey`
"""
algorithm, keydata, comment = SshPublicKey.objects.parse_keytext(
self.cleaned_data.get('publickeytext'))
algorithm, keydata, comment = SshPublicKey.objects.parse_key_text(
self.cleaned_data.get("publickeytext")
)
self.instance.user = self.osuser
self.instance.algorithm = algorithm
self.instance.data = keydata
@ -119,17 +124,19 @@ class EditSshPublicKeyCommentForm(forms.ModelForm):
<osusers.models.SshPublicKey>` comment fields.
"""
class Meta:
model = SshPublicKey
fields = ['comment']
fields = ["comment"]
def __init__(self, *args, **kwargs):
hosting_package = kwargs.pop('hostingpackage')
hosting_package = kwargs.pop("hostingpackage")
self.osuser = hosting_package.osuser
super(EditSshPublicKeyCommentForm, self).__init__(*args, **kwargs)
self.fields['comment'].widget = forms.TextInput()
self.fields["comment"].widget = forms.TextInput()
self.helper = FormHelper()
self.helper.form_action = reverse(
'edit_ssh_key_comment',
kwargs={'package': hosting_package.id, 'pk': self.instance.id})
self.helper.add_input(Submit('submit', _('Change Comment')))
"edit_ssh_key_comment",
kwargs={"package": hosting_package.id, "pk": self.instance.id},
)
self.helper.add_input(Submit("submit", _("Change Comment")))

View file

@ -2,20 +2,16 @@
This module defines the database models of operating system users.
"""
from __future__ import unicode_literals
import base64
from datetime import date
import logging
import os
import six
from django.db import models, transaction
from django.conf import settings
from django.core.exceptions import ValidationError
from django.dispatch import Signal
from django.utils import timezone
from django.utils.encoding import python_2_unicode_compatible
from django.utils.translation import ugettext as _
from model_utils.models import TimeStampedModel
@ -27,11 +23,10 @@ from passlib.utils import generate_password
_LOGGER = logging.getLogger(__name__)
password_set = Signal(providing_args=['instance', 'password'])
password_set = Signal(providing_args=["instance", "password"])
CANNOT_USE_PRIMARY_GROUP_AS_ADDITIONAL = _(
"You can not use a user's primary group.")
CANNOT_USE_PRIMARY_GROUP_AS_ADDITIONAL = _("You can not use a user's primary group.")
class GroupManager(models.Manager):
@ -48,34 +43,31 @@ class GroupManager(models.Manager):
:rtype: int
"""
q = self.aggregate(models.Max('gid'))
if q['gid__max'] is None:
q = self.aggregate(models.Max("gid"))
if q["gid__max"] is None:
return settings.OSUSER_MINGID
return max(settings.OSUSER_MINGID, q['gid__max'] + 1)
return max(settings.OSUSER_MINGID, q["gid__max"] + 1)
@python_2_unicode_compatible
class Group(TimeStampedModel, models.Model):
"""
This entity class corresponds to an operating system group.
"""
groupname = models.CharField(
_('Group name'), max_length=16, unique=True)
gid = models.PositiveSmallIntegerField(
_('Group ID'), unique=True, primary_key=True)
descr = models.TextField(_('Description'), blank=True)
passwd = models.CharField(
_('Group password'), max_length=128, blank=True)
groupname = models.CharField(_("Group name"), max_length=16, unique=True)
gid = models.PositiveSmallIntegerField(_("Group ID"), unique=True, primary_key=True)
descr = models.TextField(_("Description"), blank=True)
passwd = models.CharField(_("Group password"), max_length=128, blank=True)
objects = GroupManager()
class Meta:
verbose_name = _('Group')
verbose_name_plural = _('Groups')
verbose_name = _("Group")
verbose_name_plural = _("Groups")
def __str__(self):
return '{0} ({1})'.format(self.groupname, self.gid)
return "{0} ({1})".format(self.groupname, self.gid)
@transaction.atomic
def save(self, *args, **kwargs):
@ -122,10 +114,10 @@ class UserManager(models.Manager):
:rtype: int
"""
q = self.aggregate(models.Max('uid'))
if q['uid__max'] is None:
q = self.aggregate(models.Max("uid"))
if q["uid__max"] is None:
return settings.OSUSER_MINUID
return max(settings.OSUSER_MINUID, q['uid__max'] + 1)
return max(settings.OSUSER_MINUID, q["uid__max"] + 1)
def get_next_username(self):
"""
@ -137,23 +129,21 @@ class UserManager(models.Manager):
"""
count = 1
usernameformat = "{0}{1:02d}"
nextuser = usernameformat.format(settings.OSUSER_USERNAME_PREFIX,
count)
for user in self.values('username').filter(
username__startswith=settings.OSUSER_USERNAME_PREFIX
).order_by('username'):
if user['username'] == nextuser:
nextuser = usernameformat.format(settings.OSUSER_USERNAME_PREFIX, count)
for user in (
self.values("username")
.filter(username__startswith=settings.OSUSER_USERNAME_PREFIX)
.order_by("username")
):
if user["username"] == nextuser:
count += 1
nextuser = usernameformat.format(
settings.OSUSER_USERNAME_PREFIX, count)
nextuser = usernameformat.format(settings.OSUSER_USERNAME_PREFIX, count)
else:
break
return nextuser
@transaction.atomic
def create_user(
self, customer, username=None, password=None, commit=False
):
def create_user(self, customer, username=None, password=None, commit=False):
"""
Create a new user with a primary group named the same as the user and
an initial password.
@ -179,41 +169,42 @@ class UserManager(models.Manager):
password = generate_password()
homedir = os.path.join(settings.OSUSER_HOME_BASEPATH, username)
group = Group.objects.create(groupname=username, gid=gid)
user = self.create(username=username, group=group, uid=uid,
homedir=homedir, customer=customer,
shell=settings.OSUSER_DEFAULT_SHELL)
user = self.create(
username=username,
group=group,
uid=uid,
homedir=homedir,
customer=customer,
shell=settings.OSUSER_DEFAULT_SHELL,
)
user.set_password(password)
if commit:
user.save()
return user
@python_2_unicode_compatible
class User(TimeStampedModel, models.Model):
"""
This entity class corresponds to an operating system user.
"""
username = models.CharField(
_('User name'), max_length=64, unique=True)
uid = models.PositiveSmallIntegerField(
_('User ID'), unique=True, primary_key=True)
group = models.ForeignKey(
Group, verbose_name=_('Group'), on_delete=models.CASCADE)
gecos = models.CharField(_('Gecos field'), max_length=128, blank=True)
homedir = models.CharField(_('Home directory'), max_length=256)
shell = models.CharField(_('Login shell'), max_length=64)
customer = models.ForeignKey(
settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
username = models.CharField(_("User name"), max_length=64, unique=True)
uid = models.PositiveSmallIntegerField(_("User ID"), unique=True, primary_key=True)
group = models.ForeignKey(Group, verbose_name=_("Group"), on_delete=models.CASCADE)
gecos = models.CharField(_("Gecos field"), max_length=128, blank=True)
homedir = models.CharField(_("Home directory"), max_length=256)
shell = models.CharField(_("Login shell"), max_length=64)
customer = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
objects = UserManager()
class Meta:
verbose_name = _('User')
verbose_name_plural = _('Users')
verbose_name = _("User")
verbose_name_plural = _("Users")
def __str__(self):
return '{0} ({1})'.format(self.username, self.uid)
return "{0} ({1})".format(self.username, self.uid)
@transaction.atomic
def set_password(self, password):
@ -226,17 +217,15 @@ class User(TimeStampedModel, models.Model):
:param str password: the new password
"""
if hasattr(self, 'shadow'):
if hasattr(self, "shadow"):
self.shadow.set_password(password)
else:
self.shadow = Shadow.objects.create_shadow(
user=self, password=password
)
password_set.send(
sender=self.__class__, password=password, instance=self)
self.shadow = Shadow.objects.create_shadow(user=self, password=password)
password_set.send(sender=self.__class__, password=password, instance=self)
return True
def is_sftp_user(self):
# noinspection PyUnresolvedReferences
return self.additionalgroup_set.filter(
group__groupname=settings.OSUSER_SFTP_GROUP
).exists()
@ -269,6 +258,7 @@ class User(TimeStampedModel, models.Model):
:py:meth:`django.db.Model.delete`
"""
# noinspection PyUnresolvedReferences
self.group.delete()
super(User, self).delete(*args, **kwargs)
@ -293,64 +283,84 @@ class ShadowManager(models.Manager):
"""
changedays = (timezone.now().date() - date(1970, 1, 1)).days
shadow = self.create(
user=user, changedays=changedays,
minage=0, maxage=None, gracedays=7,
inactdays=30, expiredays=None
user=user,
changedays=changedays,
minage=0,
maxage=None,
gracedays=7,
inactdays=30,
expiredays=None,
)
shadow.set_password(password)
shadow.save()
return shadow
@python_2_unicode_compatible
class Shadow(TimeStampedModel, models.Model):
"""
This entity class corresponds to an operating system user's shadow file
entry.
"""
user = models.OneToOneField(
User, primary_key=True, verbose_name=_('User'),
on_delete=models.CASCADE)
passwd = models.CharField(_('Encrypted password'), max_length=128)
User, primary_key=True, verbose_name=_("User"), on_delete=models.CASCADE
)
passwd = models.CharField(_("Encrypted password"), max_length=128)
changedays = models.PositiveSmallIntegerField(
_('Date of last change'),
help_text=_('This is expressed in days since Jan 1, 1970'),
blank=True, null=True)
_("Date of last change"),
help_text=_("This is expressed in days since Jan 1, 1970"),
blank=True,
null=True,
)
minage = models.PositiveSmallIntegerField(
_('Minimum age'),
help_text=_('Minimum number of days before the password can be'
' changed'),
blank=True, null=True)
_("Minimum age"),
help_text=_("Minimum number of days before the password can be" " changed"),
blank=True,
null=True,
)
maxage = models.PositiveSmallIntegerField(
_('Maximum age'),
help_text=_('Maximum number of days after which the password has to'
' be changed'),
blank=True, null=True)
_("Maximum age"),
help_text=_(
"Maximum number of days after which the password has to" " be changed"
),
blank=True,
null=True,
)
gracedays = models.PositiveSmallIntegerField(
_('Grace period'),
help_text=_('The number of days before the password is going to'
' expire'),
blank=True, null=True)
_("Grace period"),
help_text=_("The number of days before the password is going to" " expire"),
blank=True,
null=True,
)
inactdays = models.PositiveSmallIntegerField(
_('Inactivity period'),
help_text=_('The number of days after the password has expired during'
' which the password should still be accepted'),
blank=True, null=True)
_("Inactivity period"),
help_text=_(
"The number of days after the password has expired during"
" which the password should still be accepted"
),
blank=True,
null=True,
)
expiredays = models.PositiveSmallIntegerField(
_('Account expiration date'),
help_text=_('The date of expiration of the account, expressed as'
' number of days since Jan 1, 1970'),
blank=True, null=True, default=None)
_("Account expiration date"),
help_text=_(
"The date of expiration of the account, expressed as"
" number of days since Jan 1, 1970"
),
blank=True,
null=True,
default=None,
)
objects = ShadowManager()
class Meta:
verbose_name = _('Shadow password')
verbose_name_plural = _('Shadow passwords')
verbose_name = _("Shadow password")
verbose_name_plural = _("Shadow passwords")
def __str__(self):
return 'for user {0}'.format(self.user)
return "for user {0}".format(self.user)
def set_password(self, password):
"""
@ -361,23 +371,23 @@ class Shadow(TimeStampedModel, models.Model):
self.passwd = sha512_crypt.encrypt(password)
@python_2_unicode_compatible
class AdditionalGroup(TimeStampedModel, models.Model):
"""
This entity class corresponds to additional group assignments for an
:py:class:`operating system user <osusers.models.User>`.
"""
user = models.ForeignKey(User, on_delete=models.CASCADE)
group = models.ForeignKey(Group, on_delete=models.CASCADE)
class Meta:
unique_together = ('user', 'group')
verbose_name = _('Additional group')
verbose_name_plural = _('Additional groups')
unique_together = ("user", "group")
verbose_name = _("Additional group")
verbose_name_plural = _("Additional groups")
def __str__(self):
return '{0} in {1}'.format(self.user, self.group)
return "{0} in {1}".format(self.user, self.group)
def clean(self):
"""
@ -385,6 +395,7 @@ class AdditionalGroup(TimeStampedModel, models.Model):
group.
"""
# noinspection PyUnresolvedReferences
if self.user.group == self.group:
raise ValidationError(CANNOT_USE_PRIMARY_GROUP_AS_ADDITIONAL)
@ -423,60 +434,62 @@ class SshPublicKeyManager(models.Manager):
"""
def parse_keytext(self, keytext):
def parse_key_text(self, key_text: str):
"""
Parse a SSH public key in OpenSSH or :rfc:`4716` format into its
components algorithm, key data and comment.
:param str keytext: key text
:param str key_text: key text
:return: triple of algorithm name, key data and comment
:rtype: triple of str
"""
if keytext.startswith('---- BEGIN SSH2 PUBLIC KEY ----'):
comment = ''
data = ''
continued = ''
if key_text.startswith("---- BEGIN SSH2 PUBLIC KEY ----"):
comment = ""
data = ""
continued = ""
headers = {}
for line in keytext.splitlines():
if line == '---- BEGIN SSH2 PUBLIC KEY ----':
header_tag = None
for line in key_text.splitlines():
if line == "---- BEGIN SSH2 PUBLIC KEY ----":
continue
elif ':' in line: # a header line
elif ":" in line: # a header line
header_tag, header_value = [
item.strip() for item in line.split(':', 1)]
if header_value.endswith('\\'):
item.strip() for item in line.split(":", 1)
]
if header_value.endswith("\\"):
continued = header_value[:-1]
else:
headers[header_tag.lower()] = header_value
elif continued:
if line.endswith('\\'):
if line.endswith("\\"):
continued += line[:-1]
continue
header_value = continued + line
headers[header_tag.lower()] = header_value
continued = ''
elif line == '---- END SSH2 PUBLIC KEY ----':
continued = ""
elif line == "---- END SSH2 PUBLIC KEY ----":
break
elif line: # ignore empty lines
data += line
if 'comment' in headers:
comment = headers['comment']
if "comment" in headers:
comment = headers["comment"]
else:
parts = keytext.split(None, 2)
parts = key_text.split(None, 2)
if len(parts) < 2:
raise ValueError('invalid SSH public key')
raise ValueError("invalid SSH public key")
data = parts[1]
comment = len(parts) == 3 and parts[2] or ""
try:
keybytes = base64.b64decode(data)
except TypeError:
raise ValueError('invalid SSH public key')
parts = keybytes.split(b'\x00' * 3)
raise ValueError("invalid SSH public key")
parts = keybytes.split(b"\x00" * 3)
if len(parts) < 2:
raise ValueError('invalid SSH public key')
alglength = six.byte2int(parts[1])
algname = parts[1][1:1+alglength]
return algname, data, comment
raise ValueError("invalid SSH public key")
key_length = int.from_bytes(parts[1], byteorder="big")
key_algorithm = parts[1][1 : 1 + key_length].decode("utf-8")
return key_algorithm, data, comment
def create_ssh_public_key(self, user, keytext):
"""
@ -490,31 +503,28 @@ class SshPublicKeyManager(models.Manager):
:retype: :py:class:`osusers.models.SshPublicKey`
"""
algorithm, data, comment = self.parse_keytext(keytext)
return self.create(
user=user, algorithm=algorithm, data=data, comment=comment)
algorithm, data, comment = self.parse_key_text(keytext)
return self.create(user=user, algorithm=algorithm, data=data, comment=comment)
@python_2_unicode_compatible
class SshPublicKey(TimeStampedModel):
"""
This entity class represents single SSH keys for an :py:class:`operating
system user <osusers.models.User>`.
"""
user = models.ForeignKey(
User, verbose_name=_('User'), on_delete=models.CASCADE)
algorithm = models.CharField(_('Algorithm'), max_length=20)
data = models.TextField(_('Key bytes'),
help_text=_('Base64 encoded key bytes'))
comment = models.TextField(_('Comment'), blank=True)
user = models.ForeignKey(User, verbose_name=_("User"), on_delete=models.CASCADE)
algorithm = models.CharField(_("Algorithm"), max_length=20)
data = models.TextField(_("Key bytes"), help_text=_("Base64 encoded key bytes"))
comment = models.TextField(_("Comment"), blank=True)
objects = SshPublicKeyManager()
class Meta:
verbose_name = _('SSH public key')
verbose_name_plural = _('SSH public keys')
unique_together = [('user', 'algorithm', 'data')]
verbose_name = _("SSH public key")
verbose_name_plural = _("SSH public keys")
unique_together = [("user", "algorithm", "data")]
def __str__(self):
return "{algorithm} {data} {comment}".format(

View file

@ -5,17 +5,10 @@ from django.test.utils import override_settings
from django.contrib.auth import get_user_model
from mock import MagicMock, Mock, patch
from unittest.mock import MagicMock, Mock, patch
from osusers.forms import (
INVALID_SSH_PUBLIC_KEY,
DUPLICATE_SSH_PUBLIC_KEY_FOR_USER,
)
from osusers.models import (
Group,
SshPublicKey,
User,
)
from osusers.forms import INVALID_SSH_PUBLIC_KEY, DUPLICATE_SSH_PUBLIC_KEY_FOR_USER
from osusers.models import Group, SshPublicKey, User
from osusers.admin import (
GroupAdmin,
PASSWORD_MISMATCH_ERROR,
@ -30,20 +23,19 @@ Customer = get_user_model()
class CustomerTestCase(TestCase):
def setUp(self):
self.customer = Customer.objects.create_user('test')
self.customer = Customer.objects.create_user("test")
super(CustomerTestCase, self).setUp()
class UserCreationFormTest(CustomerTestCase):
def test_clean_password2_same(self):
form = UserCreationForm()
form.cleaned_data = {
'customer': self.customer,
'password1': 'secret',
'password2': 'secret'
"customer": self.customer,
"password1": "secret",
"password2": "secret",
}
self.assertEqual(form.clean_password2(), 'secret')
self.assertEqual(form.clean_password2(), "secret")
def test_clean_password2_empty(self):
form = UserCreationForm()
@ -53,25 +45,23 @@ class UserCreationFormTest(CustomerTestCase):
def test_clean_password2_mismatch(self):
form = UserCreationForm()
form.cleaned_data = {
'customer': self.customer,
'password1': 'secretx',
'password2': 'secrety'
"customer": self.customer,
"password1": "secretx",
"password2": "secrety",
}
with self.assertRaises(forms.ValidationError) as cm:
form.clean_password2()
self.assertEqual(cm.exception.message, PASSWORD_MISMATCH_ERROR)
@override_settings(
CELERY_ALWAYS_EAGER=True,
CELERY_CACHE_BACKEND='memory',
BROKER_BACKEND='memory'
CELERY_ALWAYS_EAGER=True, CELERY_CACHE_BACKEND="memory", BROKER_BACKEND="memory"
)
def test_save_commit(self):
form = UserCreationForm()
form.cleaned_data = {
'customer': self.customer,
'password1': 'secret',
'password2': 'secret'
"customer": self.customer,
"password1": "secret",
"password2": "secret",
}
user = form.save()
self.assertIsNotNone(user)
@ -89,121 +79,99 @@ class UserAdminTest(CustomerTestCase):
super(UserAdminTest, self).setUp()
def test_get_form_without_object(self):
form = self.uadmin.get_form(Mock(name='request'))
self.assertEqual(
form.Meta.fields,
['customer', 'password1', 'password2']
)
form = self.uadmin.get_form(Mock(name="request"))
self.assertEqual(form.Meta.fields, ["customer", "password1", "password2"])
@override_settings(
CELERY_ALWAYS_EAGER=True,
CELERY_CACHE_BACKEND='memory',
BROKER_BACKEND='memory'
CELERY_ALWAYS_EAGER=True, CELERY_CACHE_BACKEND="memory", BROKER_BACKEND="memory"
)
def test_get_form_with_object(self):
user = User.objects.create_user(customer=self.customer)
form = self.uadmin.get_form(Mock(name='request'), user)
form = self.uadmin.get_form(Mock(name="request"), user)
self.assertEqual(
form.Meta.fields,
['username', 'group', 'gecos', 'homedir', 'shell', 'customer',
'uid']
["username", "group", "gecos", "homedir", "shell", "customer", "uid"],
)
def test_get_inline_instances_without_object(self):
inlines = self.uadmin.get_inline_instances(Mock(name='request'))
inlines = self.uadmin.get_inline_instances(Mock(name="request"))
self.assertEqual(len(inlines), 2)
@override_settings(
CELERY_ALWAYS_EAGER=True,
CELERY_CACHE_BACKEND='memory',
BROKER_BACKEND='memory'
CELERY_ALWAYS_EAGER=True, CELERY_CACHE_BACKEND="memory", BROKER_BACKEND="memory"
)
def test_get_inline_instances_with_object(self):
user = User.objects.create_user(customer=self.customer)
inlines = self.uadmin.get_inline_instances(
Mock(name='request'), user)
inlines = self.uadmin.get_inline_instances(Mock(name="request"), user)
self.assertEqual(len(inlines), len(UserAdmin.inlines))
for index in range(len(inlines)):
self.assertIsInstance(inlines[index], UserAdmin.inlines[index])
@override_settings(
CELERY_ALWAYS_EAGER=True,
CELERY_CACHE_BACKEND='memory',
BROKER_BACKEND='memory'
CELERY_ALWAYS_EAGER=True, CELERY_CACHE_BACKEND="memory", BROKER_BACKEND="memory"
)
def test_perform_delete_selected(self):
user = User.objects.create_user(customer=self.customer)
self.uadmin.perform_delete_selected(
Mock(name='request'), User.objects.filter(uid=user.uid))
Mock(name="request"), User.objects.filter(uid=user.uid)
)
self.assertEqual(User.objects.filter(uid=user.uid).count(), 0)
def test_get_actions(self):
requestmock = MagicMock(name='request')
self.assertNotIn(
'delete_selected',
self.uadmin.get_actions(requestmock))
self.assertIn(
'perform_delete_selected',
self.uadmin.get_actions(requestmock))
requestmock = MagicMock(name="request")
self.assertNotIn("delete_selected", self.uadmin.get_actions(requestmock))
self.assertIn("perform_delete_selected", self.uadmin.get_actions(requestmock))
class GroupAdminTest(TestCase):
def setUp(self):
site = AdminSite()
self.gadmin = GroupAdmin(Group, site)
super(GroupAdminTest, self).setUp()
def test_get_inline_instances_without_object(self):
inlines = self.gadmin.get_inline_instances(Mock(name='request'))
inlines = self.gadmin.get_inline_instances(Mock(name="request"))
self.assertEqual(inlines, [])
@override_settings(
CELERY_ALWAYS_EAGER=True,
CELERY_CACHE_BACKEND='memory',
BROKER_BACKEND='memory'
CELERY_ALWAYS_EAGER=True, CELERY_CACHE_BACKEND="memory", BROKER_BACKEND="memory"
)
def test_get_inline_instances_with_object(self):
group = Group.objects.create(gid=1000, groupname='test')
inlines = self.gadmin.get_inline_instances(
Mock(name='request'), group)
group = Group.objects.create(gid=1000, groupname="test")
inlines = self.gadmin.get_inline_instances(Mock(name="request"), group)
self.assertEqual(len(inlines), len(GroupAdmin.inlines))
for index in range(len(inlines)):
self.assertIsInstance(inlines[index], GroupAdmin.inlines[index])
def test_perform_delete_selected(self):
group = Group.objects.create(gid=1000, groupname='test')
group = Group.objects.create(gid=1000, groupname="test")
self.gadmin.perform_delete_selected(
Mock(name='request'), Group.objects.filter(gid=group.gid))
Mock(name="request"), Group.objects.filter(gid=group.gid)
)
self.assertEqual(Group.objects.filter(gid=group.gid).count(), 0)
def test_get_actions(self):
requestmock = MagicMock(name='request')
self.assertNotIn(
'delete_selected',
self.gadmin.get_actions(requestmock))
self.assertIn(
'perform_delete_selected',
self.gadmin.get_actions(requestmock))
requestmock = MagicMock(name="request")
self.assertNotIn("delete_selected", self.gadmin.get_actions(requestmock))
self.assertIn("perform_delete_selected", self.gadmin.get_actions(requestmock))
class SshPublicKeyCreationFormTest(CustomerTestCase):
@patch('osusers.admin.SshPublicKey.objects')
@patch("osusers.admin.SshPublicKey.objects")
def test_clean_publickeytext_valid_key(self, sshpkmanager):
form = SshPublicKeyCreationForm()
sshpkmanager.parse_keytext = MagicMock(side_effect=ValueError)
form.cleaned_data = {'publickeytext': 'wrongkey'}
sshpkmanager.parse_key_text = MagicMock(side_effect=ValueError)
form.cleaned_data = {"publickeytext": "wrongkey"}
with self.assertRaises(forms.ValidationError) as ve:
form.clean_publickeytext()
self.assertEqual(ve.exception.message, INVALID_SSH_PUBLIC_KEY)
@patch('osusers.admin.SshPublicKey.objects')
@patch("osusers.admin.SshPublicKey.objects")
def test_clean_publickeytext_invalid_key(self, sshpkmanager):
form = SshPublicKeyCreationForm()
sshpkmanager.parse_keytext = MagicMock(return_value='goodkey')
form.cleaned_data = {'publickeytext': 'goodkey'}
self.assertEqual(form.clean_publickeytext(), 'goodkey')
sshpkmanager.parse_key_text = MagicMock(return_value="goodkey")
form.cleaned_data = {"publickeytext": "goodkey"}
self.assertEqual(form.clean_publickeytext(), "goodkey")
def test_clean_missing_data(self):
form = SshPublicKeyCreationForm()
@ -211,95 +179,83 @@ class SshPublicKeyCreationFormTest(CustomerTestCase):
form.clean()
self.assertEqual(len(form.errors), 0)
@patch('osusers.admin.SshPublicKey.objects.parse_keytext')
def test_clean_once(self, parse_keytext):
parse_keytext.return_value = ('good', 'key', 'comment')
@patch("osusers.admin.SshPublicKey.objects.parse_key_text")
def test_clean_once(self, parse_key_text):
parse_key_text.return_value = ("good", "key", "comment")
user = User.objects.create_user(customer=self.customer)
form = SshPublicKeyCreationForm()
form.cleaned_data = {
'user': user,
'publickeytext': 'good key comment'
}
form.cleaned_data = {"user": user, "publickeytext": "good key comment"}
form.clean()
self.assertEqual(len(form.errors), 0)
@patch('osusers.admin.SshPublicKey.objects.parse_keytext')
def test_clean_again(self, parse_keytext):
parse_keytext.return_value = ('good', 'key', 'comment')
@patch("osusers.admin.SshPublicKey.objects.parse_key_text")
def test_clean_again(self, parse_key_text):
parse_key_text.return_value = ("good", "key", "comment")
user = User.objects.create_user(customer=self.customer)
SshPublicKey.objects.create(
user=user, algorithm='good', data='key', comment='comment')
user=user, algorithm="good", data="key", comment="comment"
)
form = SshPublicKeyCreationForm()
form.cleaned_data = {
'user': user,
'publickeytext': 'good key comment'
}
form.cleaned_data = {"user": user, "publickeytext": "good key comment"}
form.clean()
self.assertIn('publickeytext', form.errors)
self.assertIn("publickeytext", form.errors)
self.assertEqual(
form.errors['publickeytext'],
[DUPLICATE_SSH_PUBLIC_KEY_FOR_USER])
form.errors["publickeytext"], [DUPLICATE_SSH_PUBLIC_KEY_FOR_USER]
)
@patch('osusers.admin.SshPublicKey.objects.parse_keytext')
def test_save(self, parse_keytext):
parse_keytext.return_value = ('good', 'key', 'comment')
@patch("osusers.admin.SshPublicKey.objects.parse_key_text")
def test_save(self, parse_key_text):
parse_key_text.return_value = ("good", "key", "comment")
user = User.objects.create_user(customer=self.customer)
form = SshPublicKeyCreationForm()
form.cleaned_data = {
'user': user,
'publickeytext': 'good key comment'
}
form.cleaned_data = {"user": user, "publickeytext": "good key comment"}
form.instance.user = user
form.save()
self.assertTrue(
SshPublicKey.objects.filter(
user=user, algorithm='good', data='key'))
SshPublicKey.objects.filter(user=user, algorithm="good", data="key")
)
class SshPublicKeyAdminTest(CustomerTestCase):
def setUp(self):
site = AdminSite()
self.sadmin = SshPublicKeyAdmin(SshPublicKey, site)
super(SshPublicKeyAdminTest, self).setUp()
def test_get_form_no_instance(self):
form = self.sadmin.get_form(request=Mock(name='request'))
form = self.sadmin.get_form(request=Mock(name="request"))
self.assertEqual(form.Meta.model, SshPublicKey)
def test_get_form_with_instance(self):
user = User.objects.create_user(customer=self.customer)
key = SshPublicKey.objects.create(
user=user, algorithm='good', data='key', comment='comment')
form = self.sadmin.get_form(request=Mock(name='request'), obj=key)
user=user, algorithm="good", data="key", comment="comment"
)
form = self.sadmin.get_form(request=Mock(name="request"), obj=key)
self.assertEqual(form.Meta.model, SshPublicKey)
self.assertEqual(
form.Meta.fields,
['user', 'comment', 'algorithm', 'data'])
self.assertEqual(form.Meta.fields, ["user", "comment", "algorithm", "data"])
def test_get_readonly_fields_no_instance(self):
readonly_fields = self.sadmin.get_readonly_fields(
request=Mock(name='request'))
readonly_fields = self.sadmin.get_readonly_fields(request=Mock(name="request"))
self.assertEqual(readonly_fields, [])
def test_get_readonly_fields_with_instance(self):
readonly_fields = self.sadmin.get_readonly_fields(
request=Mock(name='request'), obj=Mock())
self.assertEqual(readonly_fields, ['algorithm', 'data'])
request=Mock(name="request"), obj=Mock()
)
self.assertEqual(readonly_fields, ["algorithm", "data"])
def test_perform_delete_selected(self):
user = User.objects.create_user(customer=self.customer)
key = SshPublicKey.objects.create(
user=user, algorithm='good', data='key', comment='comment')
user=user, algorithm="good", data="key", comment="comment"
)
self.sadmin.perform_delete_selected(
Mock(name='request'), SshPublicKey.objects.filter(id=key.id))
Mock(name="request"), SshPublicKey.objects.filter(id=key.id)
)
self.assertFalse(SshPublicKey.objects.filter(id=key.id).exists())
def test_get_actions(self):
requestmock = MagicMock(name='request')
self.assertNotIn(
'delete_selected',
self.sadmin.get_actions(requestmock))
self.assertIn(
'perform_delete_selected',
self.sadmin.get_actions(requestmock))
requestmock = MagicMock(name="request")
self.assertNotIn("delete_selected", self.sadmin.get_actions(requestmock))
self.assertIn("perform_delete_selected", self.sadmin.get_actions(requestmock))

View file

@ -2,15 +2,13 @@
This module provides tests for :py:mod:`osusers.forms`.
"""
from __future__ import absolute_import, unicode_literals
from mock import MagicMock, Mock, patch
from unittest.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 django.urls import reverse
from passlib.hash import sha512_crypt
@ -34,7 +32,7 @@ class AddSshPublicKeyFormTest(TestCase):
"""
def _setup_hostingpackage(self):
customer = Customer.objects.create_user('test')
customer = Customer.objects.create_user("test")
user = User.objects.create_user(customer=customer)
self.hostingpackage = Mock(id=42, osuser=user)
@ -42,97 +40,92 @@ class AddSshPublicKeyFormTest(TestCase):
instance = MagicMock()
with self.assertRaises(KeyError) as ke:
AddSshPublicKeyForm(instance)
self.assertEqual(ke.exception.args[0], 'hostingpackage')
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'))
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')
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):
@patch("osusers.forms.SshPublicKey.objects.parse_key_text")
def test_clean_publickeytext_invalid(self, parse_key_text):
self._setup_hostingpackage()
instance = MagicMock()
form = AddSshPublicKeyForm(
instance, hostingpackage=self.hostingpackage)
form.cleaned_data = {'publickeytext': 'a bad key'}
parse_keytext.side_effect = ValueError
form = AddSshPublicKeyForm(instance, hostingpackage=self.hostingpackage)
form.cleaned_data = {"publickeytext": "a bad key"}
parse_key_text.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):
@patch("osusers.forms.SshPublicKey.objects.parse_key_text")
def test_clean_publickeytext_valid(self, _):
self._setup_hostingpackage()
instance = MagicMock()
form = AddSshPublicKeyForm(
instance, hostingpackage=self.hostingpackage)
form.cleaned_data = {'publickeytext': 'good key comment'}
form = AddSshPublicKeyForm(instance, hostingpackage=self.hostingpackage)
form.cleaned_data = {"publickeytext": "good key comment"}
retval = form.clean_publickeytext()
self.assertEqual(retval, 'good key comment')
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 = AddSshPublicKeyForm(instance, hostingpackage=self.hostingpackage)
form.cleaned_data = {"publickeytext": None}
form.clean()
self.assertIsNone(form.cleaned_data['publickeytext'])
self.assertIsNone(form.cleaned_data["publickeytext"])
@patch('osusers.forms.SshPublicKey.objects.parse_keytext')
def test_clean_fresh(self, parse_keytext):
@patch("osusers.forms.SshPublicKey.objects.parse_key_text")
def test_clean_fresh(self, parse_key_text):
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 = AddSshPublicKeyForm(instance, hostingpackage=self.hostingpackage)
sshpubkey = "good key comment"
form.cleaned_data = {"publickeytext": sshpubkey}
parse_key_text.return_value = sshpubkey.split(" ")
form.clean()
self.assertEqual(
form.cleaned_data['publickeytext'], 'good key comment')
self.assertEqual(form.cleaned_data["publickeytext"], "good key comment")
@patch('osusers.forms.SshPublicKey.objects.parse_keytext')
def test_clean_duplicate(self, parse_keytext):
@patch("osusers.forms.SshPublicKey.objects.parse_key_text")
def test_clean_duplicate(self, parse_key_text):
self._setup_hostingpackage()
instance = MagicMock()
form = AddSshPublicKeyForm(
instance, hostingpackage=self.hostingpackage)
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(' ')
user=self.hostingpackage.osuser,
algorithm="good",
data="key",
comment="comment",
)
sshpubkey = "good key comment"
form.cleaned_data = {"publickeytext": sshpubkey}
parse_key_text.return_value = sshpubkey.split(" ")
form.clean()
self.assertIn('publickeytext', form.errors)
self.assertIn(
DUPLICATE_SSH_PUBLIC_KEY_FOR_USER,
form.errors['publickeytext'])
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):
@patch("osusers.admin.SshPublicKey.objects.parse_key_text")
def test_save(self, parse_key_text):
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 = AddSshPublicKeyForm(instance, hostingpackage=self.hostingpackage)
sshpubkey = "good key comment"
form.cleaned_data = {"publickeytext": sshpubkey}
parse_key_text.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')
self.assertEqual(retval.algorithm, "good")
self.assertEqual(retval.data, "key")
self.assertEqual(retval.comment, "comment")
class ChangeOsUserPasswordFormTest(TestCase):
@ -142,25 +135,27 @@ class ChangeOsUserPasswordFormTest(TestCase):
"""
def _setup_user(self):
customer = Customer.objects.create_user('test')
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.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')
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'}
form.cleaned_data = {"password1": "test"}
user = form.save()
self.assertTrue(sha512_crypt.verify('test', user.shadow.passwd))
self.assertTrue(sha512_crypt.verify("test", user.shadow.passwd))
class EditSshPublicKeyCommentFormTest(TestCase):
@ -170,7 +165,7 @@ class EditSshPublicKeyCommentFormTest(TestCase):
"""
def _setup_hostingpackage(self):
customer = Customer.objects.create_user('test')
customer = Customer.objects.create_user("test")
user = User.objects.create_user(customer=customer)
self.hostingpackage = Mock(id=42, osuser=user)
@ -178,18 +173,23 @@ class EditSshPublicKeyCommentFormTest(TestCase):
instance = MagicMock()
with self.assertRaises(KeyError) as ke:
EditSshPublicKeyCommentForm(instance)
self.assertEqual(ke.exception.args[0], 'hostingpackage')
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'))
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')
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")

View file

@ -1,19 +1,17 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from datetime import date
from django.conf import settings
from django.contrib.auth import get_user_model
from django.core.exceptions import ValidationError
from django.test import TestCase
from django.test.utils import override_settings
from django.utils import timezone
from django.contrib.auth import get_user_model
from passlib.hash import sha512_crypt
from osusers.models import (
CANNOT_USE_PRIMARY_GROUP_AS_ADDITIONAL,
AdditionalGroup,
CANNOT_USE_PRIMARY_GROUP_AS_ADDITIONAL,
Group,
Shadow,
SshPublicKey,
@ -21,7 +19,6 @@ from osusers.models import (
)
from taskresults.models import TaskResult
EXAMPLE_KEY_1_RFC4716 = """---- BEGIN SSH2 PUBLIC KEY ----
Comment: "1024-bit RSA, converted from OpenSSH by me@example.com"
x-command: /home/me/bin/lock-in-guest.sh
@ -57,12 +54,14 @@ n24VYtYtsMu74qXviYjziVucWKjjKEb11juqnF0GDlB3VVmxHLmxnAz643WK42Z7dLM5
sY29ouezv4Xz2PuMch5VGPP+CDqzCM4loWgV
---- END SSH2 PUBLIC KEY ----"""
EXAMPLE_KEY_4_OPENSSH = "".join((
"ssh-rsa ",
"AAAAB3NzaC1yc2EAAAABIwAAAIEA1on8gxCGJJWSRT4uOrR13mUaUk0hRf4RzxSZ1zRb",
"YYFw8pfGesIFoEuVth4HKyF8k1y4mRUnYHP1XNMNMJl1JcEArC2asV8sHf6zSPVffozZ",
"5TT4SfsUu/iKy9lUcCfXzwre4WWZSXXcPff+EHtWshahu3WzBdnGxm5Xoi89zcE="
))
EXAMPLE_KEY_4_OPENSSH = "".join(
(
"ssh-rsa ",
"AAAAB3NzaC1yc2EAAAABIwAAAIEA1on8gxCGJJWSRT4uOrR13mUaUk0hRf4RzxSZ1zRb",
"YYFw8pfGesIFoEuVth4HKyF8k1y4mRUnYHP1XNMNMJl1JcEArC2asV8sHf6zSPVffozZ",
"5TT4SfsUu/iKy9lUcCfXzwre4WWZSXXcPff+EHtWshahu3WzBdnGxm5Xoi89zcE=",
)
)
EXAMPLE_KEY_5_RFC4716_MULTILINE = """---- BEGIN SSH2 PUBLIC KEY ----
Comment: DSA Public Key \\
@ -99,10 +98,7 @@ YYFw8pfGesIFoEuVth4HKyF8k1y4mRUnYHP1XNMNMJl1JcEArC2asV8sHf6zSPVffozZ
5TT4SfsUu/iKy9lUcCfXzwre4WWZSXXcPff+EHtWshahu3WzBdnGxm5Xoi89zcE=
---- END SSH2 PUBLIC KEY ----"""
EXAMPLE_KEY_8_OPENSSH_BROKEN = "".join((
"ssh-rsa ",
"AschrÖdderöd"
))
EXAMPLE_KEY_8_OPENSSH_BROKEN = "".join(("ssh-rsa ", "AschrÖdderöd"))
EXAMPLE_KEY_9_RFC4716_ONLY_HEADER = "---- BEGIN SSH2 PUBLIC KEY ----"
@ -110,9 +106,7 @@ Customer = get_user_model()
@override_settings(
CELERY_ALWAYS_EAGER=True,
CELERY_CACHE_BACKEND='memory',
BROKER_BACKEND='memory'
CELERY_ALWAYS_EAGER=True, CELERY_CACHE_BACKEND="memory", BROKER_BACKEND="memory"
)
class TestCaseWithCeleryTasks(TestCase):
pass
@ -120,38 +114,44 @@ class TestCaseWithCeleryTasks(TestCase):
class AdditionalGroupTest(TestCaseWithCeleryTasks):
def setUp(self):
customer = Customer.objects.create(username='test')
self.group1 = Group.objects.create(groupname='test1', gid=1000)
customer = Customer.objects.create(username="test")
self.group1 = Group.objects.create(groupname="test1", gid=1000)
self.user = User.objects.create(
customer=customer, username='test', uid=1000, group=self.group1,
homedir='/home/test', shell='/bin/bash')
customer=customer,
username="test",
uid=1000,
group=self.group1,
homedir="/home/test",
shell="/bin/bash",
)
def test_clean_primary_group(self):
testsubj = AdditionalGroup(user=self.user, group=self.group1)
with self.assertRaises(ValidationError) as cm:
testsubj.clean()
self.assertEqual(
cm.exception.message, CANNOT_USE_PRIMARY_GROUP_AS_ADDITIONAL)
self.assertEqual(cm.exception.message, CANNOT_USE_PRIMARY_GROUP_AS_ADDITIONAL)
def test_clean_other_group(self):
group2 = Group.objects.create(groupname='test2', gid=1001)
group2 = Group.objects.create(groupname="test2", gid=1001)
testsubj = AdditionalGroup(user=self.user, group=group2)
testsubj.clean()
def test_save(self):
group2 = Group.objects.create(groupname='test2', gid=1001)
group2 = Group.objects.create(groupname="test2", gid=1001)
addgroup = AdditionalGroup(user=self.user, group=group2)
addgroup.save()
taskres = TaskResult.objects.all()
self.assertTrue(len(taskres), 4)
creators = [r.creator for r in taskres]
for tcount, tcreator in [
(2, 'handle_group_created'), (1, 'handle_user_created'),
(1, 'handle_user_added_to_group')]:
(2, "handle_group_created"),
(1, "handle_user_created"),
(1, "handle_user_added_to_group"),
]:
self.assertEqual(creators.count(tcreator), tcount)
def test_save_again(self):
group2 = Group.objects.create(groupname='test2', gid=1001)
group2 = Group.objects.create(groupname="test2", gid=1001)
TaskResult.objects.all().delete()
addgroup = AdditionalGroup(user=self.user, group=group2)
addgroup.save()
@ -161,15 +161,18 @@ class AdditionalGroupTest(TestCaseWithCeleryTasks):
self.assertEqual(len(taskres), 0)
def test_delete(self):
group2 = Group.objects.create(groupname='test2', gid=1001)
group2 = Group.objects.create(groupname="test2", gid=1001)
# noinspection PyUnresolvedReferences
addgroup = AdditionalGroup.objects.create(user=self.user, group=group2)
addgroup.delete()
# noinspection PyUnresolvedReferences
self.assertEqual(len(AdditionalGroup.objects.all()), 0)
def test___str__(self):
group2 = Group.objects.create(groupname='test2', gid=1001)
group2 = Group.objects.create(groupname="test2", gid=1001)
# noinspection PyUnresolvedReferences
addgroup = AdditionalGroup.objects.create(user=self.user, group=group2)
self.assertEqual(str(addgroup), 'test (1000) in test2 (1001)')
self.assertEqual(str(addgroup), "test (1000) in test2 (1001)")
@override_settings(OSUSER_MINGID=10000)
@ -178,56 +181,61 @@ class GroupManagerTest(TestCaseWithCeleryTasks):
self.assertEqual(Group.objects.get_next_gid(), 10000)
def test_get_next_gid_second(self):
Group.objects.create(gid=10010, groupname='test')
Group.objects.create(gid=10010, groupname="test")
self.assertEqual(Group.objects.get_next_gid(), 10011)
class GroupTest(TestCaseWithCeleryTasks):
def test___str__(self):
group = Group.objects.create(gid=10000, groupname='test')
self.assertEqual(str(group), 'test (10000)')
group = Group.objects.create(gid=10000, groupname="test")
self.assertEqual(str(group), "test (10000)")
def test_save(self):
group = Group(gid=10000, groupname='test')
group = Group(gid=10000, groupname="test")
self.assertIs(group.save(), group)
taskres = TaskResult.objects.all()
self.assertTrue(len(taskres), 1)
creators = [r.creator for r in taskres]
for tcount, tcreator in [
(1, 'handle_group_created')]:
for tcount, tcreator in [(1, "handle_group_created")]:
self.assertEqual(creators.count(tcreator), tcount)
def test_save_again(self):
group = Group.objects.create(gid=10000, groupname='test')
taskres = TaskResult.objects.all().delete()
group = Group.objects.create(gid=10000, groupname="test")
TaskResult.objects.all().delete()
group.save()
taskres = TaskResult.objects.all()
self.assertEqual(len(taskres), 0)
def test_delete(self):
group = Group.objects.create(gid=10000, groupname='test')
group = Group.objects.create(gid=10000, groupname="test")
self.assertEqual(len(Group.objects.all()), 1)
group.delete()
self.assertEqual(len(Group.objects.all()), 0)
self.assertEqual(len(TaskResult.objects.all()), 2)
tr = TaskResult.objects.first()
self.assertEqual(tr.creator, 'handle_group_created')
self.assertEqual(tr.creator, "handle_group_created")
class ShadowManagerTest(TestCaseWithCeleryTasks):
def setUp(self):
self.customer = Customer.objects.create(username='test')
self.customer = Customer.objects.create(username="test")
super(ShadowManagerTest, self).setUp()
def test_create_shadow(self):
user = User(
customer=self.customer, username='test', uid=1000,
group=Group(gid=1000, groupname='test'), homedir='/home/test',
shell='/bin/fooshell')
shadow = Shadow.objects.create_shadow(user, 'test')
self.assertTrue(sha512_crypt.verify('test', shadow.passwd))
self.assertEqual(shadow.changedays,
(timezone.now().date() - date(1970, 1, 1)).days)
group = Group.objects.create(gid=1000, groupname="test")
user = User.objects.create(
customer=self.customer,
username="test",
uid=1000,
group=group,
homedir="/home/test",
shell="/bin/fooshell",
)
shadow = Shadow.objects.create_shadow(user, "test")
self.assertTrue(sha512_crypt.verify("test", shadow.passwd))
self.assertEqual(
shadow.changedays, (timezone.now().date() - date(1970, 1, 1)).days
)
self.assertEqual(shadow.user, user)
self.assertEqual(shadow.minage, 0)
self.assertIsNone(shadow.maxage)
@ -238,39 +246,50 @@ class ShadowManagerTest(TestCaseWithCeleryTasks):
class ShadowTest(TestCaseWithCeleryTasks):
def setUp(self):
self.customer = Customer.objects.create(username='test')
self.customer = Customer.objects.create(username="test")
super(ShadowTest, self).setUp()
def test___str__(self):
group = Group.objects.create(
groupname='test', gid=1000)
group = Group.objects.create(groupname="test", gid=1000)
user = User.objects.create(
customer=self.customer, username='test', uid=1000, group=group,
homedir='/home/test', shell='/bin/bash')
customer=self.customer,
username="test",
uid=1000,
group=group,
homedir="/home/test",
shell="/bin/bash",
)
shadow = Shadow(user=user)
self.assertEqual(str(shadow), 'for user test (1000)')
self.assertEqual(str(shadow), "for user test (1000)")
def test_set_password(self):
group = Group.objects.create(
groupname='test', gid=1000)
group = Group.objects.create(groupname="test", gid=1000)
user = User.objects.create(
customer=self.customer, username='test', uid=1000, group=group,
homedir='/home/test', shell='/bin/bash')
customer=self.customer,
username="test",
uid=1000,
group=group,
homedir="/home/test",
shell="/bin/bash",
)
shadow = Shadow(user=user)
shadow.set_password('test')
self.assertTrue(sha512_crypt.verify('test', shadow.passwd))
shadow.set_password("test")
self.assertTrue(sha512_crypt.verify("test", shadow.passwd))
@override_settings(
OSUSER_MINUID=10000, OSUSER_MINGID=10000, OSUSER_USERNAME_PREFIX='test',
OSUSER_HOME_BASEPATH='/home', OSUSER_DEFAULT_SHELL='/bin/fooshell'
OSUSER_MINUID=10000,
OSUSER_MINGID=10000,
OSUSER_USERNAME_PREFIX="test",
OSUSER_HOME_BASEPATH="/home",
OSUSER_DEFAULT_SHELL="/bin/fooshell",
)
class UserManagerTest(TestCaseWithCeleryTasks):
def _create_group(self):
return Group.objects.create(gid=10000, groupname='foo')
return Group.objects.create(gid=10000, groupname="foo")
def setUp(self):
self.customer = Customer.objects.create(username='test')
self.customer = Customer.objects.create(username="test")
super(UserManagerTest, self).setUp()
def test_get_next_uid_first(self):
@ -278,40 +297,58 @@ class UserManagerTest(TestCaseWithCeleryTasks):
def test_get_next_uid_second(self):
User.objects.create(
customer=self.customer, uid=10010, username='foo',
group=self._create_group(), homedir='/home/foo',
shell='/bin/fooshell')
customer=self.customer,
uid=10010,
username="foo",
group=self._create_group(),
homedir="/home/foo",
shell="/bin/fooshell",
)
self.assertEqual(User.objects.get_next_uid(), 10011)
def test_get_next_username_first(self):
self.assertEqual(User.objects.get_next_username(), 'test01')
self.assertEqual(User.objects.get_next_username(), "test01")
def test_get_next_username_second(self):
User.objects.create(
customer=self.customer, uid=10000, username='test01',
group=self._create_group(), homedir='/home/foo',
shell='/bin/fooshell')
self.assertEqual(User.objects.get_next_username(), 'test02')
customer=self.customer,
uid=10000,
username="test01",
group=self._create_group(),
homedir="/home/foo",
shell="/bin/fooshell",
)
self.assertEqual(User.objects.get_next_username(), "test02")
def test_get_next_username_gaps(self):
group = self._create_group()
User.objects.create(
customer=self.customer, uid=10000, username='test01', group=group,
homedir='/home/foo', shell='/bin/fooshell')
customer=self.customer,
uid=10000,
username="test01",
group=group,
homedir="/home/foo",
shell="/bin/fooshell",
)
User.objects.create(
customer=self.customer, uid=10002, username='test03', group=group,
homedir='/home/foo', shell='/bin/fooshell')
self.assertEqual(User.objects.get_next_username(), 'test02')
customer=self.customer,
uid=10002,
username="test03",
group=group,
homedir="/home/foo",
shell="/bin/fooshell",
)
self.assertEqual(User.objects.get_next_username(), "test02")
def test_create_user_first(self):
user = User.objects.create_user(customer=self.customer)
self.assertIsInstance(user, User)
self.assertEqual(user.uid, 10000)
self.assertEqual(user.group.gid, 10000)
self.assertEqual(user.group.groupname, 'test01')
self.assertEqual(user.username, 'test01')
self.assertEqual(user.homedir, '/home/test01')
self.assertEqual(user.shell, '/bin/fooshell')
self.assertEqual(user.group.groupname, "test01")
self.assertEqual(user.username, "test01")
self.assertEqual(user.homedir, "/home/test01")
self.assertEqual(user.shell, "/bin/fooshell")
self.assertIsNotNone(user.shadow)
def test_create_user_tasks(self):
@ -320,8 +357,10 @@ class UserManagerTest(TestCaseWithCeleryTasks):
self.assertEqual(len(taskres), 3)
creators = [r.creator for r in taskres]
for creator in [
'handle_group_created', 'handle_user_created',
'handle_user_password_set']:
"handle_group_created",
"handle_user_created",
"handle_user_password_set",
]:
self.assertIn(creator, creators)
def test_create_user_second(self):
@ -330,36 +369,34 @@ class UserManagerTest(TestCaseWithCeleryTasks):
self.assertIsInstance(user, User)
self.assertEqual(user.uid, 10001)
self.assertEqual(user.group.gid, 10001)
self.assertEqual(user.group.groupname, 'test02')
self.assertEqual(user.username, 'test02')
self.assertEqual(user.homedir, '/home/test02')
self.assertEqual(user.shell, '/bin/fooshell')
self.assertEqual(user.group.groupname, "test02")
self.assertEqual(user.username, "test02")
self.assertEqual(user.homedir, "/home/test02")
self.assertEqual(user.shell, "/bin/fooshell")
self.assertIsNotNone(user.shadow)
self.assertEqual(len(User.objects.all()), 2)
def test_create_user_known_password(self):
user = User.objects.create_user(
customer=self.customer, password='foobar')
user = User.objects.create_user(customer=self.customer, password="foobar")
self.assertIsInstance(user, User)
self.assertEqual(user.uid, 10000)
self.assertEqual(user.group.gid, 10000)
self.assertEqual(user.group.groupname, 'test01')
self.assertEqual(user.username, 'test01')
self.assertEqual(user.homedir, '/home/test01')
self.assertEqual(user.shell, '/bin/fooshell')
self.assertEqual(user.group.groupname, "test01")
self.assertEqual(user.username, "test01")
self.assertEqual(user.homedir, "/home/test01")
self.assertEqual(user.shell, "/bin/fooshell")
self.assertIsNotNone(user.shadow)
self.assertTrue(sha512_crypt.verify('foobar', user.shadow.passwd))
self.assertTrue(sha512_crypt.verify("foobar", user.shadow.passwd))
def test_create_user_predefined_username(self):
user = User.objects.create_user(
customer=self.customer, username='tester')
user = User.objects.create_user(customer=self.customer, username="tester")
self.assertIsInstance(user, User)
self.assertEqual(user.uid, 10000)
self.assertEqual(user.group.gid, 10000)
self.assertEqual(user.group.groupname, 'tester')
self.assertEqual(user.username, 'tester')
self.assertEqual(user.homedir, '/home/tester')
self.assertEqual(user.shell, '/bin/fooshell')
self.assertEqual(user.group.groupname, "tester")
self.assertEqual(user.username, "tester")
self.assertEqual(user.homedir, "/home/tester")
self.assertEqual(user.shell, "/bin/fooshell")
self.assertIsNotNone(user.shadow)
def test_create_user_commit(self):
@ -367,31 +404,34 @@ class UserManagerTest(TestCaseWithCeleryTasks):
self.assertIsInstance(user, User)
self.assertEqual(user.uid, 10000)
self.assertEqual(user.group.gid, 10000)
self.assertEqual(user.group.groupname, 'test01')
self.assertEqual(user.username, 'test01')
self.assertEqual(user.homedir, '/home/test01')
self.assertEqual(user.shell, '/bin/fooshell')
self.assertEqual(user.group.groupname, "test01")
self.assertEqual(user.username, "test01")
self.assertEqual(user.homedir, "/home/test01")
self.assertEqual(user.shell, "/bin/fooshell")
self.assertIsNotNone(user.shadow)
@override_settings(
OSUSER_MINUID=10000, OSUSER_MINGID=10000, OSUSER_USERNAME_PREFIX='test',
OSUSER_HOME_BASEPATH='/home', OSUSER_DEFAULT_SHELL='/bin/fooshell'
OSUSER_MINUID=10000,
OSUSER_MINGID=10000,
OSUSER_USERNAME_PREFIX="test",
OSUSER_HOME_BASEPATH="/home",
OSUSER_DEFAULT_SHELL="/bin/fooshell",
)
class UserTest(TestCaseWithCeleryTasks):
def setUp(self):
self.customer = Customer.objects.create_user('test')
self.customer = Customer.objects.create_user("test")
super(UserTest, self).setUp()
def test___str__(self):
user = User.objects.create_user(self.customer)
self.assertEqual(str(user), 'test01 (10000)')
self.assertEqual(str(user), "test01 (10000)")
def test_set_password(self):
user = User.objects.create_user(self.customer)
self.assertFalse(sha512_crypt.verify('test', user.shadow.passwd))
user.set_password('test')
self.assertTrue(sha512_crypt.verify('test', user.shadow.passwd))
self.assertFalse(sha512_crypt.verify("test", user.shadow.passwd))
user.set_password("test")
self.assertTrue(sha512_crypt.verify("test", user.shadow.passwd))
def test_save(self):
user = User.objects.create_user(self.customer)
@ -400,8 +440,10 @@ class UserTest(TestCaseWithCeleryTasks):
self.assertEqual(len(taskres), 3)
creators = [r.creator for r in taskres]
for task in [
'handle_group_created', 'handle_user_created',
'handle_user_password_set']:
"handle_group_created",
"handle_user_created",
"handle_user_password_set",
]:
self.assertIn(task, creators)
def test_delete_only_user(self):
@ -411,30 +453,38 @@ class UserTest(TestCaseWithCeleryTasks):
self.assertEqual(len(taskres), 6)
creators = [r.creator for r in taskres]
for task in [
'handle_group_created', 'handle_user_created',
'handle_user_password_set', 'handle_user_deleted',
'handle_group_deleted', 'handle_user_deleted']:
"handle_group_created",
"handle_user_created",
"handle_user_password_set",
"handle_user_deleted",
"handle_group_deleted",
"handle_user_deleted",
]:
self.assertIn(task, creators)
self.assertEqual(len(User.objects.all()), 0)
def test_delete_additional_groups(self):
group1 = Group.objects.create(gid=2000, groupname='group1')
group2 = Group.objects.create(gid=2001, groupname='group2')
group1 = Group.objects.create(gid=2000, groupname="group1")
group2 = Group.objects.create(gid=2001, groupname="group2")
user = User.objects.create_user(self.customer)
for group in [group1, group2]:
# noinspection PyUnresolvedReferences
user.additionalgroup_set.add(
AdditionalGroup.objects.create(user=user, group=group))
AdditionalGroup.objects.create(user=user, group=group)
)
TaskResult.objects.all().delete()
user.delete()
taskres = TaskResult.objects.all()
self.assertEqual(len(taskres), 5)
creators = [t.creator for t in taskres]
for tcount, tcreator in [
(2, 'handle_user_removed_from_group'),
(2, 'handle_user_deleted'),
(1, 'handle_group_deleted')]:
(2, "handle_user_removed_from_group"),
(2, "handle_user_deleted"),
(1, "handle_group_deleted"),
]:
self.assertEqual(creators.count(tcreator), tcount)
self.assertEqual(len(User.objects.all()), 0)
# noinspection PyUnresolvedReferences
self.assertEqual(len(AdditionalGroup.objects.all()), 0)
def test_is_sftp_user(self):
@ -442,138 +492,140 @@ class UserTest(TestCaseWithCeleryTasks):
self.assertFalse(user.is_sftp_user())
sftp_group = Group.objects.create(
gid=2000, groupname=settings.OSUSER_SFTP_GROUP)
gid=2000, groupname=settings.OSUSER_SFTP_GROUP
)
# noinspection PyUnresolvedReferences
user.additionalgroup_set.add(
AdditionalGroup.objects.create(user=user, group=sftp_group))
AdditionalGroup.objects.create(user=user, group=sftp_group)
)
self.assertTrue(user.is_sftp_user())
class SshPublicKeyManagerTest(TestCaseWithCeleryTasks):
def test_parse_keytext_rfc4716_1(self):
res = SshPublicKey.objects.parse_keytext(EXAMPLE_KEY_1_RFC4716)
res = SshPublicKey.objects.parse_key_text(EXAMPLE_KEY_1_RFC4716)
self.assertEqual(len(res), 3)
self.assertGreater(len(res[1]), 40)
self.assertEqual(res[0], 'ssh-rsa')
self.assertEqual(res[0], "ssh-rsa")
self.assertEqual(
res[2], '"1024-bit RSA, converted from OpenSSH by me@example.com"')
res[2], '"1024-bit RSA, converted from OpenSSH by me@example.com"'
)
def test_parse_keytext_rfc4716_2(self):
res = SshPublicKey.objects.parse_keytext(EXAMPLE_KEY_2_RFC4716)
res = SshPublicKey.objects.parse_key_text(EXAMPLE_KEY_2_RFC4716)
self.assertEqual(len(res), 3)
self.assertEqual(res[0], 'ssh-dss')
self.assertEqual(res[0], "ssh-dss")
self.assertGreater(len(res[1]), 40)
self.assertEqual(
res[2],
"This is my public key for use on servers which I don't like.")
res[2], "This is my public key for use on servers which I don't like."
)
def test_parse_keytext_rfc4716_3(self):
res = SshPublicKey.objects.parse_keytext(EXAMPLE_KEY_3_RFC4716)
res = SshPublicKey.objects.parse_key_text(EXAMPLE_KEY_3_RFC4716)
self.assertEqual(len(res), 3)
self.assertEqual(res[0], 'ssh-dss')
self.assertEqual(res[0], "ssh-dss")
self.assertGreater(len(res[1]), 40)
self.assertEqual(res[2], "DSA Public Key for use with MyIsp")
def test_parse_keytext_openssh(self):
res = SshPublicKey.objects.parse_keytext(EXAMPLE_KEY_4_OPENSSH)
res = SshPublicKey.objects.parse_key_text(EXAMPLE_KEY_4_OPENSSH)
self.assertEquals(len(res), 3)
self.assertEqual(res[0], 'ssh-rsa')
self.assertEqual(res[0], "ssh-rsa")
self.assertGreater(len(res[1]), 40)
self.assertEqual(res[2], '')
self.assertEqual(res[2], "")
def test_parse_keytext_invalid_multiline(self):
with self.assertRaises(ValueError):
SshPublicKey.objects.parse_keytext("\r\n".join(["xx"]*10))
SshPublicKey.objects.parse_key_text("\r\n".join(["xx"] * 10))
def test_parse_keytext_empty_line(self):
res = SshPublicKey.objects.parse_keytext(
EXAMPLE_KEY_6_RFC4716_EMPTY_LINE)
res = SshPublicKey.objects.parse_key_text(EXAMPLE_KEY_6_RFC4716_EMPTY_LINE)
self.assertEqual(len(res), 3)
self.assertEqual(res[0], 'ssh-dss')
self.assertEqual(res[0], "ssh-dss")
self.assertGreater(len(res[1]), 40)
self.assertEqual(res[2], "DSA Public Key for use with MyIsp")
def test_parse_keytext_invalid_empty_rfc4716_header(self):
with self.assertRaises(ValueError):
SshPublicKey.objects.parse_keytext(
EXAMPLE_KEY_9_RFC4716_ONLY_HEADER)
SshPublicKey.objects.parse_key_text(EXAMPLE_KEY_9_RFC4716_ONLY_HEADER)
def test_parse_keytext_no_comment(self):
res = SshPublicKey.objects.parse_keytext(
EXAMPLE_KEY_7_NO_COMMENT)
res = SshPublicKey.objects.parse_key_text(EXAMPLE_KEY_7_NO_COMMENT)
self.assertEqual(len(res), 3)
self.assertEqual(res[0], 'ssh-rsa')
self.assertEqual(res[0], "ssh-rsa")
self.assertGreater(len(res[1]), 40)
self.assertEqual(res[2], '')
self.assertEqual(res[2], "")
def test_parse_keytext_multiline_comment(self):
res = SshPublicKey.objects.parse_keytext(
EXAMPLE_KEY_5_RFC4716_MULTILINE)
res = SshPublicKey.objects.parse_key_text(EXAMPLE_KEY_5_RFC4716_MULTILINE)
self.assertEqual(len(res), 3)
self.assertEqual(res[0], 'ssh-dss')
self.assertEqual(res[0], "ssh-dss")
self.assertGreater(len(res[1]), 40)
self.assertEqual(res[2], "DSA Public Key for use with MyIsp")
def test_parse_keytext_invalid(self):
with self.assertRaises(ValueError):
SshPublicKey.objects.parse_keytext('invalid')
SshPublicKey.objects.parse_key_text("invalid")
def test_parse_keytext_invalid_openssh(self):
with self.assertRaises(ValueError):
SshPublicKey.objects.parse_keytext(EXAMPLE_KEY_8_OPENSSH_BROKEN)
SshPublicKey.objects.parse_key_text(EXAMPLE_KEY_8_OPENSSH_BROKEN)
def test_create_ssh_public_key(self):
customer = Customer.objects.create_user('test')
customer = Customer.objects.create_user("test")
user = User.objects.create_user(customer)
key = SshPublicKey.objects.create_ssh_public_key(
user, EXAMPLE_KEY_4_OPENSSH)
key = SshPublicKey.objects.create_ssh_public_key(user, EXAMPLE_KEY_4_OPENSSH)
self.assertIsInstance(key, SshPublicKey)
self.assertEqual(key.user, user)
self.assertEqual(key.algorithm, 'ssh-rsa')
self.assertEqual(key.algorithm, "ssh-rsa")
self.assertEqual(key.data, EXAMPLE_KEY_4_OPENSSH.split()[1])
self.assertEqual(key.comment, '')
self.assertEqual(key.comment, "")
class SshPublicKeyTest(TestCaseWithCeleryTasks):
def setUp(self):
super(SshPublicKeyTest, self).setUp()
customer = Customer.objects.create_user('test')
customer = Customer.objects.create_user("test")
self.user = User.objects.create_user(customer)
TaskResult.objects.all().delete()
def test__str__rfc4716(self):
res = SshPublicKey.objects.create_ssh_public_key(
self.user, EXAMPLE_KEY_3_RFC4716)
self.user, EXAMPLE_KEY_3_RFC4716
)
self.maxDiff = None
self.assertEqual(
str(res), 'ssh-dss AAAAB3NzaC1kc3MAAACBAPY8ZOHY2yFSJA6XYC9HRwNHxae'
'hvx5wOJ0rzZdzoSOXxbETW6ToHv8D1UJ/z+zHo9Fiko5XybZnDIaBDHtblQ+Yp7St'
'xyltHnXF1YLfKD1G4T6JYrdHYI14Om1eg9e4NnCRleaqoZPF3UGfZia6bXrGTQf3g'
'Jq2e7Yisk/gF+1VAAAAFQDb8D5cvwHWTZDPfX0D2s9Rd7NBvQAAAIEAlN92+Bb7D4'
'KLYk3IwRbXblwXdkPggA4pfdtW9vGfJ0/RHd+NjB4eo1D+0dix6tXwYGN7PKS5R/F'
'XPNwxHPapcj9uL1Jn2AWQ2dsknf+i/FAAvioUPkmdMc0zuWoSOEsSNhVDtX3WdvVc'
'GcBq9cetzrtOKWOocJmJ80qadxTRHtUAAACBAN7CY+KKv1gHpRzFwdQm7HK9bb1LA'
'o2KwaoXnadFgeptNBQeSXG1vO+JsvphVMBJc9HSn24VYtYtsMu74qXviYjziVucWK'
'jjKEb11juqnF0GDlB3VVmxHLmxnAz643WK42Z7dLM5sY29ouezv4Xz2PuMch5VGPP'
'+CDqzCM4loWgV DSA Public Key for use with MyIsp')
str(res),
"ssh-dss AAAAB3NzaC1kc3MAAACBAPY8ZOHY2yFSJA6XYC9HRwNHxae"
"hvx5wOJ0rzZdzoSOXxbETW6ToHv8D1UJ/z+zHo9Fiko5XybZnDIaBDHtblQ+Yp7St"
"xyltHnXF1YLfKD1G4T6JYrdHYI14Om1eg9e4NnCRleaqoZPF3UGfZia6bXrGTQf3g"
"Jq2e7Yisk/gF+1VAAAAFQDb8D5cvwHWTZDPfX0D2s9Rd7NBvQAAAIEAlN92+Bb7D4"
"KLYk3IwRbXblwXdkPggA4pfdtW9vGfJ0/RHd+NjB4eo1D+0dix6tXwYGN7PKS5R/F"
"XPNwxHPapcj9uL1Jn2AWQ2dsknf+i/FAAvioUPkmdMc0zuWoSOEsSNhVDtX3WdvVc"
"GcBq9cetzrtOKWOocJmJ80qadxTRHtUAAACBAN7CY+KKv1gHpRzFwdQm7HK9bb1LA"
"o2KwaoXnadFgeptNBQeSXG1vO+JsvphVMBJc9HSn24VYtYtsMu74qXviYjziVucWK"
"jjKEb11juqnF0GDlB3VVmxHLmxnAz643WK42Z7dLM5sY29ouezv4Xz2PuMch5VGPP"
"+CDqzCM4loWgV DSA Public Key for use with MyIsp",
)
def test__str__openssh(self):
res = SshPublicKey.objects.create_ssh_public_key(
self.user, EXAMPLE_KEY_4_OPENSSH)
self.user, EXAMPLE_KEY_4_OPENSSH
)
self.assertEqual(str(res), EXAMPLE_KEY_4_OPENSSH)
def test_call_tasks_on_save(self):
SshPublicKey.objects.create_ssh_public_key(
self.user, EXAMPLE_KEY_4_OPENSSH)
SshPublicKey.objects.create_ssh_public_key(self.user, EXAMPLE_KEY_4_OPENSSH)
taskresults = TaskResult.objects.all()
self.assertEqual(len(taskresults), 1)
self.assertEqual(
taskresults[0].creator, 'handle_ssh_keys_changed')
self.assertEqual(taskresults[0].creator, "handle_ssh_keys_changed")
def test_call_tasks_on_delete(self):
key = SshPublicKey.objects.create_ssh_public_key(
self.user, EXAMPLE_KEY_4_OPENSSH)
self.user, EXAMPLE_KEY_4_OPENSSH
)
TaskResult.objects.all().delete()
key.delete()
taskresults = TaskResult.objects.all()
self.assertEqual(len(taskresults), 1)
self.assertEqual(
taskresults[0].creator, 'handle_ssh_keys_changed')
self.assertEqual(taskresults[0].creator, "handle_ssh_keys_changed")

View file

@ -2,66 +2,59 @@
This module provides tests for :py:mod:`osusers.views`.
"""
from __future__ import absolute_import, unicode_literals
try:
from unittest.mock import patch, MagicMock
except ImportError:
from mock import patch, MagicMock
from unittest.mock import patch, MagicMock
from django.core.urlresolvers import reverse
from django.test import TestCase, TransactionTestCase
from django.contrib.auth import get_user_model
from django.urls import reverse
from hostingpackages.models import (
CustomerHostingPackage,
HostingPackageTemplate,
)
from hostingpackages.models import CustomerHostingPackage, HostingPackageTemplate
from osusers.models import SshPublicKey
from osusers.views import (
AddSshPublicKey,
DeleteSshPublicKey,
EditSshPublicKeyComment,
)
from osusers.views import AddSshPublicKey, DeleteSshPublicKey, EditSshPublicKeyComment
User = get_user_model()
TEST_USER = 'test'
TEST_PASSWORD = 'secret'
TEST_EMAIL = 'test@example.org'
EXAMPLE_KEY = "".join((
"ssh-rsa ",
"AAAAB3NzaC1yc2EAAAABIwAAAIEA1on8gxCGJJWSRT4uOrR13mUaUk0hRf4RzxSZ1zRb",
"YYFw8pfGesIFoEuVth4HKyF8k1y4mRUnYHP1XNMNMJl1JcEArC2asV8sHf6zSPVffozZ",
"5TT4SfsUu/iKy9lUcCfXzwre4WWZSXXcPff+EHtWshahu3WzBdnGxm5Xoi89zcE="
))
TEST_USER = "test"
TEST_PASSWORD = "secret"
TEST_EMAIL = "test@example.org"
EXAMPLE_KEY = "".join(
(
"ssh-rsa ",
"AAAAB3NzaC1yc2EAAAABIwAAAIEA1on8gxCGJJWSRT4uOrR13mUaUk0hRf4RzxSZ1zRb",
"YYFw8pfGesIFoEuVth4HKyF8k1y4mRUnYHP1XNMNMJl1JcEArC2asV8sHf6zSPVffozZ",
"5TT4SfsUu/iKy9lUcCfXzwre4WWZSXXcPff+EHtWshahu3WzBdnGxm5Xoi89zcE=",
)
)
class HostingPackageAwareTestMixin(object):
# noinspection PyMethodMayBeStatic
def _setup_hosting_package(self, customer):
template = HostingPackageTemplate.objects.create(
name='testpackagetemplate', mailboxcount=10, diskspace=1,
diskspace_unit=0)
name="testpackagetemplate", mailboxcount=10, diskspace=1, diskspace_unit=0
)
package = CustomerHostingPackage.objects.create_from_template(
customer, template, 'testpackage')
with patch('hostingpackages.models.settings') as hmsettings:
customer, template, "testpackage"
)
with patch("hostingpackages.models.settings") as hmsettings:
hmsettings.OSUSER_DEFAULT_GROUPS = []
package.save()
return package
class AddSshPublicKeyTest(HostingPackageAwareTestMixin, TestCase):
def setUp(self):
self.customer = User.objects.create_user(
username=TEST_USER, password=TEST_PASSWORD)
username=TEST_USER, password=TEST_PASSWORD
)
self.package = self._setup_hosting_package(self.customer)
def _get_url(self):
return reverse('add_ssh_key', kwargs={'package': self.package.id})
return reverse("add_ssh_key", kwargs={"package": self.package.id})
def test_get_anonymous(self):
response = self.client.get(self._get_url())
@ -73,77 +66,75 @@ class AddSshPublicKeyTest(HostingPackageAwareTestMixin, TestCase):
self.assertEqual(response.status_code, 200)
def test_get_other_regular_user(self):
User.objects.create_user(
'test2', password=TEST_PASSWORD)
self.client.login(username='test2', password=TEST_PASSWORD)
User.objects.create_user("test2", password=TEST_PASSWORD)
self.client.login(username="test2", password=TEST_PASSWORD)
response = self.client.get(self._get_url())
self.assertEqual(response.status_code, 403)
def test_get_staff_user(self):
User.objects.create_superuser(
'admin', email=TEST_EMAIL, password=TEST_PASSWORD)
self.client.login(username='admin', password=TEST_PASSWORD)
User.objects.create_superuser("admin", email=TEST_EMAIL, password=TEST_PASSWORD)
self.client.login(username="admin", password=TEST_PASSWORD)
response = self.client.get(self._get_url())
self.assertEqual(response.status_code, 200)
def test_get_template(self):
self.client.login(username=TEST_USER, password=TEST_PASSWORD)
response = self.client.get(self._get_url())
self.assertTemplateUsed(response, 'osusers/sshpublickey_create.html')
self.assertTemplateUsed(response, "osusers/sshpublickey_create.html")
def test_get_form_kwargs(self):
self.client.login(username=TEST_USER, password=TEST_PASSWORD)
view = AddSshPublicKey(
request=MagicMock(), kwargs={'package': str(self.package.pk)})
request=MagicMock(), kwargs={"package": str(self.package.pk)}
)
the_kwargs = view.get_form_kwargs()
self.assertIn('hostingpackage', the_kwargs)
self.assertEqual(the_kwargs['hostingpackage'], self.package)
self.assertIn("hostingpackage", the_kwargs)
self.assertEqual(the_kwargs["hostingpackage"], self.package)
def test_get_context_data(self):
self.client.login(username=TEST_USER, password=TEST_PASSWORD)
response = self.client.get(self._get_url())
self.assertIn('customer', response.context)
self.assertEqual(response.context['customer'], self.customer)
self.assertIn('osuser', response.context)
self.assertEqual(
response.context['osuser'], self.package.osuser.username)
self.assertIn("customer", response.context)
self.assertEqual(response.context["customer"], self.customer)
self.assertIn("osuser", response.context)
self.assertEqual(response.context["osuser"], self.package.osuser.username)
def test_form_valid_redirect(self):
self.client.login(username=TEST_USER, password=TEST_PASSWORD)
response = self.client.post(
self._get_url(),
data={'publickeytext': EXAMPLE_KEY})
self._get_url(), data={"publickeytext": EXAMPLE_KEY}
)
self.assertRedirects(response, self.package.get_absolute_url())
def test_form_valid_message(self):
self.client.login(username=TEST_USER, password=TEST_PASSWORD)
response = self.client.post(
self._get_url(), follow=True,
data={'publickeytext': EXAMPLE_KEY})
messages = list(response.context['messages'])
self._get_url(), follow=True, data={"publickeytext": EXAMPLE_KEY}
)
messages = list(response.context["messages"])
self.assertEqual(len(messages), 1)
self.assertEqual(
'Successfully added new ssh-rsa SSH public key.'.format(
"Successfully added new ssh-rsa SSH public key.".format(
username=self.package.osuser.username
), str(messages[0]))
),
str(messages[0]),
)
class DeleteSshPublicKeyTest(HostingPackageAwareTestMixin, TestCase):
def setUp(self):
self.customer = User.objects.create_user(
username=TEST_USER, password=TEST_PASSWORD)
username=TEST_USER, password=TEST_PASSWORD
)
self.package = self._setup_hosting_package(self.customer)
self.sshkey = SshPublicKey.objects.create(
user=self.package.osuser, algorithm='good', data='key',
comment='comment')
user=self.package.osuser, algorithm="good", data="key", comment="comment"
)
def _get_url(self):
return reverse(
'delete_ssh_key', kwargs={
'package': self.package.id,
'pk': self.sshkey.id
})
"delete_ssh_key", kwargs={"package": self.package.id, "pk": self.sshkey.id}
)
def test_get_anonymous(self):
response = self.client.get(self._get_url())
@ -155,71 +146,63 @@ class DeleteSshPublicKeyTest(HostingPackageAwareTestMixin, TestCase):
self.assertEqual(response.status_code, 200)
def test_get_other_regular_user(self):
User.objects.create_user(
'test2', password=TEST_PASSWORD)
self.client.login(username='test2', password=TEST_PASSWORD)
User.objects.create_user("test2", password=TEST_PASSWORD)
self.client.login(username="test2", password=TEST_PASSWORD)
response = self.client.get(self._get_url())
self.assertEqual(response.status_code, 403)
def test_get_staff_user(self):
User.objects.create_superuser(
'admin', email=TEST_EMAIL, password=TEST_PASSWORD)
self.client.login(username='admin', password=TEST_PASSWORD)
User.objects.create_superuser("admin", email=TEST_EMAIL, password=TEST_PASSWORD)
self.client.login(username="admin", password=TEST_PASSWORD)
response = self.client.get(self._get_url())
self.assertEqual(response.status_code, 200)
def test_get_template(self):
self.client.login(username=TEST_USER, password=TEST_PASSWORD)
response = self.client.get(self._get_url())
self.assertTemplateUsed(
response, 'osusers/sshpublickey_confirm_delete.html')
self.assertTemplateUsed(response, "osusers/sshpublickey_confirm_delete.html")
def test_get_queryset(self):
self.client.login(username=TEST_USER, password=TEST_PASSWORD)
view = DeleteSshPublicKey(
request=MagicMock(), kwargs={
'package': str(self.package.pk),
'pk': str(self.sshkey.pk)
})
request=MagicMock(),
kwargs={"package": str(self.package.pk), "pk": str(self.sshkey.pk)},
)
queryset = view.get_queryset()
self.assertQuerysetEqual(queryset, [repr(self.sshkey)])
def test_get_context_data(self):
self.client.login(username=TEST_USER, password=TEST_PASSWORD)
response = self.client.get(self._get_url())
for key in ('hostingpackage', 'customer', 'osuser'):
for key in ("hostingpackage", "customer", "osuser"):
self.assertIn(key, response.context)
self.assertEqual(response.context['hostingpackage'], self.package)
self.assertEqual(response.context['customer'], self.customer)
self.assertEqual(
response.context['osuser'], self.package.osuser.username)
self.assertEqual(response.context["hostingpackage"], self.package)
self.assertEqual(response.context["customer"], self.customer)
self.assertEqual(response.context["osuser"], self.package.osuser.username)
def test_get_success_url(self):
self.client.login(username=TEST_USER, password=TEST_PASSWORD)
response = self.client.post(
self._get_url(),
data={'comment': 'new comment'})
self.assertRedirects(response, reverse('list_ssh_keys', kwargs={
'package': self.package.id}))
response = self.client.post(self._get_url(), data={"comment": "new comment"})
self.assertRedirects(
response, reverse("list_ssh_keys", kwargs={"package": self.package.id})
)
class EditSshPublicKeyCommentTest(
HostingPackageAwareTestMixin, TransactionTestCase):
class EditSshPublicKeyCommentTest(HostingPackageAwareTestMixin, TransactionTestCase):
def setUp(self):
self.customer = User.objects.create_user(
username=TEST_USER, password=TEST_PASSWORD)
username=TEST_USER, password=TEST_PASSWORD
)
self.package = self._setup_hosting_package(self.customer)
self.sshkey = SshPublicKey.objects.create(
user=self.package.osuser, algorithm='good', data='key',
comment='comment')
user=self.package.osuser, algorithm="good", data="key", comment="comment"
)
def _get_url(self):
return reverse(
'edit_ssh_key_comment', kwargs={
'package': self.package.id,
'pk': self.sshkey.id
})
"edit_ssh_key_comment",
kwargs={"package": self.package.id, "pk": self.sshkey.id},
)
def test_get_anonymous(self):
response = self.client.get(self._get_url())
@ -231,74 +214,67 @@ class EditSshPublicKeyCommentTest(
self.assertEqual(response.status_code, 200)
def test_get_other_regular_user(self):
User.objects.create_user(
'test2', password=TEST_PASSWORD)
self.client.login(username='test2', password=TEST_PASSWORD)
User.objects.create_user("test2", password=TEST_PASSWORD)
self.client.login(username="test2", password=TEST_PASSWORD)
response = self.client.get(self._get_url())
self.assertEqual(response.status_code, 403)
def test_get_staff_user(self):
User.objects.create_superuser(
'admin', email=TEST_EMAIL, password=TEST_PASSWORD)
self.client.login(username='admin', password=TEST_PASSWORD)
User.objects.create_superuser("admin", email=TEST_EMAIL, password=TEST_PASSWORD)
self.client.login(username="admin", password=TEST_PASSWORD)
response = self.client.get(self._get_url())
self.assertEqual(response.status_code, 200)
def test_get_template(self):
self.client.login(username=TEST_USER, password=TEST_PASSWORD)
response = self.client.get(self._get_url())
self.assertTemplateUsed(
response, 'osusers/sshpublickey_edit_comment.html')
self.assertTemplateUsed(response, "osusers/sshpublickey_edit_comment.html")
def test_get_queryset(self):
self.client.login(username=TEST_USER, password=TEST_PASSWORD)
view = EditSshPublicKeyComment(
request=MagicMock(), kwargs={
'package': str(self.package.pk),
'pk': str(self.sshkey.pk)
})
request=MagicMock(),
kwargs={"package": str(self.package.pk), "pk": str(self.sshkey.pk)},
)
queryset = view.get_queryset()
self.assertQuerysetEqual(queryset, [repr(self.sshkey)])
def test_get_form_kwargs(self):
self.client.login(username=TEST_USER, password=TEST_PASSWORD)
view = EditSshPublicKeyComment(
request=MagicMock(), kwargs={
'package': str(self.package.pk),
'pk': str(self.sshkey.pk)
})
request=MagicMock(),
kwargs={"package": str(self.package.pk), "pk": str(self.sshkey.pk)},
)
the_kwargs = view.get_form_kwargs()
self.assertIn('hostingpackage', the_kwargs)
self.assertEqual(the_kwargs['hostingpackage'], self.package)
self.assertIn("hostingpackage", the_kwargs)
self.assertEqual(the_kwargs["hostingpackage"], self.package)
def test_get_context_data(self):
self.client.login(username=TEST_USER, password=TEST_PASSWORD)
response = self.client.get(self._get_url())
for key in ('hostingpackage', 'customer', 'osuser'):
for key in ("hostingpackage", "customer", "osuser"):
self.assertIn(key, response.context)
self.assertEqual(response.context['hostingpackage'], self.package)
self.assertEqual(response.context['customer'], self.customer)
self.assertEqual(
response.context['osuser'], self.package.osuser.username)
self.assertEqual(response.context["hostingpackage"], self.package)
self.assertEqual(response.context["customer"], self.customer)
self.assertEqual(response.context["osuser"], self.package.osuser.username)
def test_get_success_url(self):
self.client.login(username=TEST_USER, password=TEST_PASSWORD)
response = self.client.post(
self._get_url(),
data={'comment': 'new comment'})
self.assertRedirects(response, reverse('list_ssh_keys', kwargs={
'package': self.package.id}))
response = self.client.post(self._get_url(), data={"comment": "new comment"})
self.assertRedirects(
response, reverse("list_ssh_keys", kwargs={"package": self.package.id})
)
class ListSshPublicKeysTest(HostingPackageAwareTestMixin, TestCase):
def setUp(self):
self.customer = User.objects.create_user(
username=TEST_USER, password=TEST_PASSWORD)
username=TEST_USER, password=TEST_PASSWORD
)
self.package = self._setup_hosting_package(self.customer)
def _get_url(self):
return reverse('list_ssh_keys', kwargs={'package': self.package.id})
return reverse("list_ssh_keys", kwargs={"package": self.package.id})
def test_get_anonymous(self):
response = self.client.get(self._get_url())
@ -310,45 +286,43 @@ class ListSshPublicKeysTest(HostingPackageAwareTestMixin, TestCase):
self.assertEqual(response.status_code, 200)
def test_get_other_regular_user(self):
User.objects.create_user(
'test2', password=TEST_PASSWORD)
self.client.login(username='test2', password=TEST_PASSWORD)
User.objects.create_user("test2", password=TEST_PASSWORD)
self.client.login(username="test2", password=TEST_PASSWORD)
response = self.client.get(self._get_url())
self.assertEqual(response.status_code, 403)
def test_get_staff_user(self):
User.objects.create_superuser(
'admin', email=TEST_EMAIL, password=TEST_PASSWORD)
self.client.login(username='admin', password=TEST_PASSWORD)
User.objects.create_superuser("admin", email=TEST_EMAIL, password=TEST_PASSWORD)
self.client.login(username="admin", password=TEST_PASSWORD)
response = self.client.get(self._get_url())
self.assertEqual(response.status_code, 200)
def test_get_template(self):
self.client.login(username=TEST_USER, password=TEST_PASSWORD)
response = self.client.get(self._get_url())
self.assertTemplateUsed(response, 'osusers/sshpublickey_list.html')
self.assertTemplateUsed(response, "osusers/sshpublickey_list.html")
def test_get_context_data(self):
self.client.login(username=TEST_USER, password=TEST_PASSWORD)
response = self.client.get(self._get_url())
for key in ('hostingpackage', 'customer', 'osuser'):
for key in ("hostingpackage", "customer", "osuser"):
self.assertIn(key, response.context)
self.assertEqual(response.context['hostingpackage'], self.package)
self.assertEqual(response.context['customer'], self.customer)
self.assertEqual(
response.context['osuser'], self.package.osuser.username)
self.assertEqual(response.context["hostingpackage"], self.package)
self.assertEqual(response.context["customer"], self.customer)
self.assertEqual(response.context["osuser"], self.package.osuser.username)
class SetOsUserPasswordTest(HostingPackageAwareTestMixin, TestCase):
def setUp(self):
self.customer = User.objects.create_user(
username=TEST_USER, password=TEST_PASSWORD)
username=TEST_USER, password=TEST_PASSWORD
)
self.package = self._setup_hosting_package(self.customer)
def _get_url(self):
return reverse('set_osuser_password', kwargs={
'slug': self.package.osuser.username})
return reverse(
"set_osuser_password", kwargs={"slug": self.package.osuser.username}
)
def test_get_anonymous(self):
response = self.client.get(self._get_url())
@ -360,45 +334,48 @@ class SetOsUserPasswordTest(HostingPackageAwareTestMixin, TestCase):
self.assertEqual(response.status_code, 200)
def test_get_other_regular_user(self):
User.objects.create_user(
'test2', password=TEST_PASSWORD)
self.client.login(username='test2', password=TEST_PASSWORD)
User.objects.create_user("test2", password=TEST_PASSWORD)
self.client.login(username="test2", password=TEST_PASSWORD)
response = self.client.get(self._get_url())
self.assertEqual(response.status_code, 403)
def test_get_staff_user(self):
User.objects.create_superuser(
'admin', email=TEST_EMAIL, password=TEST_PASSWORD)
self.client.login(username='admin', password=TEST_PASSWORD)
User.objects.create_superuser("admin", email=TEST_EMAIL, password=TEST_PASSWORD)
self.client.login(username="admin", password=TEST_PASSWORD)
response = self.client.get(self._get_url())
self.assertEqual(response.status_code, 200)
def test_get_template(self):
self.client.login(username=TEST_USER, password=TEST_PASSWORD)
response = self.client.get(self._get_url())
self.assertTemplateUsed(response, 'osusers/user_setpassword.html')
self.assertTemplateUsed(response, "osusers/user_setpassword.html")
def test_get_context_data(self):
self.client.login(username=TEST_USER, password=TEST_PASSWORD)
response = self.client.get(self._get_url())
self.assertIn('customer', response.context)
self.assertEqual(response.context['customer'], self.customer)
self.assertIn("customer", response.context)
self.assertEqual(response.context["customer"], self.customer)
def test_form_valid_redirect(self):
self.client.login(username=TEST_USER, password=TEST_PASSWORD)
response = self.client.post(
self._get_url(),
data={'password1': TEST_PASSWORD, 'password2': TEST_PASSWORD})
data={"password1": TEST_PASSWORD, "password2": TEST_PASSWORD},
)
self.assertRedirects(response, self.package.get_absolute_url())
def test_form_valid_message(self):
self.client.login(username=TEST_USER, password=TEST_PASSWORD)
response = self.client.post(
self._get_url(), follow=True,
data={'password1': TEST_PASSWORD, 'password2': TEST_PASSWORD})
messages = list(response.context['messages'])
self._get_url(),
follow=True,
data={"password1": TEST_PASSWORD, "password2": TEST_PASSWORD},
)
messages = list(response.context["messages"])
self.assertEqual(len(messages), 1)
self.assertEqual(
'New password for {username} has been set successfully.'.format(
"New password for {username} has been set successfully.".format(
username=self.package.osuser.username
), str(messages[0]))
),
str(messages[0]),
)

View file

@ -4,39 +4,32 @@ This module provides tests for the
command.
"""
from __future__ import unicode_literals
try:
from unittest.mock import patch, MagicMock
except ImportError:
from mock import patch, MagicMock
from unittest.mock import MagicMock, patch
from django.test import TestCase
from taskresults.management.commands.fetch_taskresults import Command
from taskresults.models import TaskResult
from taskresults.management.commands.fetch_taskresults import Command
TEST_TASK_UUID = "3120f6a8-2665-4fa3-a785-79efd28bfe92"
TEST_TASK_NAME = "test.task"
TEST_TASK_RESULT = "4ll y0ur b453 4r3 b3l0ng t0 u5"
TEST_TASK_UUID = '3120f6a8-2665-4fa3-a785-79efd28bfe92'
TEST_TASK_NAME = 'test.task'
TEST_TASK_RESULT = '4ll y0ur b453 4r3 b3l0ng t0 u5'
@patch('taskresults.models.app.AsyncResult')
@patch("taskresults.models.app.AsyncResult")
class FetchTaskResultsCommandTest(TestCase):
def test_handle_unfinished(self, asyncresult):
resultmock = MagicMock(task_id=TEST_TASK_UUID)
sigmock = MagicMock()
sigmock.apply_async.return_value = resultmock
tr = TaskResult.objects.create_task_result(TEST_TASK_NAME, sigmock)
self.assertFalse(tr.finished)
self.assertEqual(tr.result, '')
self.assertEqual(tr.state, '')
self.assertEqual(tr.result, "")
self.assertEqual(tr.state, "")
aresult = asyncresult.return_value
aresult.state = 'PENDING'
aresult.state = "PENDING"
aresult.ready.return_value = False
Command().handle()
@ -45,8 +38,8 @@ class FetchTaskResultsCommandTest(TestCase):
self.assertTrue(asyncresult.called_with(TEST_TASK_UUID))
self.assertTrue(aresult.ready.called_with())
self.assertFalse(tr.finished)
self.assertEqual(tr.result, '')
self.assertEqual(tr.state, 'PENDING')
self.assertEqual(tr.result, "")
self.assertEqual(tr.state, "PENDING")
def test_handle_finished(self, asyncresult):
resultmock = MagicMock(task_id=TEST_TASK_UUID)
@ -54,11 +47,11 @@ class FetchTaskResultsCommandTest(TestCase):
sigmock.apply_async.return_value = resultmock
tr = TaskResult.objects.create_task_result(TEST_TASK_NAME, sigmock)
self.assertFalse(tr.finished)
self.assertEqual(tr.result, '')
self.assertEqual(tr.state, '')
self.assertEqual(tr.result, "")
self.assertEqual(tr.state, "")
aresult = asyncresult.return_value
aresult.state = 'SUCCESS'
aresult.state = "SUCCESS"
aresult.ready.return_value = True
aresult.get.return_value = TEST_TASK_RESULT
@ -70,4 +63,4 @@ class FetchTaskResultsCommandTest(TestCase):
self.assertTrue(aresult.get.called_with())
self.assertTrue(tr.finished)
self.assertEqual(tr.result, TEST_TASK_RESULT)
self.assertEqual(tr.state, 'SUCCESS')
self.assertEqual(tr.state, "SUCCESS")

View file

@ -2,25 +2,19 @@
This module provides tests for :py:mod:`taskresults.models`.
"""
from __future__ import absolute_import, unicode_literals
try:
from unittest.mock import patch, MagicMock
except ImportError:
from mock import patch, MagicMock
from unittest.mock import MagicMock, patch
from django.test import TestCase
from taskresults.models import TaskResult
TEST_TASK_UUID = '3120f6a8-2665-4fa3-a785-79efd28bfe92'
TEST_TASK_NAME = 'test.task'
TEST_TASK_RESULT = '4ll y0ur b453 4r3 b3l0ng t0 u5'
TEST_TASK_UUID = "3120f6a8-2665-4fa3-a785-79efd28bfe92"
TEST_TASK_NAME = "test.task"
TEST_TASK_RESULT = "4ll y0ur b453 4r3 b3l0ng t0 u5"
class TaskResultTest(TestCase):
@patch('taskresults.models.app.AsyncResult')
@patch("taskresults.models.app.AsyncResult")
def test_update_taskstatus_unfinished(self, asyncresult):
resultmock = MagicMock(task_id=TEST_TASK_UUID)
sigmock = MagicMock()
@ -28,13 +22,13 @@ class TaskResultTest(TestCase):
tr = TaskResult.objects.create_task_result(TEST_TASK_NAME, sigmock)
self.assertFalse(tr.finished)
mymock = asyncresult.return_value
mymock.state = 'PENDING'
mymock.state = "PENDING"
mymock.ready.return_value = False
tr.fetch_result()
mymock.get.assert_not_called()
self.assertFalse(tr.finished)
@patch('taskresults.models.app.AsyncResult')
@patch("taskresults.models.app.AsyncResult")
def test_update_taskstatus_finished(self, asyncresult):
resultmock = MagicMock(task_id=TEST_TASK_UUID)
sigmock = MagicMock()
@ -43,7 +37,7 @@ class TaskResultTest(TestCase):
tr = TaskResult.objects.create_task_result(TEST_TASK_NAME, sigmock)
self.assertFalse(tr.finished)
aresult = asyncresult.return_value
aresult.state = 'SUCCESS'
aresult.state = "SUCCESS"
aresult.ready.return_value = True
aresult.get.return_value = TEST_TASK_RESULT
tr.fetch_result()
@ -61,11 +55,15 @@ class TaskResultTest(TestCase):
sigmock = MagicMock()
sigmock.apply_async.return_value = resultmock
tr = TaskResult.objects.create_task_result(TEST_TASK_NAME, sigmock)
self.assertEqual(str(tr), "{name} ({taskid}): no".format(
name=TEST_TASK_NAME, taskid=TEST_TASK_UUID))
self.assertEqual(
str(tr),
"{name} ({taskid}): no".format(name=TEST_TASK_NAME, taskid=TEST_TASK_UUID),
)
tr.finished = True
self.assertEqual(str(tr), "{name} ({taskid}): yes".format(
name=TEST_TASK_NAME, taskid=TEST_TASK_UUID))
self.assertEqual(
str(tr),
"{name} ({taskid}): yes".format(name=TEST_TASK_NAME, taskid=TEST_TASK_UUID),
)
TEST_RESULT = MagicMock()

View file

@ -2,35 +2,33 @@
This module provides tests for :py:mod:`userdbs.admin`.
"""
from __future__ import absolute_import
from unittest.mock import MagicMock, Mock, patch
from django.contrib.admin import AdminSite
from django.test import TestCase
from userdbs.admin import (DatabaseUserAdmin, DatabaseUserCreationForm,
UserDatabaseAdmin, UserDatabaseCreationForm)
from userdbs.admin import (
DatabaseUserAdmin,
DatabaseUserCreationForm,
UserDatabaseAdmin,
UserDatabaseCreationForm,
)
from userdbs.models import DB_TYPES, DatabaseUser, UserDatabase
try:
from unittest.mock import MagicMock, Mock, patch
except ImportError:
from mock import MagicMock, Mock, patch
class DatabaseUserCreationFormTest(TestCase):
@patch('userdbs.admin.DatabaseUser.objects.create_database_user')
@patch("userdbs.admin.DatabaseUser.objects.create_database_user")
def test_save(self, create_database_user):
create_database_user.return_value = Mock()
form = DatabaseUserCreationForm()
mockuser = Mock(name='osuser')
form.cleaned_data = {
'osuser': mockuser,
'db_type': DB_TYPES.pgsql
}
mockuser = Mock(name="osuser")
form.cleaned_data = {"osuser": mockuser, "db_type": DB_TYPES.pgsql}
retval = form.save()
self.assertTrue(create_database_user.called_with(
osuser=mockuser, db_type=DB_TYPES.pgsql, commit=True))
self.assertTrue(
create_database_user.called_with(
osuser=mockuser, db_type=DB_TYPES.pgsql, commit=True
)
)
self.assertEqual(retval, create_database_user.return_value)
def test_save_m2m_returns_none(self):
@ -39,16 +37,14 @@ class DatabaseUserCreationFormTest(TestCase):
class UserDatabaseCreationFormTest(TestCase):
@patch('userdbs.admin.UserDatabase.objects.create_userdatabase')
@patch("userdbs.admin.UserDatabase.objects.create_userdatabase")
def test_save(self, create_userdatabase):
create_userdatabase.return_value = Mock()
form = UserDatabaseCreationForm()
mockuser = Mock(name='mockuser')
form.cleaned_data = {'db_user': mockuser}
mockuser = Mock(name="mockuser")
form.cleaned_data = {"db_user": mockuser}
retval = form.save()
self.assertTrue(create_userdatabase.called_with(
db_user=mockuser, commit=True))
self.assertTrue(create_userdatabase.called_with(db_user=mockuser, commit=True))
self.assertEqual(retval, create_userdatabase.return_value)
def test_save_m2m_returns_none(self):
@ -57,116 +53,96 @@ class UserDatabaseCreationFormTest(TestCase):
class DatabaseUserAdminTest(TestCase):
def setUp(self):
site = AdminSite()
self.dbuadmin = DatabaseUserAdmin(DatabaseUser, site)
super(DatabaseUserAdminTest, self).setUp()
def test_get_form_with_instance(self):
form = self.dbuadmin.get_form(
Mock(name='request'), obj=Mock(name='dbuser'))
self.assertEqual(
form.Meta.fields,
['osuser', 'name', 'db_type']
)
form = self.dbuadmin.get_form(Mock(name="request"), obj=Mock(name="dbuser"))
self.assertEqual(form.Meta.fields, ["osuser", "name", "db_type"])
def test_get_form_without_instance(self):
form = self.dbuadmin.get_form(Mock(name='request'))
self.assertEqual(
form.Meta.fields,
['osuser', 'db_type']
)
form = self.dbuadmin.get_form(Mock(name="request"))
self.assertEqual(form.Meta.fields, ["osuser", "db_type"])
def test_get_readonly_fields_with_instance(self):
fields = self.dbuadmin.get_readonly_fields(
Mock(name='request'), obj=Mock(name='dbuser'))
self.assertEqual(
fields, ['osuser', 'name', 'db_type'])
Mock(name="request"), obj=Mock(name="dbuser")
)
self.assertEqual(fields, ["osuser", "name", "db_type"])
def test_get_readonly_fields_without_instance(self):
fields = self.dbuadmin.get_readonly_fields(
Mock(name='request'))
fields = self.dbuadmin.get_readonly_fields(Mock(name="request"))
self.assertEqual(fields, [])
def test_save_model_change(self):
objmock = Mock()
self.dbuadmin.save_model(Mock(name='request'), objmock, Mock(), True)
self.dbuadmin.save_model(Mock(name="request"), objmock, Mock(), True)
self.assertTrue(objmock.create_in_database.not_called())
def test_save_model_no_change(self):
objmock = Mock()
self.dbuadmin.save_model(Mock(name='request'), objmock, Mock(), False)
self.dbuadmin.save_model(Mock(name="request"), objmock, Mock(), False)
self.assertTrue(objmock.create_in_database.called_with())
def test_perform_delete_selected(self):
usermock = Mock()
selected = Mock()
selected.all.return_value = [usermock]
self.dbuadmin.perform_delete_selected(Mock(name='request'), selected)
self.dbuadmin.perform_delete_selected(Mock(name="request"), selected)
self.assertTrue(selected.all.called_with())
self.assertTrue(usermock.delete.called_with())
def test_get_actions(self):
requestmock = MagicMock(name='request')
self.assertNotIn(
'delete_selected',
self.dbuadmin.get_actions(requestmock))
self.assertIn(
'perform_delete_selected',
self.dbuadmin.get_actions(requestmock))
requestmock = MagicMock(name="request")
self.assertNotIn("delete_selected", self.dbuadmin.get_actions(requestmock))
self.assertIn("perform_delete_selected", self.dbuadmin.get_actions(requestmock))
class UserDatabaseAdminTest(TestCase):
def setUp(self):
site = AdminSite()
self.udbadmin = UserDatabaseAdmin(UserDatabase, site)
super(UserDatabaseAdminTest, self).setUp()
def test_get_form_with_instance(self):
form = self.udbadmin.get_form(
Mock(name='request'), obj=Mock(name='userdb'))
self.assertEqual(form.Meta.fields, ['db_name', 'db_user'])
form = self.udbadmin.get_form(Mock(name="request"), obj=Mock(name="userdb"))
self.assertEqual(form.Meta.fields, ["db_name", "db_user"])
def test_get_form_without_instance(self):
form = self.udbadmin.get_form(Mock(name='request'))
self.assertEqual(form.Meta.fields, ['db_user'])
form = self.udbadmin.get_form(Mock(name="request"))
self.assertEqual(form.Meta.fields, ["db_user"])
def test_get_readonly_fields_with_instance(self):
fields = self.udbadmin.get_readonly_fields(
Mock(name='request'), obj=Mock(name='userdb'))
self.assertEqual(
fields, ['db_name', 'db_user'])
Mock(name="request"), obj=Mock(name="userdb")
)
self.assertEqual(fields, ["db_name", "db_user"])
def test_get_readonly_fields_without_instance(self):
fields = self.udbadmin.get_readonly_fields(
Mock(name='request'))
fields = self.udbadmin.get_readonly_fields(Mock(name="request"))
self.assertEqual(fields, [])
def test_save_model_change(self):
objmock = Mock()
self.udbadmin.save_model(Mock(name='request'), objmock, Mock(), True)
self.udbadmin.save_model(Mock(name="request"), objmock, Mock(), True)
self.assertTrue(objmock.create_in_database.not_called())
def test_save_model_no_change(self):
objmock = Mock()
self.udbadmin.save_model(Mock(name='request'), objmock, Mock(), False)
self.udbadmin.save_model(Mock(name="request"), objmock, Mock(), False)
self.assertTrue(objmock.create_in_database.called_with())
def test_perform_delete_selected(self):
userdbmock = Mock()
selected = Mock()
selected.all.return_value = [userdbmock]
self.udbadmin.perform_delete_selected(Mock(name='request'), selected)
self.udbadmin.perform_delete_selected(Mock(name="request"), selected)
self.assertTrue(selected.all.called_with())
self.assertTrue(userdbmock.delete.called_with())
def test_get_actions(self):
requestmock = MagicMock(name='request')
self.assertNotIn(
'delete_selected',
self.udbadmin.get_actions(requestmock))
self.assertIn(
'perform_delete_selected',
self.udbadmin.get_actions(requestmock))
requestmock = MagicMock(name="request")
self.assertNotIn("delete_selected", self.udbadmin.get_actions(requestmock))
self.assertIn("perform_delete_selected", self.udbadmin.get_actions(requestmock))

View file

@ -2,20 +2,15 @@
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 django.urls import reverse
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
from unittest.mock import MagicMock, Mock, patch
Customer = get_user_model()
@ -33,66 +28,68 @@ class AddUserDatabaseFormTest(TestCase):
def test_constructor_needs_hostingpackage(self):
with self.assertRaises(KeyError) as ke:
AddUserDatabaseForm(instance=Mock())
self.assertEqual(ke.exception.args[0], 'hostingpackage')
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')
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')
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])
(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')
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')
@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])
(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',
}
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))
self.assertTrue(
create_userdatabase_with_user.called_with(
DB_TYPES.pgsql,
self.hostingpackage.osuser,
password="secret",
commit=True,
)
)
class ChangeDatabaseUserPasswordFormTest(TestCase):
@ -107,29 +104,31 @@ class ChangeDatabaseUserPasswordFormTest(TestCase):
def test_constructor_needs_hostingpackage(self):
with self.assertRaises(KeyError) as ke:
ChangeDatabaseUserPasswordForm(instance=Mock())
self.assertEqual(ke.exception.args[0], 'hostingpackage')
self.assertEqual(ke.exception.args[0], "hostingpackage")
def test_constructor(self):
self._setup_hostingpackage()
instance = MagicMock()
instance.name = 'test'
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')
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'
instance.name = "test"
self._setup_hostingpackage()
form = ChangeDatabaseUserPasswordForm(
instance=instance, hostingpackage=self.hostingpackage)
form.cleaned_data = {'password1': 'secret'}
instance=instance, hostingpackage=self.hostingpackage
)
form.cleaned_data = {"password1": "secret"}
form.save()
self.assertTrue(instance.set_password.called_with('secret'))
self.assertTrue(instance.set_password.called_with("secret"))

View file

@ -2,8 +2,6 @@
This module provides tests for :py:mod:`userdbs.models`.
"""
from __future__ import unicode_literals
from django.contrib.auth import get_user_model
from django.test import TestCase
from django.test.utils import override_settings
@ -16,9 +14,7 @@ Customer = get_user_model()
@override_settings(
CELERY_ALWAYS_EAGER=True,
CELERY_CACHE_BACKEND='memory',
BROKER_BACKEND='memory'
CELERY_ALWAYS_EAGER=True, CELERY_CACHE_BACKEND="memory", BROKER_BACKEND="memory"
)
class TestCaseWithCeleryTasks(TestCase):
pass
@ -29,93 +25,85 @@ class DatabaseUserManagerTest(TestCaseWithCeleryTasks):
Test case for :py:class:`userdbs.models.DatabaseUserManager`.
"""
def setUp(self):
self.customer = Customer.objects.create_user(username='testcustomer')
self.customer = Customer.objects.create_user(username="testcustomer")
self.osuser = User.objects.create_user(customer=self.customer)
TaskResult.objects.all().delete()
def test_create_database_user_with_name(self):
dbu = DatabaseUser.objects.create_database_user(
self.osuser, DB_TYPES.pgsql, 'testname', 'secret')
self.assertEqual(dbu.name, 'testname')
self.osuser, DB_TYPES.pgsql, "testname", "secret"
)
self.assertEqual(dbu.name, "testname")
self.assertEqual(dbu.osuser, self.osuser)
self.assertEqual(dbu.db_type, DB_TYPES.pgsql)
taskres = TaskResult.objects.all()
self.assertEqual(len(taskres), 1)
self.assertEqual(taskres[0].creator, 'handle_dbuser_created')
self.assertEqual(taskres[0].notes, 'pgsql user creation')
self.assertEqual(taskres[0].creator, "handle_dbuser_created")
self.assertEqual(taskres[0].notes, "pgsql user creation")
def test_create_database_user_with_name_no_commit(self):
dbu = DatabaseUser.objects.create_database_user(
self.osuser, DB_TYPES.pgsql, 'testname', 'secret', False)
self.assertEqual(dbu.name, 'testname')
self.osuser, DB_TYPES.pgsql, "testname", "secret", False
)
self.assertEqual(dbu.name, "testname")
self.assertEqual(dbu.osuser, self.osuser)
self.assertEqual(dbu.db_type, DB_TYPES.pgsql)
self.assertFalse(TaskResult.objects.exists())
def test_create_database_user_generate_name(self):
dbu = DatabaseUser.objects.create_database_user(
self.osuser, DB_TYPES.pgsql)
self.assertEqual(dbu.name, '{user}db01'.format(
user=self.osuser.username))
dbu = DatabaseUser.objects.create_database_user(self.osuser, DB_TYPES.pgsql)
self.assertEqual(dbu.name, "{user}db01".format(user=self.osuser.username))
self.assertEqual(dbu.osuser, self.osuser)
self.assertEqual(dbu.db_type, DB_TYPES.pgsql)
taskres = TaskResult.objects.all()
self.assertEqual(len(taskres), 1)
self.assertEqual(taskres[0].creator, 'handle_dbuser_created')
self.assertEqual(taskres[0].notes, 'pgsql user creation')
self.assertEqual(taskres[0].creator, "handle_dbuser_created")
self.assertEqual(taskres[0].notes, "pgsql user creation")
def test_create_database_user_multiple_generate_name(self):
dbu = DatabaseUser.objects.create_database_user(
self.osuser, DB_TYPES.mysql)
self.assertEqual(dbu.name, '{user}db01'.format(
user=self.osuser.username))
dbu = DatabaseUser.objects.create_database_user(self.osuser, DB_TYPES.mysql)
self.assertEqual(dbu.name, "{user}db01".format(user=self.osuser.username))
self.assertEqual(dbu.osuser, self.osuser)
self.assertEqual(dbu.db_type, DB_TYPES.mysql)
dbu = DatabaseUser.objects.create_database_user(
self.osuser, DB_TYPES.mysql)
self.assertEqual(dbu.name, '{user}db02'.format(
user=self.osuser.username))
dbu = DatabaseUser.objects.create_database_user(self.osuser, DB_TYPES.mysql)
self.assertEqual(dbu.name, "{user}db02".format(user=self.osuser.username))
self.assertEqual(dbu.osuser, self.osuser)
self.assertEqual(dbu.db_type, DB_TYPES.mysql)
taskres = TaskResult.objects.all()
self.assertEqual(len(taskres), 2)
self.assertEqual(taskres[0].creator, 'handle_dbuser_created')
self.assertEqual(taskres[0].notes, 'mysql user creation')
self.assertEqual(taskres[1].creator, 'handle_dbuser_created')
self.assertEqual(taskres[1].notes, 'mysql user creation')
self.assertEqual(taskres[0].creator, "handle_dbuser_created")
self.assertEqual(taskres[0].notes, "mysql user creation")
self.assertEqual(taskres[1].creator, "handle_dbuser_created")
self.assertEqual(taskres[1].notes, "mysql user creation")
def test_create_database_user_multiple_gap_generate_name(self):
dbu = DatabaseUser.objects.create_database_user(
self.osuser, DB_TYPES.mysql)
self.assertEqual(dbu.name, '{user}db01'.format(
user=self.osuser.username))
dbu = DatabaseUser.objects.create_database_user(self.osuser, DB_TYPES.mysql)
self.assertEqual(dbu.name, "{user}db01".format(user=self.osuser.username))
self.assertEqual(dbu.osuser, self.osuser)
self.assertEqual(dbu.db_type, DB_TYPES.mysql)
dbu = DatabaseUser.objects.create_database_user(
self.osuser, DB_TYPES.mysql)
self.assertEqual(dbu.name, '{user}db02'.format(
user=self.osuser.username))
dbu = DatabaseUser.objects.create_database_user(self.osuser, DB_TYPES.mysql)
self.assertEqual(dbu.name, "{user}db02".format(user=self.osuser.username))
self.assertEqual(dbu.osuser, self.osuser)
self.assertEqual(dbu.db_type, DB_TYPES.mysql)
DatabaseUser.objects.get(
name='{user}db01'.format(user=self.osuser.username)).delete()
dbu = DatabaseUser.objects.create_database_user(
self.osuser, DB_TYPES.mysql)
self.assertEqual(dbu.name, '{user}db01'.format(
user=self.osuser.username))
name="{user}db01".format(user=self.osuser.username)
).delete()
dbu = DatabaseUser.objects.create_database_user(self.osuser, DB_TYPES.mysql)
self.assertEqual(dbu.name, "{user}db01".format(user=self.osuser.username))
self.assertEqual(dbu.osuser, self.osuser)
self.assertEqual(dbu.db_type, DB_TYPES.mysql)
taskres = TaskResult.objects.all()
self.assertEqual(len(taskres), 4)
self.assertEqual(taskres[0].creator, 'handle_dbuser_created')
self.assertEqual(taskres[0].notes, 'mysql user creation')
self.assertEqual(taskres[1].creator, 'handle_dbuser_created')
self.assertEqual(taskres[1].notes, 'mysql user creation')
self.assertEqual(taskres[2].creator, 'handle_dbuser_deleted')
self.assertEqual(taskres[2].notes, 'mysql user deletion')
self.assertEqual(taskres[3].creator, 'handle_dbuser_created')
self.assertEqual(taskres[3].notes, 'mysql user creation')
self.assertEqual(taskres[0].creator, "handle_dbuser_created")
self.assertEqual(taskres[0].notes, "mysql user creation")
self.assertEqual(taskres[1].creator, "handle_dbuser_created")
self.assertEqual(taskres[1].notes, "mysql user creation")
self.assertEqual(taskres[2].creator, "handle_dbuser_deleted")
self.assertEqual(taskres[2].notes, "mysql user deletion")
self.assertEqual(taskres[3].creator, "handle_dbuser_created")
self.assertEqual(taskres[3].notes, "mysql user creation")
class DatabaseUserTest(TestCaseWithCeleryTasks):
@ -123,41 +111,43 @@ class DatabaseUserTest(TestCaseWithCeleryTasks):
Test case for :py:class:`userdbs.models.DatabaseUser`.
"""
def setUp(self):
self.customer = Customer.objects.create_user(username='testcustomer')
self.customer = Customer.objects.create_user(username="testcustomer")
self.osuser = User.objects.create_user(customer=self.customer)
self.dbu = DatabaseUser.objects.create_database_user(
self.osuser, DB_TYPES.pgsql)
self.osuser, DB_TYPES.pgsql
)
TaskResult.objects.all().delete()
def test___str__(self):
self.assertEqual(
str(self.dbu),
'{user}db01 (PostgreSQL for {user})'.format(
user=self.osuser.username))
"{user}db01 (PostgreSQL for {user})".format(user=self.osuser.username),
)
def test_set_password_pgsql(self):
self.dbu.set_password('secret')
self.dbu.set_password("secret")
taskres = TaskResult.objects.all()
self.assertEqual(len(taskres), 1)
self.assertEqual(taskres[0].creator, 'handle_dbuser_password_set')
self.assertEqual(taskres[0].notes, 'pgsql password change')
self.assertEqual(taskres[0].creator, "handle_dbuser_password_set")
self.assertEqual(taskres[0].notes, "pgsql password change")
def test_set_password_mysql(self):
self.dbu.db_type = DB_TYPES.mysql
self.dbu.save()
self.dbu.set_password('secret')
self.dbu.set_password("secret")
taskres = TaskResult.objects.all()
self.assertEqual(len(taskres), 1)
self.assertEqual(taskres[0].creator, 'handle_dbuser_password_set')
self.assertEqual(taskres[0].notes, 'mysql password change')
self.assertEqual(taskres[0].creator, "handle_dbuser_password_set")
self.assertEqual(taskres[0].notes, "mysql password change")
def test_delete_no_dbs(self):
self.dbu.delete()
taskres = TaskResult.objects.all()
self.assertEqual(len(taskres), 1)
self.assertEqual(taskres[0].creator, 'handle_dbuser_deleted')
self.assertEqual(taskres[0].notes, 'pgsql user deletion')
self.assertEqual(taskres[0].creator, "handle_dbuser_deleted")
self.assertEqual(taskres[0].notes, "pgsql user deletion")
def test_delete_with_dbs(self):
db = UserDatabase.objects.create_userdatabase(self.dbu)
@ -166,12 +156,12 @@ class DatabaseUserTest(TestCaseWithCeleryTasks):
self.assertFalse(UserDatabase.objects.filter(id=dbid).exists())
taskres = TaskResult.objects.all()
self.assertEqual(len(taskres), 3)
self.assertEqual(taskres[0].creator, 'handle_userdb_created')
self.assertEqual(taskres[0].notes, 'pgsql database creation')
self.assertEqual(taskres[1].creator, 'handle_userdb_deleted')
self.assertEqual(taskres[1].notes, 'pgsql database deletion')
self.assertEqual(taskres[2].creator, 'handle_dbuser_deleted')
self.assertEqual(taskres[2].notes, 'pgsql user deletion')
self.assertEqual(taskres[0].creator, "handle_userdb_created")
self.assertEqual(taskres[0].notes, "pgsql database creation")
self.assertEqual(taskres[1].creator, "handle_userdb_deleted")
self.assertEqual(taskres[1].notes, "pgsql database deletion")
self.assertEqual(taskres[2].creator, "handle_dbuser_deleted")
self.assertEqual(taskres[2].notes, "pgsql user deletion")
class UserDatabaseManagerTest(TestCaseWithCeleryTasks):
@ -179,50 +169,52 @@ class UserDatabaseManagerTest(TestCaseWithCeleryTasks):
Test case for :py:class:`userdbs.models.UserDatabaseManager`.
"""
def setUp(self):
self.customer = Customer.objects.create_user(username='testcustomer')
self.customer = Customer.objects.create_user(username="testcustomer")
self.osuser = User.objects.create_user(customer=self.customer)
TaskResult.objects.all().delete()
def _create_database_user(self, dbtype):
self.dbu = DatabaseUser.objects.create_database_user(
self.osuser, dbtype)
self.dbu = DatabaseUser.objects.create_database_user(self.osuser, dbtype)
TaskResult.objects.all().delete()
def test_create_userdatabase_with_user_mysql(self):
db = UserDatabase.objects.create_userdatabase_with_user(
DB_TYPES.mysql, self.osuser)
self.assertEqual(db.db_name, '{user}db01'.format(
user=self.osuser.username))
self.assertEqual(db.db_user.name, '{user}db01'.format(
user=self.osuser.username))
DB_TYPES.mysql, self.osuser
)
self.assertEqual(db.db_name, "{user}db01".format(user=self.osuser.username))
self.assertEqual(
db.db_user.name, "{user}db01".format(user=self.osuser.username)
)
taskres = TaskResult.objects.all()
self.assertEqual(len(taskres), 2)
self.assertEqual(taskres[0].creator, 'handle_dbuser_created')
self.assertEqual(taskres[0].notes, 'mysql user creation')
self.assertEqual(taskres[1].creator, 'handle_userdb_created')
self.assertEqual(taskres[1].notes, 'mysql database creation')
self.assertEqual(taskres[0].creator, "handle_dbuser_created")
self.assertEqual(taskres[0].notes, "mysql user creation")
self.assertEqual(taskres[1].creator, "handle_userdb_created")
self.assertEqual(taskres[1].notes, "mysql database creation")
def test_create_userdatabase_with_user_pgsql(self):
db = UserDatabase.objects.create_userdatabase_with_user(
DB_TYPES.pgsql, self.osuser)
self.assertEqual(db.db_name, '{user}db01'.format(
user=self.osuser.username))
self.assertEqual(db.db_user.name, '{user}db01'.format(
user=self.osuser.username))
DB_TYPES.pgsql, self.osuser
)
self.assertEqual(db.db_name, "{user}db01".format(user=self.osuser.username))
self.assertEqual(
db.db_user.name, "{user}db01".format(user=self.osuser.username)
)
taskres = TaskResult.objects.all()
self.assertEqual(len(taskres), 2)
self.assertEqual(taskres[0].creator, 'handle_dbuser_created')
self.assertEqual(taskres[0].notes, 'pgsql user creation')
self.assertEqual(taskres[1].creator, 'handle_userdb_created')
self.assertEqual(taskres[1].notes, 'pgsql database creation')
self.assertEqual(taskres[0].creator, "handle_dbuser_created")
self.assertEqual(taskres[0].notes, "pgsql user creation")
self.assertEqual(taskres[1].creator, "handle_userdb_created")
self.assertEqual(taskres[1].notes, "pgsql database creation")
def test_create_userdatabase_given_name_no_new_write(self):
self._create_database_user(DB_TYPES.pgsql)
db = UserDatabase.objects.create_userdatabase(self.dbu, db_name='test')
db = UserDatabase.objects.create_userdatabase(self.dbu, db_name="test")
taskres = TaskResult.objects.all()
self.assertEqual(len(taskres), 1)
self.assertEqual(db.db_name, 'test')
self.assertEqual(db.db_name, "test")
TaskResult.objects.all().delete()
db.save()
taskres = TaskResult.objects.all()
@ -230,11 +222,11 @@ class UserDatabaseManagerTest(TestCaseWithCeleryTasks):
def test_create_userdatabase_given_name(self):
self._create_database_user(DB_TYPES.pgsql)
db = UserDatabase.objects.create_userdatabase(self.dbu, db_name='test')
self.assertEqual(db.db_name, 'test')
db = UserDatabase.objects.create_userdatabase(self.dbu, db_name="test")
self.assertEqual(db.db_name, "test")
taskres = TaskResult.objects.all()
self.assertEqual(len(taskres), 1)
self.assertEqual(db.db_name, 'test')
self.assertEqual(db.db_name, "test")
def test_create_userdatabase_generate_name_no_commit(self):
self._create_database_user(DB_TYPES.pgsql)
@ -252,19 +244,19 @@ class UserDatabaseManagerTest(TestCaseWithCeleryTasks):
db = UserDatabase.objects.create_userdatabase(self.dbu)
self.assertEqual(db.db_name, self.dbu.name)
db = UserDatabase.objects.create_userdatabase(self.dbu)
self.assertEqual(db.db_name, '{user}_02'.format(user=self.dbu.name))
self.assertEqual(db.db_name, "{user}_02".format(user=self.dbu.name))
def test_create_userdatabase_multiple_gap_generate_name(self):
self._create_database_user(DB_TYPES.pgsql)
db = UserDatabase.objects.create_userdatabase(self.dbu)
self.assertEqual(db.db_name, self.dbu.name)
dbx = UserDatabase.objects.create_userdatabase(self.dbu)
self.assertEqual(dbx.db_name, '{user}_02'.format(user=self.dbu.name))
self.assertEqual(dbx.db_name, "{user}_02".format(user=self.dbu.name))
db = UserDatabase.objects.create_userdatabase(self.dbu)
self.assertEqual(db.db_name, '{user}_03'.format(user=self.dbu.name))
self.assertEqual(db.db_name, "{user}_03".format(user=self.dbu.name))
dbx.delete()
db = UserDatabase.objects.create_userdatabase(self.dbu)
self.assertEqual(db.db_name, '{user}_02'.format(user=self.dbu.name))
self.assertEqual(db.db_name, "{user}_02".format(user=self.dbu.name))
class UserDatabaseTest(TestCaseWithCeleryTasks):
@ -272,24 +264,23 @@ class UserDatabaseTest(TestCaseWithCeleryTasks):
Test case for :py:class:`userdbs.models.UserDabase`.
"""
def test___str__(self):
customer = Customer.objects.create_user(username='testcustomer')
customer = Customer.objects.create_user(username="testcustomer")
osuser = User.objects.create_user(customer=customer)
db = UserDatabase.objects.create_userdatabase_with_user(
DB_TYPES.pgsql, osuser)
db = UserDatabase.objects.create_userdatabase_with_user(DB_TYPES.pgsql, osuser)
self.assertEqual(
str(db),
'{user}db01 ({dbuser})'.format(
user=osuser.username, dbuser=db.db_user))
"{user}db01 ({dbuser})".format(user=osuser.username, dbuser=db.db_user),
)
def test_delete_mysql_db(self):
customer = Customer.objects.create_user(username='testcustomer')
customer = Customer.objects.create_user(username="testcustomer")
osuser = User.objects.create_user(customer=customer)
TaskResult.objects.all().delete()
db = UserDatabase.objects.create_userdatabase_with_user(
DB_TYPES.mysql, osuser)
db = UserDatabase.objects.create_userdatabase_with_user(DB_TYPES.mysql, osuser)
db.delete()
taskres = TaskResult.objects.all()
self.assertEqual(len(taskres), 3)
self.assertEqual(taskres[2].creator, 'handle_userdb_deleted')
self.assertEqual(taskres[2].notes, 'mysql database deletion')
self.assertEqual(taskres[2].creator, "handle_userdb_deleted")
self.assertEqual(taskres[2].notes, "mysql database deletion")

View file

@ -4,63 +4,60 @@ This module contains explicit tests for corner cases in
:py:mod:`userdbs.tests.test_models`.
"""
from __future__ import unicode_literals
from unittest.mock import Mock
from django.test import TestCase
from django.test.utils import override_settings
from taskresults.models import TaskResult
from userdbs.signals import (handle_dbuser_created, handle_dbuser_deleted,
handle_dbuser_password_set, handle_userdb_created,
handle_userdb_deleted)
try:
from unittest.mock import Mock
except ImportError:
from mock import Mock
from userdbs.signals import (
handle_dbuser_created,
handle_dbuser_deleted,
handle_dbuser_password_set,
handle_userdb_created,
handle_userdb_deleted,
)
@override_settings(
CELERY_ALWAYS_EAGER=True,
CELERY_CACHE_BACKEND='memory',
BROKER_BACKEND='memory'
CELERY_ALWAYS_EAGER=True, CELERY_CACHE_BACKEND="memory", BROKER_BACKEND="memory"
)
class TestCaseWithCeleryTasks(TestCase):
pass
class TestWithUnknownDBType(TestCaseWithCeleryTasks):
def test_handle_dbuser_password_set_unknown(self):
instance = Mock(data={'name': 'test', 'db_type': -1})
handle_dbuser_password_set(Mock(name='sender'), instance, 'secret')
instance = Mock(data={"name": "test", "db_type": -1})
handle_dbuser_password_set(Mock(name="sender"), instance, "secret")
self.assertFalse(TaskResult.objects.exists())
def test_handle_dbuser_create_unknown(self):
instance = Mock(data={'name': 'test', 'db_type': -1})
handle_dbuser_created(
Mock(name='sender'), instance, True, password='secret')
instance = Mock(data={"name": "test", "db_type": -1})
handle_dbuser_created(Mock(name="sender"), instance, True, password="secret")
self.assertFalse(TaskResult.objects.exists())
def test_handle_dbuser_deleted_unknown(self):
instance = Mock(data={'name': 'test', 'db_type': -1})
handle_dbuser_deleted(Mock(name='sender'), instance)
instance = Mock(data={"name": "test", "db_type": -1})
handle_dbuser_deleted(Mock(name="sender"), instance)
self.assertFalse(TaskResult.objects.exists())
def test_handle_userdb_created_unknown(self):
instance = Mock(
data={
'db_name': 'test',
'db_user': Mock(data={'name': 'test', 'db_type': -1, })
})
handle_userdb_created(Mock(name='sender'), instance, True)
"db_name": "test",
"db_user": Mock(data={"name": "test", "db_type": -1}),
}
)
handle_userdb_created(Mock(name="sender"), instance, True)
self.assertFalse(TaskResult.objects.exists())
def test_handle_userdb_deleted_unknown(self):
instance = Mock(
data={
'db_name': 'test',
'db_user': Mock(data={'name': 'test', 'db_type': -1, })
})
handle_userdb_deleted(Mock(name='sender'), instance)
"db_name": "test",
"db_user": Mock(data={"name": "test", "db_type": -1}),
}
)
handle_userdb_deleted(Mock(name="sender"), instance)
self.assertFalse(TaskResult.objects.exists())

View file

@ -2,16 +2,11 @@
This module provides tests for :py:mod:`userdbs.views`.
"""
from __future__ import absolute_import, unicode_literals
from unittest.mock import patch, MagicMock
try:
from unittest.mock import patch, MagicMock
except ImportError:
from mock import patch, MagicMock
from django.core.urlresolvers import reverse
from django.test import TestCase
from django.contrib.auth import get_user_model
from django.urls import reverse
from hostingpackages.models import (
CustomerHostingPackage,
@ -26,58 +21,61 @@ from userdbs.views import AddUserDatabase, ChangeDatabaseUserPassword
User = get_user_model()
TEST_USER = 'test'
TEST_PASSWORD = 'secret'
TEST_EMAIL = 'test@example.org'
TEST_USER = "test"
TEST_PASSWORD = "secret"
TEST_EMAIL = "test@example.org"
class HostingPackageAwareTestMixin(object):
# noinspection PyMethodMayBeStatic
def _setup_hosting_package(self, customer):
template = HostingPackageTemplate.objects.create(
name='testpackagetemplate', mailboxcount=10, diskspace=1,
diskspace_unit=0)
name="testpackagetemplate", mailboxcount=10, diskspace=1, diskspace_unit=0
)
package = CustomerHostingPackage.objects.create_from_template(
customer, template, 'testpackage')
with patch('hostingpackages.models.settings') as hmsettings:
customer, template, "testpackage"
)
with patch("hostingpackages.models.settings") as hmsettings:
hmsettings.OSUSER_DEFAULT_GROUPS = []
package.save()
return package
class CustomerUserDatabaseOptionAwareTestMixin(object):
def __init__(self, *args, **kwargs):
super(CustomerUserDatabaseOptionAwareTestMixin, self).__init__(
*args, **kwargs)
super(CustomerUserDatabaseOptionAwareTestMixin, self).__init__(*args, **kwargs)
self._templates = {}
def _setup_userdatabaseoption(self, number, dbtype):
key = "{}_{}".format(dbtype, number)
if key not in self._templates:
self._templates[key] = UserDatabaseOption.objects.create(
number=number, db_type=dbtype)
number=number, db_type=dbtype
)
return self._templates[key]
def _create_userdatabase_option(self, number=1, dbtype=DB_TYPES.pgsql):
# noinspection PyUnresolvedReferences
return CustomerUserDatabaseOption.objects.create(
template=self._setup_userdatabaseoption(number, dbtype),
number=number, db_type=dbtype, hosting_package=self.package)
number=number,
db_type=dbtype,
hosting_package=self.package,
)
class AddUserDatabaseTest(
HostingPackageAwareTestMixin, CustomerUserDatabaseOptionAwareTestMixin,
TestCase
HostingPackageAwareTestMixin, CustomerUserDatabaseOptionAwareTestMixin, TestCase
):
def setUp(self):
self.customer = User.objects.create_user(
username=TEST_USER, password=TEST_PASSWORD)
username=TEST_USER, password=TEST_PASSWORD
)
self.package = self._setup_hosting_package(self.customer)
def _get_url(self):
return reverse(
'add_userdatabase', kwargs={'package': self.package.id})
return reverse("add_userdatabase", kwargs={"package": self.package.id})
def test_get_anonymous(self):
response = self.client.get(self._get_url())
@ -95,31 +93,29 @@ class AddUserDatabaseTest(
self.assertEqual(response.status_code, 200)
def test_get_other_regular_user(self):
User.objects.create_user(
'test2', password=TEST_PASSWORD)
self.client.login(username='test2', password=TEST_PASSWORD)
User.objects.create_user("test2", password=TEST_PASSWORD)
self.client.login(username="test2", password=TEST_PASSWORD)
response = self.client.get(self._get_url())
self.assertEqual(response.status_code, 403)
def test_get_staff_user_nodboption(self):
User.objects.create_superuser(
'admin', email=TEST_EMAIL, password=TEST_PASSWORD)
self.client.login(username='admin', password=TEST_PASSWORD)
User.objects.create_superuser("admin", email=TEST_EMAIL, password=TEST_PASSWORD)
self.client.login(username="admin", password=TEST_PASSWORD)
response = self.client.get(self._get_url())
self.assertEqual(response.status_code, 400)
def test_get_staff_user(self):
self._create_userdatabase_option()
User.objects.create_superuser(
'admin', email=TEST_EMAIL, password=TEST_PASSWORD)
self.client.login(username='admin', password=TEST_PASSWORD)
User.objects.create_superuser("admin", email=TEST_EMAIL, password=TEST_PASSWORD)
self.client.login(username="admin", password=TEST_PASSWORD)
response = self.client.get(self._get_url())
self.assertEqual(response.status_code, 200)
def test_get_regular_user_nofree_db(self):
db_option = self._create_userdatabase_option()
UserDatabase.objects.create_userdatabase_with_user(
db_option.db_type, self.package.osuser)
db_option.db_type, self.package.osuser
)
self.client.login(username=TEST_USER, password=TEST_PASSWORD)
response = self.client.get(self._get_url())
self.assertEqual(response.status_code, 400)
@ -128,21 +124,21 @@ class AddUserDatabaseTest(
db_option = self._create_userdatabase_option()
self.client.login(username=TEST_USER, password=TEST_PASSWORD)
view = AddUserDatabase(
request=MagicMock(), kwargs={'package': str(self.package.pk)})
request=MagicMock(), kwargs={"package": str(self.package.pk)}
)
the_kwargs = view.get_form_kwargs()
self.assertIn('hostingpackage', the_kwargs)
self.assertEqual(the_kwargs['hostingpackage'], self.package)
self.assertIn('dbtypes', the_kwargs)
self.assertIn("hostingpackage", the_kwargs)
self.assertEqual(the_kwargs["hostingpackage"], self.package)
self.assertIn("dbtypes", the_kwargs)
self.assertEqual(
the_kwargs['dbtypes'],
[(db_option.db_type, DB_TYPES[db_option.db_type])],
the_kwargs["dbtypes"], [(db_option.db_type, DB_TYPES[db_option.db_type])]
)
def test_get_template(self):
self._create_userdatabase_option()
self.client.login(username=TEST_USER, password=TEST_PASSWORD)
response = self.client.get(self._get_url())
self.assertTemplateUsed(response, 'userdbs/userdatabase_create.html')
self.assertTemplateUsed(response, "userdbs/userdatabase_create.html")
def test_form_valid_redirect(self):
db_option = self._create_userdatabase_option()
@ -150,48 +146,55 @@ class AddUserDatabaseTest(
response = self.client.post(
self._get_url(),
data={
'db_type': db_option.db_type, 'password1': TEST_PASSWORD,
'password2': TEST_PASSWORD})
"db_type": db_option.db_type,
"password1": TEST_PASSWORD,
"password2": TEST_PASSWORD,
},
)
self.assertRedirects(response, self.package.get_absolute_url())
def test_form_valid_message(self):
db_option = self._create_userdatabase_option()
self.client.login(username=TEST_USER, password=TEST_PASSWORD)
response = self.client.post(
self._get_url(), follow=True,
self._get_url(),
follow=True,
data={
'db_type': db_option.db_type, 'password1': TEST_PASSWORD,
'password2': TEST_PASSWORD})
db = UserDatabase.objects.filter(
db_user__osuser=self.package.osuser).get()
messages = list(response.context['messages'])
"db_type": db_option.db_type,
"password1": TEST_PASSWORD,
"password2": TEST_PASSWORD,
},
)
db = UserDatabase.objects.filter(db_user__osuser=self.package.osuser).get()
messages = list(response.context["messages"])
self.assertEqual(len(messages), 1)
self.assertEqual(
str(messages[0]), (
'Successfully create new {type} database {dbname} for user '
'{dbuser}.').format(
type=db.db_user.db_type, dbname=db.db_name,
dbuser=db.db_user))
str(messages[0]),
(
"Successfully create new {type} database {dbname} for user " "{dbuser}."
).format(type=db.db_user.db_type, dbname=db.db_name, dbuser=db.db_user),
)
class ChangeDatabaseUserPasswordTest(
HostingPackageAwareTestMixin, CustomerUserDatabaseOptionAwareTestMixin,
TestCase
HostingPackageAwareTestMixin, CustomerUserDatabaseOptionAwareTestMixin, TestCase
):
def setUp(self):
self.customer = User.objects.create_user(
username=TEST_USER, password=TEST_PASSWORD)
username=TEST_USER, password=TEST_PASSWORD
)
self.package = self._setup_hosting_package(self.customer)
template = self._create_userdatabase_option()
database = UserDatabase.objects.create_userdatabase_with_user(
template.db_type, self.package.osuser)
template.db_type, self.package.osuser
)
self.dbuser = database.db_user
def _get_url(self, dbuser):
return reverse(
'change_dbuser_password', kwargs={
'package': self.package.id, 'slug': dbuser.name})
"change_dbuser_password",
kwargs={"package": self.package.id, "slug": dbuser.name},
)
def test_get_anonymous(self):
response = self.client.get(self._get_url(self.dbuser))
@ -203,80 +206,85 @@ class ChangeDatabaseUserPasswordTest(
self.assertEqual(response.status_code, 200)
def test_get_other_regular_user(self):
User.objects.create_user(
'test2', password=TEST_PASSWORD)
self.client.login(username='test2', password=TEST_PASSWORD)
User.objects.create_user("test2", password=TEST_PASSWORD)
self.client.login(username="test2", password=TEST_PASSWORD)
response = self.client.get(self._get_url(self.dbuser))
self.assertEqual(response.status_code, 403)
def test_get_staff_user(self):
User.objects.create_superuser(
'admin', email=TEST_EMAIL, password=TEST_PASSWORD)
self.client.login(username='admin', password=TEST_PASSWORD)
User.objects.create_superuser("admin", email=TEST_EMAIL, password=TEST_PASSWORD)
self.client.login(username="admin", password=TEST_PASSWORD)
response = self.client.get(self._get_url(self.dbuser))
self.assertEqual(response.status_code, 200)
def test_get_template(self):
self.client.login(username=TEST_USER, password=TEST_PASSWORD)
response = self.client.get(self._get_url(self.dbuser))
self.assertTemplateUsed(
response, 'userdbs/databaseuser_setpassword.html')
self.assertTemplateUsed(response, "userdbs/databaseuser_setpassword.html")
def test_get_form_kwargs(self):
self.client.login(username=TEST_USER, password=TEST_PASSWORD)
view = ChangeDatabaseUserPassword(request=MagicMock(), kwargs={
'package': str(self.package.pk), 'slug': self.dbuser.name})
view = ChangeDatabaseUserPassword(
request=MagicMock(),
kwargs={"package": str(self.package.pk), "slug": self.dbuser.name},
)
the_kwargs = view.get_form_kwargs()
self.assertIn('hostingpackage', the_kwargs)
self.assertEqual(the_kwargs['hostingpackage'], self.package)
self.assertIn("hostingpackage", the_kwargs)
self.assertEqual(the_kwargs["hostingpackage"], self.package)
def test_get_context_data(self):
self.client.login(username=TEST_USER, password=TEST_PASSWORD)
response = self.client.get(self._get_url(self.dbuser))
self.assertIn('dbuser', response.context)
self.assertEqual(response.context['dbuser'], self.dbuser)
self.assertIn('hostingpackage', response.context)
self.assertEqual(response.context['hostingpackage'], self.package)
self.assertIn('customer', response.context)
self.assertEqual(response.context['customer'], self.customer)
self.assertIn("dbuser", response.context)
self.assertEqual(response.context["dbuser"], self.dbuser)
self.assertIn("hostingpackage", response.context)
self.assertEqual(response.context["hostingpackage"], self.package)
self.assertIn("customer", response.context)
self.assertEqual(response.context["customer"], self.customer)
def test_form_valid_redirect(self):
self.client.login(username=TEST_USER, password=TEST_PASSWORD)
response = self.client.post(self._get_url(self.dbuser), data={
'password1': TEST_PASSWORD, 'password2': TEST_PASSWORD})
response = self.client.post(
self._get_url(self.dbuser),
data={"password1": TEST_PASSWORD, "password2": TEST_PASSWORD},
)
self.assertRedirects(response, self.package.get_absolute_url())
def test_form_valid_message(self):
self.client.login(username=TEST_USER, password=TEST_PASSWORD)
response = self.client.post(
self._get_url(self.dbuser), follow=True, data={
'password1': TEST_PASSWORD, 'password2': TEST_PASSWORD})
messages = list(response.context['messages'])
self._get_url(self.dbuser),
follow=True,
data={"password1": TEST_PASSWORD, "password2": TEST_PASSWORD},
)
messages = list(response.context["messages"])
self.assertEqual(len(messages), 1)
self.assertEqual(
str(messages[0]),
'Successfully changed password of database user {dbuser}.'.format(
dbuser=self.dbuser.name))
"Successfully changed password of database user {dbuser}.".format(
dbuser=self.dbuser.name
),
)
class DeleteUserDatabaseTest(
HostingPackageAwareTestMixin, CustomerUserDatabaseOptionAwareTestMixin,
TestCase
HostingPackageAwareTestMixin, CustomerUserDatabaseOptionAwareTestMixin, TestCase
):
def setUp(self):
self.customer = User.objects.create_user(
username=TEST_USER, password=TEST_PASSWORD)
username=TEST_USER, password=TEST_PASSWORD
)
self.package = self._setup_hosting_package(self.customer)
template = self._create_userdatabase_option()
self.database = UserDatabase.objects.create_userdatabase_with_user(
template.db_type, self.package.osuser)
template.db_type, self.package.osuser
)
def _get_url(self, userdatabase):
return reverse(
'delete_userdatabase', kwargs={
'package': self.package.id,
'slug': userdatabase.db_name})
"delete_userdatabase",
kwargs={"package": self.package.id, "slug": userdatabase.db_name},
)
def test_get_anonymous(self):
response = self.client.get(self._get_url(self.database))
@ -288,34 +296,31 @@ class DeleteUserDatabaseTest(
self.assertEqual(response.status_code, 200)
def test_get_other_regular_user(self):
User.objects.create_user(
'test2', password=TEST_PASSWORD)
self.client.login(username='test2', password=TEST_PASSWORD)
User.objects.create_user("test2", password=TEST_PASSWORD)
self.client.login(username="test2", password=TEST_PASSWORD)
response = self.client.get(self._get_url(self.database))
self.assertEqual(response.status_code, 403)
def test_get_staff_user(self):
User.objects.create_superuser(
'admin', email=TEST_EMAIL, password=TEST_PASSWORD)
self.client.login(username='admin', password=TEST_PASSWORD)
User.objects.create_superuser("admin", email=TEST_EMAIL, password=TEST_PASSWORD)
self.client.login(username="admin", password=TEST_PASSWORD)
response = self.client.get(self._get_url(self.database))
self.assertEqual(response.status_code, 200)
def test_get_template(self):
self.client.login(username=TEST_USER, password=TEST_PASSWORD)
response = self.client.get(self._get_url(self.database))
self.assertTemplateUsed(
response, 'userdbs/userdatabase_confirm_delete.html')
self.assertTemplateUsed(response, "userdbs/userdatabase_confirm_delete.html")
def test_get_context_data(self):
self.client.login(username=TEST_USER, password=TEST_PASSWORD)
response = self.client.get(self._get_url(self.database))
self.assertIn('database', response.context)
self.assertEqual(response.context['database'], self.database)
self.assertIn('hostingpackage', response.context)
self.assertEqual(response.context['hostingpackage'], self.package)
self.assertIn('customer', response.context)
self.assertEqual(response.context['customer'], self.customer)
self.assertIn("database", response.context)
self.assertEqual(response.context["database"], self.database)
self.assertIn("hostingpackage", response.context)
self.assertEqual(response.context["hostingpackage"], self.package)
self.assertIn("customer", response.context)
self.assertEqual(response.context["customer"], self.customer)
def test_form_valid_redirect(self):
self.client.login(username=TEST_USER, password=TEST_PASSWORD)
@ -325,6 +330,6 @@ class DeleteUserDatabaseTest(
def test_form_valid_message(self):
self.client.login(username=TEST_USER, password=TEST_PASSWORD)
response = self.client.post(self._get_url(self.database), follow=True)
messages = list(response.context['messages'])
messages = list(response.context["messages"])
self.assertEqual(len(messages), 1)
self.assertEqual(str(messages[0]), "Database deleted.")