2010-02-19 17:57:48 -04:00
|
|
|
import operator
|
2008-12-24 14:14:03 +00:00
|
|
|
import unittest
|
|
|
|
|
2009-08-24 10:21:04 -03:00
|
|
|
from scrapy.utils.python import str_to_unicode, unicode_to_str, \
|
2010-02-19 17:57:48 -04:00
|
|
|
memoizemethod_noargs, isbinarytext, equal_attributes
|
2008-12-24 14:14:03 +00:00
|
|
|
|
|
|
|
class UtilsPythonTestCase(unittest.TestCase):
|
|
|
|
def test_str_to_unicode(self):
|
|
|
|
# converting an utf-8 encoded string to unicode
|
|
|
|
self.assertEqual(str_to_unicode('lel\xc3\xb1e'), u'lel\xf1e')
|
|
|
|
|
2009-01-02 18:59:34 +00:00
|
|
|
# converting a latin-1 encoded string to unicode
|
|
|
|
self.assertEqual(str_to_unicode('lel\xf1e', 'latin-1'), u'lel\xf1e')
|
|
|
|
|
2008-12-24 14:14:03 +00:00
|
|
|
# converting a unicode to unicode should return the same object
|
|
|
|
self.assertEqual(str_to_unicode(u'\xf1e\xf1e\xf1e'), u'\xf1e\xf1e\xf1e')
|
|
|
|
|
|
|
|
# converting a strange object should raise TypeError
|
|
|
|
self.assertRaises(TypeError, str_to_unicode, 423)
|
|
|
|
|
|
|
|
def test_unicode_to_str(self):
|
|
|
|
# converting a unicode object to an utf-8 encoded string
|
|
|
|
self.assertEqual(unicode_to_str(u'\xa3 49'), '\xc2\xa3 49')
|
|
|
|
|
2009-01-02 18:59:34 +00:00
|
|
|
# converting a unicode object to a latin-1 encoded string
|
|
|
|
self.assertEqual(unicode_to_str(u'\xa3 49', 'latin-1'), '\xa3 49')
|
|
|
|
|
2008-12-24 14:14:03 +00:00
|
|
|
# converting a regular string to string should return the same object
|
|
|
|
self.assertEqual(unicode_to_str('lel\xf1e'), 'lel\xf1e')
|
|
|
|
|
|
|
|
# converting a strange object should raise TypeError
|
|
|
|
self.assertRaises(TypeError, unicode_to_str, unittest)
|
|
|
|
|
2009-08-24 10:21:04 -03:00
|
|
|
def test_memoizemethod_noargs(self):
|
2009-01-26 02:57:03 +00:00
|
|
|
class A(object):
|
|
|
|
|
2009-08-24 10:21:04 -03:00
|
|
|
@memoizemethod_noargs
|
|
|
|
def cached(self):
|
|
|
|
return object()
|
|
|
|
|
|
|
|
def noncached(self):
|
|
|
|
return object()
|
2009-01-26 02:57:03 +00:00
|
|
|
|
|
|
|
a = A()
|
2009-08-24 10:21:04 -03:00
|
|
|
one = a.cached()
|
|
|
|
two = a.cached()
|
|
|
|
three = a.noncached()
|
2009-01-26 02:57:03 +00:00
|
|
|
assert one is two
|
|
|
|
assert one is not three
|
|
|
|
|
|
|
|
def test_isbinarytext(self):
|
|
|
|
|
|
|
|
# basic tests
|
|
|
|
assert not isbinarytext("hello")
|
|
|
|
|
|
|
|
# utf-16 strings contain null bytes
|
|
|
|
assert not isbinarytext(u"hello".encode('utf-16'))
|
|
|
|
|
|
|
|
# one with encoding
|
|
|
|
assert not isbinarytext("<div>Price \xa3</div>")
|
|
|
|
|
|
|
|
# finally some real binary bytes
|
|
|
|
assert isbinarytext("\x02\xa3")
|
|
|
|
|
2010-02-19 17:57:48 -04:00
|
|
|
def test_equal_attributes(self):
|
|
|
|
class Obj:
|
|
|
|
pass
|
|
|
|
|
|
|
|
a = Obj()
|
|
|
|
b = Obj()
|
|
|
|
# no attributes given return False
|
|
|
|
self.failIf(equal_attributes(a, b, []))
|
|
|
|
# not existent attributes
|
|
|
|
self.failIf(equal_attributes(a, b, ['x', 'y']))
|
|
|
|
|
|
|
|
a.x = 1
|
|
|
|
b.x = 1
|
|
|
|
# equal attribute
|
|
|
|
self.failUnless(equal_attributes(a, b, ['x']))
|
|
|
|
|
|
|
|
b.y = 2
|
|
|
|
# obj1 has no attribute y
|
|
|
|
self.failIf(equal_attributes(a, b, ['x', 'y']))
|
|
|
|
|
|
|
|
a.y = 2
|
|
|
|
# equal attributes
|
|
|
|
self.failUnless(equal_attributes(a, b, ['x', 'y']))
|
|
|
|
|
|
|
|
a.y = 1
|
|
|
|
# differente attributes
|
|
|
|
self.failIf(equal_attributes(a, b, ['x', 'y']))
|
|
|
|
|
|
|
|
# test callable
|
|
|
|
a.meta = {}
|
|
|
|
b.meta = {}
|
|
|
|
self.failUnless(equal_attributes(a, b, ['meta']))
|
|
|
|
|
|
|
|
# compare ['meta']['a']
|
|
|
|
a.meta['z'] = 1
|
|
|
|
b.meta['z'] = 1
|
|
|
|
|
|
|
|
get_z = operator.itemgetter('z')
|
|
|
|
get_meta = operator.attrgetter('meta')
|
|
|
|
compare_z = lambda obj: get_z(get_meta(obj))
|
|
|
|
|
|
|
|
self.failUnless(equal_attributes(a, b, [compare_z, 'x']))
|
|
|
|
# fail z equality
|
|
|
|
a.meta['z'] = 2
|
|
|
|
self.failIf(equal_attributes(a, b, [compare_z, 'x']))
|
|
|
|
|
|
|
|
|
2008-12-24 14:14:03 +00:00
|
|
|
if __name__ == "__main__":
|
|
|
|
unittest.main()
|