diff options
Diffstat (limited to 'tests/proxy_model_inheritance/tests.py')
-rw-r--r-- | tests/proxy_model_inheritance/tests.py | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/tests/proxy_model_inheritance/tests.py b/tests/proxy_model_inheritance/tests.py new file mode 100644 index 0000000000..239bc67809 --- /dev/null +++ b/tests/proxy_model_inheritance/tests.py @@ -0,0 +1,61 @@ +from __future__ import absolute_import + +import os +import sys + +from django.conf import settings +from django.core.management import call_command +from django.db.models.loading import cache, load_app +from django.test import TestCase, TransactionTestCase +from django.test.utils import override_settings +from django.utils._os import upath + +from .models import (ConcreteModel, ConcreteModelSubclass, + ConcreteModelSubclassProxy) + + +@override_settings(INSTALLED_APPS=('app1', 'app2')) +class ProxyModelInheritanceTests(TransactionTestCase): + """ + Proxy model inheritance across apps can result in syncdb not creating the table + for the proxied model (as described in #12286). This test creates two dummy + apps and calls syncdb, then verifies that the table has been created. + """ + + def setUp(self): + self.old_sys_path = sys.path[:] + sys.path.append(os.path.dirname(os.path.abspath(upath(__file__)))) + for app in settings.INSTALLED_APPS: + load_app(app) + + def tearDown(self): + sys.path = self.old_sys_path + del cache.app_store[cache.app_labels['app1']] + del cache.app_store[cache.app_labels['app2']] + del cache.app_labels['app1'] + del cache.app_labels['app2'] + del cache.app_models['app1'] + del cache.app_models['app2'] + + def test_table_exists(self): + call_command('syncdb', verbosity=0) + from .app1.models import ProxyModel + from .app2.models import NiceModel + self.assertEqual(NiceModel.objects.all().count(), 0) + self.assertEqual(ProxyModel.objects.all().count(), 0) + + +class MultiTableInheritanceProxyTest(TestCase): + + def test_model_subclass_proxy(self): + """ + Deleting an instance of a model proxying a multi-table inherited + subclass should cascade delete down the whole inheritance chain (see + #18083). + + """ + instance = ConcreteModelSubclassProxy.objects.create() + instance.delete() + self.assertEqual(0, ConcreteModelSubclassProxy.objects.count()) + self.assertEqual(0, ConcreteModelSubclass.objects.count()) + self.assertEqual(0, ConcreteModel.objects.count()) |