summaryrefslogtreecommitdiff
path: root/tests/apps
diff options
context:
space:
mode:
authorAymeric Augustin <aymeric.augustin@m4x.org>2020-07-21 10:35:12 +0200
committerGitHub <noreply@github.com>2020-07-21 10:35:12 +0200
commit3f2821af6bc48fa8e7970c1ce27bc54c3172545e (patch)
tree807b209dd7bf77cde680f54a18395672c1cb607f /tests/apps
parent6ec5eb5d74fd18a91256010706ab8b5b583526a9 (diff)
downloaddjango-3f2821af6bc48fa8e7970c1ce27bc54c3172545e.tar.gz
Fixed #31180 -- Configured applications automatically.
Diffstat (limited to 'tests/apps')
-rw-r--r--tests/apps/default_config_app/__init__.py1
-rw-r--r--tests/apps/default_config_app/apps.py5
-rw-r--r--tests/apps/explicit_default_config_app/__init__.py1
-rw-r--r--tests/apps/explicit_default_config_app/apps.py5
-rw-r--r--tests/apps/explicit_default_config_mismatch_app/__init__.py1
-rw-r--r--tests/apps/explicit_default_config_mismatch_app/apps.py5
-rw-r--r--tests/apps/explicit_default_config_mismatch_app/not_apps.py5
-rw-r--r--tests/apps/namespace_package_base/nsapp/apps.py1
-rw-r--r--tests/apps/no_config_app/__init__.py0
-rw-r--r--tests/apps/one_config_app/__init__.py0
-rw-r--r--tests/apps/one_config_app/apps.py5
-rw-r--r--tests/apps/tests.py104
-rw-r--r--tests/apps/two_configs_app/__init__.py0
-rw-r--r--tests/apps/two_configs_app/apps.py9
-rw-r--r--tests/apps/two_configs_one_default_app/__init__.py0
-rw-r--r--tests/apps/two_configs_one_default_app/apps.py10
-rw-r--r--tests/apps/two_default_configs_app/__init__.py0
-rw-r--r--tests/apps/two_default_configs_app/apps.py11
18 files changed, 146 insertions, 17 deletions
diff --git a/tests/apps/default_config_app/__init__.py b/tests/apps/default_config_app/__init__.py
deleted file mode 100644
index aebe0350d9..0000000000
--- a/tests/apps/default_config_app/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-default_app_config = 'apps.default_config_app.apps.CustomConfig'
diff --git a/tests/apps/default_config_app/apps.py b/tests/apps/default_config_app/apps.py
deleted file mode 100644
index ba859a4750..0000000000
--- a/tests/apps/default_config_app/apps.py
+++ /dev/null
@@ -1,5 +0,0 @@
-from django.apps import AppConfig
-
-
-class CustomConfig(AppConfig):
- name = 'apps.default_config_app'
diff --git a/tests/apps/explicit_default_config_app/__init__.py b/tests/apps/explicit_default_config_app/__init__.py
new file mode 100644
index 0000000000..d97f1b3f21
--- /dev/null
+++ b/tests/apps/explicit_default_config_app/__init__.py
@@ -0,0 +1 @@
+default_app_config = 'apps.explicit_default_config_app.apps.ExplicitDefaultConfig'
diff --git a/tests/apps/explicit_default_config_app/apps.py b/tests/apps/explicit_default_config_app/apps.py
new file mode 100644
index 0000000000..e41ad5dcbb
--- /dev/null
+++ b/tests/apps/explicit_default_config_app/apps.py
@@ -0,0 +1,5 @@
+from django.apps import AppConfig
+
+
+class ExplicitDefaultConfig(AppConfig):
+ name = 'apps.explicit_default_config_app'
diff --git a/tests/apps/explicit_default_config_mismatch_app/__init__.py b/tests/apps/explicit_default_config_mismatch_app/__init__.py
new file mode 100644
index 0000000000..8889145538
--- /dev/null
+++ b/tests/apps/explicit_default_config_mismatch_app/__init__.py
@@ -0,0 +1 @@
+default_app_config = 'apps.explicit_default_config_mismatch_app.not_apps.ExplicitDefaultConfigMismatch'
diff --git a/tests/apps/explicit_default_config_mismatch_app/apps.py b/tests/apps/explicit_default_config_mismatch_app/apps.py
new file mode 100644
index 0000000000..ddbead408d
--- /dev/null
+++ b/tests/apps/explicit_default_config_mismatch_app/apps.py
@@ -0,0 +1,5 @@
+from django.apps import AppConfig
+
+
+class ImplicitDefaultConfigMismatch(AppConfig):
+ name = 'apps.explicit_default_config_mismatch_app'
diff --git a/tests/apps/explicit_default_config_mismatch_app/not_apps.py b/tests/apps/explicit_default_config_mismatch_app/not_apps.py
new file mode 100644
index 0000000000..941d35c3d2
--- /dev/null
+++ b/tests/apps/explicit_default_config_mismatch_app/not_apps.py
@@ -0,0 +1,5 @@
+from django.apps import AppConfig
+
+
+class ExplicitDefaultConfigMismatch(AppConfig):
+ name = 'apps.explicit_default_config_mismatch_app'
diff --git a/tests/apps/namespace_package_base/nsapp/apps.py b/tests/apps/namespace_package_base/nsapp/apps.py
index a878449bf9..a81362e5b2 100644
--- a/tests/apps/namespace_package_base/nsapp/apps.py
+++ b/tests/apps/namespace_package_base/nsapp/apps.py
@@ -4,5 +4,6 @@ from django.apps import AppConfig
class NSAppConfig(AppConfig):
+ default = False
name = 'nsapp'
path = os.path.dirname(__file__)
diff --git a/tests/apps/no_config_app/__init__.py b/tests/apps/no_config_app/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/tests/apps/no_config_app/__init__.py
diff --git a/tests/apps/one_config_app/__init__.py b/tests/apps/one_config_app/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/tests/apps/one_config_app/__init__.py
diff --git a/tests/apps/one_config_app/apps.py b/tests/apps/one_config_app/apps.py
new file mode 100644
index 0000000000..8b44796e42
--- /dev/null
+++ b/tests/apps/one_config_app/apps.py
@@ -0,0 +1,5 @@
+from django.apps import AppConfig
+
+
+class OneConfig(AppConfig):
+ name = 'apps.one_config_app'
diff --git a/tests/apps/tests.py b/tests/apps/tests.py
index 566aec60c3..f4b0a8879b 100644
--- a/tests/apps/tests.py
+++ b/tests/apps/tests.py
@@ -5,11 +5,17 @@ from django.apps.registry import Apps
from django.contrib.admin.models import LogEntry
from django.core.exceptions import AppRegistryNotReady, ImproperlyConfigured
from django.db import models
-from django.test import SimpleTestCase, override_settings
+from django.test import SimpleTestCase, ignore_warnings, override_settings
from django.test.utils import extend_sys_path, isolate_apps
+from django.utils.deprecation import RemovedInDjango41Warning
-from .default_config_app.apps import CustomConfig
+from .explicit_default_config_app.apps import ExplicitDefaultConfig
+from .explicit_default_config_mismatch_app.not_apps import (
+ ExplicitDefaultConfigMismatch,
+)
from .models import SoAlternative, TotallyNormal, new_apps
+from .one_config_app.apps import OneConfig
+from .two_configs_one_default_app.apps import TwoConfig
# Small list with a variety of cases for tests that iterate on installed apps.
# Intentionally not in alphabetical order to check if the order is preserved.
@@ -84,25 +90,56 @@ class AppsTests(SimpleTestCase):
pass
def test_no_such_app_config(self):
- msg = "No module named 'apps.NoSuchConfig'"
+ msg = "Module 'apps' does not contain a 'NoSuchConfig' class."
with self.assertRaisesMessage(ImportError, msg):
with self.settings(INSTALLED_APPS=['apps.NoSuchConfig']):
pass
def test_no_such_app_config_with_choices(self):
msg = (
- "'apps.apps' does not contain a class 'NoSuchConfig'. Choices are: "
- "'BadConfig', 'MyAdmin', 'MyAuth', 'NoSuchApp', 'PlainAppsConfig', "
- "'RelabeledAppsConfig'."
+ "Module 'apps.apps' does not contain a 'NoSuchConfig' class. "
+ "Choices are: 'BadConfig', 'MyAdmin', 'MyAuth', 'NoSuchApp', "
+ "'PlainAppsConfig', 'RelabeledAppsConfig'."
)
- with self.assertRaisesMessage(ImproperlyConfigured, msg):
+ with self.assertRaisesMessage(ImportError, msg):
with self.settings(INSTALLED_APPS=['apps.apps.NoSuchConfig']):
pass
- def test_default_app_config(self):
- with self.settings(INSTALLED_APPS=['apps.default_config_app']):
- config = apps.get_app_config('default_config_app')
- self.assertIsInstance(config, CustomConfig)
+ def test_no_config_app(self):
+ """Load an app that doesn't provide an AppConfig class."""
+ with self.settings(INSTALLED_APPS=['apps.no_config_app']):
+ config = apps.get_app_config('no_config_app')
+ self.assertIsInstance(config, AppConfig)
+
+ def test_one_config_app(self):
+ """Load an app that provides an AppConfig class."""
+ with self.settings(INSTALLED_APPS=['apps.one_config_app']):
+ config = apps.get_app_config('one_config_app')
+ self.assertIsInstance(config, OneConfig)
+
+ def test_two_configs_app(self):
+ """Load an app that provides two AppConfig classes."""
+ with self.settings(INSTALLED_APPS=['apps.two_configs_app']):
+ config = apps.get_app_config('two_configs_app')
+ self.assertIsInstance(config, AppConfig)
+
+ def test_two_default_configs_app(self):
+ """Load an app that provides two default AppConfig classes."""
+ msg = (
+ "'apps.two_default_configs_app.apps' declares more than one "
+ "default AppConfig: 'TwoConfig', 'TwoConfigBis'."
+ )
+ with self.assertRaisesMessage(RuntimeError, msg):
+ with self.settings(INSTALLED_APPS=['apps.two_default_configs_app']):
+ pass
+
+ def test_two_configs_one_default_app(self):
+ """
+ Load an app that provides two AppConfig classes, one being the default.
+ """
+ with self.settings(INSTALLED_APPS=['apps.two_configs_one_default_app']):
+ config = apps.get_app_config('two_configs_one_default_app')
+ self.assertIsInstance(config, TwoConfig)
@override_settings(INSTALLED_APPS=SOME_INSTALLED_APPS)
def test_get_app_configs(self):
@@ -438,3 +475,48 @@ class NamespacePackageAppTests(SimpleTestCase):
with self.settings(INSTALLED_APPS=['nsapp.apps.NSAppConfig']):
app_config = apps.get_app_config('nsapp')
self.assertEqual(app_config.path, self.app_path)
+
+
+class DeprecationTests(SimpleTestCase):
+ @ignore_warnings(category=RemovedInDjango41Warning)
+ def test_explicit_default_app_config(self):
+ with self.settings(INSTALLED_APPS=['apps.explicit_default_config_app']):
+ config = apps.get_app_config('explicit_default_config_app')
+ self.assertIsInstance(config, ExplicitDefaultConfig)
+
+ def test_explicit_default_app_config_warning(self):
+ """
+ Load an app that specifies a default AppConfig class matching the
+ autodetected one.
+ """
+ msg = (
+ "'apps.explicit_default_config_app' defines default_app_config = "
+ "'apps.explicit_default_config_app.apps.ExplicitDefaultConfig'. "
+ "Django now detects this configuration automatically. You can "
+ "remove default_app_config."
+ )
+ with self.assertRaisesMessage(RemovedInDjango41Warning, msg):
+ with self.settings(INSTALLED_APPS=['apps.explicit_default_config_app']):
+ config = apps.get_app_config('explicit_default_config_app')
+ self.assertIsInstance(config, ExplicitDefaultConfig)
+
+ def test_explicit_default_app_config_mismatch(self):
+ """
+ Load an app that specifies a default AppConfig class not matching the
+ autodetected one.
+ """
+ msg = (
+ "'apps.explicit_default_config_mismatch_app' defines "
+ "default_app_config = 'apps.explicit_default_config_mismatch_app."
+ "not_apps.ExplicitDefaultConfigMismatch'. However, Django's "
+ "automatic detection picked another configuration, 'apps."
+ "explicit_default_config_mismatch_app.apps."
+ "ImplicitDefaultConfigMismatch'. You should move the default "
+ "config class to the apps submodule of your application and, if "
+ "this module defines several config classes, mark the default one "
+ "with default = True."
+ )
+ with self.assertRaisesMessage(RemovedInDjango41Warning, msg):
+ with self.settings(INSTALLED_APPS=['apps.explicit_default_config_mismatch_app']):
+ config = apps.get_app_config('explicit_default_config_mismatch_app')
+ self.assertIsInstance(config, ExplicitDefaultConfigMismatch)
diff --git a/tests/apps/two_configs_app/__init__.py b/tests/apps/two_configs_app/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/tests/apps/two_configs_app/__init__.py
diff --git a/tests/apps/two_configs_app/apps.py b/tests/apps/two_configs_app/apps.py
new file mode 100644
index 0000000000..dd2eac9ad1
--- /dev/null
+++ b/tests/apps/two_configs_app/apps.py
@@ -0,0 +1,9 @@
+from django.apps import AppConfig
+
+
+class TwoConfig(AppConfig):
+ name = 'apps.two_configs_app'
+
+
+class TwoConfigBis(AppConfig):
+ name = 'apps.two_configs_app'
diff --git a/tests/apps/two_configs_one_default_app/__init__.py b/tests/apps/two_configs_one_default_app/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/tests/apps/two_configs_one_default_app/__init__.py
diff --git a/tests/apps/two_configs_one_default_app/apps.py b/tests/apps/two_configs_one_default_app/apps.py
new file mode 100644
index 0000000000..489eb0f88f
--- /dev/null
+++ b/tests/apps/two_configs_one_default_app/apps.py
@@ -0,0 +1,10 @@
+from django.apps import AppConfig
+
+
+class TwoConfig(AppConfig):
+ default = True
+ name = 'apps.two_configs_one_default_app'
+
+
+class TwoConfigAlt(AppConfig):
+ name = 'apps.two_configs_one_default_app'
diff --git a/tests/apps/two_default_configs_app/__init__.py b/tests/apps/two_default_configs_app/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/tests/apps/two_default_configs_app/__init__.py
diff --git a/tests/apps/two_default_configs_app/apps.py b/tests/apps/two_default_configs_app/apps.py
new file mode 100644
index 0000000000..3cbcc411b0
--- /dev/null
+++ b/tests/apps/two_default_configs_app/apps.py
@@ -0,0 +1,11 @@
+from django.apps import AppConfig
+
+
+class TwoConfig(AppConfig):
+ default = True
+ name = 'apps.two_default_configs_app'
+
+
+class TwoConfigBis(AppConfig):
+ default = True
+ name = 'apps.two_default_configs_app'