2006-08-27 20:24:59 +08:00
|
|
|
import re, doctest, unittest
|
|
|
|
from django.db import transaction
|
2007-03-01 21:11:08 +08:00
|
|
|
from django.core import management
|
|
|
|
from django.db.models import get_apps
|
2006-08-27 20:24:59 +08:00
|
|
|
|
|
|
|
normalize_long_ints = lambda s: re.sub(r'(?<![\w])(\d+)L(?![\w])', '\\1', s)
|
|
|
|
|
|
|
|
class OutputChecker(doctest.OutputChecker):
|
|
|
|
def check_output(self, want, got, optionflags):
|
|
|
|
ok = doctest.OutputChecker.check_output(self, want, got, optionflags)
|
|
|
|
|
|
|
|
# Doctest does an exact string comparison of output, which means long
|
|
|
|
# integers aren't equal to normal integers ("22L" vs. "22"). The
|
|
|
|
# following code normalizes long integers so that they equal normal
|
|
|
|
# integers.
|
|
|
|
if not ok:
|
|
|
|
return normalize_long_ints(want) == normalize_long_ints(got)
|
|
|
|
return ok
|
|
|
|
|
|
|
|
class DocTestRunner(doctest.DocTestRunner):
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
|
|
doctest.DocTestRunner.__init__(self, *args, **kwargs)
|
|
|
|
self.optionflags = doctest.ELLIPSIS
|
|
|
|
|
|
|
|
def report_unexpected_exception(self, out, test, example, exc_info):
|
|
|
|
doctest.DocTestRunner.report_unexpected_exception(self,out,test,example,exc_info)
|
|
|
|
|
|
|
|
# Rollback, in case of database errors. Otherwise they'd have
|
|
|
|
# side effects on other tests.
|
|
|
|
from django.db import transaction
|
|
|
|
transaction.rollback_unless_managed()
|
|
|
|
|
2007-03-01 21:11:08 +08:00
|
|
|
class TestCase(unittest.TestCase):
|
|
|
|
def install_fixtures(self):
|
|
|
|
"""If the Test Case class has a 'fixtures' member, clear the database and
|
|
|
|
install the named fixtures at the start of each test.
|
|
|
|
|
|
|
|
"""
|
|
|
|
management.flush(verbosity=0, interactive=False)
|
|
|
|
if hasattr(self, 'fixtures'):
|
|
|
|
management.load_data(self.fixtures, verbosity=0)
|
|
|
|
|
|
|
|
def run(self, result=None):
|
|
|
|
"""Wrapper around default run method so that user-defined Test Cases
|
|
|
|
automatically call install_fixtures without having to include a call to
|
|
|
|
super().
|
|
|
|
|
|
|
|
"""
|
|
|
|
self.install_fixtures()
|
|
|
|
super(TestCase, self).run(result)
|