Modified test_utils to work with unittest2 discovery.

This commit is contained in:
Preston Timmons 2013-04-06 12:09:44 -05:00 committed by Carl Meyer
parent cdf520ee86
commit 751b007c98
3 changed files with 95 additions and 83 deletions

View File

@ -42,6 +42,13 @@ def get_tests(app_module):
return test_module return test_module
def make_doctest(module):
return doctest.DocTestSuite(module,
checker=doctestOutputChecker,
runner=DocTestRunner,
)
def build_suite(app_module): def build_suite(app_module):
""" """
Create a complete Django test suite for the provided application module. Create a complete Django test suite for the provided application module.
@ -56,9 +63,7 @@ def build_suite(app_module):
suite.addTest(unittest.defaultTestLoader.loadTestsFromModule( suite.addTest(unittest.defaultTestLoader.loadTestsFromModule(
app_module)) app_module))
try: try:
suite.addTest(doctest.DocTestSuite(app_module, suite.addTest(make_doctest(app_module))
checker=doctestOutputChecker,
runner=DocTestRunner))
except ValueError: except ValueError:
# No doc tests in models.py # No doc tests in models.py
pass pass
@ -75,9 +80,7 @@ def build_suite(app_module):
suite.addTest(unittest.defaultTestLoader.loadTestsFromModule( suite.addTest(unittest.defaultTestLoader.loadTestsFromModule(
test_module)) test_module))
try: try:
suite.addTest(doctest.DocTestSuite( suite.addTest(make_doctest(test_module))
test_module, checker=doctestOutputChecker,
runner=DocTestRunner))
except ValueError: except ValueError:
# No doc tests in tests.py # No doc tests in tests.py
pass pass
@ -130,9 +133,7 @@ def build_test(label):
tests = [] tests = []
for module in app_module, test_module: for module in app_module, test_module:
try: try:
doctests = doctest.DocTestSuite(module, doctests = make_doctest(module)
checker=doctestOutputChecker,
runner=DocTestRunner)
# Now iterate over the suite, looking for doctests whose name # Now iterate over the suite, looking for doctests whose name
# matches the pattern that was given # matches the pattern that was given
for test in doctests: for test in doctests:

View File

@ -0,0 +1,77 @@
from django.utils import six
__test__ = {"API_TEST": r"""
# Some checks of the doctest output normalizer.
# Standard doctests do fairly
>>> import json
>>> from django.utils.xmlutils import SimplerXMLGenerator
>>> from django.utils.six import StringIO
>>> def produce_json():
... return json.dumps(['foo', {'bar': ('baz', None, 1.0, 2), 'whiz': 42}])
>>> def produce_xml():
... stream = StringIO()
... xml = SimplerXMLGenerator(stream, encoding='utf-8')
... xml.startDocument()
... xml.startElement("foo", {"aaa" : "1.0", "bbb": "2.0"})
... xml.startElement("bar", {"ccc" : "3.0"})
... xml.characters("Hello")
... xml.endElement("bar")
... xml.startElement("whiz", {})
... xml.characters("Goodbye")
... xml.endElement("whiz")
... xml.endElement("foo")
... xml.endDocument()
... return stream.getvalue()
>>> def produce_xml_fragment():
... stream = StringIO()
... xml = SimplerXMLGenerator(stream, encoding='utf-8')
... xml.startElement("foo", {"aaa": "1.0", "bbb": "2.0"})
... xml.characters("Hello")
... xml.endElement("foo")
... xml.startElement("bar", {"ccc": "3.0", "ddd": "4.0"})
... xml.endElement("bar")
... return stream.getvalue()
# JSON output is normalized for field order, so it doesn't matter
# which order json dictionary attributes are listed in output
>>> produce_json()
'["foo", {"bar": ["baz", null, 1.0, 2], "whiz": 42}]'
>>> produce_json()
'["foo", {"whiz": 42, "bar": ["baz", null, 1.0, 2]}]'
# XML output is normalized for attribute order, so it doesn't matter
# which order XML element attributes are listed in output
>>> produce_xml()
'<?xml version="1.0" encoding="UTF-8"?>\n<foo aaa="1.0" bbb="2.0"><bar ccc="3.0">Hello</bar><whiz>Goodbye</whiz></foo>'
>>> produce_xml()
'<?xml version="1.0" encoding="UTF-8"?>\n<foo bbb="2.0" aaa="1.0"><bar ccc="3.0">Hello</bar><whiz>Goodbye</whiz></foo>'
>>> produce_xml_fragment()
'<foo aaa="1.0" bbb="2.0">Hello</foo><bar ccc="3.0" ddd="4.0"></bar>'
>>> produce_xml_fragment()
'<foo bbb="2.0" aaa="1.0">Hello</foo><bar ddd="4.0" ccc="3.0"></bar>'
"""}
if not six.PY3:
__test__["API_TEST"] += """
>>> def produce_long():
... return 42L
>>> def produce_int():
... return 42
# Long values are normalized and are comparable to normal integers ...
>>> produce_long()
42
# ... and vice versa
>>> produce_int()
42L
"""

