summaryrefslogtreecommitdiff
path: root/tests/check/tests.py
blob: 19b3840a9aaf4f35b30be3b1ec04aaedb08f61d1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
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