from twisted.python import filepath
from nevow import athena,loaders,tags,rend,url,static,util
staticData = filepath.FilePath(__file__).parent().child('static')
class TestSuiteFragment(athena.LiveFragment):
jsClass = u'Nevow.Athena.Test.TestSuite'
docFactory = loaders.stan(tags.invisible(render=tags.directive('tests')))
def __init__(self, suite):
super(TestSuiteFragment, self).__init__()
self.suite = suite
self.testInstances = suite.gatherInstances()
def gatherTests(self, testInstances):
suiteTag = tags.div()
for test in testInstances:
if isinstance(test, list):
suiteTag[self.gatherTests(testInstances)]
else:
test.setFragmentParent(self)
suiteTag[test]
return suiteTag
def gatherHead(self):
head = []
def gather(testInstances):
for test in testInstances:
if isinstance(test, list):
head.extend(gather(test))
else:
head.append(test.head())
gather(self.testInstances)
return filter(None, head)
def render_tests(self, ctx, data):
return ctx.tag[self.gatherTests(self.testInstances)]
class TestRunner(TestSuiteFragment):
jsClass = u'Nevow.Athena.Test.TestRunner'
docFactory = loaders.stan(
tags.div(_class='test-runner', render=tags.directive('liveFragment'))[
tags.form(action='#')[
athena.handler(event='onsubmit', handler='runWithDefaults'),
tags.input(type='submit', value='Run Tests')],
tags.div[
tags.div[
tags.div['Tests passed: ', tags.span(_class='test-success-count')[0]],
tags.div['Tests failed: ', tags.span(_class='test-failure-count')[0]],
tags.div['Tests completed in: ', tags.span(_class='test-time')['-']],
tags.div(render=tags.directive('debug'))],
tags.hr,
tags.div[tags.span(_class='test-results')],
tags.hr,
tags.div(render=tags.directive('tests'))]])
def render_debug(self, ctx, data):
f = athena.IntrospectionFragment()
f.setFragmentParent(self)
return f
DOCTYPE_XHTML = (
'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" '
'"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">')
class TestFramework(athena.LivePage):
addSlash = True
docFactory = loaders.stan([
tags.xml(DOCTYPE_XHTML),
tags.html[
tags.head(render=tags.directive('liveglue'))[
tags.link(rel='stylesheet', href='livetest.css'),
tags.directive('head')],
tags.body[
tags.invisible(render=tags.directive('runner'))]]])
def __init__(self, testSuite):
super(TestFramework, self).__init__()
self.testSuite = testSuite
self.children = {
'livetest.css': static.File(util.resource_filename('nevow.livetrial', 'livetest.css')),
}
def beforeRender(self, ctx):
self.runner = TestRunner(self.testSuite)
def render_runner(self, ctx, data):
self.runner.setFragmentParent(self)
return self.runner
def render_head(self, ctx, data):
return self.runner.gatherHead()
class TestFrameworkRoot(rend.Page):
def child_app(self, ctx):
return TestFramework(self.original)
child_ = url.URL.fromString('/app')
|