1
- from hamcrest import assert_that , is_
1
+ from hamcrest import assert_that , is_ , has_properties
2
2
from mock import MagicMock , patch , ANY
3
3
import pytest
4
4
5
5
from scrapy .settings import Settings
6
6
7
- from scrapy_html_storage import HtmlStorageMiddleware , should_save_html
7
+ from scrapy_html_storage import HtmlStorageMiddleware
8
8
9
9
10
10
def make_request_mock (save_html = False , query = '' , results_page = None ):
@@ -19,11 +19,51 @@ def make_request_mock(save_html=False, query='', results_page=None):
19
19
20
20
return request_mock
21
21
22
+ def make_response_mock (response_status ):
23
+ """ Constructs HTTP Response mock object.
24
+ """
25
+ response_mock = MagicMock ()
26
+ response_mock .status = response_status
27
+
28
+ return response_mock
29
+
30
+
31
+ def make_allowed_response_codes_list ():
32
+ return range (200 , 300 )
33
+
34
+
35
+ def make_downloader (save_html_on_codes = []):
36
+ settings = Settings ()
37
+ settings .set ('HTML_STORAGE' , {
38
+ 'gzip_output' : True ,
39
+ 'save_html_on_codes' : save_html_on_codes
40
+ })
41
+ return HtmlStorageMiddleware (settings )
42
+
43
+
44
+ @pytest .mark .parametrize ('response_status,as_expected' , [
45
+ (200 , True ),
46
+ (299 , True ),
47
+ (300 , False ),
48
+ (404 , False ),
49
+ ])
50
+ def test_should_save_html_returns_true_when_request_metainformation_has_special_key_set_and_appropriate_response_status (response_status , as_expected ):
51
+ request_mock = make_request_mock (save_html = True )
52
+ response_mock = make_response_mock (response_status = response_status )
53
+ downloader = make_downloader (make_allowed_response_codes_list ())
54
+
55
+ save = downloader ._should_save_html (request_mock , response_mock )
56
+
57
+ assert_that (save , is_ (as_expected ))
58
+
22
59
23
- def test_should_save_html_returns_true_when_request_metainformation_has_special_key_set ():
60
+ @pytest .mark .parametrize ('response_status' , [200 , 299 , 300 , 404 ])
61
+ def test_should_save_html_returns_true_when_request_metainformation_has_special_key_set_and_allowed_resonse_codes_list_is_empty (response_status ):
24
62
request_mock = make_request_mock (save_html = True )
63
+ response_mock = make_response_mock (response_status = response_status )
64
+ downloader = make_downloader ()
25
65
26
- save = should_save_html (request_mock )
66
+ save = downloader . _should_save_html (request_mock , response_mock )
27
67
28
68
assert_that (save , is_ (True ))
29
69
@@ -33,8 +73,9 @@ def test_process_response_stores_response_body_to_file_if_request_asks_for_it(
33
73
write_to_file_mock ):
34
74
downloader = HtmlStorageMiddleware (Settings ())
35
75
request_mock = make_request_mock (save_html = True )
76
+ response_mock = make_response_mock (response_status = 200 )
36
77
37
- downloader .process_response (request_mock , MagicMock () , MagicMock ())
78
+ downloader .process_response (request_mock , response_mock , MagicMock ())
38
79
39
80
assert_that (write_to_file_mock .call_count , is_ (1 ))
40
81
@@ -44,11 +85,12 @@ def test_process_response_saves_response_html_to_file_resolved_by_spider(
44
85
write_to_file_mock ):
45
86
downloader = HtmlStorageMiddleware (Settings ())
46
87
request_mock = make_request_mock (save_html = True )
88
+ response_mock = make_response_mock (response_status = 200 )
47
89
48
90
spider_mock = MagicMock ()
49
91
spider_mock .response_html_path .return_value = '/tmp/response.html'
50
92
51
- downloader .process_response (request_mock , MagicMock () , spider_mock )
93
+ downloader .process_response (request_mock , response_mock , spider_mock )
52
94
53
95
write_to_file_mock .assert_called_with ('/tmp/response.html' , ANY )
54
96
@@ -59,8 +101,9 @@ def test_process_response_stores_response_body_to_gzip_file_if_this_setting_is_o
59
101
downloader = HtmlStorageMiddleware (Settings ())
60
102
downloader .gzip_output = True
61
103
request_mock = make_request_mock (save_html = True )
104
+ response_mock = make_response_mock (response_status = 200 )
62
105
63
- downloader .process_response (request_mock , MagicMock () , MagicMock ())
106
+ downloader .process_response (request_mock , response_mock , MagicMock ())
64
107
65
108
assert_that (write_to_gzip_mock .call_count , is_ (1 ))
66
109
@@ -76,11 +119,18 @@ def test_from_settings_constructs_middleware_with_the_specified_settings():
76
119
77
120
def test_constructor_extracts_expected_settings ():
78
121
settings = Settings ()
79
- settings .set ('HTML_STORAGE' , {'gzip_output' : True })
122
+ save_html_on_codes = make_allowed_response_codes_list ()
123
+ settings .set ('HTML_STORAGE' , {
124
+ 'gzip_output' : True ,
125
+ 'save_html_on_codes' : save_html_on_codes
126
+ })
80
127
81
128
downloader = HtmlStorageMiddleware (settings )
82
129
83
- assert_that (downloader .gzip_output , is_ (True ))
130
+ assert_that (downloader , has_properties (dict (
131
+ gzip_output = True ,
132
+ save_html_on_codes = save_html_on_codes
133
+ )))
84
134
85
135
86
136
def test_constructor_sets_empty_settings_when_middleware_settings_are_not_specified ():
0 commit comments