/usr/lib/python2.7/dist-packages/cssutils/tests/basetest.py is in python-cssutils 1.0.2-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 | """Base class for all tests"""
import logging
import os
import re
import sys
import StringIO
import unittest
import urllib2
from email import message_from_string, message_from_file
# add src to PYTHONPATH
sys.path.append(os.path.join(os.path.abspath('.'), '..'))
import cssutils
PY2x = sys.version_info < (3,0)
def msg3x(msg):
"""msg might contain unicode repr `u'...'` which in py3 is `u'...`
needed by tests using ``assertRaisesMsg``"""
if not PY2x and msg.find("u'"):
msg = msg.replace("u'", "'")
return msg
def get_resource_filename(resource_name):
"""Get the resource filename.
If the module is zipped, the file will be extracted and the temporary name
is returned instead.
"""
try:
from pkg_resources import resource_filename
except ImportError:
this_dir = os.path.dirname(__file__)
parts = resource_name.split('/')
return os.path.normpath(os.path.join(this_dir, '..', *parts))
else:
return resource_filename('cssutils', resource_name)
def get_sheet_filename(sheet_name):
"""Get the filename for the given sheet."""
# Extract all sheets since they might use @import
sheet_dir = get_resource_filename('tests/sheets')
return os.path.join(sheet_dir, sheet_name)
class BaseTestCase(unittest.TestCase):
def _tempSer(self):
"Replace default ser with temp ser."
self._ser = cssutils.ser
cssutils.ser = cssutils.serialize.CSSSerializer()
def _restoreSer(self):
"Restore the default ser."
cssutils.ser = self._ser
def setUp(self):
# a raising parser!!!
cssutils.log.raiseExceptions = True
cssutils.log.setLevel(logging.FATAL)
self.p = cssutils.CSSParser(raiseExceptions=True)
def tearDown(self):
if hasattr(self, '_ser'):
self._restoreSer()
def assertRaisesEx(self, exception, callable, *args, **kwargs):
"""
from
http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/307970
"""
if "exc_args" in kwargs:
exc_args = kwargs["exc_args"]
del kwargs["exc_args"]
else:
exc_args = None
if "exc_pattern" in kwargs:
exc_pattern = kwargs["exc_pattern"]
del kwargs["exc_pattern"]
else:
exc_pattern = None
argv = [repr(a) for a in args]\
+ ["%s=%r" % (k,v) for k,v in kwargs.items()]
callsig = "%s(%s)" % (callable.__name__, ", ".join(argv))
try:
callable(*args, **kwargs)
except exception, exc:
if exc_args is not None:
self.failIf(exc.args != exc_args,
"%s raised %s with unexpected args: "\
"expected=%r, actual=%r"\
% (callsig, exc.__class__, exc_args, exc.args))
if exc_pattern is not None:
self.assertTrue(exc_pattern.search(str(exc)),
"%s raised %s, but the exception "\
"does not match '%s': %r"\
% (callsig, exc.__class__, exc_pattern.pattern,
str(exc)))
except:
exc_info = sys.exc_info()
print exc_info
self.fail("%s raised an unexpected exception type: "\
"expected=%s, actual=%s"\
% (callsig, exception, exc_info[0]))
else:
self.fail("%s did not raise %s" % (callsig, exception))
def assertRaisesMsg(self, excClass, msg, callableObj, *args, **kwargs):
"""
Just like unittest.TestCase.assertRaises,
but checks that the message is right too.
Usage::
self.assertRaisesMsg(
MyException, "Exception message",
my_function, (arg1, arg2)
)
from
http://www.nedbatchelder.com/blog/200609.html#e20060905T064418
"""
try:
callableObj(*args, **kwargs)
except excClass, exc:
excMsg = unicode(exc)
if not msg:
# No message provided: any message is fine.
return
elif excMsg == msg:
# Message provided, and we got the right message: passes.
return
else:
# Message provided, and it didn't match: fail!
raise self.failureException(
u"Right exception, wrong message: got '%s' instead of '%s'" %
(excMsg, msg))
else:
if hasattr(excClass, '__name__'):
excName = excClass.__name__
else:
excName = str(excClass)
raise self.failureException(
"Expected to raise %s, didn't get an exception at all" %
excName
)
def do_equal_p(self, tests, att='cssText', debug=False, raising=True):
"""
if raising self.p is used for parsing, else self.pf
"""
p = cssutils.CSSParser(raiseExceptions=raising)
# parses with self.p and checks att of result
for test, expected in tests.items():
if debug:
print '"%s"' % test
s = p.parseString(test)
if expected is None:
expected = test
self.assertEqual(expected, unicode(s.__getattribute__(att), 'utf-8'))
def do_raise_p(self, tests, debug=False, raising=True):
# parses with self.p and expects raise
p = cssutils.CSSParser(raiseExceptions=raising)
for test, expected in tests.items():
if debug:
print '"%s"' % test
self.assertRaises(expected, p.parseString, test)
def do_equal_r(self, tests, att='cssText', debug=False):
# sets attribute att of self.r and asserts Equal
for test, expected in tests.items():
if debug:
print '"%s"' % test
self.r.__setattr__(att, test)
if expected is None:
expected = test
self.assertEqual(expected, self.r.__getattribute__(att))
def do_raise_r(self, tests, att='_setCssText', debug=False):
# sets self.r and asserts raise
for test, expected in tests.items():
if debug:
print '"%s"' % test
self.assertRaises(expected, self.r.__getattribute__(att), test)
def do_raise_r_list(self, tests, err, att='_setCssText', debug=False):
# sets self.r and asserts raise
for test in tests:
if debug:
print '"%s"' % test
self.assertRaises(err, self.r.__getattribute__(att), test)
class GenerateTests(type):
"""Metaclass to handle a parametrized test.
This works by generating many test methods from a single method.
To generate the methods, you need the base method with the prefix
"gen_test_", which takes the parameters. Then you define the attribute
"cases" on this method with a list of cases. Each case is a tuple, which is
unpacked when the test is called.
Example::
def gen_test_length(self, string, expected):
self.assertEquals(len(string), expected)
gen_test_length.cases = [
("a", 1),
("aa", 2),
]
"""
def __new__(cls, name, bases, attrs):
new_attrs = {}
for aname, aobj in attrs.items():
if not aname.startswith("gen_test_"):
new_attrs[aname] = aobj
continue
# Strip off the gen_
test_name = aname[4:]
cases = aobj.cases
for case_num, case in enumerate(cases):
stringed_case = cls.make_case_repr(case)
case_name = "%s_%s_%s" % (test_name, case_num, stringed_case)
# Force the closure binding
def make_wrapper(case=case, aobj=aobj):
def wrapper(self):
aobj(self, *case)
return wrapper
wrapper = make_wrapper()
wrapper.__name__ = case_name
wrapper.__doc__ = "%s(%s)" % (test_name,
", ".join(map(repr, case)))
if aobj.__doc__ is not None:
wrapper.__doc__ += "\n\n" + aobj.__doc__
new_attrs[case_name] = wrapper
return type(name, bases, new_attrs)
@classmethod
def make_case_repr(cls, case):
if isinstance(case, str):
value = case
else:
try:
iter(case)
except TypeError:
value = repr(case)
else:
value = '_'.join(cls.make_case_repr(x) for x in case)
value = re.sub('[^A-Za-z_]', '_', value)
value = re.sub('_{2,}', '_', value)
return value
|