1. import os
    
  2. 
    
  3. from django.apps import apps
    
  4. from django.test import SimpleTestCase
    
  5. from django.test.utils import extend_sys_path
    
  6. 
    
  7. 
    
  8. class EggLoadingTest(SimpleTestCase):
    
  9.     def setUp(self):
    
  10.         self.egg_dir = "%s/eggs" % os.path.dirname(__file__)
    
  11. 
    
  12.     def tearDown(self):
    
  13.         apps.clear_cache()
    
  14. 
    
  15.     def test_egg1(self):
    
  16.         """Models module can be loaded from an app in an egg"""
    
  17.         egg_name = "%s/modelapp.egg" % self.egg_dir
    
  18.         with extend_sys_path(egg_name):
    
  19.             with self.settings(INSTALLED_APPS=["app_with_models"]):
    
  20.                 models_module = apps.get_app_config("app_with_models").models_module
    
  21.                 self.assertIsNotNone(models_module)
    
  22.         del apps.all_models["app_with_models"]
    
  23. 
    
  24.     def test_egg2(self):
    
  25.         """
    
  26.         Loading an app from an egg that has no models returns no models (and no
    
  27.         error).
    
  28.         """
    
  29.         egg_name = "%s/nomodelapp.egg" % self.egg_dir
    
  30.         with extend_sys_path(egg_name):
    
  31.             with self.settings(INSTALLED_APPS=["app_no_models"]):
    
  32.                 models_module = apps.get_app_config("app_no_models").models_module
    
  33.                 self.assertIsNone(models_module)
    
  34.         del apps.all_models["app_no_models"]
    
  35. 
    
  36.     def test_egg3(self):
    
  37.         """
    
  38.         Models module can be loaded from an app located under an egg's
    
  39.         top-level package.
    
  40.         """
    
  41.         egg_name = "%s/omelet.egg" % self.egg_dir
    
  42.         with extend_sys_path(egg_name):
    
  43.             with self.settings(INSTALLED_APPS=["omelet.app_with_models"]):
    
  44.                 models_module = apps.get_app_config("app_with_models").models_module
    
  45.                 self.assertIsNotNone(models_module)
    
  46.         del apps.all_models["app_with_models"]
    
  47. 
    
  48.     def test_egg4(self):
    
  49.         """
    
  50.         Loading an app with no models from under the top-level egg package
    
  51.         generates no error.
    
  52.         """
    
  53.         egg_name = "%s/omelet.egg" % self.egg_dir
    
  54.         with extend_sys_path(egg_name):
    
  55.             with self.settings(INSTALLED_APPS=["omelet.app_no_models"]):
    
  56.                 models_module = apps.get_app_config("app_no_models").models_module
    
  57.                 self.assertIsNone(models_module)
    
  58.         del apps.all_models["app_no_models"]
    
  59. 
    
  60.     def test_egg5(self):
    
  61.         """
    
  62.         Loading an app from an egg that has an import error in its models
    
  63.         module raises that error.
    
  64.         """
    
  65.         egg_name = "%s/brokenapp.egg" % self.egg_dir
    
  66.         with extend_sys_path(egg_name):
    
  67.             with self.assertRaisesMessage(ImportError, "modelz"):
    
  68.                 with self.settings(INSTALLED_APPS=["broken_app"]):
    
  69.                     pass
    
  70. 
    
  71. 
    
  72. class GetModelsTest(SimpleTestCase):
    
  73.     def setUp(self):
    
  74.         from .not_installed import models
    
  75. 
    
  76.         self.not_installed_module = models
    
  77. 
    
  78.     def test_get_model_only_returns_installed_models(self):
    
  79.         with self.assertRaises(LookupError):
    
  80.             apps.get_model("not_installed", "NotInstalledModel")
    
  81. 
    
  82.     def test_get_models_only_returns_installed_models(self):
    
  83.         self.assertNotIn("NotInstalledModel", [m.__name__ for m in apps.get_models()])