Moving some of the setup out to the module level to avoid repeating things unnecessary. In particular applying fixtures and finding patterns and testurls need only be done once.

- Legacy-Id: 469
This commit is contained in:
Henrik Levkowetz 2007-06-17 11:25:48 +00:00
parent 63754d4b2b
commit f303d6f226

View file

@ -102,24 +102,20 @@ def note(string):
print now.strftime(" %Y-%m-%d_%H:%M"), "+%ds" % (now-prev_note_time).seconds
prev_note_time = datetime.utcnow()
class UrlTestCase(TestCase):
def setUp(self):
from django.test.client import Client
self.client = Client()
def module_setup(module):
# get selected prefixes, if any
self.prefixes = os.environ.get("URLPREFIX", "").split()
module.prefixes = os.environ.get("URLPREFIX", "").split()
# find test urls
self.testtuples = []
self.testurls = []
self.diffchunks = []
module.testtuples = []
module.testurls = []
module.diffchunks = []
for root, dirs, files in os.walk(settings.BASE_DIR):
if "testurl.list" in files:
self.testtuples += read_testurls(root+"/testurl.list")
module.testtuples += read_testurls(root+"/testurl.list")
if "testurls.list" in files:
self.testtuples += read_testurls(root+"/testurls.list")
self.testurls = [ tuple[1] for tuple in self.testtuples ]
module.testtuples += read_testurls(root+"/testurls.list")
module.testurls = [ tuple[1] for tuple in module.testtuples ]
# find diff chunks
testdir = os.path.abspath(settings.BASE_DIR+"/../test/diff/")
@ -132,22 +128,42 @@ class UrlTestCase(TestCase):
chunk = re.sub(r"(?m)^@@ -\d+,(\d+) \\\+\d+,(\d+) @@$", r"@@ -\d+,\1 \+\d+,\2 @@", chunk)
#print "*** Installing diff chunk:"
#print chunk
self.diffchunks.append(chunk)
module.diffchunks.append(chunk)
# extract application urls:
self.patterns = get_patterns(ietf.urls)
module.patterns = get_patterns(ietf.urls)
# apply prefix filters
self.patterns = [ pattern for pattern in self.patterns for prefix in self.prefixes if re.match(prefix, pattern) ]
self.testtuples = [ tuple for tuple in self.testtuples for prefix in self.prefixes if re.match(prefix, tuple[1][1:]) ]
module.patterns = [ pattern for pattern in module.patterns for prefix in module.prefixes if re.match(prefix, pattern) ]
module.testtuples = [ tuple for tuple in module.testtuples for prefix in module.prefixes if re.match(prefix, tuple[1][1:]) ]
# Use the default database for the url tests, instead of the test database
self.testdb = settings.DATABASE_NAME
module.testdb = settings.DATABASE_NAME
connection.close()
settings.DATABASE_NAME = startup_database
# Install updated fixtures:
# Also has the side effect of creating the database connection.
management.syncdb(verbosity=1, interactive=False)
connection.close()
settings.DATABASE_NAME = module.testdb
connection.cursor()
class UrlTestCase(TestCase):
def __init__(self, *args, **kwargs):
TestCase.__init__(self, *args, **kwargs)
def setUp(self):
from django.test.client import Client
self.client = Client()
self.testdb = settings.DATABASE_NAME
connection.close()
settings.DATABASE_NAME = startup_database
connection.cursor()
def tearDown(self):
# Revert to using the test database
@ -157,16 +173,16 @@ class UrlTestCase(TestCase):
def testCoverage(self):
covered = []
for codes, testurl, goodurl in self.testtuples:
for pattern in self.patterns:
for codes, testurl, goodurl in module.testtuples:
for pattern in module.patterns:
if re.match(pattern, testurl[1:]):
covered.append(pattern)
# We should have at least one test case for each url pattern declared
# in our Django application:
#self.assertEqual(set(patterns), set(covered), "Not all the
#application URLs has test cases. The missing are: %s" % (list(set(patterns) - set(covered))))
if not set(self.patterns) == set(covered):
missing = list(set(self.patterns) - set(covered))
if not set(module.patterns) == set(covered):
missing = list(set(module.patterns) - set(covered))
print "Not all the application URLs has test cases, there are %d missing." % (len(missing))
print "The ones missing are: "
for pattern in missing:
@ -270,7 +286,7 @@ class UrlTestCase(TestCase):
contextlines = 0
difflist = list(unified_diff(goodtext, testtext, master, url, "", "", contextlines, lineterm=""))
diff = "\n".join(difflist)
for chunk in self.diffchunks:
for chunk in module.diffchunks:
#print "*** Checking for chunk:", chunk[:24]
while re.search(chunk, diff):
#print "*** Removing chunk of %s lines" % (len(chunk.split("\n")))
@ -321,20 +337,20 @@ class UrlTestCase(TestCase):
def testUrlsList(self):
note("\nTesting specified URLs:")
self.doUrlsTest(self.testtuples)
self.doUrlsTest(module.testtuples)
def testRedirectsList(self):
note("\nTesting specified Redirects:")
self.doRedirectsTest(self.testtuples)
self.doRedirectsTest(module.testtuples)
def testUrlsFallback(self):
note("\nFallback: Test access to URLs which don't have an explicit test entry:")
lst = []
for pattern in self.patterns:
for pattern in module.patterns:
if pattern.startswith("^") and pattern.endswith("$"):
url = "/"+pattern[1:-1]
# if there is no variable parts in the url, test it
if re.search("^[-a-z0-9./_]*$", url) and not url in self.testurls and not url.startswith("/admin/"):
if re.search("^[-a-z0-9./_]*$", url) and not url in module.testurls and not url.startswith("/admin/"):
lst.append((["200"], url, None))
else:
#print "No fallback test for %s" % (url)
@ -343,3 +359,9 @@ class UrlTestCase(TestCase):
lst.append((["Skip"], pattern, None))
self.doUrlsTest(lst)
class Module:
pass
module = Module()
module_setup(module)