mirror of
https://github.com/jwinterm/modoboa.git
synced 2026-11-12 08:53:56 +01:00
More tests updated
This commit is contained in:
@@ -72,6 +72,24 @@ class DomainAPITestCase(ModoAPITestCase):
|
||||
)
|
||||
self.assertEqual(response.status_code, 403)
|
||||
|
||||
def test_create_utf8(self):
|
||||
"""Test the creation of a domain with non-ASCII characters."""
|
||||
url = reverse("v1:domain-list")
|
||||
values = {
|
||||
"name": "pouét.com",
|
||||
"quota": 1000,
|
||||
"default_mailbox_quota": 100,
|
||||
"type": "domain",
|
||||
}
|
||||
response = self.client.post(url, values, format="json")
|
||||
self.assertEqual(response.status_code, 201)
|
||||
dom = models.Domain.objects.get(name="pouét.com")
|
||||
self.assertEqual(dom.name, "pouét.com")
|
||||
self.assertEqual(dom.quota, 1000)
|
||||
self.assertEqual(dom.default_mailbox_quota, 100)
|
||||
self.assertEqual(dom.enabled, False)
|
||||
self.assertFalse(dom.admins)
|
||||
|
||||
@mock.patch.object(dns.resolver.Resolver, "resolve")
|
||||
@mock.patch("socket.getaddrinfo")
|
||||
def test_create_domain_with_mx_check(self, mock_getaddrinfo, mock_query):
|
||||
|
||||
@@ -71,6 +71,15 @@ class DomainSerializer(v1_serializers.DomainSerializer):
|
||||
many=True, source="domainobjectlimit_set", required=False
|
||||
)
|
||||
|
||||
def validate_enable_dkim(self, value):
|
||||
"""Check prerequisites."""
|
||||
if not value:
|
||||
return value
|
||||
storage_dir = param_tools.get_global_parameter("dkim_keys_storage_dir")
|
||||
if not storage_dir:
|
||||
raise ValidationError(_("DKIM keys storage directory not configured"))
|
||||
return value
|
||||
|
||||
def validate(self, data):
|
||||
result = super().validate(data)
|
||||
dtype = data.get("type", "domain")
|
||||
@@ -205,7 +214,7 @@ class AdminGlobalParametersSerializer(serializers.Serializer):
|
||||
|
||||
# Domain settings
|
||||
enable_mx_checks = serializers.BooleanField(default=True)
|
||||
valid_mxs = serializers.CharField(allow_blank=True)
|
||||
valid_mxs = serializers.CharField(default="", allow_blank=True)
|
||||
domains_must_have_authorized_mx = serializers.BooleanField(default=False)
|
||||
enable_ipv6_mx_checks = serializers.BooleanField(default=True)
|
||||
enable_spf_checks = serializers.BooleanField(default=True)
|
||||
|
||||
@@ -7,7 +7,7 @@ from django.utils.encoding import force_str
|
||||
from rest_framework.authtoken.models import Token
|
||||
|
||||
from modoboa.admin import factories, models, constants
|
||||
from modoboa.core import models as core_models
|
||||
from modoboa.core import factories as core_factories, models as core_models
|
||||
from modoboa.lib.tests import ModoAPITestCase
|
||||
|
||||
|
||||
@@ -98,6 +98,18 @@ class DomainViewSetTestCase(ModoAPITestCase):
|
||||
resp = self.client.post(url)
|
||||
self.assertEqual(resp.status_code, 204)
|
||||
|
||||
def test_delete_auto_account_removal(self):
|
||||
self.set_global_parameter("auto_account_removal", True)
|
||||
dom = models.Domain.objects.get(name="test2.com")
|
||||
url = reverse("v2:domain-delete", args=[dom.pk])
|
||||
response = self.client.post(url, {}, format="json")
|
||||
self.assertEqual(response.status_code, 204)
|
||||
with self.assertRaises(models.Domain.DoesNotExist):
|
||||
dom.refresh_from_db()
|
||||
self.assertFalse(
|
||||
core_models.User.objects.filter(username="admin@test2.com").exists()
|
||||
)
|
||||
|
||||
def test_administrators(self):
|
||||
domain = models.Domain.objects.get(name="test.com")
|
||||
url = reverse("v2:domain-administrators", args=[domain.pk])
|
||||
@@ -169,8 +181,9 @@ class AccountViewSetTestCase(ModoAPITestCase):
|
||||
|
||||
def test_create(self):
|
||||
url = reverse("v2:account-list")
|
||||
username = "toto@test.com"
|
||||
data = {
|
||||
"username": "toto@test.com",
|
||||
"username": username,
|
||||
"role": "SimpleUsers",
|
||||
"mailbox": {"use_domain_quota": True},
|
||||
"password": "Toto12345",
|
||||
@@ -180,6 +193,30 @@ class AccountViewSetTestCase(ModoAPITestCase):
|
||||
resp = self.client.post(url, data, format="json")
|
||||
self.assertEqual(resp.status_code, 201)
|
||||
self.assertTrue(models.Alias.objects.filter(address="alias3@test.com").exists())
|
||||
# Check if self alias has been created
|
||||
self.assertTrue(
|
||||
models.AliasRecipient.objects.select_related("alias")
|
||||
.filter(
|
||||
alias__address=username,
|
||||
address=username,
|
||||
alias__internal=True,
|
||||
)
|
||||
.exists()
|
||||
)
|
||||
|
||||
def test_create_with_existing_alias(self):
|
||||
alias = models.Alias.objects.get(address="alias@test.com")
|
||||
alias.set_recipients(["user@external.com"])
|
||||
values = {
|
||||
"username": "tester@test.com",
|
||||
"role": "SimpleUsers",
|
||||
"mailbox": {"use_domain_quota": True},
|
||||
"is_active": True,
|
||||
"aliases": ["alias@test.com"],
|
||||
}
|
||||
response = self.client.post(reverse("v2:account-list"), values, format="json")
|
||||
self.assertTrue(response.status_code, 201)
|
||||
self.assertTrue(alias.aliasrecipient_set.count() == 2)
|
||||
|
||||
def test_create_admin(self):
|
||||
url = reverse("v2:account-list")
|
||||
@@ -241,12 +278,43 @@ class AccountViewSetTestCase(ModoAPITestCase):
|
||||
self.assertIn("password", resp.json())
|
||||
|
||||
def test_delete(self):
|
||||
account = core_models.User.objects.get(username="user@test.com")
|
||||
username = "user@test.com"
|
||||
account = core_models.User.objects.get(username=username)
|
||||
url = reverse("v2:account-delete", args=[account.pk])
|
||||
resp = self.client.post(url)
|
||||
self.assertEqual(resp.status_code, 204)
|
||||
with self.assertRaises(core_models.User.DoesNotExist):
|
||||
account.refresh_from_db()
|
||||
# Check if self alias has been deleted
|
||||
self.assertFalse(
|
||||
models.AliasRecipient.objects.select_related("alias")
|
||||
.filter(
|
||||
alias__address=username,
|
||||
address=username,
|
||||
alias__internal=True,
|
||||
)
|
||||
.exists()
|
||||
)
|
||||
|
||||
def test_delete_default_superadmin(self):
|
||||
"""Delete default superadmin."""
|
||||
sadmin2 = core_factories.UserFactory(username="admin2", is_superuser=True)
|
||||
sadmin = core_models.User.objects.get(username="admin")
|
||||
self.authenticate_user(sadmin2)
|
||||
response = self.client.post(reverse("v2:account-delete", args=[sadmin.pk]), {})
|
||||
self.assertEqual(response.status_code, 204)
|
||||
values = {
|
||||
"username": "user@test.com",
|
||||
"role": "DomainAdmins",
|
||||
"is_active": True,
|
||||
"language": "en",
|
||||
"mailbox": {"use_domain_quota": True},
|
||||
}
|
||||
account = core_models.User.objects.get(username="user@test.com")
|
||||
response = self.client.put(
|
||||
reverse("v2:account-detail", args=[account.pk]), values, format="json"
|
||||
)
|
||||
self.assertEqual(response.status_code, 200)
|
||||
|
||||
def test_update(self):
|
||||
account = core_models.User.objects.get(username="user@test.com")
|
||||
@@ -261,6 +329,30 @@ class AccountViewSetTestCase(ModoAPITestCase):
|
||||
resp = self.client.patch(url, data, format="json")
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
|
||||
def test_rename(self):
|
||||
account = core_models.User.objects.get(username="user@test.com")
|
||||
url = reverse("v2:account-detail", args=[account.pk])
|
||||
new_username = "user_updated@test.com"
|
||||
data = {
|
||||
"username": new_username,
|
||||
"role": "SimpleUsers",
|
||||
"password": "Toto12345",
|
||||
"mailbox": {"quota": 10},
|
||||
"aliases": ["aliasupdate1@test.com"],
|
||||
}
|
||||
response = self.client.put(url, data, format="json")
|
||||
self.assertEqual(response.status_code, 200)
|
||||
# Check if self alias has been updated
|
||||
self.assertTrue(
|
||||
models.AliasRecipient.objects.select_related("alias")
|
||||
.filter(
|
||||
alias__address=new_username,
|
||||
address=new_username,
|
||||
alias__internal=True,
|
||||
)
|
||||
.exists()
|
||||
)
|
||||
|
||||
def test_mailbox_options_update(self):
|
||||
account = core_models.User.objects.get(username="user@test.com")
|
||||
url = reverse("v2:account-detail", args=[account.pk])
|
||||
@@ -408,6 +500,49 @@ class AccountViewSetTestCase(ModoAPITestCase):
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
self.assertEqual(len(resp.json()["resources"]), 2)
|
||||
|
||||
def _set_quota(self, email, value, expected_status=200):
|
||||
account = core_models.User.objects.get(username=email)
|
||||
values = {
|
||||
"username": email,
|
||||
"role": "SimpleUsers",
|
||||
"mailbox": {"use_domain_quota": False, "quota": value},
|
||||
"is_active": True,
|
||||
"language": "en",
|
||||
}
|
||||
response = self.client.put(
|
||||
reverse("v2:account-detail", args=[account.id]), values, format="json"
|
||||
)
|
||||
self.assertEqual(response.status_code, expected_status)
|
||||
|
||||
def test_set_nul_quota_as_superadmin(self):
|
||||
self._set_quota("user@test.com", 0)
|
||||
|
||||
def test_set_nul_quota_as_domainadmin(self):
|
||||
"""Check cases where a domain admin set unlimited quota."""
|
||||
dadmin = core_models.User.objects.get(username="admin@test.com")
|
||||
self.authenticate_user(dadmin)
|
||||
# Fails because domain has a quota
|
||||
self._set_quota("user@test.com", 0, 400)
|
||||
|
||||
dadmin = core_models.User.objects.get(username="admin@test2.com")
|
||||
self.authenticate_user(dadmin)
|
||||
# Ok because domain has no quota
|
||||
self._set_quota("user@test2.com", 0)
|
||||
|
||||
def test_domain_quota(self):
|
||||
"""Check domain quota."""
|
||||
dom = models.Domain.objects.get(name="test.com")
|
||||
dom.quota = 100
|
||||
dom.save(update_fields=["quota"])
|
||||
# 2 x 10MB
|
||||
self.assertEqual(dom.allocated_quota, 20)
|
||||
self._set_quota("user@test.com", 80)
|
||||
del dom.allocated_quota
|
||||
# 10 + 80 < 100 => ok
|
||||
self.assertEqual(dom.allocated_quota, 90)
|
||||
# 30 + 80 > 100 => failure
|
||||
self._set_quota("admin@test.com", 30, 400)
|
||||
|
||||
|
||||
class IdentityViewSetTestCase(ModoAPITestCase):
|
||||
@classmethod
|
||||
@@ -525,6 +660,20 @@ class AliasViewSetTestCase(ModoAPITestCase):
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
self.assertIn("address", resp.json())
|
||||
|
||||
def test_create_on_existing_account(self):
|
||||
values = {
|
||||
"address": "user@test.com",
|
||||
"recipients": ["ext@doman.test"],
|
||||
"enabled": True,
|
||||
}
|
||||
response = self.client.post(reverse("v2:alias-list"), values, format="json")
|
||||
self.assertEqual(response.status_code, 201)
|
||||
# Check that internal alias has not been updated
|
||||
alias = models.Alias.objects.get(address="user@test.com", internal=True)
|
||||
self.assertTrue(alias.aliasrecipient_set.count() == 1)
|
||||
alias = models.Alias.objects.get(address="user@test.com", internal=False)
|
||||
self.assertTrue(alias.aliasrecipient_set.count() == 1)
|
||||
|
||||
|
||||
class UserAccountViewSetTestCase(ModoAPITestCase):
|
||||
@classmethod
|
||||
|
||||
Reference in New Issue
Block a user