|
@@ -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
|
|
|
|
|
|
|
|
|
|
|
@@ -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)
|