models module can be loaded from an app in an egg eggname smodelapp egg self eggdir with extendsyspatheggname with self settingsinstalledappsappwithmodels modelsmodule apps getappconfigappwithmodels modelsmodule self assertisnotnonemodelsmodule del apps allmodelsappwithmodels def testegg2self eggname snomodelapp egg self eggdir with extendsyspatheggname with self settingsinstalledappsappnomodels modelsmodule apps getappconfigappnomodels modelsmodule self assertisnonemodelsmodule del apps allmodelsappnomodels def testegg3self eggname somelet egg self eggdir with extendsyspatheggname with self settingsinstalledappsomelet appwithmodels modelsmodule apps getappconfigappwithmodels modelsmodule self assertisnotnonemodelsmodule del apps allmodelsappwithmodels def testegg4self eggname somelet egg self eggdir with extendsyspatheggname with self settingsinstalledappsomelet appnomodels modelsmodule apps getappconfigappnomodels modelsmodule self assertisnonemodelsmodule del apps allmodelsappnomodels def testegg5self eggname sbrokenapp egg self eggdir with extendsyspatheggname with self assertraisesmessageimporterror modelz with self settingsinstalledappsbrokenapp pass class getmodelstestsimpletestcase def setupself from notinstalled import models self notinstalledmodule models def testgetmodelonlyreturnsinstalledmodelsself with self assertraiseslookuperror apps getmodelnotinstalled notinstalledmodel def testgetmodelsonlyreturnsinstalledmodelsself self assertnotinnotinstalledmodel m name for m in apps getmodels models module can be loaded from an app in an egg loading an app from an egg that has no models returns no models and no error models module can be loaded from an app located under an egg s top level package loading an app with no models from under the top level egg package generates no error loading an app from an egg that has an import error in its models module raises that error
import os

from django.apps import apps
from django.test import SimpleTestCase
from django.test.utils import extend_sys_path


class EggLoadingTest(SimpleTestCase):
    def setUp(self):
        self.egg_dir = "%s/eggs" % os.path.dirname(__file__)

    def tearDown(self):
        apps.clear_cache()

    def test_egg1(self):
        
        egg_name = "%s/modelapp.egg" % self.egg_dir
        with extend_sys_path(egg_name):
            with self.settings(INSTALLED_APPS=["app_with_models"]):
                models_module = apps.get_app_config("app_with_models").models_module
                self.assertIsNotNone(models_module)
        del apps.all_models["app_with_models"]

    def test_egg2(self):
        
        egg_name = "%s/nomodelapp.egg" % self.egg_dir
        with extend_sys_path(egg_name):
            with self.settings(INSTALLED_APPS=["app_no_models"]):
                models_module = apps.get_app_config("app_no_models").models_module
                self.assertIsNone(models_module)
        del apps.all_models["app_no_models"]

    def test_egg3(self):
        
        egg_name = "%s/omelet.egg" % self.egg_dir
        with extend_sys_path(egg_name):
            with self.settings(INSTALLED_APPS=["omelet.app_with_models"]):
                models_module = apps.get_app_config("app_with_models").models_module
                self.assertIsNotNone(models_module)
        del apps.all_models["app_with_models"]

    def test_egg4(self):
        
        egg_name = "%s/omelet.egg" % self.egg_dir
        with extend_sys_path(egg_name):
            with self.settings(INSTALLED_APPS=["omelet.app_no_models"]):
                models_module = apps.get_app_config("app_no_models").models_module
                self.assertIsNone(models_module)
        del apps.all_models["app_no_models"]

    def test_egg5(self):
        
        egg_name = "%s/brokenapp.egg" % self.egg_dir
        with extend_sys_path(egg_name):
            with self.assertRaisesMessage(ImportError, "modelz"):
                with self.settings(INSTALLED_APPS=["broken_app"]):
                    pass


class GetModelsTest(SimpleTestCase):
    def setUp(self):
        from .not_installed import models

        self.not_installed_module = models

    def test_get_model_only_returns_installed_models(self):
        with self.assertRaises(LookupError):
            apps.get_model("not_installed", "NotInstalledModel")

    def test_get_models_only_returns_installed_models(self):
        self.assertNotIn("NotInstalledModel", [m.__name__ for m in apps.get_models()])