tests.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. from __future__ import absolute_import
  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
  9. from django.utils._os import upath
  10. class EggLoadingTest(TestCase):
  11. def setUp(self):
  12. self.old_path = sys.path[:]
  13. self.egg_dir = '%s/eggs' % os.path.dirname(upath(__file__))
  14. # This test adds dummy applications to the app cache. These
  15. # need to be removed in order to prevent bad interactions
  16. # with the flush operation in other tests.
  17. self.old_app_models = copy.deepcopy(cache.app_models)
  18. self.old_app_store = copy.deepcopy(cache.app_store)
  19. def tearDown(self):
  20. sys.path = self.old_path
  21. cache.app_models = self.old_app_models
  22. cache.app_store = self.old_app_store
  23. def test_egg1(self):
  24. """Models module can be loaded from an app in an egg"""
  25. egg_name = '%s/modelapp.egg' % self.egg_dir
  26. sys.path.append(egg_name)
  27. models = load_app('app_with_models')
  28. self.assertFalse(models is None)
  29. def test_egg2(self):
  30. """Loading an app from an egg that has no models returns no models (and no error)"""
  31. egg_name = '%s/nomodelapp.egg' % self.egg_dir
  32. sys.path.append(egg_name)
  33. models = load_app('app_no_models')
  34. self.assertTrue(models is None)
  35. def test_egg3(self):
  36. """Models module can be loaded from an app located under an egg's top-level package"""
  37. egg_name = '%s/omelet.egg' % self.egg_dir
  38. sys.path.append(egg_name)
  39. models = load_app('omelet.app_with_models')
  40. self.assertFalse(models is None)
  41. def test_egg4(self):
  42. """Loading an app with no models from under the top-level egg package generates no error"""
  43. egg_name = '%s/omelet.egg' % self.egg_dir
  44. sys.path.append(egg_name)
  45. models = load_app('omelet.app_no_models')
  46. self.assertTrue(models is None)
  47. def test_egg5(self):
  48. """Loading an app from an egg that has an import error in its models module raises that error"""
  49. egg_name = '%s/brokenapp.egg' % self.egg_dir
  50. sys.path.append(egg_name)
  51. self.assertRaises(ImportError, load_app, 'broken_app')
  52. try:
  53. load_app('broken_app')
  54. except ImportError as e:
  55. # Make sure the message is indicating the actual
  56. # problem in the broken app.
  57. self.assertTrue("modelz" in e.args[0])
  58. class GetModelsTest(TestCase):
  59. def setUp(self):
  60. from .not_installed import models
  61. self.not_installed_module = models
  62. def test_get_model_only_returns_installed_models(self):
  63. self.assertEqual(
  64. get_model("not_installed", "NotInstalledModel"), None)
  65. def test_get_model_with_not_installed(self):
  66. self.assertEqual(
  67. get_model(
  68. "not_installed", "NotInstalledModel", only_installed=False),
  69. self.not_installed_module.NotInstalledModel)
  70. def test_get_models_only_returns_installed_models(self):
  71. self.assertFalse(
  72. "NotInstalledModel" in
  73. [m.__name__ for m in get_models()])
  74. def test_get_models_with_app_label_only_returns_installed_models(self):
  75. self.assertEqual(get_models(self.not_installed_module), [])
  76. def test_get_models_with_not_installed(self):
  77. self.assertTrue(
  78. "NotInstalledModel" in [
  79. m.__name__ for m in get_models(only_installed=False)])
  80. class NotInstalledModelsTest(TestCase):
  81. def test_related_not_installed_model(self):
  82. from .not_installed.models import NotInstalledModel
  83. self.assertEqual(
  84. set(NotInstalledModel._meta.get_all_field_names()),
  85. set(["id", "relatedmodel", "m2mrelatedmodel"]))