mirror of
				https://github.com/django/django.git
				synced 2025-10-26 23:26:08 +00:00 
			
		
		
		
	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.
		
			
				
	
	
		
			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)
 |