import sys
import os
import optparse
import unittest2 as unittest
from xml.sax import saxutils
from nose.tools import eq_
from nose.plugins.xunit import Xunit, escape_cdata
from nose.exc import SkipTest
from nose.config import Config
def mktest():
class TC(unittest.TestCase):
def runTest(self):
pass
test = TC()
return test
mktest.__test__ = False
class TestEscaping(unittest.TestCase):
def setUp(self):
self.x = Xunit()
def test_all(self):
eq_(self.x._quoteattr(
''''''),
('"<baz src="http://foo?f=1&b=2" '
'quote="inix hubris \'maximus\'?" />"'))
def test_unicode_is_utf8_by_default(self):
eq_(self.x._quoteattr(u'Ivan Krsti\u0107'),
'"Ivan Krsti\xc4\x87"')
def test_unicode_custom_utf16_madness(self):
self.x.encoding = 'utf-16'
utf16 = self.x._quoteattr(u'Ivan Krsti\u0107')[1:-1]
# to avoid big/little endian bytes, assert that we can put it back:
eq_(utf16.decode('utf16'), u'Ivan Krsti\u0107')
def test_control_characters(self):
# quoting of \n, \r varies in diff. python versions
n = saxutils.quoteattr('\n')[1:-1]
r = saxutils.quoteattr('\r')[1:-1]
eq_(self.x._quoteattr('foo\n\b\f\r'), '"foo%s??%s"' % (n, r))
eq_(escape_cdata('foo\n\b\f\r'), 'foo\n??\r')
class TestOptions(unittest.TestCase):
def test_defaults(self):
parser = optparse.OptionParser()
x = Xunit()
x.add_options(parser, env={})
(options, args) = parser.parse_args([])
eq_(options.xunit_file, "nosetests.xml")
def test_file_from_environ(self):
parser = optparse.OptionParser()
x = Xunit()
x.add_options(parser, env={'NOSE_XUNIT_FILE': "kangaroo.xml"})
(options, args) = parser.parse_args([])
eq_(options.xunit_file, "kangaroo.xml")
def test_file_from_opt(self):
parser = optparse.OptionParser()
x = Xunit()
x.add_options(parser, env={})
(options, args) = parser.parse_args(["--xunit-file=blagojevich.xml"])
eq_(options.xunit_file, "blagojevich.xml")
class TestXMLOutputWithXML(unittest.TestCase):
def setUp(self):
self.xmlfile = os.path.abspath(
os.path.join(os.path.dirname(__file__),
'support', 'xunit.xml'))
parser = optparse.OptionParser()
self.x = Xunit()
self.x.add_options(parser, env={})
(options, args) = parser.parse_args([
"--with-xunit",
"--xunit-file=%s" % self.xmlfile
])
self.x.configure(options, Config())
try:
import xml.etree.ElementTree
except ImportError:
self.ET = False
else:
self.ET = xml.etree.ElementTree
def tearDown(self):
os.unlink(self.xmlfile)
def get_xml_report(self):
class DummyStream:
pass
self.x.report(DummyStream())
f = open(self.xmlfile, 'r')
return f.read()
f.close()
def test_addFailure(self):
test = mktest()
self.x.startTest(test)
try:
raise AssertionError("one is not 'equal' to two")
except AssertionError:
some_err = sys.exc_info()
self.x.addFailure(test, some_err)
result = self.get_xml_report()
print result
if self.ET:
tree = self.ET.fromstring(result)
eq_(tree.attrib['name'], "nosetests")
eq_(tree.attrib['tests'], "1")
eq_(tree.attrib['errors'], "0")
eq_(tree.attrib['failures'], "1")
eq_(tree.attrib['skip'], "0")
tc = tree.find("testcase")
eq_(tc.attrib['classname'], "test_xunit.TC")
eq_(tc.attrib['name'], "runTest")
assert int(tc.attrib['time']) >= 0
err = tc.find("failure")
eq_(err.attrib['type'], "exceptions.AssertionError")
err_lines = err.text.strip().split("\n")
eq_(err_lines[0], 'Traceback (most recent call last):')
eq_(err_lines[-1], 'AssertionError: one is not \'equal\' to two')
eq_(err_lines[-2], ' raise AssertionError("one is not \'equal\' to two")')
else:
# this is a dumb test for 2.4-
assert '' in result
assert '' in result
assert '' in result
def test_addFailure_early(self):
test = mktest()
try:
raise AssertionError("one is not equal to two")
except AssertionError:
some_err = sys.exc_info()
# add failure without startTest, due to custom TestResult munging?
self.x.addFailure(test, some_err)
result = self.get_xml_report()
print result
if self.ET:
tree = self.ET.fromstring(result)
tc = tree.find("testcase")
eq_(tc.attrib['time'], "0")
else:
# this is a dumb test for 2.4-
assert '' in result
assert ('') in result
def test_addError(self):
test = mktest()
self.x.startTest(test)
try:
raise RuntimeError("some error happened")
except RuntimeError:
some_err = sys.exc_info()
self.x.addError(test, some_err)
result = self.get_xml_report()
print result
if self.ET:
tree = self.ET.fromstring(result)
eq_(tree.attrib['name'], "nosetests")
eq_(tree.attrib['tests'], "1")
eq_(tree.attrib['errors'], "1")
eq_(tree.attrib['failures'], "0")
eq_(tree.attrib['skip'], "0")
tc = tree.find("testcase")
eq_(tc.attrib['classname'], "test_xunit.TC")
eq_(tc.attrib['name'], "runTest")
assert int(tc.attrib['time']) >= 0
err = tc.find("error")
eq_(err.attrib['type'], "exceptions.RuntimeError")
err_lines = err.text.strip().split("\n")
eq_(err_lines[0], 'Traceback (most recent call last):')
eq_(err_lines[-1], 'RuntimeError: some error happened')
eq_(err_lines[-2], ' raise RuntimeError("some error happened")')
else:
# this is a dumb test for 2.4-
assert '' in result
assert '' in result
assert '' in result
def test_addError_early(self):
test = mktest()
try:
raise RuntimeError("some error happened")
except RuntimeError:
some_err = sys.exc_info()
# call addError without startTest
# which can happen if setup() raises an error
self.x.addError(test, some_err)
result = self.get_xml_report()
print result
if self.ET:
tree = self.ET.fromstring(result)
tc = tree.find("testcase")
eq_(tc.attrib['time'], "0")
else:
# this is a dumb test for 2.4-
assert '' in result
assert ('') in result
def test_addSuccess(self):
test = mktest()
self.x.startTest(test)
self.x.addSuccess(test, (None,None,None))
result = self.get_xml_report()
print result
if self.ET:
tree = self.ET.fromstring(result)
eq_(tree.attrib['name'], "nosetests")
eq_(tree.attrib['tests'], "1")
eq_(tree.attrib['errors'], "0")
eq_(tree.attrib['failures'], "0")
eq_(tree.attrib['skip'], "0")
tc = tree.find("testcase")
eq_(tc.attrib['classname'], "test_xunit.TC")
eq_(tc.attrib['name'], "runTest")
assert int(tc.attrib['time']) >= 0
else:
# this is a dumb test for 2.4-
assert '' in result
assert '' in result
assert '' in result
def test_addSuccess_early(self):
test = mktest()
# call addSuccess without startTest
# which can happen (?) -- did happen with JsLint plugin
self.x.addSuccess(test, (None,None,None))
result = self.get_xml_report()
print result
if self.ET:
tree = self.ET.fromstring(result)
tc = tree.find("testcase")
eq_(tc.attrib['time'], "0")
else:
# this is a dumb test for 2.4-
assert '' in result
assert ('') in result