mirror of
https://github.com/jwinterm/modoboa.git
synced 2026-10-19 05:58:34 +02:00
- B007 Loop control variable not used within the loop body. If this is intended, start the name with an underscore.
* modoboa/admin/lib.py
* modoboa/admin/templatetags/admin_tags.py
* modoboa/admin/tests/test_account.py
* modoboa/admin/views/domain.py
* modoboa/admin/views/identity.py
* modoboa/core/views/dashboard.py
* modoboa/limits/forms.py
* modoboa/limits/handlers.py
* modoboa/limits/tests/test_api.py
* modoboa/limits/tests/test_domain_limits.py
* modoboa/limits/tests/test_import.py
* modoboa/limits/tests/test_user_limits.py
* modoboa/limits/utils.py
* modoboa/parameters/tools.py
* modoboa/relaydomains/tests.py
- C402 Unnecessary generator - rewrite as a dict comprehension.
* modoboa/admin/models/domain.py
* modoboa/admin/views/domain.py
* modoboa/admin/views/identity.py
* modoboa/limits/searializers.py
- C407 Unnecessary list comprehension - can take a generator.
* modoboa/core/password_validation.py
* modoboa/parameters/tools.py
* modoboa/transport/backends.py
- C408 Unnecessary dict call - rewrite as a literal.
* modoboa/admin/tests/test_account.py
* modoboa/admin/tests/test_alias.py
* modoboa/admin/tests/test_password_schemes.py
* modoboa/admin/views/domain.py
* modoboa/admin/views/identity.py
* modoboa/core/extensions.py
* modoboa/lib/middleware.py
* modoboa/lib/templatetags/form_tags.py
* modoboa/lib/templatetags/lib_tags.py
* modoboa/lib/web_utils.py
* modoboa/limits/handlers.py
* modoboa/limits/tests/test_user_limits.py
- E741 ambiguous variable name
* modoboa/core/management/commands/cleanlogs.py
* modoboa/limits/forms.py
* modoboa/limits/tests/test_user_limits.py
* modoboa/limits/utils.py
* modoboa/relaydomains/tests.py
- F401 imported but unused
* doc/conf.py
* modoboa/admin/views/domain.py
* modoboa/core/app_settings.py
* modoboa/core/management/commands/load_initial_data.py
- F821 undefined name 'raw_input'
* modoboa/core/commands/deploy.py
- F841 local variable 'test' is assigned to but never used
* modoboa/core/app_settings.py
- N802 function name 'setUpTestData' should be lowercase xxx
* modoboa/lib/email_utils.py - __ for name mangeling, _ for internal
- N805 first argument of a method should be named 'self'
* modoboa/lib/connections.py
* modoboa/lib/singleton.py
Ignore the following
- A001 "copyright" is a python builtin and is being shadowed, consider renaming the variable
* doc/conf.py
- A003 is a python builtin, consider renaming the class attribute
* modoboa/admin/factories.py
* modoboa/admin/forms/domain.py
* modoboa/admin/management/commands/handle_mailbox_operations.py
* modoboa/admin/management/commands/modo.py
* modoboa/admin/management/commands/subcommands/_repair.py
* modoboa/admin/models/domain.py
* modoboa/admin/models/mailbox.py
* modoboa/core/commands/__init__.py
* modoboa/core/commands/deploy.py
* modoboa/core/commands/help.py
* modoboa/core/management/commands/clean_inactive_accounts.py
* modoboa/core/management/commands/cleanlogs.py
* modoboa/core/management/commands/communicate_with_public_api.py
* modoboa/core/management/commands/generate_postfix_maps.py
* modoboa/core/management/commands/load_initial_data.py
* modoboa/core/management/commands/set_default_site.py
- F401 imported but unused
* modoboa/admin/apps.py - used to load handlers
* modoboa/core/password_hashers/__init__.py - dynamically loaded
* modoboa/limits/apps.py - used to load handlers
* modoboa/relaydomains/apps.py - used to load handlers
* modoboa/transport/apps.py - used to load handlers
- N802 function name should be lowercase xxx
* modoboa/admin/tests/test_account.py
* modoboa/admin/tests/test_alias.py
* modoboa/admin/tests/test_domain_alias.py
* modoboa/admin/tests/test_export.py
* modoboa/admin/tests/test_mailbox_operations.py
* modoboa/admin/tests/test_password_schemas.py
* modoboa/admin/tests/test_repair.py
* modoboa/core/tests/test_authentication.py
* modoboa/core/tests/test_core.py
* modoboa/core/tests/test_ldap.py
* modoboa/core/tests/test_views.py
* modoboa/lib/imap_utf7.py
* modoboa/limits/tests/test_api.py
* modoboa/limits/tests/test_domain_limits.py
* modoboa/limits/tests/test_import.py
* modoboa/limits/tests/test_user_limits.py
* modoboa/relaydomains/tests.py
other fixes:
- use isinstance() instead of type() == Class
346 lines
13 KiB
Python
346 lines
13 KiB
Python
# coding: utf-8
|
|
"""Test cases for the limits extension."""
|
|
|
|
from __future__ import unicode_literals
|
|
|
|
from testfixtures import compare
|
|
|
|
from django.urls import reverse
|
|
|
|
from rest_framework.authtoken.models import Token
|
|
|
|
from modoboa.admin.factories import populate_database
|
|
from modoboa.admin.models import Domain
|
|
from modoboa.core import factories as core_factories
|
|
from modoboa.core.models import User
|
|
from modoboa.lib import permissions, tests as lib_tests
|
|
from .. import utils
|
|
|
|
|
|
class APIAdminLimitsTestCase(lib_tests.ModoAPITestCase):
|
|
"""Check that limits are used also by the API."""
|
|
|
|
@classmethod
|
|
def setUpTestData(cls): # NOQA:N802
|
|
"""Create test data."""
|
|
super(APIAdminLimitsTestCase, cls).setUpTestData()
|
|
for name, _definition in utils.get_user_limit_templates():
|
|
cls.localconfig.parameters.set_value(
|
|
"deflt_user_{0}_limit".format(name), 2)
|
|
cls.localconfig.save()
|
|
populate_database()
|
|
cls.user = User.objects.get(username="admin@test.com")
|
|
cls.da_token = Token.objects.create(user=cls.user)
|
|
cls.reseller = core_factories.UserFactory(
|
|
username="reseller", groups=("Resellers", ),
|
|
)
|
|
cls.r_token = Token.objects.create(user=cls.reseller)
|
|
|
|
def test_domadmins_limit(self):
|
|
"""Check domain admins limit."""
|
|
self.client.credentials(
|
|
HTTP_AUTHORIZATION="Token " + self.r_token.key)
|
|
|
|
limit = self.reseller.userobjectlimit_set.get(name="domain_admins")
|
|
url = reverse("api:account-list")
|
|
data = {
|
|
"username": "fromapi@test.com",
|
|
"role": "DomainAdmins",
|
|
"password": "Toto1234",
|
|
}
|
|
response = self.client.post(url, data, format="json")
|
|
self.assertEqual(response.status_code, 201)
|
|
self.assertFalse(limit.is_exceeded())
|
|
|
|
data["username"] = "fromapi2@test.com"
|
|
response = self.client.post(url, data, format="json")
|
|
self.assertEqual(response.status_code, 201)
|
|
self.assertTrue(limit.is_exceeded())
|
|
|
|
data["username"] = "fromapi3@test.com"
|
|
response = self.client.post(url, data, format="json")
|
|
self.assertEqual(response.status_code, 400)
|
|
|
|
user = User.objects.get(username="user@test.com")
|
|
domain = Domain.objects.get(name="test.com")
|
|
domain.add_admin(self.reseller)
|
|
url = reverse("api:account-detail", args=[user.pk])
|
|
data = {
|
|
"username": user.username,
|
|
"role": "DomainAdmins",
|
|
"password": "Toto1234",
|
|
"mailbox": {
|
|
"full_address": user.username,
|
|
"quota": user.mailbox.quota
|
|
}
|
|
}
|
|
response = self.client.put(url, data, format="json")
|
|
self.assertEqual(response.status_code, 400)
|
|
|
|
def test_domains_limit(self):
|
|
"""Check domains limit."""
|
|
self.client.credentials(
|
|
HTTP_AUTHORIZATION="Token " + self.r_token.key)
|
|
limit = self.reseller.userobjectlimit_set.get(name="domains")
|
|
quota = self.reseller.userobjectlimit_set.get(name="quota")
|
|
quota.max_value = 3
|
|
quota.save(update_fields=["max_value"])
|
|
url = reverse("api:domain-list")
|
|
data = {"name": "test3.com", "quota": 1}
|
|
response = self.client.post(url, data, format="json")
|
|
self.assertEqual(response.status_code, 201)
|
|
self.assertFalse(limit.is_exceeded())
|
|
self.assertFalse(quota.is_exceeded())
|
|
|
|
data["name"] = "test4.com"
|
|
response = self.client.post(url, data, format="json")
|
|
self.assertEqual(response.status_code, 201)
|
|
self.assertTrue(limit.is_exceeded())
|
|
self.assertFalse(quota.is_exceeded())
|
|
|
|
data["name"] = "test5.com"
|
|
response = self.client.post(url, data, format="json")
|
|
self.assertEqual(response.status_code, 403)
|
|
self.assertEqual(
|
|
response.content.decode("utf-8"), '"Domains: limit reached"'
|
|
)
|
|
|
|
self.client.delete(
|
|
reverse("api:domain-detail",
|
|
args=[Domain.objects.get(name="test4.com").pk]))
|
|
data["quota"] = 0
|
|
response = self.client.post(url, data, format="json")
|
|
self.assertEqual(response.status_code, 400)
|
|
self.assertEqual(
|
|
response.content.decode(),
|
|
'"You\'re not allowed to define unlimited values"')
|
|
|
|
def test_domain_aliases_limit(self):
|
|
"""Check domain aliases limit."""
|
|
self.client.credentials(
|
|
HTTP_AUTHORIZATION="Token " + self.r_token.key)
|
|
domain = Domain.objects.get(name="test.com")
|
|
domain.add_admin(self.reseller)
|
|
limit = self.reseller.userobjectlimit_set.get(name="domain_aliases")
|
|
url = reverse("api:domain_alias-list")
|
|
data = {"name": "dalias1.com", "target": domain.pk}
|
|
response = self.client.post(url, data, format="json")
|
|
self.assertEqual(response.status_code, 201)
|
|
self.assertFalse(limit.is_exceeded())
|
|
|
|
data["name"] = "dalias2.com"
|
|
response = self.client.post(url, data, format="json")
|
|
self.assertEqual(response.status_code, 201)
|
|
self.assertTrue(limit.is_exceeded())
|
|
|
|
data["username"] = "dalias3.com"
|
|
response = self.client.post(url, data, format="json")
|
|
self.assertEqual(response.status_code, 400)
|
|
|
|
def test_mailboxes_limit(self):
|
|
"""Check mailboxes limit."""
|
|
self.client.credentials(
|
|
HTTP_AUTHORIZATION="Token " + self.da_token.key)
|
|
|
|
limit = self.user.userobjectlimit_set.get(name="mailboxes")
|
|
url = reverse("api:account-list")
|
|
data = {
|
|
"username": "fromapi@test.com",
|
|
"role": "SimpleUsers",
|
|
"password": "Toto1234",
|
|
"mailbox": {
|
|
"full_address": "fromapi@test.com",
|
|
"quota": 10
|
|
}
|
|
}
|
|
response = self.client.post(url, data, format="json")
|
|
self.assertEqual(response.status_code, 201)
|
|
self.assertFalse(limit.is_exceeded())
|
|
|
|
data["username"] = "fromapi2@test.com"
|
|
data["mailbox"]["full_address"] = "fromapi2@test.com"
|
|
response = self.client.post(url, data, format="json")
|
|
self.assertEqual(response.status_code, 201)
|
|
self.assertTrue(limit.is_exceeded())
|
|
|
|
data["username"] = "fromapi3@test.com"
|
|
data["mailbox"]["full_address"] = "fromapi3@test.com"
|
|
response = self.client.post(url, data, format="json")
|
|
self.assertEqual(response.status_code, 400)
|
|
|
|
def test_aliases_limit(self):
|
|
"""Check mailbox aliases limit."""
|
|
self.client.credentials(
|
|
HTTP_AUTHORIZATION="Token " + self.da_token.key)
|
|
|
|
limit = self.user.userobjectlimit_set.get(name="mailbox_aliases")
|
|
url = reverse("api:alias-list")
|
|
data = {
|
|
"address": "alias_fromapi@test.com",
|
|
"recipients": [
|
|
"user@test.com", "postmaster@test.com", "user_éé@nonlocal.com"
|
|
]
|
|
}
|
|
response = self.client.post(url, data, format="json")
|
|
self.assertEqual(response.status_code, 201)
|
|
self.assertFalse(limit.is_exceeded())
|
|
|
|
data["address"] = "alias_fromapi2@test.com"
|
|
response = self.client.post(url, data, format="json")
|
|
self.assertEqual(response.status_code, 201)
|
|
self.assertTrue(limit.is_exceeded())
|
|
|
|
data["address"] = "alias_fromapi3@test.com"
|
|
response = self.client.post(url, data, format="json")
|
|
self.assertEqual(response.status_code, 400)
|
|
|
|
|
|
class APIDomainLimitsTestCase(lib_tests.ModoAPITestCase):
|
|
"""Check that limits are used also by the API."""
|
|
|
|
@classmethod
|
|
def setUpTestData(cls): # NOQA:N802
|
|
"""Create test data."""
|
|
super(APIDomainLimitsTestCase, cls).setUpTestData()
|
|
cls.localconfig.parameters.set_value(
|
|
"enable_domain_limits", True)
|
|
for name, _definition in utils.get_domain_limit_templates():
|
|
cls.localconfig.parameters.set_value(
|
|
"deflt_domain_{0}_limit".format(name), 2)
|
|
cls.localconfig.save()
|
|
populate_database()
|
|
|
|
def test_mailboxes_limit(self):
|
|
"""Check mailboxes limit."""
|
|
domain = Domain.objects.get(name="test.com")
|
|
limit = domain.domainobjectlimit_set.get(name="mailboxes")
|
|
self.assertTrue(limit.is_exceeded())
|
|
url = reverse("api:account-list")
|
|
data = {
|
|
"username": "fromapi@test.com",
|
|
"role": "SimpleUsers",
|
|
"password": "Toto1234",
|
|
"mailbox": {
|
|
"full_address": "fromapi@test.com",
|
|
"quota": 10
|
|
}
|
|
}
|
|
response = self.client.post(url, data, format="json")
|
|
self.assertEqual(response.status_code, 400)
|
|
|
|
def test_domain_aliases_limit(self):
|
|
"""Check domain_aliases limit."""
|
|
domain = Domain.objects.get(name="test.com")
|
|
limit = domain.domainobjectlimit_set.get(name="domain_aliases")
|
|
url = reverse("api:domain_alias-list")
|
|
data = {"name": "dalias1.com", "target": domain.pk}
|
|
response = self.client.post(url, data, format="json")
|
|
self.assertEqual(response.status_code, 201)
|
|
data["name"] = "dalias2.com"
|
|
response = self.client.post(url, data, format="json")
|
|
self.assertEqual(response.status_code, 201)
|
|
self.assertTrue(limit.is_exceeded())
|
|
data["name"] = "dalias3.com"
|
|
response = self.client.post(url, data, format="json")
|
|
self.assertEqual(response.status_code, 400)
|
|
|
|
def test_mailbox_aliases_limit(self):
|
|
"""Check mailbox_aliases limit."""
|
|
domain = Domain.objects.get(name="test.com")
|
|
limit = domain.domainobjectlimit_set.get(name="mailbox_aliases")
|
|
self.assertTrue(limit.is_exceeded())
|
|
url = reverse("api:alias-list")
|
|
data = {
|
|
"address": "alias_fromapi@test.com",
|
|
"recipients": [
|
|
"user@test.com", "postmaster@test.com", "user_éé@nonlocal.com"
|
|
]
|
|
}
|
|
response = self.client.post(url, data, format="json")
|
|
self.assertEqual(response.status_code, 400)
|
|
|
|
|
|
class ResourcesAPITestCase(lib_tests.ModoAPITestCase):
|
|
"""Check resources API."""
|
|
|
|
@classmethod
|
|
def setUpTestData(cls): # NOQA:N802
|
|
"""Create test data."""
|
|
super(ResourcesAPITestCase, cls).setUpTestData()
|
|
for name, _definition in utils.get_user_limit_templates():
|
|
cls.localconfig.parameters.set_value(
|
|
"deflt_user_{0}_limit".format(name), 2)
|
|
cls.localconfig.save()
|
|
populate_database()
|
|
cls.user = User.objects.get(username="admin@test.com")
|
|
cls.da_token = Token.objects.create(user=cls.user)
|
|
cls.reseller = core_factories.UserFactory(
|
|
username="reseller", groups=("Resellers", ),
|
|
)
|
|
cls.r_token = Token.objects.create(user=cls.reseller)
|
|
|
|
def test_get_admin_resources(self):
|
|
"""Retrieve admin resources."""
|
|
url = reverse("api:resources-detail", args=[self.user.pk])
|
|
response = self.client.get(url)
|
|
self.assertEqual(response.status_code, 200)
|
|
expected = {
|
|
"quota": 2,
|
|
"mailboxes": 2,
|
|
"domain_admins": 2,
|
|
"domain_aliases": 2,
|
|
"domains": 2,
|
|
"mailbox_aliases": 2
|
|
}
|
|
compare(expected, response.data)
|
|
|
|
# As reseller => fails
|
|
self.client.credentials(
|
|
HTTP_AUTHORIZATION="Token {}".format(self.r_token.key))
|
|
response = self.client.get(url)
|
|
self.assertEqual(response.status_code, 404)
|
|
|
|
# As domain admin => fails
|
|
self.client.credentials(
|
|
HTTP_AUTHORIZATION="Token {}".format(self.da_token.key))
|
|
response = self.client.get(url)
|
|
self.assertEqual(response.status_code, 404)
|
|
|
|
def test_update_resources(self):
|
|
"""Update resources."""
|
|
url = reverse("api:resources-detail", args=[self.reseller.pk])
|
|
response = self.client.get(url)
|
|
resources = response.data
|
|
resources.update({"domains": 1000, "mailboxes": 1000})
|
|
response = self.client.put(url, resources)
|
|
self.assertEqual(response.status_code, 200)
|
|
self.assertEqual(
|
|
self.reseller.userobjectlimit_set.get(name="domains").max_value,
|
|
1000)
|
|
|
|
# As domain admin => fails
|
|
self.client.credentials(
|
|
HTTP_AUTHORIZATION="Token {}".format(self.da_token.key))
|
|
resources.update({"domains": 2, "mailboxes": 2})
|
|
url = reverse("api:resources-detail", args=[self.user.pk])
|
|
response = self.client.put(url, resources)
|
|
self.assertEqual(response.status_code, 404)
|
|
|
|
# As reseller => ok
|
|
permissions.grant_access_to_object(self.reseller, self.user, True)
|
|
self.client.credentials(
|
|
HTTP_AUTHORIZATION="Token {}".format(self.r_token.key))
|
|
resources.update({"domains": 500, "mailboxes": 500})
|
|
url = reverse("api:resources-detail", args=[self.user.pk])
|
|
response = self.client.put(url, resources)
|
|
self.assertEqual(response.status_code, 200)
|
|
self.assertEqual(
|
|
self.user.userobjectlimit_set.get(name="domains").max_value,
|
|
500)
|
|
self.assertEqual(
|
|
self.reseller.userobjectlimit_set.get(name="domains").max_value,
|
|
502)
|
|
resources.update({"domains": 1003})
|
|
response = self.client.put(url, resources)
|
|
self.assertEqual(response.status_code, 424)
|