View File

@ -1,5 +1,6 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from __future__ import absolute_import, unicode_literals from __future__ import absolute_import, unicode_literals
from StringIO import StringIO
import warnings import warnings
from django.db import connection from django.db import connection
@ -8,8 +9,10 @@ from django.http import HttpResponse
from django.template.loader import render_to_string from django.template.loader import render_to_string
from django.test import SimpleTestCase, TestCase, skipUnlessDBFeature from django.test import SimpleTestCase, TestCase, skipUnlessDBFeature
from django.test.html import HTMLParseError, parse_html from django.test.html import HTMLParseError, parse_html
from django.test.simple import make_doctest
from django.test.utils import CaptureQueriesContext from django.test.utils import CaptureQueriesContext
from django.utils import six from django.utils import six
from django.utils import unittest
from django.utils.unittest import skip from django.utils.unittest import skip
from .models import Person from .models import Person
@ -621,79 +624,10 @@ class AssertFieldOutputTests(SimpleTestCase):
} }
self.assertFieldOutput(MyCustomField, {}, {}, empty_value=None) self.assertFieldOutput(MyCustomField, {}, {}, empty_value=None)
__test__ = {"API_TEST": r"""
# Some checks of the doctest output normalizer.
# Standard doctests do fairly
>>> import json
>>> from django.utils.xmlutils import SimplerXMLGenerator
>>> from django.utils.six import StringIO
>>> def produce_json(): class DoctestNormalizerTest(SimpleTestCase):
... return json.dumps(['foo', {'bar': ('baz', None, 1.0, 2), 'whiz': 42}])
>>> def produce_xml(): def test_normalizer(self):
... stream = StringIO() suite = make_doctest("test_utils.doctest_output")
... xml = SimplerXMLGenerator(stream, encoding='utf-8') failures = unittest.TextTestRunner(stream=StringIO()).run(suite)
... xml.startDocument() self.assertEqual(failures.failures, [])
... xml.startElement("foo", {"aaa" : "1.0", "bbb": "2.0"})
... xml.startElement("bar", {"ccc" : "3.0"})
... xml.characters("Hello")
... xml.endElement("bar")
... xml.startElement("whiz", {})
... xml.characters("Goodbye")
... xml.endElement("whiz")
... xml.endElement("foo")
... xml.endDocument()
... return stream.getvalue()
>>> def produce_xml_fragment():
... stream = StringIO()
... xml = SimplerXMLGenerator(stream, encoding='utf-8')
... xml.startElement("foo", {"aaa": "1.0", "bbb": "2.0"})
... xml.characters("Hello")
... xml.endElement("foo")
... xml.startElement("bar", {"ccc": "3.0", "ddd": "4.0"})
... xml.endElement("bar")
... return stream.getvalue()
# JSON output is normalized for field order, so it doesn't matter
# which order json dictionary attributes are listed in output
>>> produce_json()
'["foo", {"bar": ["baz", null, 1.0, 2], "whiz": 42}]'
>>> produce_json()
'["foo", {"whiz": 42, "bar": ["baz", null, 1.0, 2]}]'
# XML output is normalized for attribute order, so it doesn't matter
# which order XML element attributes are listed in output
>>> produce_xml()
'<?xml version="1.0" encoding="UTF-8"?>\n<foo aaa="1.0" bbb="2.0"><bar ccc="3.0">Hello</bar><whiz>Goodbye</whiz></foo>'
>>> produce_xml()
'<?xml version="1.0" encoding="UTF-8"?>\n<foo bbb="2.0" aaa="1.0"><bar ccc="3.0">Hello</bar><whiz>Goodbye</whiz></foo>'
>>> produce_xml_fragment()
'<foo aaa="1.0" bbb="2.0">Hello</foo><bar ccc="3.0" ddd="4.0"></bar>'
>>> produce_xml_fragment()
'<foo bbb="2.0" aaa="1.0">Hello</foo><bar ddd="4.0" ccc="3.0"></bar>'
"""}
if not six.PY3:
__test__["API_TEST"] += """
>>> def produce_long():
... return 42L
>>> def produce_int():
... return 42
# Long values are normalized and are comparable to normal integers ...
>>> produce_long()
42
# ... and vice versa
>>> produce_int()
42L
"""