diff options
author | Aymeric Augustin <aymeric.augustin@m4x.org> | 2020-07-21 10:35:12 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-07-21 10:35:12 +0200 |
commit | 3f2821af6bc48fa8e7970c1ce27bc54c3172545e (patch) | |
tree | 807b209dd7bf77cde680f54a18395672c1cb607f /tests/apps | |
parent | 6ec5eb5d74fd18a91256010706ab8b5b583526a9 (diff) | |
download | django-3f2821af6bc48fa8e7970c1ce27bc54c3172545e.tar.gz |
Fixed #31180 -- Configured applications automatically.
Diffstat (limited to 'tests/apps')
-rw-r--r-- | tests/apps/default_config_app/__init__.py | 1 | ||||
-rw-r--r-- | tests/apps/default_config_app/apps.py | 5 | ||||
-rw-r--r-- | tests/apps/explicit_default_config_app/__init__.py | 1 | ||||
-rw-r--r-- | tests/apps/explicit_default_config_app/apps.py | 5 | ||||
-rw-r--r-- | tests/apps/explicit_default_config_mismatch_app/__init__.py | 1 | ||||
-rw-r--r-- | tests/apps/explicit_default_config_mismatch_app/apps.py | 5 | ||||
-rw-r--r-- | tests/apps/explicit_default_config_mismatch_app/not_apps.py | 5 | ||||
-rw-r--r-- | tests/apps/namespace_package_base/nsapp/apps.py | 1 | ||||
-rw-r--r-- | tests/apps/no_config_app/__init__.py | 0 | ||||
-rw-r--r-- | tests/apps/one_config_app/__init__.py | 0 | ||||
-rw-r--r-- | tests/apps/one_config_app/apps.py | 5 | ||||
-rw-r--r-- | tests/apps/tests.py | 104 | ||||
-rw-r--r-- | tests/apps/two_configs_app/__init__.py | 0 | ||||
-rw-r--r-- | tests/apps/two_configs_app/apps.py | 9 | ||||
-rw-r--r-- | tests/apps/two_configs_one_default_app/__init__.py | 0 | ||||
-rw-r--r-- | tests/apps/two_configs_one_default_app/apps.py | 10 | ||||
-rw-r--r-- | tests/apps/two_default_configs_app/__init__.py | 0 | ||||
-rw-r--r-- | tests/apps/two_default_configs_app/apps.py | 11 |
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' |