2013-12-26 17:03:17 +00:00
|
|
|
from __future__ import absolute_import, unicode_literals
|
2013-12-24 11:25:17 +00:00
|
|
|
|
|
|
|
from django.apps import apps
|
|
|
|
from django.apps.registry import Apps
|
2013-12-26 18:20:38 +00:00
|
|
|
from django.core.exceptions import ImproperlyConfigured
|
2013-12-24 11:25:17 +00:00
|
|
|
from django.db import models
|
2013-12-26 17:03:17 +00:00
|
|
|
from django.test import TestCase, override_settings
|
2013-12-31 16:25:57 +00:00
|
|
|
from django.utils import six
|
2013-12-24 11:25:17 +00:00
|
|
|
|
|
|
|
from .models import TotallyNormal, SoAlternative, new_apps
|
|
|
|
|
|
|
|
|
2013-12-26 17:03:17 +00:00
|
|
|
# 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.
|
|
|
|
|
|
|
|
SOME_INSTALLED_APPS = [
|
|
|
|
'apps.apps.MyAdmin',
|
|
|
|
'apps.apps.MyAuth',
|
|
|
|
'django.contrib.contenttypes',
|
|
|
|
'django.contrib.sessions',
|
|
|
|
'django.contrib.messages',
|
|
|
|
'django.contrib.staticfiles',
|
|
|
|
]
|
|
|
|
|
|
|
|
SOME_INSTALLED_APPS_NAMES = [
|
|
|
|
'django.contrib.admin',
|
|
|
|
'django.contrib.auth',
|
|
|
|
] + SOME_INSTALLED_APPS[2:]
|
|
|
|
|
2013-12-26 18:20:38 +00:00
|
|
|
|
2013-12-24 11:25:17 +00:00
|
|
|
class AppsTests(TestCase):
|
|
|
|
|
2013-12-26 14:04:58 +00:00
|
|
|
def test_singleton_master(self):
|
|
|
|
"""
|
|
|
|
Ensures that only one master registry can exist.
|
|
|
|
"""
|
|
|
|
with self.assertRaises(RuntimeError):
|
2013-12-30 15:03:06 +00:00
|
|
|
Apps(installed_apps=None)
|
2013-12-26 14:04:58 +00:00
|
|
|
|
|
|
|
def test_ready(self):
|
|
|
|
"""
|
|
|
|
Tests the ready property of the master registry.
|
|
|
|
"""
|
|
|
|
# The master app registry is always ready when the tests run.
|
|
|
|
self.assertTrue(apps.ready)
|
2013-12-30 15:03:06 +00:00
|
|
|
# Non-master app registries are populated in __init__.
|
|
|
|
self.assertTrue(Apps().ready)
|
2013-12-26 14:04:58 +00:00
|
|
|
|
2013-12-26 18:20:38 +00:00
|
|
|
def test_bad_app_config(self):
|
|
|
|
"""
|
|
|
|
Tests when INSTALLED_APPS contains an incorrect app config.
|
|
|
|
"""
|
|
|
|
with self.assertRaises(ImproperlyConfigured):
|
|
|
|
with self.settings(INSTALLED_APPS=['apps.apps.BadConfig']):
|
|
|
|
pass
|
|
|
|
|
|
|
|
def test_not_an_app_config(self):
|
|
|
|
"""
|
|
|
|
Tests when INSTALLED_APPS contains a class that isn't an app config.
|
|
|
|
"""
|
|
|
|
with self.assertRaises(ImproperlyConfigured):
|
|
|
|
with self.settings(INSTALLED_APPS=['apps.apps.NotAConfig']):
|
|
|
|
pass
|
|
|
|
|
|
|
|
def test_no_such_app(self):
|
|
|
|
"""
|
2013-12-26 18:29:32 +00:00
|
|
|
Tests when INSTALLED_APPS contains an app that doesn't exist, either
|
|
|
|
directly or via an app config.
|
2013-12-26 18:20:38 +00:00
|
|
|
"""
|
2013-12-26 18:29:32 +00:00
|
|
|
with self.assertRaises(ImportError):
|
|
|
|
with self.settings(INSTALLED_APPS=['there is no such app']):
|
|
|
|
pass
|
2013-12-26 18:20:38 +00:00
|
|
|
with self.assertRaises(ImportError):
|
|
|
|
with self.settings(INSTALLED_APPS=['apps.apps.NoSuchApp']):
|
|
|
|
pass
|
|
|
|
|
|
|
|
def test_no_such_app_config(self):
|
|
|
|
"""
|
|
|
|
Tests when INSTALLED_APPS contains an entry that doesn't exist.
|
|
|
|
"""
|
|
|
|
with self.assertRaises(ImportError):
|
|
|
|
with self.settings(INSTALLED_APPS=['apps.apps.NoSuchConfig']):
|
|
|
|
pass
|
|
|
|
|
2013-12-26 17:03:17 +00:00
|
|
|
@override_settings(INSTALLED_APPS=SOME_INSTALLED_APPS)
|
|
|
|
def test_get_app_configs(self):
|
|
|
|
"""
|
|
|
|
Tests get_app_configs().
|
|
|
|
"""
|
|
|
|
app_configs = apps.get_app_configs()
|
|
|
|
self.assertListEqual(
|
|
|
|
[app_config.name for app_config in app_configs],
|
|
|
|
SOME_INSTALLED_APPS_NAMES)
|
|
|
|
|
|
|
|
@override_settings(INSTALLED_APPS=SOME_INSTALLED_APPS)
|
|
|
|
def test_get_app_config(self):
|
|
|
|
"""
|
|
|
|
Tests get_app_config().
|
|
|
|
"""
|
|
|
|
app_config = apps.get_app_config('admin')
|
|
|
|
self.assertEqual(app_config.name, 'django.contrib.admin')
|
|
|
|
|
|
|
|
app_config = apps.get_app_config('staticfiles')
|
|
|
|
self.assertEqual(app_config.name, 'django.contrib.staticfiles')
|
|
|
|
|
|
|
|
with self.assertRaises(LookupError):
|
|
|
|
apps.get_app_config('webdesign')
|
|
|
|
|
2013-12-26 19:04:06 +00:00
|
|
|
@override_settings(INSTALLED_APPS=SOME_INSTALLED_APPS)
|
2014-01-06 21:48:41 +00:00
|
|
|
def test_is_installed(self):
|
|
|
|
self.assertTrue(apps.is_installed('django.contrib.admin'))
|
|
|
|
self.assertTrue(apps.is_installed('django.contrib.staticfiles'))
|
|
|
|
self.assertFalse(apps.is_installed('django.contrib.webdesign'))
|
2013-12-26 19:04:06 +00:00
|
|
|
|
2013-12-31 15:23:42 +00:00
|
|
|
@override_settings(INSTALLED_APPS=['apps.apps.RelabeledAppsConfig'])
|
|
|
|
def test_relabeling(self):
|
|
|
|
self.assertEqual(apps.get_app_config('relabeled').name, 'apps')
|
|
|
|
|
2013-12-31 16:25:57 +00:00
|
|
|
def test_duplicate_labels(self):
|
|
|
|
with six.assertRaisesRegex(self, ImproperlyConfigured, "Application labels aren't unique"):
|
|
|
|
with self.settings(INSTALLED_APPS=['apps.apps.PlainAppsConfig', 'apps']):
|
|
|
|
pass
|
|
|
|
|
|
|
|
def test_duplicate_names(self):
|
|
|
|
with six.assertRaisesRegex(self, ImproperlyConfigured, "Application names aren't unique"):
|
|
|
|
with self.settings(INSTALLED_APPS=['apps.apps.RelabeledAppsConfig', 'apps']):
|
|
|
|
pass
|
|
|
|
|
2013-12-24 11:25:17 +00:00
|
|
|
def test_models_py(self):
|
|
|
|
"""
|
|
|
|
Tests that the models in the models.py file were loaded correctly.
|
|
|
|
"""
|
|
|
|
self.assertEqual(apps.get_model("apps", "TotallyNormal"), TotallyNormal)
|
2013-12-28 13:55:54 +00:00
|
|
|
with self.assertRaises(LookupError):
|
|
|
|
apps.get_model("apps", "SoAlternative")
|
2013-12-24 11:25:17 +00:00
|
|
|
|
2013-12-28 13:55:54 +00:00
|
|
|
with self.assertRaises(LookupError):
|
|
|
|
new_apps.get_model("apps", "TotallyNormal")
|
2013-12-24 11:25:17 +00:00
|
|
|
self.assertEqual(new_apps.get_model("apps", "SoAlternative"), SoAlternative)
|
|
|
|
|
|
|
|
def test_dynamic_load(self):
|
|
|
|
"""
|
|
|
|
Makes a new model at runtime and ensures it goes into the right place.
|
|
|
|
"""
|
2013-12-29 20:47:55 +00:00
|
|
|
old_models = list(apps.get_app_config("apps").get_models())
|
2013-12-24 11:25:17 +00:00
|
|
|
# Construct a new model in a new app registry
|
|
|
|
body = {}
|
2013-12-30 15:03:06 +00:00
|
|
|
new_apps = Apps(["apps"])
|
2013-12-24 11:25:17 +00:00
|
|
|
meta_contents = {
|
|
|
|
'app_label': "apps",
|
|
|
|
'apps': new_apps,
|
|
|
|
}
|
2013-12-26 17:03:17 +00:00
|
|
|
meta = type(str("Meta"), tuple(), meta_contents)
|
2013-12-24 11:25:17 +00:00
|
|
|
body['Meta'] = meta
|
|
|
|
body['__module__'] = TotallyNormal.__module__
|
2013-12-26 17:03:17 +00:00
|
|
|
temp_model = type(str("SouthPonies"), (models.Model,), body)
|
2013-12-24 11:25:17 +00:00
|
|
|
# Make sure it appeared in the right place!
|
2013-12-29 20:47:55 +00:00
|
|
|
self.assertListEqual(list(apps.get_app_config("apps").get_models()), old_models)
|
2013-12-28 13:55:54 +00:00
|
|
|
with self.assertRaises(LookupError):
|
|
|
|
apps.get_model("apps", "SouthPonies")
|
2013-12-24 11:25:17 +00:00
|
|
|
self.assertEqual(new_apps.get_model("apps", "SouthPonies"), temp_model)
|