11import unittest
22
3+ from w3lib .http import basic_auth_header
4+
35from scrapy .http import Request
46from scrapy .downloadermiddlewares .httpauth import HttpAuthMiddleware
57from scrapy .spiders import Spider
68
79
10+ class TestSpiderLegacy (Spider ):
11+ http_user = 'foo'
12+ http_pass = 'bar'
13+
14+
815class TestSpider (Spider ):
916 http_user = 'foo'
1017 http_pass = 'bar'
18+ http_auth_domain = 'example.com'
19+
20+
21+ class TestSpiderAny (Spider ):
22+ http_user = 'foo'
23+ http_pass = 'bar'
24+ http_auth_domain = None
25+
26+
27+ class HttpAuthMiddlewareLegacyTest (unittest .TestCase ):
28+
29+ def setUp (self ):
30+ self .spider = TestSpiderLegacy ('foo' )
31+
32+ def test_auth (self ):
33+ mw = HttpAuthMiddleware ()
34+ mw .spider_opened (self .spider )
35+
36+ # initial request, sets the domain and sends the header
37+ req = Request ('http://example.com/' )
38+ assert mw .process_request (req , self .spider ) is None
39+ self .assertEqual (req .headers ['Authorization' ], basic_auth_header ('foo' , 'bar' ))
40+
41+ # subsequent request to the same domain, should send the header
42+ req = Request ('http://example.com/' )
43+ assert mw .process_request (req , self .spider ) is None
44+ self .assertEqual (req .headers ['Authorization' ], basic_auth_header ('foo' , 'bar' ))
45+
46+ # subsequent request to a different domain, shouldn't send the header
47+ req = Request ('http://example-noauth.com/' )
48+ assert mw .process_request (req , self .spider ) is None
49+ self .assertNotIn ('Authorization' , req .headers )
50+
51+ def test_auth_already_set (self ):
52+ mw = HttpAuthMiddleware ()
53+ mw .spider_opened (self .spider )
54+ req = Request ('http://example.com/' ,
55+ headers = dict (Authorization = 'Digest 123' ))
56+ assert mw .process_request (req , self .spider ) is None
57+ self .assertEqual (req .headers ['Authorization' ], b'Digest 123' )
1158
1259
1360class HttpAuthMiddlewareTest (unittest .TestCase ):
@@ -20,13 +67,45 @@ def setUp(self):
2067 def tearDown (self ):
2168 del self .mw
2269
70+ def test_no_auth (self ):
71+ req = Request ('http://example-noauth.com/' )
72+ assert self .mw .process_request (req , self .spider ) is None
73+ self .assertNotIn ('Authorization' , req .headers )
74+
75+ def test_auth_domain (self ):
76+ req = Request ('http://example.com/' )
77+ assert self .mw .process_request (req , self .spider ) is None
78+ self .assertEqual (req .headers ['Authorization' ], basic_auth_header ('foo' , 'bar' ))
79+
80+ def test_auth_subdomain (self ):
81+ req = Request ('http://foo.example.com/' )
82+ assert self .mw .process_request (req , self .spider ) is None
83+ self .assertEqual (req .headers ['Authorization' ], basic_auth_header ('foo' , 'bar' ))
84+
85+ def test_auth_already_set (self ):
86+ req = Request ('http://example.com/' ,
87+ headers = dict (Authorization = 'Digest 123' ))
88+ assert self .mw .process_request (req , self .spider ) is None
89+ self .assertEqual (req .headers ['Authorization' ], b'Digest 123' )
90+
91+
92+ class HttpAuthAnyMiddlewareTest (unittest .TestCase ):
93+
94+ def setUp (self ):
95+ self .mw = HttpAuthMiddleware ()
96+ self .spider = TestSpiderAny ('foo' )
97+ self .mw .spider_opened (self .spider )
98+
99+ def tearDown (self ):
100+ del self .mw
101+
23102 def test_auth (self ):
24- req = Request ('http://scrapytest.org /' )
103+ req = Request ('http://example.com /' )
25104 assert self .mw .process_request (req , self .spider ) is None
26- self .assertEqual (req .headers ['Authorization' ], b'Basic Zm9vOmJhcg==' )
105+ self .assertEqual (req .headers ['Authorization' ], basic_auth_header ( 'foo' , 'bar' ) )
27106
28107 def test_auth_already_set (self ):
29- req = Request ('http://scrapytest.org /' ,
108+ req = Request ('http://example.com /' ,
30109 headers = dict (Authorization = 'Digest 123' ))
31110 assert self .mw .process_request (req , self .spider ) is None
32111 self .assertEqual (req .headers ['Authorization' ], b'Digest 123' )
0 commit comments