mirror of
				https://github.com/django/django.git
				synced 2025-11-04 05:35:37 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			127 lines
		
	
	
	
		
			5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			127 lines
		
	
	
	
		
			5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
from django.core.checks.compatibility import base
 | 
						|
from django.core.checks.compatibility import django_1_6_0
 | 
						|
from django.core.management.commands import check
 | 
						|
from django.core.management import call_command
 | 
						|
from django.db.models.fields import NOT_PROVIDED
 | 
						|
from django.test import TestCase
 | 
						|
 | 
						|
from .models import Book
 | 
						|
 | 
						|
class StubCheckModule(object):
 | 
						|
    # Has no ``run_checks`` attribute & will trigger a warning.
 | 
						|
    __name__ = 'StubCheckModule'
 | 
						|
 | 
						|
 | 
						|
class FakeWarnings(object):
 | 
						|
    def __init__(self):
 | 
						|
        self._warnings = []
 | 
						|
 | 
						|
    def warn(self, message):
 | 
						|
        self._warnings.append(message)
 | 
						|
 | 
						|
 | 
						|
class CompatChecksTestCase(TestCase):
 | 
						|
    def setUp(self):
 | 
						|
        super(CompatChecksTestCase, self).setUp()
 | 
						|
 | 
						|
        # We're going to override the list of checks to perform for test
 | 
						|
        # consistency in the future.
 | 
						|
        self.old_compat_checks = base.COMPAT_CHECKS
 | 
						|
        base.COMPAT_CHECKS = [
 | 
						|
            django_1_6_0,
 | 
						|
        ]
 | 
						|
 | 
						|
    def tearDown(self):
 | 
						|
        # Restore what's supposed to be in ``COMPAT_CHECKS``.
 | 
						|
        base.COMPAT_CHECKS = self.old_compat_checks
 | 
						|
        super(CompatChecksTestCase, self).tearDown()
 | 
						|
 | 
						|
    def test_check_test_runner_new_default(self):
 | 
						|
        with self.settings(TEST_RUNNER='django.test.runner.DiscoverRunner'):
 | 
						|
            result = django_1_6_0.check_test_runner()
 | 
						|
            self.assertTrue("Django 1.6 introduced a new default test runner" in result)
 | 
						|
 | 
						|
    def test_check_test_runner_overridden(self):
 | 
						|
        with self.settings(TEST_RUNNER='myapp.test.CustomRunnner'):
 | 
						|
            self.assertEqual(django_1_6_0.check_test_runner(), None)
 | 
						|
 | 
						|
    def test_run_checks_new_default(self):
 | 
						|
        with self.settings(TEST_RUNNER='django.test.runner.DiscoverRunner'):
 | 
						|
            result = django_1_6_0.run_checks()
 | 
						|
            self.assertEqual(len(result), 1)
 | 
						|
            self.assertTrue("Django 1.6 introduced a new default test runner" in result[0])
 | 
						|
 | 
						|
    def test_run_checks_overridden(self):
 | 
						|
        with self.settings(TEST_RUNNER='myapp.test.CustomRunnner'):
 | 
						|
            self.assertEqual(len(django_1_6_0.run_checks()), 0)
 | 
						|
 | 
						|
    def test_boolean_field_default_value(self):
 | 
						|
        with self.settings(TEST_RUNNER='myapp.test.CustomRunnner'):
 | 
						|
            # We patch the field's default value to trigger the warning
 | 
						|
            boolean_field = Book._meta.get_field('is_published')
 | 
						|
            old_default = boolean_field.default
 | 
						|
            try:
 | 
						|
                boolean_field.default = NOT_PROVIDED
 | 
						|
                result = django_1_6_0.run_checks()
 | 
						|
                self.assertEqual(len(result), 1)
 | 
						|
                self.assertTrue("You have not set a default value for one or more BooleanFields" in result[0])
 | 
						|
                self.assertTrue('check.Book: "is_published"' in result[0])
 | 
						|
                # We did not patch the BlogPost.is_published field so
 | 
						|
                # there should not be a warning about it
 | 
						|
                self.assertFalse('check.BlogPost' in result[0])
 | 
						|
            finally:
 | 
						|
                # Restore the ``default``
 | 
						|
                boolean_field.default = old_default
 | 
						|
 | 
						|
    def test_check_compatibility(self):
 | 
						|
        with self.settings(TEST_RUNNER='django.test.runner.DiscoverRunner'):
 | 
						|
            result = base.check_compatibility()
 | 
						|
            self.assertEqual(len(result), 1)
 | 
						|
            self.assertTrue("Django 1.6 introduced a new default test runner" in result[0])
 | 
						|
 | 
						|
        with self.settings(TEST_RUNNER='myapp.test.CustomRunnner'):
 | 
						|
            self.assertEqual(len(base.check_compatibility()), 0)
 | 
						|
 | 
						|
    def test_check_compatibility_warning(self):
 | 
						|
        # First, we're patching over the ``COMPAT_CHECKS`` with a stub which
 | 
						|
        # will trigger the warning.
 | 
						|
        base.COMPAT_CHECKS = [
 | 
						|
            StubCheckModule(),
 | 
						|
        ]
 | 
						|
 | 
						|
        # Next, we unfortunately have to patch out ``warnings``.
 | 
						|
        old_warnings = base.warnings
 | 
						|
        base.warnings = FakeWarnings()
 | 
						|
 | 
						|
        self.assertEqual(len(base.warnings._warnings), 0)
 | 
						|
 | 
						|
        with self.settings(TEST_RUNNER='myapp.test.CustomRunnner'):
 | 
						|
            self.assertEqual(len(base.check_compatibility()), 0)
 | 
						|
 | 
						|
        self.assertEqual(len(base.warnings._warnings), 1)
 | 
						|
        self.assertTrue("The 'StubCheckModule' module lacks a 'run_checks'" in base.warnings._warnings[0])
 | 
						|
 | 
						|
        # Restore the ``warnings``.
 | 
						|
        base.warnings = old_warnings
 | 
						|
 | 
						|
    def test_management_command(self):
 | 
						|
        # Again, we unfortunately have to patch out ``warnings``. Different
 | 
						|
        old_warnings = check.warnings
 | 
						|
        check.warnings = FakeWarnings()
 | 
						|
 | 
						|
        self.assertEqual(len(check.warnings._warnings), 0)
 | 
						|
 | 
						|
        # Should not produce any warnings.
 | 
						|
        with self.settings(TEST_RUNNER='myapp.test.CustomRunnner'):
 | 
						|
            call_command('check')
 | 
						|
 | 
						|
        self.assertEqual(len(check.warnings._warnings), 0)
 | 
						|
 | 
						|
        with self.settings(TEST_RUNNER='django.test.runner.DiscoverRunner'):
 | 
						|
            call_command('check')
 | 
						|
 | 
						|
        self.assertEqual(len(check.warnings._warnings), 1)
 | 
						|
        self.assertTrue("Django 1.6 introduced a new default test runner" in check.warnings._warnings[0])
 | 
						|
 | 
						|
        # Restore the ``warnings``.
 | 
						|
        base.warnings = old_warnings
 |