2011-08-02 11:57:55 -03:00
|
|
|
|
import unittest
|
|
|
|
|
|
2017-01-24 11:29:11 -03:00
|
|
|
|
from scrapy.http import Request, FormRequest
|
2015-05-09 04:20:09 -03:00
|
|
|
|
from scrapy.spiders import Spider
|
2019-06-05 23:43:56 +09:00
|
|
|
|
from scrapy.utils.reqser import request_to_dict, request_from_dict, _is_private_method, _mangle_private_name
|
2011-08-02 11:57:55 -03:00
|
|
|
|
|
2015-08-04 02:17:46 +05:00
|
|
|
|
|
2011-08-02 11:57:55 -03:00
|
|
|
|
class RequestSerializationTest(unittest.TestCase):
|
|
|
|
|
|
|
|
|
|
def setUp(self):
|
|
|
|
|
self.spider = TestSpider()
|
|
|
|
|
|
|
|
|
|
def test_basic(self):
|
|
|
|
|
r = Request("http://www.example.com")
|
|
|
|
|
self._assert_serializes_ok(r)
|
|
|
|
|
|
|
|
|
|
def test_all_attributes(self):
|
|
|
|
|
r = Request("http://www.example.com",
|
2017-06-05 17:26:52 -03:00
|
|
|
|
callback=self.spider.parse_item,
|
|
|
|
|
errback=self.spider.handle_error,
|
2011-08-02 11:57:55 -03:00
|
|
|
|
method="POST",
|
2015-07-29 20:52:25 +00:00
|
|
|
|
body=b"some body",
|
2011-08-02 11:57:55 -03:00
|
|
|
|
headers={'content-encoding': 'text/html; charset=latin-1'},
|
2015-08-04 02:17:46 +05:00
|
|
|
|
cookies={'currency': u'руб'},
|
2011-08-02 11:57:55 -03:00
|
|
|
|
encoding='latin-1',
|
|
|
|
|
priority=20,
|
2017-02-20 16:42:29 +02:00
|
|
|
|
meta={'a': 'b'},
|
2019-03-15 22:32:45 +00:00
|
|
|
|
cb_kwargs={'k': 'v'},
|
2017-02-20 16:42:29 +02:00
|
|
|
|
flags=['testFlag'])
|
2017-06-05 17:26:52 -03:00
|
|
|
|
self._assert_serializes_ok(r, spider=self.spider)
|
2011-08-02 11:57:55 -03:00
|
|
|
|
|
|
|
|
|
def test_latin1_body(self):
|
2015-08-04 02:17:46 +05:00
|
|
|
|
r = Request("http://www.example.com", body=b"\xa3")
|
2011-08-02 11:57:55 -03:00
|
|
|
|
self._assert_serializes_ok(r)
|
|
|
|
|
|
|
|
|
|
def test_utf8_body(self):
|
2015-08-04 02:17:46 +05:00
|
|
|
|
r = Request("http://www.example.com", body=b"\xc2\xa3")
|
2011-08-02 11:57:55 -03:00
|
|
|
|
self._assert_serializes_ok(r)
|
|
|
|
|
|
|
|
|
|
def _assert_serializes_ok(self, request, spider=None):
|
|
|
|
|
d = request_to_dict(request, spider=spider)
|
|
|
|
|
request2 = request_from_dict(d, spider=spider)
|
|
|
|
|
self._assert_same_request(request, request2)
|
|
|
|
|
|
|
|
|
|
def _assert_same_request(self, r1, r2):
|
2017-01-24 11:29:11 -03:00
|
|
|
|
self.assertEqual(r1.__class__, r2.__class__)
|
2011-08-02 11:57:55 -03:00
|
|
|
|
self.assertEqual(r1.url, r2.url)
|
|
|
|
|
self.assertEqual(r1.callback, r2.callback)
|
|
|
|
|
self.assertEqual(r1.errback, r2.errback)
|
|
|
|
|
self.assertEqual(r1.method, r2.method)
|
|
|
|
|
self.assertEqual(r1.body, r2.body)
|
|
|
|
|
self.assertEqual(r1.headers, r2.headers)
|
|
|
|
|
self.assertEqual(r1.cookies, r2.cookies)
|
|
|
|
|
self.assertEqual(r1.meta, r2.meta)
|
2019-03-15 22:32:45 +00:00
|
|
|
|
self.assertEqual(r1.cb_kwargs, r2.cb_kwargs)
|
2011-08-02 11:57:55 -03:00
|
|
|
|
self.assertEqual(r1._encoding, r2._encoding)
|
|
|
|
|
self.assertEqual(r1.priority, r2.priority)
|
|
|
|
|
self.assertEqual(r1.dont_filter, r2.dont_filter)
|
2017-02-20 16:42:29 +02:00
|
|
|
|
self.assertEqual(r1.flags, r2.flags)
|
2011-08-02 11:57:55 -03:00
|
|
|
|
|
2017-01-24 11:29:11 -03:00
|
|
|
|
def test_request_class(self):
|
|
|
|
|
r = FormRequest("http://www.example.com")
|
|
|
|
|
self._assert_serializes_ok(r, spider=self.spider)
|
|
|
|
|
r = CustomRequest("http://www.example.com")
|
|
|
|
|
self._assert_serializes_ok(r, spider=self.spider)
|
|
|
|
|
|
2011-08-02 11:57:55 -03:00
|
|
|
|
def test_callback_serialization(self):
|
2015-08-04 02:17:46 +05:00
|
|
|
|
r = Request("http://www.example.com", callback=self.spider.parse_item,
|
|
|
|
|
errback=self.spider.handle_error)
|
2011-08-02 11:57:55 -03:00
|
|
|
|
self._assert_serializes_ok(r, spider=self.spider)
|
|
|
|
|
|
2019-05-24 21:45:53 +09:00
|
|
|
|
def test_private_callback_serialization(self):
|
|
|
|
|
r = Request("http://www.example.com",
|
|
|
|
|
callback=self.spider._TestSpider__parse_item_private,
|
|
|
|
|
errback=self.spider.handle_error)
|
|
|
|
|
self._assert_serializes_ok(r, spider=self.spider)
|
|
|
|
|
|
2019-06-03 20:41:02 +09:00
|
|
|
|
def test_mixin_private_callback_serialization(self):
|
|
|
|
|
r = Request("http://www.example.com",
|
|
|
|
|
callback=self.spider._TestSpiderMixin__mixin_callback,
|
|
|
|
|
errback=self.spider.handle_error)
|
|
|
|
|
self._assert_serializes_ok(r, spider=self.spider)
|
|
|
|
|
|
2019-05-27 23:30:23 +09:00
|
|
|
|
def test_private_callback_name_matching(self):
|
2019-05-28 01:40:26 +09:00
|
|
|
|
self.assertTrue(_is_private_method('__a'))
|
|
|
|
|
self.assertTrue(_is_private_method('__a_'))
|
|
|
|
|
self.assertTrue(_is_private_method('__a_a'))
|
|
|
|
|
self.assertTrue(_is_private_method('__a_a_'))
|
|
|
|
|
self.assertTrue(_is_private_method('__a__a'))
|
|
|
|
|
self.assertTrue(_is_private_method('__a__a_'))
|
|
|
|
|
self.assertTrue(_is_private_method('__a___a'))
|
|
|
|
|
self.assertTrue(_is_private_method('__a___a_'))
|
|
|
|
|
self.assertTrue(_is_private_method('___a'))
|
|
|
|
|
self.assertTrue(_is_private_method('___a_'))
|
|
|
|
|
self.assertTrue(_is_private_method('___a_a'))
|
|
|
|
|
self.assertTrue(_is_private_method('___a_a_'))
|
|
|
|
|
self.assertTrue(_is_private_method('____a_a_'))
|
|
|
|
|
|
|
|
|
|
self.assertFalse(_is_private_method('_a'))
|
|
|
|
|
self.assertFalse(_is_private_method('_a_'))
|
|
|
|
|
self.assertFalse(_is_private_method('__a__'))
|
|
|
|
|
self.assertFalse(_is_private_method('__'))
|
|
|
|
|
self.assertFalse(_is_private_method('___'))
|
|
|
|
|
self.assertFalse(_is_private_method('____'))
|
2019-05-27 23:30:23 +09:00
|
|
|
|
|
2019-06-05 23:43:56 +09:00
|
|
|
|
def _assert_mangles_to(self, obj, name):
|
2019-06-06 04:25:19 +09:00
|
|
|
|
func = getattr(obj, name)
|
2019-06-05 23:43:56 +09:00
|
|
|
|
self.assertEqual(
|
2019-06-06 04:25:19 +09:00
|
|
|
|
_mangle_private_name(obj, func, func.__name__),
|
2019-06-05 23:43:56 +09:00
|
|
|
|
name
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
def test_private_name_mangling(self):
|
|
|
|
|
self._assert_mangles_to(
|
|
|
|
|
self.spider, '_TestSpider__parse_item_private')
|
2019-08-28 16:29:53 +05:00
|
|
|
|
self._assert_mangles_to(
|
|
|
|
|
self.spider, '_TestSpiderMixin__mixin_callback')
|
2019-06-05 23:43:56 +09:00
|
|
|
|
|
2011-08-02 11:57:55 -03:00
|
|
|
|
def test_unserializable_callback1(self):
|
|
|
|
|
r = Request("http://www.example.com", callback=lambda x: x)
|
|
|
|
|
self.assertRaises(ValueError, request_to_dict, r)
|
|
|
|
|
self.assertRaises(ValueError, request_to_dict, r, spider=self.spider)
|
|
|
|
|
|
|
|
|
|
def test_unserializable_callback2(self):
|
|
|
|
|
r = Request("http://www.example.com", callback=self.spider.parse_item)
|
|
|
|
|
self.assertRaises(ValueError, request_to_dict, r)
|
|
|
|
|
|
|
|
|
|
|
2019-06-03 20:41:02 +09:00
|
|
|
|
class TestSpiderMixin(object):
|
|
|
|
|
def __mixin_callback(self, response):
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class TestSpider(Spider, TestSpiderMixin):
|
2011-08-02 11:57:55 -03:00
|
|
|
|
name = 'test'
|
2015-08-04 02:17:46 +05:00
|
|
|
|
|
2011-08-02 11:57:55 -03:00
|
|
|
|
def parse_item(self, response):
|
|
|
|
|
pass
|
2015-08-04 02:17:46 +05:00
|
|
|
|
|
2011-08-02 11:57:55 -03:00
|
|
|
|
def handle_error(self, failure):
|
|
|
|
|
pass
|
2017-01-24 11:29:11 -03:00
|
|
|
|
|
2019-05-24 21:45:53 +09:00
|
|
|
|
def __parse_item_private(self, response):
|
|
|
|
|
pass
|
|
|
|
|
|
2017-01-24 11:29:11 -03:00
|
|
|
|
|
|
|
|
|
class CustomRequest(Request):
|
|
|
|
|
pass
|