From 3cebf2db1ab7d36e4a48ef7c858abebf6ad4f5cc Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Sat, 13 Jan 2018 09:53:42 +0100 Subject: [PATCH] Improve coverage. --- modoboa/admin/app_settings.py | 4 +- .../commands/subcommands/_manage_dkim_keys.py | 11 +- modoboa/admin/tests/test_domain.py | 24 ++++ modoboa/core/tests/test_views.py | 121 +++++++++--------- 4 files changed, 93 insertions(+), 67 deletions(-) diff --git a/modoboa/admin/app_settings.py b/modoboa/admin/app_settings.py index fa063105c..6ce1b66f4 100644 --- a/modoboa/admin/app_settings.py +++ b/modoboa/admin/app_settings.py @@ -201,13 +201,13 @@ class AdminParametersForm(param_forms.AdminParametersForm): if storage_dir: if not os.path.isdir(storage_dir): raise forms.ValidationError( - ugettext_lazy("Directory not found") + ugettext_lazy("Directory not found.") ) code, output = exec_cmd("which openssl") if code: raise forms.ValidationError( ugettext_lazy( - "openssl not found, please make sure it is installed") + "openssl not found, please make sure it is installed.") ) return storage_dir diff --git a/modoboa/admin/management/commands/subcommands/_manage_dkim_keys.py b/modoboa/admin/management/commands/subcommands/_manage_dkim_keys.py index 610b8779a..bae55519c 100644 --- a/modoboa/admin/management/commands/subcommands/_manage_dkim_keys.py +++ b/modoboa/admin/management/commands/subcommands/_manage_dkim_keys.py @@ -5,6 +5,7 @@ from __future__ import print_function, unicode_literals import os from django.core.management.base import BaseCommand +from django.utils.encoding import smart_text from modoboa.lib import sysutils from modoboa.parameters import tools as param_tools @@ -26,16 +27,16 @@ class ManageDKIMKeys(BaseCommand): "openssl genrsa -out {} {}".format(pkey_path, key_size)) if code: print("Failed to generate DKIM private key for domain {}: {}" - .format(domain.name, output)) + .format(domain.name, smart_text(output))) domain.dkim_private_key_path = pkey_path code, output = sysutils.exec_cmd( "openssl rsa -in {} -pubout".format(pkey_path)) if code: print("Failed to generate DKIM public key for domain {}: {}" - .format(domain.name, output)) - public_key = b"" - for cpt, line in enumerate(output.splitlines()): - if cpt == 0 or line.startswith(b"-----"): + .format(domain.name, smart_text(output))) + public_key = "" + for cpt, line in enumerate(smart_text(output).splitlines()): + if cpt == 0 or line.startswith("-----"): continue public_key += line domain.dkim_public_key = public_key diff --git a/modoboa/admin/tests/test_domain.py b/modoboa/admin/tests/test_domain.py index a161ffde5..cabab25e3 100644 --- a/modoboa/admin/tests/test_domain.py +++ b/modoboa/admin/tests/test_domain.py @@ -10,12 +10,15 @@ import tempfile import dns.resolver from mock import patch +from testfixtures import compare from django.core.management import call_command from django.urls import reverse +from django.utils.html import escape from modoboa.core import factories as core_factories from modoboa.core.models import User +from modoboa.core.tests.test_views import SETTINGS_SAMPLE from modoboa.lib.tests import ModoTestCase from . import utils @@ -371,6 +374,21 @@ class DKIMTestCase(ModoTestCase): def tearDown(self): shutil.rmtree(self.workdir) + def test_global_settings(self): + """Check validation rules.""" + url = reverse("core:parameters") + settings = SETTINGS_SAMPLE.copy() + settings["admin-dkim_keys_storage_dir"] = "/wrong" + response = self.client.post(url, settings, format="json") + self.assertEqual(response.status_code, 400) + compare(response.json(), { + "form_errors": {"dkim_keys_storage_dir": ["Directory not found."]}, + "prefix": "admin" + }) + settings["admin-dkim_keys_storage_dir"] = self.workdir + response = self.client.post(url, settings, format="json") + self.assertEqual(response.status_code, 200) + def test_dkim_key_creation(self): """Test DKIM key creation.""" values = { @@ -395,3 +413,9 @@ class DKIMTestCase(ModoTestCase): call_command("modo", "manage_dkim_keys") key_path = os.path.join(self.workdir, "{}.pem".format(values["name"])) self.assertTrue(os.path.exists(key_path)) + + domain = Domain.objects.get(name=values["name"]) + url = reverse("admin:domain_detail", args=[domain.pk]) + response = self.client.get(url) + self.assertContains( + response, escape(domain.bind_format_dkim_public_key)) diff --git a/modoboa/core/tests/test_views.py b/modoboa/core/tests/test_views.py index 7e06ad910..c9d5a004a 100644 --- a/modoboa/core/tests/test_views.py +++ b/modoboa/core/tests/test_views.py @@ -15,6 +15,63 @@ from .. import factories from .. import models from .. import signals +SETTINGS_SAMPLE = { + "core-check_new_versions": "True", + "core-log_maximum_age": "365", + "core-ldap_auth_method": "searchbind", + "limits-deflt_domain_mailbox_aliases_limit": "0", + "core-send_statistics": "True", + "core-default_top_redirection": "user", + "core-sender_address": "noreply@modoboa.org", + "admin-auto_account_removal": "False", + "core-ldap_server_port": "389", + "core-rounds_number": "70000", + "core-ldap_bind_password": "", + "limits-deflt_domain_domain_aliases_limit": "0", + "core-secret_key": ":?j3]QPWo!.'_c4n", + "limits-deflt_domain_domain_admins_limit": "0", + "limits-enable_admin_limits": "True", + "core-ldap_bind_dn": "", + "core-enable_api_communication": "True", + "limits-deflt_user_domain_admins_limit": "0", + "limits-enable_domain_limits": "False", + "csrfmiddlewaretoken": "SGgMVZsA4TPqoiV786TMST6xgOlhAf4F", + "limits-deflt_user_mailboxes_limit": "0", + "core-password_scheme": "sha512crypt", + "core-items_per_page": "30", + "limits-deflt_user_mailbox_aliases_limit": "0", + "limits-deflt_domain_mailboxes_limit": "0", + "core-ldap_is_active_directory": "False", + "core-ldap_group_type": "posixgroup", + "limits-deflt_user_domain_aliases_limit": "0", + "core-top_notifications_check_interval": "30", + "core-ldap_password_attribute": "userPassword", + "admin-auto_create_domain_and_mailbox": "True", + "admin-enable_dnsbl_checks": "True", + "admin-default_domain_quota": "0", + "admin-default_mailbox_quota": "0", + "core-ldap_server_address": "localhost", + "core-authentication_type": "local", + "core-ldap_admin_groups": "", + "core-ldap_groups_search_base": "", + "admin-enable_mx_checks": "True", + "core-ldap_search_base": "", + "admin-valid_mxs": "", + "limits-deflt_user_domains_limit": "0", + "core-ldap_search_filter": "(mail=%(user)s)", + "core-ldap_secured": "none", + "core-ldap_user_dn_template": "", + "core-default_password": "Toto1000", + "limits-deflt_user_quota_limit": "0", + "core-hide_features_widget": "False", + "core-inactive_account_threshold": "30", + "admin-domains_must_have_authorized_mx": False, + "core-random_password_length": "8", + "admin-create_alias_on_mbox_rename": False, + "admin-dkim_keys_storage_dir": "", + "admin-dkim_default_key_length": 1024 +} + def announcement(sender, location, **kwargs): """Simpler handler.""" @@ -106,63 +163,6 @@ class DashboardTestCase(ModoTestCase): class SettingsTestCase(ModoTestCase): """Settings tests.""" - settings_sample = { - "core-check_new_versions": "True", - "core-log_maximum_age": "365", - "core-ldap_auth_method": "searchbind", - "limits-deflt_domain_mailbox_aliases_limit": "0", - "core-send_statistics": "True", - "core-default_top_redirection": "user", - "core-sender_address": "noreply@modoboa.org", - "admin-auto_account_removal": "False", - "core-ldap_server_port": "389", - "core-rounds_number": "70000", - "core-ldap_bind_password": "", - "limits-deflt_domain_domain_aliases_limit": "0", - "core-secret_key": ":?j3]QPWo!.'_c4n", - "limits-deflt_domain_domain_admins_limit": "0", - "limits-enable_admin_limits": "True", - "core-ldap_bind_dn": "", - "core-enable_api_communication": "True", - "limits-deflt_user_domain_admins_limit": "0", - "limits-enable_domain_limits": "False", - "csrfmiddlewaretoken": "SGgMVZsA4TPqoiV786TMST6xgOlhAf4F", - "limits-deflt_user_mailboxes_limit": "0", - "core-password_scheme": "sha512crypt", - "core-items_per_page": "30", - "limits-deflt_user_mailbox_aliases_limit": "0", - "limits-deflt_domain_mailboxes_limit": "0", - "core-ldap_is_active_directory": "False", - "core-ldap_group_type": "posixgroup", - "limits-deflt_user_domain_aliases_limit": "0", - "core-top_notifications_check_interval": "30", - "core-ldap_password_attribute": "userPassword", - "admin-auto_create_domain_and_mailbox": "True", - "admin-enable_dnsbl_checks": "True", - "admin-default_domain_quota": "0", - "admin-default_mailbox_quota": "0", - "core-ldap_server_address": "localhost", - "core-authentication_type": "local", - "core-ldap_admin_groups": "", - "core-ldap_groups_search_base": "", - "admin-enable_mx_checks": "True", - "core-ldap_search_base": "", - "admin-valid_mxs": "", - "limits-deflt_user_domains_limit": "0", - "core-ldap_search_filter": "(mail=%(user)s)", - "core-ldap_secured": "none", - "core-ldap_user_dn_template": "", - "core-default_password": "Toto1000", - "limits-deflt_user_quota_limit": "0", - "core-hide_features_widget": "False", - "core-inactive_account_threshold": "30", - "admin-domains_must_have_authorized_mx": False, - "core-random_password_length": "8", - "admin-create_alias_on_mbox_rename": False, - "admin-dkim_keys_storage_dir": "", - "admin-dkim_default_key_length": 1024 - } - def test_get_settings(self): """Test settings display.""" url = reverse("core:parameters") @@ -173,10 +173,11 @@ class SettingsTestCase(ModoTestCase): def test_save_settings(self): """Test settings save.""" url = reverse("core:parameters") - response = self.client.post(url, self.settings_sample, format="json") + settings = SETTINGS_SAMPLE.copy() + response = self.client.post(url, settings, format="json") self.assertEqual(response.status_code, 200) - self.settings_sample["core-rounds_number"] = "" - response = self.client.post(url, self.settings_sample, format="json") + settings["core-rounds_number"] = "" + response = self.client.post(url, settings, format="json") self.assertEqual(response.status_code, 400) compare(response.json(), { "form_errors": {"rounds_number": ["This field is required."]},