tests.py 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. from __future__ import unicode_literals
  2. import copy
  3. import os
  4. import sys
  5. import time
  6. from unittest import TestCase
  7. from django.conf import Settings
  8. from django.db.models.loading import cache, load_app, get_model, get_models, AppCache
  9. from django.test.utils import override_settings
  10. from django.utils._os import upath
  11. class EggLoadingTest(TestCase):
  12. def setUp(self):
  13. self.old_path = sys.path[:]
  14. self.egg_dir = '%s/eggs' % os.path.dirname(upath(__file__))
  15. # This test adds dummy applications to the app cache. These
  16. # need to be removed in order to prevent bad interactions
  17. # with the flush operation in other tests.
  18. self.old_app_models = copy.deepcopy(cache.app_models)
  19. self.old_app_store = copy.deepcopy(cache.app_store)
  20. def tearDown(self):
  21. sys.path = self.old_path
  22. cache.app_models = self.old_app_models
  23. cache.app_store = self.old_app_store
  24. def test_egg1(self):
  25. """Models module can be loaded from an app in an egg"""
  26. egg_name = '%s/modelapp.egg' % self.egg_dir
  27. sys.path.append(egg_name)
  28. models = load_app('app_with_models')
  29. self.assertFalse(models is None)
  30. def test_egg2(self):
  31. """Loading an app from an egg that has no models returns no models (and no error)"""
  32. egg_name = '%s/nomodelapp.egg' % self.egg_dir
  33. sys.path.append(egg_name)
  34. models = load_app('app_no_models')
  35. self.assertTrue(models is None)
  36. def test_egg3(self):
  37. """Models module can be loaded from an app located under an egg's top-level package"""
  38. egg_name = '%s/omelet.egg' % self.egg_dir
  39. sys.path.append(egg_name)
  40. models = load_app('omelet.app_with_models')
  41. self.assertFalse(models is None)
  42. def test_egg4(self):
  43. """Loading an app with no models from under the top-level egg package generates no error"""
  44. egg_name = '%s/omelet.egg' % self.egg_dir
  45. sys.path.append(egg_name)
  46. models = load_app('omelet.app_no_models')
  47. self.assertTrue(models is None)
  48. def test_egg5(self):
  49. """Loading an app from an egg that has an import error in its models module raises that error"""
  50. egg_name = '%s/brokenapp.egg' % self.egg_dir
  51. sys.path.append(egg_name)
  52. self.assertRaises(ImportError, load_app, 'broken_app')
  53. raised = None
  54. try:
  55. load_app('broken_app')
  56. except ImportError as e:
  57. raised = e
  58. # Make sure the message is indicating the actual
  59. # problem in the broken app.
  60. self.assertTrue(raised is not None)
  61. self.assertTrue("modelz" in raised.args[0])
  62. def test_missing_app(self):
  63. """
  64. Test that repeated app loading doesn't succeed in case there is an
  65. error. Refs #17667.
  66. """
  67. # AppCache is a Borg, so we can instantiate one and change its
  68. # loaded to False to force the following code to actually try to
  69. # populate the cache.
  70. a = AppCache()
  71. a.loaded = False
  72. try:
  73. with override_settings(INSTALLED_APPS=('notexists',)):
  74. self.assertRaises(ImportError, get_model, 'notexists', 'nomodel', seed_cache=True)
  75. self.assertRaises(ImportError, get_model, 'notexists', 'nomodel', seed_cache=True)
  76. finally:
  77. a.loaded = True
  78. class GetModelsTest(TestCase):
  79. def setUp(self):
  80. from .not_installed import models
  81. self.not_installed_module = models
  82. def test_get_model_only_returns_installed_models(self):
  83. self.assertEqual(
  84. get_model("not_installed", "NotInstalledModel"), None)
  85. def test_get_model_with_not_installed(self):
  86. self.assertEqual(
  87. get_model(
  88. "not_installed", "NotInstalledModel", only_installed=False),
  89. self.not_installed_module.NotInstalledModel)
  90. def test_get_models_only_returns_installed_models(self):
  91. self.assertFalse(
  92. "NotInstalledModel" in
  93. [m.__name__ for m in get_models()])
  94. def test_get_models_with_app_label_only_returns_installed_models(self):
  95. self.assertEqual(get_models(self.not_installed_module), [])
  96. def test_get_models_with_not_installed(self):
  97. self.assertTrue(
  98. "NotInstalledModel" in [
  99. m.__name__ for m in get_models(only_installed=False)])
  100. class NotInstalledModelsTest(TestCase):
  101. def test_related_not_installed_model(self):
  102. from .not_installed.models import NotInstalledModel
  103. self.assertEqual(
  104. set(NotInstalledModel._meta.get_all_field_names()),
  105. set(["id", "relatedmodel", "m2mrelatedmodel"]))