Fixed #23469 -- Removed test runner compatibility check which often yielded false positives.

This commit is contained in:
Tim Graham 2014-10-17 10:31:49 -04:00
parent 6ce6c77e03
commit 7ae03204ac
3 changed files with 2 additions and 117 deletions

View File

@ -9,85 +9,10 @@ from .. import Warning, register, Tags
@register(Tags.compatibility)
def check_1_6_compatibility(**kwargs):
errors = []
errors.extend(_check_test_runner(**kwargs))
errors.extend(_check_boolean_field_default_value(**kwargs))
return errors
def _check_test_runner(app_configs=None, **kwargs):
"""
Checks if the user has *not* overridden the ``TEST_RUNNER`` setting &
warns them about the default behavior changes.
If the user has overridden that setting, we presume they know what they're
doing & avoid generating a message.
"""
from django.conf import settings
# We need to establish if this is a project defined on the 1.5 project template,
# because if the project was generated on the 1.6 template, it will have be been
# developed with the new TEST_RUNNER behavior in mind.
# There's no canonical way to do this; so we leverage off the fact that 1.6
# also introduced a new project template, removing a bunch of settings from the
# default that won't be in common usage.
# We make this determination on a balance of probabilities. Each of these factors
# contributes a weight; if enough of them trigger, we've got a likely 1.6 project.
weight = 0
# If TEST_RUNNER is explicitly set, it's all a moot point - if it's been explicitly set,
# the user has opted into a specific set of behaviors, which won't change as the
# default changes.
if not settings.is_overridden('TEST_RUNNER'):
# Strong markers:
# SITE_ID = 1 is in 1.5 template, not defined in 1.6 template
try:
settings.SITE_ID
weight += 2
except AttributeError:
pass
# BASE_DIR is not defined in 1.5 template, set in 1.6 template
try:
settings.BASE_DIR
except AttributeError:
weight += 2
# TEMPLATE_LOADERS defined in 1.5 template, not defined in 1.6 template
if settings.is_overridden('TEMPLATE_LOADERS'):
weight += 2
# MANAGERS defined in 1.5 template, not defined in 1.6 template
if settings.is_overridden('MANAGERS'):
weight += 2
# Weaker markers - These are more likely to have been added in common usage
# ADMINS defined in 1.5 template, not defined in 1.6 template
if settings.is_overridden('ADMINS'):
weight += 1
# Clickjacking enabled by default in 1.6
if 'django.middleware.clickjacking.XFrameOptionsMiddleware' not in set(settings.MIDDLEWARE_CLASSES):
weight += 1
if weight >= 6:
return [
Warning(
"Some project unittests may not execute as expected.",
hint=("Django 1.6 introduced a new default test runner. It looks like "
"this project was generated using Django 1.5 or earlier. You should "
"ensure your tests are all running & behaving as expected. See "
"https://docs.djangoproject.com/en/dev/releases/1.6/#new-test-runner "
"for more information."),
obj=None,
id='1_6.W001',
)
]
else:
return []
def _check_boolean_field_default_value(app_configs=None, **kwargs):
"""
Checks if there are any BooleanFields without a default value, &

View File

@ -166,7 +166,8 @@ Backwards Compatibility
The following checks are performed to warn the user of any potential problems
that might occur as a result of a version upgrade.
* **1_6.W001**: Some project unit tests may not execute as expected.
* **1_6.W001**: Some project unit tests may not execute as expected. *This
check was removed in Django 1.8 due to false positives*.
* **1_6.W002**: ``BooleanField`` does not have a default value.
Admin

View File

@ -86,47 +86,6 @@ class MessageTests(TestCase):
class Django_1_6_0_CompatibilityChecks(TestCase):
@override_settings(TEST_RUNNER='django.test.runner.DiscoverRunner')
def test_test_runner_new_default(self):
errors = check_1_6_compatibility()
self.assertEqual(errors, [])
@override_settings(TEST_RUNNER='myapp.test.CustomRunner')
def test_test_runner_overriden(self):
errors = check_1_6_compatibility()
self.assertEqual(errors, [])
def test_test_runner_not_set_explicitly(self):
# If TEST_RUNNER was set explicitly, temporarily pretend it wasn't
test_runner_overridden = False
if 'TEST_RUNNER' in settings._wrapped._explicit_settings:
test_runner_overridden = True
settings._wrapped._explicit_settings.remove('TEST_RUNNER')
# We remove some settings to make this look like a project generated under Django 1.5.
settings._wrapped._explicit_settings.add('MANAGERS')
settings._wrapped._explicit_settings.add('ADMINS')
try:
errors = check_1_6_compatibility()
expected = [
checks.Warning(
"Some project unittests may not execute as expected.",
hint=("Django 1.6 introduced a new default test runner. It looks like "
"this project was generated using Django 1.5 or earlier. You should "
"ensure your tests are all running & behaving as expected. See "
"https://docs.djangoproject.com/en/dev/releases/1.6/#new-test-runner "
"for more information."),
obj=None,
id='1_6.W001',
)
]
self.assertEqual(errors, expected)
finally:
# Restore settings value
if test_runner_overridden:
settings._wrapped._explicit_settings.add('TEST_RUNNER')
settings._wrapped._explicit_settings.remove('MANAGERS')
settings._wrapped._explicit_settings.remove('ADMINS')
@override_settings(TEST_RUNNER='myapp.test.CustomRunner')
def test_boolean_field_default_value(self):
# We patch the field's default value to trigger the warning