From 0252bccf2f1093b1a27ff805348016e6dac76584 Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Sun, 26 Mar 2017 18:17:36 +0200 Subject: [PATCH 1/4] Include plugins API urls if available. see #1084 --- modoboa/admin/tests/test_api.py | 70 ++++++++++++++++---------------- modoboa/core/extensions.py | 42 +++++++++++-------- modoboa/limits/tests/test_api.py | 20 ++++----- modoboa/urls.py | 5 ++- modoboa/urls_api.py | 5 ++- 5 files changed, 76 insertions(+), 66 deletions(-) diff --git a/modoboa/admin/tests/test_api.py b/modoboa/admin/tests/test_api.py index 0d17f9702..8a824b08b 100644 --- a/modoboa/admin/tests/test_api.py +++ b/modoboa/admin/tests/test_api.py @@ -29,20 +29,20 @@ class DomainAPITestCase(ModoAPITestCase): def test_get_domains(self): """Retrieve a list of domains.""" - url = reverse("external_api:domain-list") + url = reverse("api:domain-list") response = self.client.get(url) self.assertEqual(response.status_code, 200) self.assertEqual(len(response.data), 2) domain = response.data[0] url = reverse( - "external_api:domain-detail", args=[domain["pk"]]) + "api:domain-detail", args=[domain["pk"]]) response = self.client.get(url) self.assertEqual(response.status_code, 200) self.assertEqual(response.data["name"], domain["name"]) def test_create_domain(self): """Check domain creation.""" - url = reverse("external_api:domain-list") + url = reverse("api:domain-list") response = self.client.post( url, {"name": "test3.com", "quota": 0, "default_mailbox_quota": 10} ) @@ -71,7 +71,7 @@ class DomainAPITestCase(ModoAPITestCase): models.Mailbox.objects.filter( domain__name="test.com", address="user").update( use_domain_quota=True) - url = reverse("external_api:domain-detail", args=[domain.pk]) + url = reverse("api:domain-detail", args=[domain.pk]) response = self.client.put( url, {"name": "test.com", "default_mailbox_quota": 1000}) self.assertEqual(response.status_code, 200) @@ -91,7 +91,7 @@ class DomainAPITestCase(ModoAPITestCase): def test_delete_domain(self): """Try to delete a domain.""" domain = models.Domain.objects.get(name="test.com") - url = reverse("external_api:domain-detail", args=[domain.pk]) + url = reverse("api:domain-detail", args=[domain.pk]) response = self.client.delete(url) self.assertEqual(response.status_code, 204) self.assertFalse(models.Domain.objects.filter(pk=domain.pk).exists()) @@ -114,30 +114,30 @@ class DomainAliasAPITestCase(ModoAPITestCase): def test_get(self): """Retrieve a list of domain aliases.""" - url = reverse("external_api:domain_alias-list") + url = reverse("api:domain_alias-list") response = self.client.get(url) self.assertEqual(response.status_code, 200) self.assertEqual(len(response.data), 2) url = reverse( - "external_api:domain_alias-detail", args=[response.data[0]["pk"]]) + "api:domain_alias-detail", args=[response.data[0]["pk"]]) response = self.client.get(url) self.assertEqual(response.status_code, 200) self.assertEqual(response.data["name"], "dalias1.com") - url = reverse("external_api:domain_alias-list") + url = reverse("api:domain_alias-list") response = self.client.get("{}?domain=test.com".format(url)) self.assertEqual(response.status_code, 200) self.assertEqual(len(response.data), 1) self.client.credentials( HTTP_AUTHORIZATION='Token ' + self.da_token.key) - response = self.client.get(reverse("external_api:domain_alias-list")) + response = self.client.get(reverse("api:domain_alias-list")) self.assertEqual(response.status_code, 200) self.assertEqual(len(response.data), 0) def test_post(self): """Try to create a new domain alias.""" - url = reverse("external_api:domain_alias-list") + url = reverse("api:domain_alias-list") target = models.Domain.objects.get(name="test.com") data = { "name": "dalias3.com", @@ -160,7 +160,7 @@ class DomainAliasAPITestCase(ModoAPITestCase): def test_put(self): """Try to update a domain alias.""" dalias = models.DomainAlias.objects.get(name="dalias1.com") - url = reverse("external_api:domain_alias-detail", args=[dalias.pk]) + url = reverse("api:domain_alias-detail", args=[dalias.pk]) data = { "name": "dalias3.com", "target": dalias.target.pk } @@ -174,7 +174,7 @@ class DomainAliasAPITestCase(ModoAPITestCase): def test_delete(self): """Try to delete an existing domain alias.""" dalias = models.DomainAlias.objects.get(name="dalias1.com") - url = reverse("external_api:domain_alias-detail", args=[dalias.pk]) + url = reverse("api:domain_alias-detail", args=[dalias.pk]) response = self.client.delete(url) self.assertEqual(response.status_code, 204) self.assertFalse( @@ -212,7 +212,7 @@ class AccountAPITestCase(ModoAPITestCase): def test_get_accounts(self): """Retrieve a list of accounts.""" - url = reverse("external_api:account-list") + url = reverse("api:account-list") response = self.client.get(url) self.assertEqual(response.status_code, 200) response = json.loads(response.content) @@ -230,7 +230,7 @@ class AccountAPITestCase(ModoAPITestCase): def test_create_account(self): """Try to create a new account.""" - url = reverse("external_api:account-list") + url = reverse("api:account-list") response = self.client.post(url, self.ACCOUNT_DATA, format="json") self.assertEqual(response.status_code, 201) @@ -244,7 +244,7 @@ class AccountAPITestCase(ModoAPITestCase): data = copy.deepcopy(self.ACCOUNT_DATA) data["username"] = "fromapi_ééé@test.com" data["mailbox"]["full_address"] = data["username"] - url = reverse("external_api:account-list") + url = reverse("api:account-list") response = self.client.post(url, data, format="json") self.assertEqual(response.status_code, 201) @@ -253,7 +253,7 @@ class AccountAPITestCase(ModoAPITestCase): data = copy.deepcopy(self.ACCOUNT_DATA) data["domains"] = ["test.com"] data["role"] = "DomainAdmins" - url = reverse("external_api:account-list") + url = reverse("api:account-list") response = self.client.post(url, data, format="json") self.assertEqual(response.status_code, 201) domain = admin_models.Domain.objects.get(name="test.com") @@ -270,7 +270,7 @@ class AccountAPITestCase(ModoAPITestCase): """Try to create a new account.""" data = copy.deepcopy(self.ACCOUNT_DATA) del data["mailbox"] - url = reverse("external_api:account-list") + url = reverse("api:account-list") response = self.client.post(url, data, format="json") self.assertEqual(response.status_code, 201) account = json.loads(response.content) @@ -284,7 +284,7 @@ class AccountAPITestCase(ModoAPITestCase): """Check if unicity is respected.""" data = copy.deepcopy(self.ACCOUNT_DATA) data["username"] = "user@test.com" - url = reverse("external_api:account-list") + url = reverse("api:account-list") response = self.client.post(url, data, format="json") self.assertEqual(response.status_code, 400) @@ -297,7 +297,7 @@ class AccountAPITestCase(ModoAPITestCase): """Try to create a new account.""" data = copy.deepcopy(self.ACCOUNT_DATA) data["password"] = "toto" - url = reverse("external_api:account-list") + url = reverse("api:account-list") response = self.client.post(url, data, format="json") self.assertEqual(response.status_code, 400) errors = json.loads(response.content) @@ -309,13 +309,13 @@ class AccountAPITestCase(ModoAPITestCase): HTTP_AUTHORIZATION='Token ' + self.da_token.key) data = copy.deepcopy(self.ACCOUNT_DATA) data["mailbox"]["quota"] = 1000 - url = reverse("external_api:account-list") + url = reverse("api:account-list") response = self.client.post(url, data, format="json") self.assertEqual(response.status_code, 400) data["username"] = "fromapi@test2.com" data["mailbox"].update({"full_address": "fromapi@test2.com", "quota": 10}) - url = reverse("external_api:account-list") + url = reverse("api:account-list") response = self.client.post(url, data, format="json") self.assertEqual(response.status_code, 400) errors = json.loads(response.content) @@ -325,7 +325,7 @@ class AccountAPITestCase(ModoAPITestCase): """Try to create a new account.""" data = copy.deepcopy(self.ACCOUNT_DATA) data["master_user"] = True - url = reverse("external_api:account-list") + url = reverse("api:account-list") response = self.client.post(url, data, format="json") self.assertEqual(response.status_code, 400) errors = json.loads(response.content) @@ -334,7 +334,7 @@ class AccountAPITestCase(ModoAPITestCase): def test_update_account(self): """Try to update an account.""" account = core_models.User.objects.get(username="user@test.com") - url = reverse("external_api:account-detail", args=[account.pk]) + url = reverse("api:account-detail", args=[account.pk]) data = { "username": "fromapi@test.com", "role": account.role, @@ -359,7 +359,7 @@ class AccountAPITestCase(ModoAPITestCase): def test_patch_account(self): """Try to patch an account.""" account = core_models.User.objects.get(username="user@test.com") - url = reverse("external_api:account-detail", args=[account.pk]) + url = reverse("api:account-detail", args=[account.pk]) data = { "username": "fromapi@test.com", "mailbox": { @@ -372,7 +372,7 @@ class AccountAPITestCase(ModoAPITestCase): def test_update_domain_admin_account(self): """Try to change administered domains.""" account = core_models.User.objects.get(username="admin@test.com") - url = reverse("external_api:account-detail", args=[account.pk]) + url = reverse("api:account-detail", args=[account.pk]) data = { "username": account.username, "role": account.role, @@ -399,7 +399,7 @@ class AccountAPITestCase(ModoAPITestCase): def test_update_account_wrong_address(self): """Try to update an account.""" account = core_models.User.objects.get(username="user@test.com") - url = reverse("external_api:account-detail", args=[account.pk]) + url = reverse("api:account-detail", args=[account.pk]) data = { "username": "fromapi@test3.com", "role": account.role, @@ -417,7 +417,7 @@ class AccountAPITestCase(ModoAPITestCase): account = core_models.User.objects.get(username="user@test.com") domadmin = core_models.User.objects.get(username="admin@test.com") self.assertTrue(domadmin.can_access(account)) - url = reverse("external_api:account-detail", args=[account.pk]) + url = reverse("api:account-detail", args=[account.pk]) response = self.client.delete(url) self.assertEqual(response.status_code, 204) self.assertFalse( @@ -426,7 +426,7 @@ class AccountAPITestCase(ModoAPITestCase): def test_account_exists(self): """Validate /exists/ service.""" - url = reverse("external_api:account-exists") + url = reverse("api:account-exists") response = self.client.get( "{}?email={}".format(url, "user@test.com")) self.assertEqual(response.status_code, 200) @@ -444,7 +444,7 @@ class AccountAPITestCase(ModoAPITestCase): """Check the change password service.""" account = core_models.User.objects.get(username="user@test.com") url = reverse( - "external_api:account-password", args=[account.pk]) + "api:account-password", args=[account.pk]) response = self.client.put( url, {"password": "toto", "new_password": "pass"}, format="json") @@ -482,7 +482,7 @@ class AliasAPITestCase(ModoAPITestCase): def test_get_aliases(self): """Retrieve a list of aliases.""" - url = reverse("external_api:alias-list") + url = reverse("api:alias-list") response = self.client.get(url) self.assertEqual(response.status_code, 200) response = json.loads(response.content) @@ -496,7 +496,7 @@ class AliasAPITestCase(ModoAPITestCase): def test_get_alias(self): """Retrieve an alias.""" al = models.Alias.objects.get(address="alias@test.com") - url = reverse("external_api:alias-detail", args=[al.pk]) + url = reverse("api:alias-detail", args=[al.pk]) response = self.client.get(url) self.assertEqual(response.status_code, 200) response = json.loads(response.content) @@ -504,7 +504,7 @@ class AliasAPITestCase(ModoAPITestCase): def test_create_alias(self): """Try to create a new alias.""" - url = reverse("external_api:alias-list") + url = reverse("api:alias-list") response = self.client.post(url, self.ALIAS_DATA, format="json") self.assertEqual(response.status_code, 201) @@ -531,7 +531,7 @@ class AliasAPITestCase(ModoAPITestCase): """As DomainAdmin, try to create a new alias.""" self.client.credentials( HTTP_AUTHORIZATION='Token ' + self.da_token.key) - url = reverse("external_api:alias-list") + url = reverse("api:alias-list") response = self.client.post(url, self.ALIAS_DATA, format="json") self.assertEqual(response.status_code, 201) @@ -545,7 +545,7 @@ class AliasAPITestCase(ModoAPITestCase): def test_update_alias(self): """Try to update an alias.""" alias = models.Alias.objects.get(address="alias@test.com") - url = reverse("external_api:alias-detail", args=[alias.pk]) + url = reverse("api:alias-detail", args=[alias.pk]) data = { "address": "alias@test.com", "recipients": ["user@test.com", "user@nonlocal.com"] @@ -576,7 +576,7 @@ class AliasAPITestCase(ModoAPITestCase): alias = models.Alias.objects.get(address="alias@test.com") domadmin = core_models.User.objects.get(username="admin@test.com") self.assertTrue(domadmin.can_access(alias)) - url = reverse("external_api:alias-detail", args=[alias.pk]) + url = reverse("api:alias-detail", args=[alias.pk]) response = self.client.delete(url) self.assertEqual(response.status_code, 204) self.assertFalse( diff --git a/modoboa/core/extensions.py b/modoboa/core/extensions.py index e7e552a04..b1a401317 100644 --- a/modoboa/core/extensions.py +++ b/modoboa/core/extensions.py @@ -74,21 +74,8 @@ class ExtensionsPool(object): extinstance = self.get_extension(name) if extinstance is None: return None - result = None - try: - baseurl = ( - extinstance.url if extinstance.url is not None - else name - ) - result = ( - url(r'^%s/' % (baseurl), - include("{0}.urls".format(name), namespace=name)) - ) - except ImportError: - # No urls for this extension - pass extinstance.load() - return result + return extinstance def load_all(self): """Load all defined extensions. @@ -101,11 +88,30 @@ class ExtensionsPool(object): :return: a list of url maps """ - result = [] for ext in settings.MODOBOA_APPS: - ext_urls = self.load_extension(ext) - if ext_urls is not None: - result += [ext_urls] + self.load_extension(ext) + + def get_urls(self, category="app"): + """Get all extensions defined urls.""" + result = [] + for ext_name in self.extensions.keys(): + ext = self.get_extension(ext_name) + options = {} + if category == "api": + root = "" + pattern = "{}.urls_api" + else: + baseurl = getattr(ext, "url", ext_name) + root = r"^{}/".format(baseurl) + options.update({"namespace": ext_name}) + pattern = "{}.urls" + try: + result.append( + url(root, include(pattern.format(ext_name), **options)) + ) + except ImportError: + # No urls for this extension + pass return result def list_all(self): diff --git a/modoboa/limits/tests/test_api.py b/modoboa/limits/tests/test_api.py index 58bb15454..ec2fb6d2c 100644 --- a/modoboa/limits/tests/test_api.py +++ b/modoboa/limits/tests/test_api.py @@ -39,7 +39,7 @@ class APIAdminLimitsTestCase(lib_tests.ModoAPITestCase): HTTP_AUTHORIZATION='Token ' + self.r_token.key) limit = self.reseller.userobjectlimit_set.get(name="domain_admins") - url = reverse("external_api:account-list") + url = reverse("api:account-list") data = { "username": "fromapi@test.com", "role": "DomainAdmins", @@ -61,7 +61,7 @@ class APIAdminLimitsTestCase(lib_tests.ModoAPITestCase): user = User.objects.get(username="user@test.com") domain = Domain.objects.get(name="test.com") domain.add_admin(self.reseller) - url = reverse("external_api:account-detail", args=[user.pk]) + url = reverse("api:account-detail", args=[user.pk]) data = { "username": user.username, "role": "DomainAdmins", @@ -82,7 +82,7 @@ class APIAdminLimitsTestCase(lib_tests.ModoAPITestCase): quota = self.reseller.userobjectlimit_set.get(name="quota") quota.max_value = 3 quota.save(update_fields=["max_value"]) - url = reverse("external_api:domain-list") + 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) @@ -101,7 +101,7 @@ class APIAdminLimitsTestCase(lib_tests.ModoAPITestCase): self.assertEqual(response.content, '"Domains: limit reached"') self.client.delete( - reverse("external_api:domain-detail", + reverse("api:domain-detail", args=[Domain.objects.get(name="test4.com").pk])) data["quota"] = 0 response = self.client.post(url, data, format="json") @@ -117,7 +117,7 @@ class APIAdminLimitsTestCase(lib_tests.ModoAPITestCase): domain = Domain.objects.get(name="test.com") domain.add_admin(self.reseller) limit = self.reseller.userobjectlimit_set.get(name="domain_aliases") - url = reverse("external_api:domain_alias-list") + 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) @@ -138,7 +138,7 @@ class APIAdminLimitsTestCase(lib_tests.ModoAPITestCase): HTTP_AUTHORIZATION='Token ' + self.da_token.key) limit = self.user.userobjectlimit_set.get(name="mailboxes") - url = reverse("external_api:account-list") + url = reverse("api:account-list") data = { "username": "fromapi@test.com", "role": "SimpleUsers", @@ -169,7 +169,7 @@ class APIAdminLimitsTestCase(lib_tests.ModoAPITestCase): HTTP_AUTHORIZATION='Token ' + self.da_token.key) limit = self.user.userobjectlimit_set.get(name="mailbox_aliases") - url = reverse("external_api:alias-list") + url = reverse("api:alias-list") data = { "address": "alias_fromapi@test.com", "recipients": [ @@ -210,7 +210,7 @@ class APIDomainLimitsTestCase(lib_tests.ModoAPITestCase): domain = Domain.objects.get(name="test.com") limit = domain.domainobjectlimit_set.get(name="mailboxes") self.assertTrue(limit.is_exceeded()) - url = reverse("external_api:account-list") + url = reverse("api:account-list") data = { "username": "fromapi@test.com", "role": "SimpleUsers", @@ -227,7 +227,7 @@ class APIDomainLimitsTestCase(lib_tests.ModoAPITestCase): """Check domain_aliases limit.""" domain = Domain.objects.get(name="test.com") limit = domain.domainobjectlimit_set.get(name="domain_aliases") - url = reverse("external_api:domain_alias-list") + 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) @@ -244,7 +244,7 @@ class APIDomainLimitsTestCase(lib_tests.ModoAPITestCase): domain = Domain.objects.get(name="test.com") limit = domain.domainobjectlimit_set.get(name="mailbox_aliases") self.assertTrue(limit.is_exceeded()) - url = reverse("external_api:alias-list") + url = reverse("api:alias-list") data = { "address": "alias_fromapi@test.com", "recipients": [ diff --git a/modoboa/urls.py b/modoboa/urls.py index 4e5686dba..2db45e2e1 100644 --- a/modoboa/urls.py +++ b/modoboa/urls.py @@ -26,7 +26,8 @@ urlpatterns = [ include('modoboa.relaydomains.urls', namespace="relaydomains")), ] -urlpatterns += exts_pool.load_all() +exts_pool.load_all() +urlpatterns += exts_pool.get_urls() extra_routes = core_signals.extra_uprefs_routes.send(sender="urls") if extra_routes: @@ -37,7 +38,7 @@ if extra_routes: # API urls urlpatterns += [ url("^docs/api/", include_docs_urls(title=API_TITLE)), - url("^api/v1/", include("modoboa.urls_api", namespace="external_api")), + url("^api/v1/", include("modoboa.urls_api", namespace="api")), ] if settings.DEBUG: diff --git a/modoboa/urls_api.py b/modoboa/urls_api.py index 54c3e5bfd..8261317b3 100644 --- a/modoboa/urls_api.py +++ b/modoboa/urls_api.py @@ -2,7 +2,10 @@ from django.conf.urls import include, url +from modoboa.core.extensions import exts_pool + urlpatterns = [ - url("", include("modoboa.admin.urls_api")), + url("", include("modoboa.admin.urls_api")) ] +urlpatterns += exts_pool.get_urls(category="api") From b1f0c3b39a4978dfc4855665de9b509b38445ca5 Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Sun, 26 Mar 2017 19:48:10 +0200 Subject: [PATCH 2/4] Increased coverage. see #1084 --- modoboa/core/extensions.py | 13 +++++++++---- modoboa/core/tests/stupid_extension_2/urls.py | 8 +++++++- modoboa/core/tests/test_extensions.py | 14 +++++++++++++- 3 files changed, 29 insertions(+), 6 deletions(-) diff --git a/modoboa/core/extensions.py b/modoboa/core/extensions.py index b1a401317..a49764d5c 100644 --- a/modoboa/core/extensions.py +++ b/modoboa/core/extensions.py @@ -16,16 +16,22 @@ class ModoExtension(object): label = None version = "NA" description = "" - url = None needs_media = False always_active = False + url = None topredirection_url = None + def get_url(self): + """Return extension base url.""" + if self.url is None: + return self.name + return self.url + def infos(self): """Information about this extension.""" return { "name": self.name, "label": self.label, "version": self.version, - "description": self.description, "url": self.url, + "description": self.description, "url": self.get_url(), "topredirection_url": self.topredirection_url, "always_active": self.always_active } @@ -101,8 +107,7 @@ class ExtensionsPool(object): root = "" pattern = "{}.urls_api" else: - baseurl = getattr(ext, "url", ext_name) - root = r"^{}/".format(baseurl) + root = r"^{}/".format(ext.get_url()) options.update({"namespace": ext_name}) pattern = "{}.urls" try: diff --git a/modoboa/core/tests/stupid_extension_2/urls.py b/modoboa/core/tests/stupid_extension_2/urls.py index 552d09822..a7996a92b 100644 --- a/modoboa/core/tests/stupid_extension_2/urls.py +++ b/modoboa/core/tests/stupid_extension_2/urls.py @@ -1,3 +1,9 @@ """Custom urls.""" -urlpatterns = [] +from django.conf.urls import url + +from . import views + +urlpatterns = [ + url("^$", views.test_view, name="index") +] diff --git a/modoboa/core/tests/test_extensions.py b/modoboa/core/tests/test_extensions.py index aa3f57e6b..cd23f3151 100644 --- a/modoboa/core/tests/test_extensions.py +++ b/modoboa/core/tests/test_extensions.py @@ -6,6 +6,7 @@ import sys from testfixtures import compare from django.core import management +from django.core.urlresolvers import reverse from django.test import TestCase, override_settings from .. import extensions @@ -57,7 +58,7 @@ class ExtensionTestCase(TestCase): compare(infos, { "name": "stupid_extension_1", "label": "Stupid extension", "version": "1.0.0", "description": "A stupid extension", - "url": None, "always_active": False, + "url": "stupid_extension_1", "always_active": False, "topredirection_url": None }) @@ -72,3 +73,14 @@ class ExtensionTestCase(TestCase): """Check if method is called.""" with self.assertRaises(RuntimeError): management.call_command("load_initial_data") + + def test_get_urls(self): + """Load extensions urls.""" + urls = self.pool.get_urls() + self.assertEqual(len(urls), 1) + + url = reverse("stupid_extension_2:index") + self.assertEqual(url, "/stupid_extension_2/") + + urls = self.pool.get_urls(category="api") + self.assertEqual(len(urls), 0) From 53bc6a9054e3519eeddb0fca6c4cc7f3ba39bab5 Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Sun, 26 Mar 2017 19:56:16 +0200 Subject: [PATCH 3/4] Added missing file. see #1084 --- modoboa/core/tests/stupid_extension_2/views.py | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 modoboa/core/tests/stupid_extension_2/views.py diff --git a/modoboa/core/tests/stupid_extension_2/views.py b/modoboa/core/tests/stupid_extension_2/views.py new file mode 100644 index 000000000..4a5f6dd70 --- /dev/null +++ b/modoboa/core/tests/stupid_extension_2/views.py @@ -0,0 +1,5 @@ +from django import http + + +def test_view(request): + return http.HttpResponse() From 5ca4e455a85b709ccff216eb17e098a38b9e6350 Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Sun, 26 Mar 2017 20:04:43 +0200 Subject: [PATCH 4/4] Fixed unit test. see #1084 --- modoboa/core/extensions.py | 2 +- modoboa/core/tests/test_extensions.py | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/modoboa/core/extensions.py b/modoboa/core/extensions.py index a49764d5c..4303ff07d 100644 --- a/modoboa/core/extensions.py +++ b/modoboa/core/extensions.py @@ -98,7 +98,7 @@ class ExtensionsPool(object): self.load_extension(ext) def get_urls(self, category="app"): - """Get all extensions defined urls.""" + """Get all urls defined by extensions.""" result = [] for ext_name in self.extensions.keys(): ext = self.get_extension(ext_name) diff --git a/modoboa/core/tests/test_extensions.py b/modoboa/core/tests/test_extensions.py index cd23f3151..d220f3318 100644 --- a/modoboa/core/tests/test_extensions.py +++ b/modoboa/core/tests/test_extensions.py @@ -79,8 +79,5 @@ class ExtensionTestCase(TestCase): urls = self.pool.get_urls() self.assertEqual(len(urls), 1) - url = reverse("stupid_extension_2:index") - self.assertEqual(url, "/stupid_extension_2/") - urls = self.pool.get_urls(category="api") self.assertEqual(len(urls), 0)