2009-04-12 08:31:55 +00:00
|
|
|
import cgi
|
2009-09-17 14:26:42 -03:00
|
|
|
import unittest
|
2014-07-14 22:18:57 +08:00
|
|
|
from six.moves import xmlrpc_client as xmlrpclib
|
2014-07-14 21:26:37 +08:00
|
|
|
from six.moves.urllib.parse import urlparse
|
2009-04-12 08:31:55 +00:00
|
|
|
|
2012-03-15 11:47:02 -03:00
|
|
|
from scrapy.http import Request, FormRequest, XmlRpcRequest, Headers, HtmlResponse
|
2008-06-28 23:37:28 +00:00
|
|
|
|
2009-09-17 14:26:42 -03:00
|
|
|
|
2008-06-28 23:37:28 +00:00
|
|
|
class RequestTest(unittest.TestCase):
|
|
|
|
|
2009-09-07 09:37:46 -03:00
|
|
|
request_class = Request
|
2009-09-17 14:26:42 -03:00
|
|
|
default_method = 'GET'
|
|
|
|
default_headers = {}
|
|
|
|
default_meta = {}
|
2009-09-07 09:37:46 -03:00
|
|
|
|
2009-01-17 23:57:53 +00:00
|
|
|
def test_init(self):
|
2009-01-18 16:36:17 +00:00
|
|
|
# Request requires url in the constructor
|
2009-09-07 09:37:46 -03:00
|
|
|
self.assertRaises(Exception, self.request_class)
|
2009-01-18 16:36:17 +00:00
|
|
|
|
2009-08-17 21:16:55 -03:00
|
|
|
# url argument must be basestring
|
2009-09-07 09:37:46 -03:00
|
|
|
self.assertRaises(TypeError, self.request_class, 123)
|
|
|
|
r = self.request_class('http://www.example.com')
|
2009-03-24 20:02:42 +00:00
|
|
|
|
2009-09-07 09:37:46 -03:00
|
|
|
r = self.request_class("http://www.example.com")
|
2009-08-17 21:16:55 -03:00
|
|
|
assert isinstance(r.url, str)
|
2009-01-17 23:57:53 +00:00
|
|
|
self.assertEqual(r.url, "http://www.example.com")
|
2009-09-17 14:26:42 -03:00
|
|
|
self.assertEqual(r.method, self.default_method)
|
2009-01-17 23:57:53 +00:00
|
|
|
|
|
|
|
assert isinstance(r.headers, Headers)
|
2009-09-17 14:26:42 -03:00
|
|
|
self.assertEqual(r.headers, self.default_headers)
|
|
|
|
self.assertEqual(r.meta, self.default_meta)
|
2009-01-17 23:57:53 +00:00
|
|
|
|
|
|
|
meta = {"lala": "lolo"}
|
|
|
|
headers = {"caca": "coco"}
|
2009-09-07 09:37:46 -03:00
|
|
|
r = self.request_class("http://www.example.com", meta=meta, headers=headers, body="a body")
|
2009-01-17 23:57:53 +00:00
|
|
|
|
|
|
|
assert r.meta is not meta
|
|
|
|
self.assertEqual(r.meta, meta)
|
|
|
|
assert r.headers is not headers
|
|
|
|
self.assertEqual(r.headers["caca"], "coco")
|
|
|
|
|
2011-06-10 18:22:36 -03:00
|
|
|
def test_url_no_scheme(self):
|
|
|
|
self.assertRaises(ValueError, self.request_class, 'foo')
|
|
|
|
|
2008-06-28 23:37:28 +00:00
|
|
|
def test_headers(self):
|
|
|
|
# Different ways of setting headers attribute
|
|
|
|
url = 'http://www.scrapy.org'
|
|
|
|
headers = {'Accept':'gzip', 'Custom-Header':'nothing to tell you'}
|
2009-09-07 09:37:46 -03:00
|
|
|
r = self.request_class(url=url, headers=headers)
|
|
|
|
p = self.request_class(url=url, headers=r.headers)
|
2008-06-28 23:37:28 +00:00
|
|
|
|
|
|
|
self.assertEqual(r.headers, p.headers)
|
|
|
|
self.assertFalse(r.headers is headers)
|
|
|
|
self.assertFalse(p.headers is r.headers)
|
|
|
|
|
|
|
|
# headers must not be unicode
|
|
|
|
h = Headers({'key1': u'val1', u'key2': 'val2'})
|
|
|
|
h[u'newkey'] = u'newval'
|
2009-01-14 01:17:40 +00:00
|
|
|
for k, v in h.iteritems():
|
2008-06-28 23:37:28 +00:00
|
|
|
self.assert_(isinstance(k, str))
|
2009-04-22 17:21:46 +00:00
|
|
|
for s in v:
|
|
|
|
self.assert_(isinstance(s, str))
|
2008-06-28 23:37:28 +00:00
|
|
|
|
|
|
|
def test_eq(self):
|
|
|
|
url = 'http://www.scrapy.org'
|
2009-09-07 09:37:46 -03:00
|
|
|
r1 = self.request_class(url=url)
|
|
|
|
r2 = self.request_class(url=url)
|
2008-06-28 23:37:28 +00:00
|
|
|
self.assertNotEqual(r1, r2)
|
|
|
|
|
|
|
|
set_ = set()
|
|
|
|
set_.add(r1)
|
|
|
|
set_.add(r2)
|
|
|
|
self.assertEqual(len(set_), 2)
|
|
|
|
|
|
|
|
def test_url(self):
|
|
|
|
"""Request url tests"""
|
2009-09-07 09:37:46 -03:00
|
|
|
r = self.request_class(url="http://www.scrapy.org/path")
|
2008-06-28 23:37:28 +00:00
|
|
|
self.assertEqual(r.url, "http://www.scrapy.org/path")
|
|
|
|
|
|
|
|
# url quoting on creation
|
2009-09-07 09:37:46 -03:00
|
|
|
r = self.request_class(url="http://www.scrapy.org/blank%20space")
|
2008-06-28 23:37:28 +00:00
|
|
|
self.assertEqual(r.url, "http://www.scrapy.org/blank%20space")
|
2009-09-07 09:37:46 -03:00
|
|
|
r = self.request_class(url="http://www.scrapy.org/blank space")
|
2008-06-28 23:37:28 +00:00
|
|
|
self.assertEqual(r.url, "http://www.scrapy.org/blank%20space")
|
|
|
|
|
|
|
|
# url encoding
|
2009-09-07 09:37:46 -03:00
|
|
|
r1 = self.request_class(url=u"http://www.scrapy.org/price/\xa3", encoding="utf-8")
|
|
|
|
r2 = self.request_class(url=u"http://www.scrapy.org/price/\xa3", encoding="latin1")
|
2009-01-20 21:10:18 +00:00
|
|
|
self.assertEqual(r1.url, "http://www.scrapy.org/price/%C2%A3")
|
|
|
|
self.assertEqual(r2.url, "http://www.scrapy.org/price/%A3")
|
|
|
|
|
|
|
|
def test_body(self):
|
2009-09-07 09:37:46 -03:00
|
|
|
r1 = self.request_class(url="http://www.example.com/")
|
2009-01-26 02:57:03 +00:00
|
|
|
assert r1.body == ''
|
2009-01-20 21:10:18 +00:00
|
|
|
|
2009-09-07 09:37:46 -03:00
|
|
|
r2 = self.request_class(url="http://www.example.com/", body="")
|
2009-01-20 21:10:18 +00:00
|
|
|
assert isinstance(r2.body, str)
|
|
|
|
self.assertEqual(r2.encoding, 'utf-8') # default encoding
|
|
|
|
|
2009-09-07 09:37:46 -03:00
|
|
|
r3 = self.request_class(url="http://www.example.com/", body=u"Price: \xa3100", encoding='utf-8')
|
2009-01-20 21:10:18 +00:00
|
|
|
assert isinstance(r3.body, str)
|
|
|
|
self.assertEqual(r3.body, "Price: \xc2\xa3100")
|
|
|
|
|
2009-09-07 09:37:46 -03:00
|
|
|
r4 = self.request_class(url="http://www.example.com/", body=u"Price: \xa3100", encoding='latin1')
|
2009-01-20 21:10:18 +00:00
|
|
|
assert isinstance(r4.body, str)
|
|
|
|
self.assertEqual(r4.body, "Price: \xa3100")
|
2008-06-28 23:37:28 +00:00
|
|
|
|
2011-10-28 16:33:12 -02:00
|
|
|
def test_ajax_url(self):
|
2012-02-07 14:44:06 -02:00
|
|
|
# ascii url
|
2011-10-28 16:33:12 -02:00
|
|
|
r = self.request_class(url="http://www.example.com/ajax.html#!key=value")
|
2014-06-02 16:57:59 +00:00
|
|
|
self.assertEqual(r.url, "http://www.example.com/ajax.html?_escaped_fragment_=key%3Dvalue")
|
2012-02-07 14:44:06 -02:00
|
|
|
# unicode url
|
|
|
|
r = self.request_class(url=u"http://www.example.com/ajax.html#!key=value")
|
2014-06-02 16:57:59 +00:00
|
|
|
self.assertEqual(r.url, "http://www.example.com/ajax.html?_escaped_fragment_=key%3Dvalue")
|
2011-10-28 16:33:12 -02:00
|
|
|
|
2009-01-15 03:24:48 +00:00
|
|
|
def test_copy(self):
|
|
|
|
"""Test Request copy"""
|
2013-01-24 17:47:36 -02:00
|
|
|
|
2009-01-18 17:52:21 +00:00
|
|
|
def somecallback():
|
|
|
|
pass
|
|
|
|
|
2010-06-09 00:44:18 -03:00
|
|
|
r1 = self.request_class("http://www.example.com", callback=somecallback, errback=somecallback)
|
2009-01-15 03:24:48 +00:00
|
|
|
r1.meta['foo'] = 'bar'
|
|
|
|
r2 = r1.copy()
|
|
|
|
|
2010-06-09 00:44:18 -03:00
|
|
|
# make sure copy does not propagate callbacks
|
|
|
|
assert r1.callback is somecallback
|
|
|
|
assert r1.errback is somecallback
|
2010-09-08 00:15:09 -03:00
|
|
|
assert r2.callback is r1.callback
|
|
|
|
assert r2.errback is r2.errback
|
2009-01-18 17:52:21 +00:00
|
|
|
|
2009-01-15 03:24:48 +00:00
|
|
|
# make sure meta dict is shallow copied
|
|
|
|
assert r1.meta is not r2.meta, "meta must be a shallow copy, not identical"
|
|
|
|
self.assertEqual(r1.meta, r2.meta)
|
|
|
|
|
2009-01-18 17:52:21 +00:00
|
|
|
# make sure headers attribute is shallow copied
|
|
|
|
assert r1.headers is not r2.headers, "headers must be a shallow copy, not identical"
|
|
|
|
self.assertEqual(r1.headers, r2.headers)
|
2009-03-24 20:02:42 +00:00
|
|
|
self.assertEqual(r1.encoding, r2.encoding)
|
|
|
|
self.assertEqual(r1.dont_filter, r2.dont_filter)
|
2009-01-18 17:52:21 +00:00
|
|
|
|
|
|
|
# Request.body can be identical since it's an immutable object (str)
|
|
|
|
|
2009-01-17 20:40:07 +00:00
|
|
|
def test_copy_inherited_classes(self):
|
|
|
|
"""Test Request children copies preserve their class"""
|
|
|
|
|
2009-09-07 09:37:46 -03:00
|
|
|
class CustomRequest(self.request_class):
|
2009-01-17 20:40:07 +00:00
|
|
|
pass
|
|
|
|
|
2011-06-10 18:27:39 -03:00
|
|
|
r1 = CustomRequest('http://www.example.com')
|
2009-01-17 20:40:07 +00:00
|
|
|
r2 = r1.copy()
|
|
|
|
|
|
|
|
assert type(r2) is CustomRequest
|
|
|
|
|
2009-01-18 17:52:21 +00:00
|
|
|
def test_replace(self):
|
|
|
|
"""Test Request.replace() method"""
|
2009-09-17 14:26:42 -03:00
|
|
|
r1 = self.request_class("http://www.example.com", method='GET')
|
|
|
|
hdrs = Headers(dict(r1.headers, key='value'))
|
2009-01-18 17:52:21 +00:00
|
|
|
r2 = r1.replace(method="POST", body="New body", headers=hdrs)
|
|
|
|
self.assertEqual(r1.url, r2.url)
|
|
|
|
self.assertEqual((r1.method, r2.method), ("GET", "POST"))
|
2009-01-26 02:57:03 +00:00
|
|
|
self.assertEqual((r1.body, r2.body), ('', "New body"))
|
2009-09-17 14:26:42 -03:00
|
|
|
self.assertEqual((r1.headers, r2.headers), (self.default_headers, hdrs))
|
2009-01-18 17:52:21 +00:00
|
|
|
|
2009-03-24 20:02:42 +00:00
|
|
|
# Empty attributes (which may fail if not compared properly)
|
2009-09-07 09:37:46 -03:00
|
|
|
r3 = self.request_class("http://www.example.com", meta={'a': 1}, dont_filter=True)
|
2009-03-24 21:03:38 +00:00
|
|
|
r4 = r3.replace(url="http://www.example.com/2", body='', meta={}, dont_filter=False)
|
|
|
|
self.assertEqual(r4.url, "http://www.example.com/2")
|
2009-03-24 20:02:42 +00:00
|
|
|
self.assertEqual(r4.body, '')
|
|
|
|
self.assertEqual(r4.meta, {})
|
|
|
|
assert r4.dont_filter is False
|
|
|
|
|
2011-05-02 01:11:19 -03:00
|
|
|
def test_method_always_str(self):
|
|
|
|
r = self.request_class("http://www.example.com", method=u"POST")
|
|
|
|
assert isinstance(r.method, str)
|
|
|
|
|
2013-08-23 12:43:22 -03:00
|
|
|
def test_immutable_attributes(self):
|
|
|
|
r = self.request_class("http://example.com")
|
|
|
|
self.assertRaises(AttributeError, setattr, r, 'url', 'http://example2.com')
|
|
|
|
self.assertRaises(AttributeError, setattr, r, 'body', 'xxx')
|
|
|
|
|
2009-08-18 20:40:04 -03:00
|
|
|
|
2009-09-07 09:37:46 -03:00
|
|
|
class FormRequestTest(RequestTest):
|
2009-01-26 02:57:03 +00:00
|
|
|
|
2009-09-07 09:37:46 -03:00
|
|
|
request_class = FormRequest
|
2009-03-03 00:37:06 +00:00
|
|
|
|
2014-01-30 15:16:31 +01:00
|
|
|
def assertSortedEqual(self, first, second, msg=None):
|
|
|
|
return self.assertEqual(sorted(first), sorted(second), msg)
|
|
|
|
|
2009-03-03 00:37:06 +00:00
|
|
|
def test_empty_formdata(self):
|
2009-09-07 09:37:46 -03:00
|
|
|
r1 = self.request_class("http://www.example.com", formdata={})
|
2009-01-26 02:57:03 +00:00
|
|
|
self.assertEqual(r1.body, '')
|
|
|
|
|
2009-03-03 00:37:06 +00:00
|
|
|
def test_default_encoding(self):
|
2009-01-26 02:57:03 +00:00
|
|
|
# using default encoding (utf-8)
|
|
|
|
data = {'one': 'two', 'price': '\xc2\xa3 100'}
|
2009-09-07 09:37:46 -03:00
|
|
|
r2 = self.request_class("http://www.example.com", formdata=data)
|
2009-05-07 00:36:39 -03:00
|
|
|
self.assertEqual(r2.method, 'POST')
|
2009-01-26 02:57:03 +00:00
|
|
|
self.assertEqual(r2.encoding, 'utf-8')
|
2014-01-30 15:16:31 +01:00
|
|
|
self.assertSortedEqual(r2.body.split('&'),
|
|
|
|
'price=%C2%A3+100&one=two'.split('&'))
|
2009-01-26 02:57:03 +00:00
|
|
|
self.assertEqual(r2.headers['Content-Type'], 'application/x-www-form-urlencoded')
|
|
|
|
|
2009-03-03 00:37:06 +00:00
|
|
|
def test_custom_encoding(self):
|
2009-01-26 02:57:03 +00:00
|
|
|
data = {'price': u'\xa3 100'}
|
2009-09-07 09:37:46 -03:00
|
|
|
r3 = self.request_class("http://www.example.com", formdata=data, encoding='latin1')
|
2009-01-26 02:57:03 +00:00
|
|
|
self.assertEqual(r3.encoding, 'latin1')
|
|
|
|
self.assertEqual(r3.body, 'price=%A3+100')
|
2009-01-17 20:40:07 +00:00
|
|
|
|
2009-03-03 00:37:06 +00:00
|
|
|
def test_multi_key_values(self):
|
2009-02-05 13:41:10 +00:00
|
|
|
# using multiples values for a single key
|
|
|
|
data = {'price': u'\xa3 100', 'colours': ['red', 'blue', 'green']}
|
2009-09-07 09:37:46 -03:00
|
|
|
r3 = self.request_class("http://www.example.com", formdata=data)
|
2014-01-30 15:16:31 +01:00
|
|
|
self.assertSortedEqual(r3.body.split('&'),
|
|
|
|
'colours=red&colours=blue&colours=green&price=%C2%A3+100'.split('&'))
|
2009-02-05 13:41:10 +00:00
|
|
|
|
2009-04-12 08:31:55 +00:00
|
|
|
def test_from_response_post(self):
|
2012-04-19 16:48:02 -03:00
|
|
|
response = _buildresponse(
|
|
|
|
"""<form action="post.php" method="POST">
|
|
|
|
<input type="hidden" name="test" value="val1">
|
|
|
|
<input type="hidden" name="test" value="val2">
|
|
|
|
<input type="hidden" name="test2" value="xxx">
|
|
|
|
</form>""",
|
|
|
|
url="http://www.example.com/this/list.html")
|
|
|
|
req = self.request_class.from_response(response,
|
|
|
|
formdata={'one': ['two', 'three'], 'six': 'seven'})
|
|
|
|
self.assertEqual(req.method, 'POST')
|
|
|
|
self.assertEqual(req.headers['Content-type'], 'application/x-www-form-urlencoded')
|
|
|
|
self.assertEqual(req.url, "http://www.example.com/this/post.php")
|
|
|
|
fs = _qs(req)
|
|
|
|
self.assertEqual(set(fs["test"]), set(["val1", "val2"]))
|
|
|
|
self.assertEqual(set(fs["one"]), set(["two", "three"]))
|
|
|
|
self.assertEqual(fs['test2'], ['xxx'])
|
|
|
|
self.assertEqual(fs['six'], ['seven'])
|
2009-04-12 08:31:55 +00:00
|
|
|
|
2010-07-08 14:02:28 -03:00
|
|
|
def test_from_response_extra_headers(self):
|
2012-04-19 16:48:02 -03:00
|
|
|
response = _buildresponse(
|
|
|
|
"""<form action="post.php" method="POST">
|
|
|
|
<input type="hidden" name="test" value="val1">
|
|
|
|
<input type="hidden" name="test" value="val2">
|
|
|
|
<input type="hidden" name="test2" value="xxx">
|
|
|
|
</form>""")
|
|
|
|
req = self.request_class.from_response(response,
|
|
|
|
formdata={'one': ['two', 'three'], 'six': 'seven'},
|
|
|
|
headers={"Accept-Encoding": "gzip,deflate"})
|
|
|
|
self.assertEqual(req.method, 'POST')
|
|
|
|
self.assertEqual(req.headers['Content-type'], 'application/x-www-form-urlencoded')
|
|
|
|
self.assertEqual(req.headers['Accept-Encoding'], 'gzip,deflate')
|
2010-07-08 14:02:28 -03:00
|
|
|
|
2009-04-12 08:31:55 +00:00
|
|
|
def test_from_response_get(self):
|
2012-04-19 16:48:02 -03:00
|
|
|
response = _buildresponse(
|
|
|
|
"""<form action="get.php" method="GET">
|
|
|
|
<input type="hidden" name="test" value="val1">
|
|
|
|
<input type="hidden" name="test" value="val2">
|
|
|
|
<input type="hidden" name="test2" value="xxx">
|
|
|
|
</form>""",
|
|
|
|
url="http://www.example.com/this/list.html")
|
|
|
|
r1 = self.request_class.from_response(response,
|
|
|
|
formdata={'one': ['two', 'three'], 'six': 'seven'})
|
2009-04-20 02:29:19 +00:00
|
|
|
self.assertEqual(r1.method, 'GET')
|
2009-08-17 21:16:55 -03:00
|
|
|
self.assertEqual(urlparse(r1.url).hostname, "www.example.com")
|
|
|
|
self.assertEqual(urlparse(r1.url).path, "/this/get.php")
|
2012-04-19 16:48:02 -03:00
|
|
|
fs = _qs(r1)
|
|
|
|
self.assertEqual(set(fs['test']), set(['val1', 'val2']))
|
|
|
|
self.assertEqual(set(fs['one']), set(['two', 'three']))
|
|
|
|
self.assertEqual(fs['test2'], ['xxx'])
|
|
|
|
self.assertEqual(fs['six'], ['seven'])
|
2009-04-12 08:31:55 +00:00
|
|
|
|
2009-04-20 02:29:19 +00:00
|
|
|
def test_from_response_override_params(self):
|
2012-04-19 16:48:02 -03:00
|
|
|
response = _buildresponse(
|
|
|
|
"""<form action="get.php" method="POST">
|
|
|
|
<input type="hidden" name="one" value="1">
|
|
|
|
<input type="hidden" name="two" value="3">
|
|
|
|
</form>""")
|
|
|
|
req = self.request_class.from_response(response, formdata={'two': '2'})
|
|
|
|
fs = _qs(req)
|
|
|
|
self.assertEqual(fs['one'], ['1'])
|
|
|
|
self.assertEqual(fs['two'], ['2'])
|
2009-04-20 02:29:19 +00:00
|
|
|
|
2013-03-13 13:38:37 -03:00
|
|
|
def test_from_response_override_method(self):
|
|
|
|
response = _buildresponse(
|
|
|
|
'''<html><body>
|
|
|
|
<form action="/app"></form>
|
|
|
|
</body></html>''')
|
|
|
|
request = FormRequest.from_response(response)
|
|
|
|
self.assertEqual(request.method, 'GET')
|
|
|
|
request = FormRequest.from_response(response, method='POST')
|
|
|
|
self.assertEqual(request.method, 'POST')
|
|
|
|
|
2013-12-30 15:13:18 -02:00
|
|
|
def test_from_response_override_url(self):
|
|
|
|
response = _buildresponse(
|
|
|
|
'''<html><body>
|
|
|
|
<form action="/app"></form>
|
|
|
|
</body></html>''')
|
|
|
|
request = FormRequest.from_response(response)
|
|
|
|
self.assertEqual(request.url, 'http://example.com/app')
|
|
|
|
request = FormRequest.from_response(response, url='http://foo.bar/absolute')
|
|
|
|
self.assertEqual(request.url, 'http://foo.bar/absolute')
|
|
|
|
request = FormRequest.from_response(response, url='/relative')
|
|
|
|
self.assertEqual(request.url, 'http://example.com/relative')
|
|
|
|
|
2012-04-13 16:20:35 -03:00
|
|
|
def test_from_response_submit_first_clickable(self):
|
2012-04-19 16:48:02 -03:00
|
|
|
response = _buildresponse(
|
|
|
|
"""<form action="get.php" method="GET">
|
|
|
|
<input type="submit" name="clickable1" value="clicked1">
|
|
|
|
<input type="hidden" name="one" value="1">
|
|
|
|
<input type="hidden" name="two" value="3">
|
|
|
|
<input type="submit" name="clickable2" value="clicked2">
|
|
|
|
</form>""")
|
|
|
|
req = self.request_class.from_response(response, formdata={'two': '2'})
|
|
|
|
fs = _qs(req)
|
|
|
|
self.assertEqual(fs['clickable1'], ['clicked1'])
|
|
|
|
self.assertFalse('clickable2' in fs, fs)
|
|
|
|
self.assertEqual(fs['one'], ['1'])
|
|
|
|
self.assertEqual(fs['two'], ['2'])
|
2009-10-20 15:51:41 -02:00
|
|
|
|
2012-04-13 16:20:35 -03:00
|
|
|
def test_from_response_submit_not_first_clickable(self):
|
2012-04-19 16:48:02 -03:00
|
|
|
response = _buildresponse(
|
|
|
|
"""<form action="get.php" method="GET">
|
|
|
|
<input type="submit" name="clickable1" value="clicked1">
|
|
|
|
<input type="hidden" name="one" value="1">
|
|
|
|
<input type="hidden" name="two" value="3">
|
|
|
|
<input type="submit" name="clickable2" value="clicked2">
|
|
|
|
</form>""")
|
|
|
|
req = self.request_class.from_response(response, formdata={'two': '2'}, \
|
|
|
|
clickdata={'name': 'clickable2'})
|
|
|
|
fs = _qs(req)
|
|
|
|
self.assertEqual(fs['clickable2'], ['clicked2'])
|
|
|
|
self.assertFalse('clickable1' in fs, fs)
|
|
|
|
self.assertEqual(fs['one'], ['1'])
|
|
|
|
self.assertEqual(fs['two'], ['2'])
|
2009-10-20 15:51:41 -02:00
|
|
|
|
2012-04-25 16:12:48 -03:00
|
|
|
def test_from_response_dont_submit_image_as_input(self):
|
|
|
|
response = _buildresponse(
|
|
|
|
"""<form>
|
|
|
|
<input type="hidden" name="i1" value="i1v">
|
|
|
|
<input type="image" name="i2" src="http://my.image.org/1.jpg">
|
|
|
|
<input type="submit" name="i3" value="i3v">
|
|
|
|
</form>""")
|
|
|
|
req = self.request_class.from_response(response, dont_click=True)
|
|
|
|
fs = _qs(req)
|
|
|
|
self.assertEqual(fs, {'i1': ['i1v']})
|
|
|
|
|
2013-09-07 21:53:27 -03:00
|
|
|
def test_from_response_dont_submit_reset_as_input(self):
|
|
|
|
response = _buildresponse(
|
|
|
|
"""<form>
|
|
|
|
<input type="hidden" name="i1" value="i1v">
|
|
|
|
<input type="text" name="i2" value="i2v">
|
|
|
|
<input type="reset" name="resetme">
|
|
|
|
<input type="submit" name="i3" value="i3v">
|
|
|
|
</form>""")
|
|
|
|
req = self.request_class.from_response(response, dont_click=True)
|
|
|
|
fs = _qs(req)
|
|
|
|
self.assertEqual(fs, {'i1': ['i1v'], 'i2': ['i2v']})
|
|
|
|
|
2012-04-13 12:12:33 -03:00
|
|
|
def test_from_response_multiple_clickdata(self):
|
2012-04-19 16:48:02 -03:00
|
|
|
response = _buildresponse(
|
|
|
|
"""<form action="get.php" method="GET">
|
|
|
|
<input type="submit" name="clickable" value="clicked1">
|
|
|
|
<input type="submit" name="clickable" value="clicked2">
|
|
|
|
<input type="hidden" name="one" value="clicked1">
|
|
|
|
<input type="hidden" name="two" value="clicked2">
|
|
|
|
</form>""")
|
|
|
|
req = self.request_class.from_response(response, \
|
2012-04-13 16:20:35 -03:00
|
|
|
clickdata={'name': 'clickable', 'value': 'clicked2'})
|
2012-04-19 16:48:02 -03:00
|
|
|
fs = _qs(req)
|
|
|
|
self.assertEqual(fs['clickable'], ['clicked2'])
|
|
|
|
self.assertEqual(fs['one'], ['clicked1'])
|
|
|
|
self.assertEqual(fs['two'], ['clicked2'])
|
2012-04-13 12:12:33 -03:00
|
|
|
|
|
|
|
def test_from_response_unicode_clickdata(self):
|
2012-04-19 16:48:02 -03:00
|
|
|
response = _buildresponse(
|
|
|
|
u"""<form action="get.php" method="GET">
|
|
|
|
<input type="submit" name="price in \u00a3" value="\u00a3 1000">
|
|
|
|
<input type="submit" name="price in \u20ac" value="\u20ac 2000">
|
|
|
|
<input type="hidden" name="poundsign" value="\u00a3">
|
|
|
|
<input type="hidden" name="eurosign" value="\u20ac">
|
|
|
|
</form>""")
|
|
|
|
req = self.request_class.from_response(response, \
|
2012-04-13 12:12:33 -03:00
|
|
|
clickdata={'name': u'price in \u00a3'})
|
2012-04-19 16:48:02 -03:00
|
|
|
fs = _qs(req)
|
|
|
|
self.assertTrue(fs[u'price in \u00a3'.encode('utf-8')])
|
2012-04-15 00:47:30 -03:00
|
|
|
|
|
|
|
def test_from_response_multiple_forms_clickdata(self):
|
2012-04-19 16:48:02 -03:00
|
|
|
response = _buildresponse(
|
|
|
|
"""<form name="form1">
|
|
|
|
<input type="submit" name="clickable" value="clicked1">
|
|
|
|
<input type="hidden" name="field1" value="value1">
|
|
|
|
</form>
|
|
|
|
<form name="form2">
|
|
|
|
<input type="submit" name="clickable" value="clicked2">
|
|
|
|
<input type="hidden" name="field2" value="value2">
|
|
|
|
</form>
|
|
|
|
""")
|
|
|
|
req = self.request_class.from_response(response, formname='form2', \
|
2012-04-15 00:47:30 -03:00
|
|
|
clickdata={'name': 'clickable'})
|
2012-04-19 16:48:02 -03:00
|
|
|
fs = _qs(req)
|
|
|
|
self.assertEqual(fs['clickable'], ['clicked2'])
|
|
|
|
self.assertEqual(fs['field2'], ['value2'])
|
|
|
|
self.assertFalse('field1' in fs, fs)
|
2012-04-13 12:12:33 -03:00
|
|
|
|
2012-04-15 00:47:30 -03:00
|
|
|
def test_from_response_override_clickable(self):
|
2012-04-19 16:48:02 -03:00
|
|
|
response = _buildresponse('''<form><input type="submit" name="clickme" value="one"> </form>''')
|
|
|
|
req = self.request_class.from_response(response, \
|
|
|
|
formdata={'clickme': 'two'}, clickdata={'name': 'clickme'})
|
|
|
|
fs = _qs(req)
|
|
|
|
self.assertEqual(fs['clickme'], ['two'])
|
2012-04-13 16:20:35 -03:00
|
|
|
|
2009-10-29 13:18:13 -02:00
|
|
|
def test_from_response_dont_click(self):
|
2012-04-19 16:48:02 -03:00
|
|
|
response = _buildresponse(
|
|
|
|
"""<form action="get.php" method="GET">
|
|
|
|
<input type="submit" name="clickable1" value="clicked1">
|
|
|
|
<input type="hidden" name="one" value="1">
|
|
|
|
<input type="hidden" name="two" value="3">
|
|
|
|
<input type="submit" name="clickable2" value="clicked2">
|
|
|
|
</form>""")
|
2009-10-29 13:18:13 -02:00
|
|
|
r1 = self.request_class.from_response(response, dont_click=True)
|
2012-04-19 16:48:02 -03:00
|
|
|
fs = _qs(r1)
|
|
|
|
self.assertFalse('clickable1' in fs, fs)
|
|
|
|
self.assertFalse('clickable2' in fs, fs)
|
2009-10-29 13:18:13 -02:00
|
|
|
|
2012-04-10 10:19:59 +03:00
|
|
|
def test_from_response_ambiguous_clickdata(self):
|
2012-04-19 16:48:02 -03:00
|
|
|
response = _buildresponse(
|
|
|
|
"""
|
|
|
|
<form action="get.php" method="GET">
|
|
|
|
<input type="submit" name="clickable1" value="clicked1">
|
|
|
|
<input type="hidden" name="one" value="1">
|
|
|
|
<input type="hidden" name="two" value="3">
|
|
|
|
<input type="submit" name="clickable2" value="clicked2">
|
|
|
|
</form>""")
|
|
|
|
self.assertRaises(ValueError, self.request_class.from_response,
|
|
|
|
response, clickdata={'type': 'submit'})
|
2012-04-10 10:19:59 +03:00
|
|
|
|
2012-04-13 12:12:33 -03:00
|
|
|
def test_from_response_non_matching_clickdata(self):
|
2012-04-19 16:48:02 -03:00
|
|
|
response = _buildresponse(
|
|
|
|
"""<form>
|
|
|
|
<input type="submit" name="clickable" value="clicked">
|
|
|
|
</form>""")
|
|
|
|
self.assertRaises(ValueError, self.request_class.from_response,
|
|
|
|
response, clickdata={'nonexistent': 'notme'})
|
2012-04-13 12:12:33 -03:00
|
|
|
|
2014-03-12 07:26:52 -03:00
|
|
|
def test_from_response_nr_index_clickdata(self):
|
|
|
|
response = _buildresponse(
|
|
|
|
"""<form>
|
|
|
|
<input type="submit" name="clickable1" value="clicked1">
|
|
|
|
<input type="submit" name="clickable2" value="clicked2">
|
|
|
|
</form>
|
|
|
|
""")
|
|
|
|
req = self.request_class.from_response(response, clickdata={'nr': 1})
|
|
|
|
fs = _qs(req)
|
2014-03-12 12:45:46 -03:00
|
|
|
self.assertIn('clickable2', fs)
|
|
|
|
self.assertNotIn('clickable1', fs)
|
2014-03-12 07:26:52 -03:00
|
|
|
|
|
|
|
def test_from_response_invalid_nr_index_clickdata(self):
|
|
|
|
response = _buildresponse(
|
|
|
|
"""<form>
|
|
|
|
<input type="submit" name="clickable" value="clicked">
|
|
|
|
</form>
|
|
|
|
""")
|
|
|
|
self.assertRaises(ValueError, self.request_class.from_response,
|
|
|
|
response, clickdata={'nr': 1})
|
|
|
|
|
2009-04-12 09:16:31 +00:00
|
|
|
def test_from_response_errors_noform(self):
|
2012-04-19 16:48:02 -03:00
|
|
|
response = _buildresponse("""<html></html>""")
|
2009-09-07 09:37:46 -03:00
|
|
|
self.assertRaises(ValueError, self.request_class.from_response, response)
|
2009-04-12 09:16:31 +00:00
|
|
|
|
2013-01-24 17:47:36 -02:00
|
|
|
def test_from_response_invalid_html5(self):
|
|
|
|
response = _buildresponse("""<!DOCTYPE html><body></html><form>"""
|
|
|
|
"""<input type="text" name="foo" value="xxx">"""
|
|
|
|
"""</form></body></html>""")
|
|
|
|
req = self.request_class.from_response(response, formdata={'bar': 'buz'})
|
|
|
|
fs = _qs(req)
|
|
|
|
self.assertEqual(fs, {'foo': ['xxx'], 'bar': ['buz']})
|
|
|
|
|
2009-04-12 09:16:31 +00:00
|
|
|
def test_from_response_errors_formnumber(self):
|
2012-04-19 16:48:02 -03:00
|
|
|
response = _buildresponse(
|
|
|
|
"""<form action="get.php" method="GET">
|
|
|
|
<input type="hidden" name="test" value="val1">
|
|
|
|
<input type="hidden" name="test" value="val2">
|
|
|
|
<input type="hidden" name="test2" value="xxx">
|
|
|
|
</form>""")
|
2009-09-07 09:37:46 -03:00
|
|
|
self.assertRaises(IndexError, self.request_class.from_response, response, formnumber=1)
|
|
|
|
|
2010-09-20 08:33:24 -03:00
|
|
|
def test_from_response_noformname(self):
|
2012-04-19 16:48:02 -03:00
|
|
|
response = _buildresponse(
|
|
|
|
"""<form action="post.php" method="POST">
|
|
|
|
<input type="hidden" name="one" value="1">
|
|
|
|
<input type="hidden" name="two" value="2">
|
|
|
|
</form>""")
|
|
|
|
r1 = self.request_class.from_response(response, formdata={'two':'3'})
|
2010-09-20 08:33:24 -03:00
|
|
|
self.assertEqual(r1.method, 'POST')
|
|
|
|
self.assertEqual(r1.headers['Content-type'], 'application/x-www-form-urlencoded')
|
2012-04-19 16:48:02 -03:00
|
|
|
fs = _qs(r1)
|
|
|
|
self.assertEqual(fs, {'one': ['1'], 'two': ['3']})
|
2010-09-20 08:33:24 -03:00
|
|
|
|
|
|
|
def test_from_response_formname_exists(self):
|
2012-04-19 16:48:02 -03:00
|
|
|
response = _buildresponse(
|
|
|
|
"""<form action="post.php" method="POST">
|
|
|
|
<input type="hidden" name="one" value="1">
|
|
|
|
<input type="hidden" name="two" value="2">
|
|
|
|
</form>
|
|
|
|
<form name="form2" action="post.php" method="POST">
|
|
|
|
<input type="hidden" name="three" value="3">
|
|
|
|
<input type="hidden" name="four" value="4">
|
|
|
|
</form>""")
|
|
|
|
r1 = self.request_class.from_response(response, formname="form2")
|
2010-09-20 08:33:24 -03:00
|
|
|
self.assertEqual(r1.method, 'POST')
|
2012-04-19 16:48:02 -03:00
|
|
|
fs = _qs(r1)
|
|
|
|
self.assertEqual(fs, {'four': ['4'], 'three': ['3']})
|
2010-09-20 08:33:24 -03:00
|
|
|
|
|
|
|
def test_from_response_formname_notexist(self):
|
2012-04-19 16:48:02 -03:00
|
|
|
response = _buildresponse(
|
|
|
|
"""<form name="form1" action="post.php" method="POST">
|
|
|
|
<input type="hidden" name="one" value="1">
|
|
|
|
</form>
|
|
|
|
<form name="form2" action="post.php" method="POST">
|
|
|
|
<input type="hidden" name="two" value="2">
|
|
|
|
</form>""")
|
|
|
|
r1 = self.request_class.from_response(response, formname="form3")
|
2010-09-20 08:33:24 -03:00
|
|
|
self.assertEqual(r1.method, 'POST')
|
2012-04-19 16:48:02 -03:00
|
|
|
fs = _qs(r1)
|
|
|
|
self.assertEqual(fs, {'one': ['1']})
|
2010-09-20 08:33:24 -03:00
|
|
|
|
|
|
|
def test_from_response_formname_errors_formnumber(self):
|
2012-04-19 16:48:02 -03:00
|
|
|
response = _buildresponse(
|
|
|
|
"""<form name="form1" action="post.php" method="POST">
|
|
|
|
<input type="hidden" name="one" value="1">
|
|
|
|
</form>
|
|
|
|
<form name="form2" action="post.php" method="POST">
|
|
|
|
<input type="hidden" name="two" value="2">
|
|
|
|
</form>""")
|
|
|
|
self.assertRaises(IndexError, self.request_class.from_response, \
|
|
|
|
response, formname="form3", formnumber=2)
|
2010-09-20 08:33:24 -03:00
|
|
|
|
2012-04-19 15:40:07 -03:00
|
|
|
def test_from_response_select(self):
|
|
|
|
res = _buildresponse(
|
|
|
|
'''<form>
|
|
|
|
<select name="i1">
|
|
|
|
<option value="i1v1">option 1</option>
|
|
|
|
<option value="i1v2" selected>option 2</option>
|
|
|
|
</select>
|
|
|
|
<select name="i2">
|
|
|
|
<option value="i2v1">option 1</option>
|
|
|
|
<option value="i2v2">option 2</option>
|
|
|
|
</select>
|
|
|
|
<select>
|
|
|
|
<option value="i3v1">option 1</option>
|
|
|
|
<option value="i3v2">option 2</option>
|
|
|
|
</select>
|
|
|
|
<select name="i4" multiple>
|
|
|
|
<option value="i4v1">option 1</option>
|
|
|
|
<option value="i4v2" selected>option 2</option>
|
|
|
|
<option value="i4v3" selected>option 3</option>
|
|
|
|
</select>
|
|
|
|
<select name="i5" multiple>
|
|
|
|
<option value="i5v1">option 1</option>
|
|
|
|
<option value="i5v2">option 2</option>
|
|
|
|
</select>
|
2012-04-19 16:17:34 -03:00
|
|
|
<select name="i6"></select>
|
|
|
|
<select name="i7"/>
|
2012-04-19 15:40:07 -03:00
|
|
|
</form>''')
|
|
|
|
req = self.request_class.from_response(res)
|
|
|
|
fs = _qs(req)
|
|
|
|
self.assertEqual(fs, {'i1': ['i1v2'], 'i2': ['i2v1'], 'i4': ['i4v2', 'i4v3']})
|
|
|
|
|
|
|
|
def test_from_response_radio(self):
|
|
|
|
res = _buildresponse(
|
|
|
|
'''<form>
|
2012-04-19 16:17:34 -03:00
|
|
|
<input type="radio" name="i1" value="i1v1">
|
2012-04-19 15:40:07 -03:00
|
|
|
<input type="radio" name="i1" value="iv2" checked>
|
|
|
|
<input type="radio" name="i2" checked>
|
|
|
|
<input type="radio" name="i2">
|
|
|
|
<input type="radio" name="i3" value="i3v1">
|
|
|
|
<input type="radio" name="i3">
|
2012-04-20 16:39:50 -03:00
|
|
|
<input type="radio" value="i4v1">
|
|
|
|
<input type="radio">
|
2012-04-19 15:40:07 -03:00
|
|
|
</form>''')
|
|
|
|
req = self.request_class.from_response(res)
|
|
|
|
fs = _qs(req)
|
|
|
|
self.assertEqual(fs, {'i1': ['iv2'], 'i2': ['on']})
|
|
|
|
|
|
|
|
def test_from_response_checkbox(self):
|
|
|
|
res = _buildresponse(
|
|
|
|
'''<form>
|
2012-04-19 16:17:34 -03:00
|
|
|
<input type="checkbox" name="i1" value="i1v1">
|
2012-04-19 15:40:07 -03:00
|
|
|
<input type="checkbox" name="i1" value="iv2" checked>
|
|
|
|
<input type="checkbox" name="i2" checked>
|
|
|
|
<input type="checkbox" name="i2">
|
|
|
|
<input type="checkbox" name="i3" value="i3v1">
|
|
|
|
<input type="checkbox" name="i3">
|
2012-04-20 16:39:50 -03:00
|
|
|
<input type="checkbox" value="i4v1">
|
|
|
|
<input type="checkbox">
|
2012-04-19 15:40:07 -03:00
|
|
|
</form>''')
|
|
|
|
req = self.request_class.from_response(res)
|
|
|
|
fs = _qs(req)
|
|
|
|
self.assertEqual(fs, {'i1': ['iv2'], 'i2': ['on']})
|
|
|
|
|
|
|
|
def test_from_response_input_text(self):
|
|
|
|
res = _buildresponse(
|
|
|
|
'''<form>
|
2012-04-19 16:17:34 -03:00
|
|
|
<input type="text" name="i1" value="i1v1">
|
2012-04-19 15:40:07 -03:00
|
|
|
<input type="text" name="i2">
|
2012-04-20 16:39:50 -03:00
|
|
|
<input type="text" value="i3v1">
|
2012-04-19 15:40:07 -03:00
|
|
|
<input type="text">
|
|
|
|
</form>''')
|
|
|
|
req = self.request_class.from_response(res)
|
|
|
|
fs = _qs(req)
|
2012-04-19 16:17:34 -03:00
|
|
|
self.assertEqual(fs, {'i1': ['i1v1'], 'i2': ['']})
|
2012-04-19 15:40:07 -03:00
|
|
|
|
|
|
|
def test_from_response_input_hidden(self):
|
|
|
|
res = _buildresponse(
|
|
|
|
'''<form>
|
2012-04-19 16:17:34 -03:00
|
|
|
<input type="hidden" name="i1" value="i1v1">
|
2012-04-19 15:40:07 -03:00
|
|
|
<input type="hidden" name="i2">
|
2012-04-20 16:39:50 -03:00
|
|
|
<input type="hidden" value="i3v1">
|
2012-04-19 15:40:07 -03:00
|
|
|
<input type="hidden">
|
|
|
|
</form>''')
|
|
|
|
req = self.request_class.from_response(res)
|
|
|
|
fs = _qs(req)
|
2012-04-19 16:17:34 -03:00
|
|
|
self.assertEqual(fs, {'i1': ['i1v1'], 'i2': ['']})
|
2012-04-19 15:40:07 -03:00
|
|
|
|
2012-04-19 16:17:34 -03:00
|
|
|
def test_from_response_input_textarea(self):
|
|
|
|
res = _buildresponse(
|
|
|
|
'''<form>
|
|
|
|
<textarea name="i1">i1v</textarea>
|
|
|
|
<textarea name="i2"></textarea>
|
|
|
|
<textarea name="i3"/>
|
|
|
|
<textarea>i4v</textarea>
|
|
|
|
</form>''')
|
|
|
|
req = self.request_class.from_response(res)
|
|
|
|
fs = _qs(req)
|
|
|
|
self.assertEqual(fs, {'i1': ['i1v'], 'i2': [''], 'i3': ['']})
|
2012-04-19 15:40:07 -03:00
|
|
|
|
2012-04-19 16:58:01 -03:00
|
|
|
def test_from_response_descendants(self):
|
|
|
|
res = _buildresponse(
|
|
|
|
'''<form>
|
|
|
|
<div>
|
|
|
|
<fieldset>
|
|
|
|
<input type="text" name="i1">
|
|
|
|
<select name="i2">
|
|
|
|
<option value="v1" selected>
|
|
|
|
</select>
|
|
|
|
</fieldset>
|
|
|
|
<input type="radio" name="i3" value="i3v2" checked>
|
|
|
|
<input type="checkbox" name="i4" value="i4v2" checked>
|
|
|
|
<textarea name="i5"></textarea>
|
|
|
|
<input type="hidden" name="h1" value="h1v">
|
|
|
|
</div>
|
|
|
|
<input type="hidden" name="h2" value="h2v">
|
|
|
|
</form>''')
|
|
|
|
req = self.request_class.from_response(res)
|
|
|
|
fs = _qs(req)
|
|
|
|
self.assertEqual(set(fs), set(['h2', 'i2', 'i1', 'i3', 'h1', 'i5', 'i4']))
|
|
|
|
|
2012-11-07 02:08:38 +08:00
|
|
|
def test_from_response_xpath(self):
|
|
|
|
response = _buildresponse(
|
|
|
|
"""<form action="post.php" method="POST">
|
|
|
|
<input type="hidden" name="one" value="1">
|
|
|
|
<input type="hidden" name="two" value="2">
|
|
|
|
</form>
|
|
|
|
<form action="post2.php" method="POST">
|
|
|
|
<input type="hidden" name="three" value="3">
|
|
|
|
<input type="hidden" name="four" value="4">
|
|
|
|
</form>""")
|
|
|
|
r1 = self.request_class.from_response(response, formxpath="//form[@action='post.php']")
|
|
|
|
fs = _qs(r1)
|
|
|
|
self.assertEqual(fs['one'], ['1'])
|
|
|
|
|
|
|
|
r1 = self.request_class.from_response(response, formxpath="//form/input[@name='four']")
|
|
|
|
fs = _qs(r1)
|
|
|
|
self.assertEqual(fs['three'], ['3'])
|
|
|
|
|
|
|
|
self.assertRaises(ValueError, self.request_class.from_response,
|
|
|
|
response, formxpath="//form/input[@name='abc']")
|
2012-04-19 16:58:01 -03:00
|
|
|
|
2012-04-19 15:40:07 -03:00
|
|
|
def _buildresponse(body, **kwargs):
|
|
|
|
kwargs.setdefault('body', body)
|
|
|
|
kwargs.setdefault('url', 'http://example.com')
|
|
|
|
kwargs.setdefault('encoding', 'utf-8')
|
|
|
|
return HtmlResponse(**kwargs)
|
|
|
|
|
|
|
|
def _qs(req):
|
|
|
|
if req.method == 'POST':
|
|
|
|
qs = req.body
|
|
|
|
else:
|
|
|
|
qs = req.url.partition('?')[2]
|
|
|
|
return cgi.parse_qs(qs, True)
|
|
|
|
|
2012-04-19 16:48:02 -03:00
|
|
|
|
2009-09-17 12:21:43 -03:00
|
|
|
class XmlRpcRequestTest(RequestTest):
|
2009-03-03 00:37:06 +00:00
|
|
|
|
2009-09-17 14:26:42 -03:00
|
|
|
request_class = XmlRpcRequest
|
|
|
|
default_method = 'POST'
|
|
|
|
default_headers = {'Content-Type': ['text/xml']}
|
|
|
|
|
|
|
|
def _test_request(self, **kwargs):
|
|
|
|
r = self.request_class('http://scrapytest.org/rpc2', **kwargs)
|
2009-03-03 00:37:06 +00:00
|
|
|
self.assertEqual(r.headers['Content-Type'], 'text/xml')
|
2009-09-17 14:26:42 -03:00
|
|
|
self.assertEqual(r.body, xmlrpclib.dumps(**kwargs))
|
2009-03-03 05:37:41 +00:00
|
|
|
self.assertEqual(r.method, 'POST')
|
2009-09-17 14:26:42 -03:00
|
|
|
self.assertEqual(r.encoding, kwargs.get('encoding', 'utf-8'))
|
2009-03-03 05:37:41 +00:00
|
|
|
self.assertTrue(r.dont_filter, True)
|
2009-03-03 00:37:06 +00:00
|
|
|
|
2009-09-17 14:26:42 -03:00
|
|
|
def test_xmlrpc_dumps(self):
|
|
|
|
self._test_request(params=('value',))
|
|
|
|
self._test_request(params=('username', 'password'), methodname='login')
|
|
|
|
self._test_request(params=('response', ), methodresponse='login')
|
|
|
|
self._test_request(params=(u'pas\xa3',), encoding='utf-8')
|
|
|
|
self._test_request(params=(u'pas\xa3',), encoding='latin')
|
|
|
|
self._test_request(params=(None,), allow_none=1)
|
|
|
|
self.assertRaises(TypeError, self._test_request)
|
|
|
|
self.assertRaises(TypeError, self._test_request, params=(None,))
|
|
|
|
|
2009-04-16 18:23:12 +00:00
|
|
|
|
2008-06-28 23:37:28 +00:00
|
|
|
if __name__ == "__main__":
|
|
|
|
unittest.main()
|