This is necessary because get_model() checks are case insensitive, and if the swapable check isn't, the swappable logic gets tied up in knots with models that are partially swapped out. Thanks to chris@cogdon.org for the report and extensive analysis, and Preston for his work on the draft patch. Backport of c04c03d from trunk.
59 lines
2.5 KiB
Python
59 lines
2.5 KiB
Python
from __future__ import absolute_import, unicode_literals
|
|
|
|
from django.utils.six import StringIO
|
|
|
|
from django.contrib.auth.models import Permission
|
|
from django.contrib.contenttypes.models import ContentType
|
|
from django.core import management
|
|
from django.db.models.loading import cache
|
|
from django.test import TestCase
|
|
from django.test.utils import override_settings
|
|
|
|
from regressiontests.swappable_models.models import Article
|
|
|
|
|
|
class SwappableModelTests(TestCase):
|
|
def setUp(self):
|
|
# This test modifies the installed apps, so we need to make sure
|
|
# we're not dealing with a cached app list.
|
|
cache._get_models_cache.clear()
|
|
|
|
def tearDown(self):
|
|
# By fiddling with swappable models, we alter the installed models
|
|
# cache, so flush it to make sure there are no side effects.
|
|
cache._get_models_cache.clear()
|
|
|
|
@override_settings(TEST_ARTICLE_MODEL='swappable_models.AlternateArticle')
|
|
def test_generated_data(self):
|
|
"Permissions and content types are not created for a swapped model"
|
|
|
|
# Delete all permissions and content_types
|
|
Permission.objects.filter(content_type__app_label='swappable_models').delete()
|
|
ContentType.objects.filter(app_label='swappable_models').delete()
|
|
|
|
# Re-run syncdb. This will re-build the permissions and content types.
|
|
new_io = StringIO()
|
|
management.call_command('syncdb', load_initial_data=False, interactive=False, stdout=new_io)
|
|
|
|
# Check that content types and permissions exist for the swapped model,
|
|
# but not for the swappable model.
|
|
apps_models = [(p.content_type.app_label, p.content_type.model)
|
|
for p in Permission.objects.all()]
|
|
self.assertIn(('swappable_models', 'alternatearticle'), apps_models)
|
|
self.assertNotIn(('swappable_models', 'article'), apps_models)
|
|
|
|
apps_models = [(ct.app_label, ct.model)
|
|
for ct in ContentType.objects.all()]
|
|
self.assertIn(('swappable_models', 'alternatearticle'), apps_models)
|
|
self.assertNotIn(('swappable_models', 'article'), apps_models)
|
|
|
|
@override_settings(TEST_ARTICLE_MODEL='swappable_models.article')
|
|
def test_case_insensitive(self):
|
|
"Model names are case insensitive. Check that model swapping honors this."
|
|
try:
|
|
Article.objects.all()
|
|
except AttributeError:
|
|
self.fail('Swappable model names should be case insensitive.')
|
|
|
|
self.assertIsNone(Article._meta.swapped)
|