summaryrefslogtreecommitdiff
path: root/tests/test_runner/test_debug_sql.py
blob: 7bc0950d8434ef9ac3b2acaff22ec405d3dc2e93 (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
import unittest

from django.db import connection
from django.test import TestCase
from django.test.runner import DiscoverRunner
from django.utils import six

from .models import Person


@unittest.skipUnless(connection.vendor == 'sqlite', 'Only run on sqlite so we can check output SQL.')
class TestDebugSQL(unittest.TestCase):

    class PassingTest(TestCase):
        def runTest(self):
            Person.objects.filter(first_name='pass').count()

    class FailingTest(TestCase):
        def runTest(self):
            Person.objects.filter(first_name='fail').count()
            self.fail()

    class ErrorTest(TestCase):
        def runTest(self):
            Person.objects.filter(first_name='error').count()
            raise Exception

    def _test_output(self, verbosity):
        runner = DiscoverRunner(debug_sql=True, verbosity=0)
        suite = runner.test_suite()
        suite.addTest(self.FailingTest())
        suite.addTest(self.ErrorTest())
        suite.addTest(self.PassingTest())
        old_config = runner.setup_databases()
        stream = six.StringIO()
        resultclass = runner.get_resultclass()
        runner.test_runner(
            verbosity=verbosity,
            stream=stream,
            resultclass=resultclass,
        ).run(suite)
        runner.teardown_databases(old_config)

        stream.seek(0)
        return stream.read()

    def test_output_normal(self):
        full_output = self._test_output(1)
        for output in self.expected_outputs:
            self.assertIn(output, full_output)
        for output in self.verbose_expected_outputs:
            self.assertNotIn(output, full_output)

    def test_output_verbose(self):
        full_output = self._test_output(2)
        for output in self.expected_outputs:
            self.assertIn(output, full_output)
        for output in self.verbose_expected_outputs:
            self.assertIn(output, full_output)

    if six.PY3:
        expected_outputs = [
            ('''QUERY = 'SELECT COUNT(%s) AS "__count" '''
                '''FROM "test_runner_person" WHERE '''
                '''"test_runner_person"."first_name" = %s' '''
                '''- PARAMS = ('*', 'error');'''),
            ('''QUERY = 'SELECT COUNT(%s) AS "__count" '''
                '''FROM "test_runner_person" WHERE '''
                '''"test_runner_person"."first_name" = %s' '''
                '''- PARAMS = ('*', 'fail');'''),
        ]
    else:
        expected_outputs = [
            ('''QUERY = u'SELECT COUNT(%s) AS "__count" '''
                '''FROM "test_runner_person" WHERE '''
                '''"test_runner_person"."first_name" = %s' '''
                '''- PARAMS = (u'*', u'error');'''),
            ('''QUERY = u'SELECT COUNT(%s) AS "__count" '''
                '''FROM "test_runner_person" WHERE '''
                '''"test_runner_person"."first_name" = %s' '''
                '''- PARAMS = (u'*', u'fail');'''),
        ]

    verbose_expected_outputs = [
        'runTest (test_runner.test_debug_sql.FailingTest) ... FAIL',
        'runTest (test_runner.test_debug_sql.ErrorTest) ... ERROR',
        'runTest (test_runner.test_debug_sql.PassingTest) ... ok',
    ]
    if six.PY3:
        verbose_expected_outputs += [
            ('''QUERY = 'SELECT COUNT(%s) AS "__count" '''
                '''FROM "test_runner_person" WHERE '''
                '''"test_runner_person"."first_name" = %s' '''
                '''- PARAMS = ('*', 'pass');'''),
        ]
    else:
        verbose_expected_outputs += [
            ('''QUERY = u'SELECT COUNT(%s) AS "__count" '''
                '''FROM "test_runner_person" WHERE '''
                '''"test_runner_person"."first_name" = %s' '''
                '''- PARAMS = (u'*', u'pass');'''),
        ]