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
|
# coding: utf-8
from parsel import Selector
from parsel.xpathfuncs import set_xpathfunc
import unittest
class XPathFuncsTestCase(unittest.TestCase):
def test_has_class_simple(self):
body = u"""
<p class="foo bar-baz">First</p>
<p class="foo">Second</p>
<p class="bar">Third</p>
<p>Fourth</p>
"""
sel = Selector(text=body)
self.assertEqual(
[x.extract() for x in sel.xpath('//p[has-class("foo")]/text()')],
[u'First', u'Second'])
self.assertEqual(
[x.extract() for x in sel.xpath('//p[has-class("bar")]/text()')],
[u'Third'])
self.assertEqual(
[x.extract() for x in sel.xpath('//p[has-class("foo","bar")]/text()')],
[])
self.assertEqual(
[x.extract() for x in sel.xpath('//p[has-class("foo","bar-baz")]/text()')],
[u'First'])
def test_has_class_error_no_args(self):
body = u"""
<p CLASS="foo">First</p>
"""
sel = Selector(text=body)
self.assertRaisesRegexp(
ValueError, 'has-class must have at least 1 argument',
sel.xpath, 'has-class()')
def test_has_class_error_invalid_arg_type(self):
body = u"""
<p CLASS="foo">First</p>
"""
sel = Selector(text=body)
self.assertRaisesRegexp(
ValueError, 'has-class arguments must be strings',
sel.xpath, 'has-class(.)')
def test_has_class_error_invalid_unicode(self):
body = u"""
<p CLASS="foo">First</p>
"""
sel = Selector(text=body)
self.assertRaisesRegexp(
ValueError, 'All strings must be XML compatible',
sel.xpath, u'has-class("héllö")'.encode('utf-8'))
def test_has_class_unicode(self):
body = u"""
<p CLASS="fóó">First</p>
"""
sel = Selector(text=body)
self.assertEqual(
[x.extract() for x in sel.xpath(u'//p[has-class("fóó")]/text()')],
[u'First'])
def test_has_class_uppercase(self):
body = u"""
<p CLASS="foo">First</p>
"""
sel = Selector(text=body)
self.assertEqual(
[x.extract() for x in sel.xpath('//p[has-class("foo")]/text()')],
[u'First'])
def test_has_class_newline(self):
body = u"""
<p CLASS="foo
bar">First</p>
"""
sel = Selector(text=body)
self.assertEqual(
[x.extract() for x in sel.xpath(u'//p[has-class("foo")]/text()')],
[u'First'])
def test_has_class_tab(self):
body = u"""
<p CLASS="foo\tbar">First</p>
"""
sel = Selector(text=body)
self.assertEqual(
[x.extract() for x in sel.xpath(u'//p[has-class("foo")]/text()')],
[u'First'])
def test_set_xpathfunc(self):
def myfunc(ctx):
myfunc.call_count += 1
myfunc.call_count = 0
body = u"""
<p CLASS="foo">First</p>
"""
sel = Selector(text=body)
self.assertRaisesRegexp(
ValueError, 'Unregistered function in myfunc',
sel.xpath, 'myfunc()')
set_xpathfunc('myfunc', myfunc)
sel.xpath('myfunc()')
self.assertEqual(myfunc.call_count, 1)
set_xpathfunc('myfunc', None)
self.assertRaisesRegexp(
ValueError, 'Unregistered function in myfunc',
sel.xpath, 'myfunc()')
|