From 12139ddfe660c289c7e5c754bdaa781d1e94d987 Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Wed, 20 Apr 2016 14:31:56 +0200 Subject: [PATCH] Unit tests added. see #799 --- modoboa/admin/forms/alias.py | 2 +- modoboa/limits/constants.py | 4 +- modoboa/limits/models.py | 8 +++- modoboa/limits/tests.py | 74 +++++++++++++++++++++++++++++++++++- 4 files changed, 82 insertions(+), 6 deletions(-) diff --git a/modoboa/admin/forms/alias.py b/modoboa/admin/forms/alias.py index f18063c58..1f12b6bc4 100644 --- a/modoboa/admin/forms/alias.py +++ b/modoboa/admin/forms/alias.py @@ -76,7 +76,7 @@ class AliasForm(forms.ModelForm, DynamicForm): raise forms.ValidationError( _("You don't have access to this domain") ) - if self.instance.pk: + if not self.instance.pk: try: core_signals.can_create_object.send( sender=self.__class__, context=domain, diff --git a/modoboa/limits/constants.py b/modoboa/limits/constants.py index 16a074c1b..4150911df 100644 --- a/modoboa/limits/constants.py +++ b/modoboa/limits/constants.py @@ -40,6 +40,8 @@ DEFAULT_DOMAIN_LIMITS = collections.OrderedDict(( "help": _("Maximum number of mailboxes allowed for this domain.")}), ("mailbox_aliases", { "relation": "alias_set", "label": _("Mailbox aliases"), - "help": _("Maximum number of mailbox aliases allowed for this domain.") + "help": _( + "Maximum number of mailbox aliases allowed for this domain."), + "extra_filters": {"internal": False} }) )) diff --git a/modoboa/limits/models.py b/modoboa/limits/models.py index 3a3d3dba0..aca757b42 100644 --- a/modoboa/limits/models.py +++ b/modoboa/limits/models.py @@ -120,6 +120,10 @@ class DomainObjectLimit(ObjectLimitMixin, models.Model): @property def current_value(self): """Return the current number of objects.""" - if not self.definition: + definition = self.definition + if not definition: raise RuntimeError("Bad limit {}".format(self.name)) - return getattr(self.domain, self.definition["relation"]).count() + relation = getattr(self.domain, definition["relation"]) + if "extra_filters" in definition: + relation = relation.filter(**definition["extra_filters"]) + return relation.count() diff --git a/modoboa/limits/tests.py b/modoboa/limits/tests.py index f3f930137..7c36841e2 100644 --- a/modoboa/limits/tests.py +++ b/modoboa/limits/tests.py @@ -240,7 +240,8 @@ class ResellerTestCase(ResourceTestCase): ) self._check_limit('domain_admins', 2, 2) - self.user.userobjectlimit_set.filter(name="mailboxes").update(max_value=3) + self.user.userobjectlimit_set.filter( + name="mailboxes").update(max_value=3) self._create_account('user1@domain.tld') user = User.objects.get(username='user1@domain.tld') values = { @@ -269,7 +270,8 @@ class ResellerTestCase(ResourceTestCase): ) def test_domain_admins_limit_from_domain_tpl(self): - self.user.userobjectlimit_set.filter(name="domains").update(max_value=3) + self.user.userobjectlimit_set.filter( + name="domains").update(max_value=3) self._create_domain('domain1.tld', withtpl=True) self._create_domain('domain2.tld', withtpl=True) self._check_limit('domain_admins', 2, 2) @@ -455,8 +457,36 @@ class DomainLimitsTestCase(ModoTestCase): domain.domainobjectlimit_set.get( name="domain_aliases").max_value, 3) + def test_domain_aliases_limit(self): + """Try to exceed defined limit.""" + # Import + # API + domain = Domain.objects.get(name="test.com") + limit = domain.domainobjectlimit_set.get(name="domain_aliases") + self.assertFalse(limit.is_exceeded()) + values = { + "name": domain.name, "quota": domain.quota, + "enabled": domain.enabled, "type": "domain", + "mailboxes_limit": 2, "mailbox_aliases_limit": 2, + "domain_aliases_limit": 2, + "aliases": "alias1.com", "aliases_1": "alias2.com" + } + self.ajax_post( + reverse("admin:domain_change", args=[domain.id]), + values + ) + self.assertTrue(limit.is_exceeded()) + values["aliases_2"] = "alias3.com" + self.ajax_post( + reverse("admin:domain_change", args=[domain.id]), + values, 403 + ) + def test_mailboxes_limit(self): """Try to exceed defined limits.""" + # Import + # API + # LDAP ? domain = Domain.objects.get(name="test.com") domain.domainobjectlimit_set.filter(name="mailboxes").update( max_value=3) @@ -475,3 +505,43 @@ class DomainLimitsTestCase(ModoTestCase): username = "titi@test.com" self.ajax_post(reverse("admin:account_add"), values, 400) + + def test_mailbox_aliases_limit(self): + """Try to exceed defined limits.""" + # Import + # API + domain = Domain.objects.get(name="test.com") + user = User.objects.get(username="user@test.com") + limit = domain.domainobjectlimit_set.get(name="mailbox_aliases") + limit.max_value = 4 + limit.save() + self.assertFalse(limit.is_exceeded()) + values = { + "username": user.username, "role": user.group, + "is_active": user.is_active, "email": user.email, + "quota_act": True, + "aliases": "alias@test.com", "aliases_1": "alias1@test.com" + } + self.ajax_post( + reverse("admin:account_change", args=[user.id]), + values + ) + self.assertTrue(limit.is_exceeded()) + + values["aliases_2"] = "alias2@test.com" + self.ajax_post( + reverse("admin:account_change", args=[user.id]), + values, 403 + ) + + limit.max_value = 5 + limit.save() + values = { + "address": "forward2@test.com", "recipients": "user@test.com", + "enabled": True + } + self.ajax_post(reverse("admin:alias_add"), values) + self.assertTrue(limit.is_exceeded()) + + values["address"] = "forward3@test.com" + self.ajax_post(reverse("admin:alias_add"), values, 400)