3
3
import json
4
4
import mock
5
5
import pytest
6
+ import unittest
6
7
from scrapy .settings import Settings
7
8
8
9
import sh_scrapy .crawl
@@ -120,6 +121,7 @@ def test_run_pkg_script(run_pkg_mock):
120
121
assert run_pkg_mock .call_args [0 ] == (['py:script.py' ],)
121
122
122
123
124
+ @unittest .skipIf (sys .version_info > (3 ,7 ), "Requires Python 3.7 or lower" )
123
125
@mock .patch ('pkg_resources.WorkingSet' )
124
126
def test_run_pkg_script_distribution_not_found (working_set_class ):
125
127
fake_set = mock .Mock ()
@@ -128,6 +130,14 @@ def test_run_pkg_script_distribution_not_found(working_set_class):
128
130
with pytest .raises (ValueError ):
129
131
_run (['py:script.py' ], {'SETTING' : 'VALUE' })
130
132
133
+ @unittest .skipIf (sys .version_info < (3 ,8 ), "Requires Python 3.8 or higher" )
134
+ @mock .patch ('importlib.metadata.entry_points' )
135
+ def test_run_pkg_script_distribution_not_found_python_3_8_plus (working_set_class ):
136
+ fake_set = mock .Mock ()
137
+ fake_set .iter_entry_points .return_value = iter (())
138
+ working_set_class .return_value = [fake_set ]
139
+ with pytest .raises (ValueError ):
140
+ _run (['py:script.py' ], {'SETTING' : 'VALUE' })
131
141
132
142
@mock .patch ('sh_scrapy.crawl._run_scrapy' )
133
143
def test_run_scrapy_spider (run_scrapy_mock ):
@@ -155,6 +165,7 @@ def get_working_set(working_set_class):
155
165
return working_set
156
166
157
167
168
+ @unittest .skipIf (sys .version_info > (3 ,7 ), "Requires Python 3.7 or lower" )
158
169
@mock .patch ('pkg_resources.WorkingSet' )
159
170
def test_run_pkgscript_base_usage (working_set_class ):
160
171
working_set = get_working_set (working_set_class )
@@ -167,6 +178,25 @@ def test_run_pkgscript_base_usage(working_set_class):
167
178
'script.py' , {'__name__' : '__main__' })
168
179
assert sys .argv == ['script.py' , 'arg1' , 'arg2' ]
169
180
181
+ def get_entry_points_mock ():
182
+ """Helper to configure a fake entry point"""
183
+ ep = mock .Mock ()
184
+ ep .name = 'settings'
185
+ ep .dist .run_script = mock .Mock ()
186
+ return [ep ]
187
+
188
+ @unittest .skipIf (sys .version_info < (3 ,8 ), "Requires Python 3.8 or higher" )
189
+ @mock .patch ('importlib.metadata.entry_points' )
190
+ def test_run_pkgscript_base_usage_python_3_8_plus (entry_points_mock ):
191
+ entry_points_mock .return_value = get_entry_points_mock ()
192
+ _run_pkgscript (['py:script.py' , 'arg1' , 'arg2' ])
193
+ assert entry_points_mock .called
194
+ assert entry_points_mock .call_args [1 ] == {'group' : 'scrapy' }
195
+ ep = entry_points_mock .return_value [0 ]
196
+ assert ep .dist .run_script .called
197
+ assert ep .dist .run_script .call_args [0 ] == ('script.py' , {'__name__' : '__main__' })
198
+ assert sys .argv == ['script.py' , 'arg1' , 'arg2' ]
199
+
170
200
171
201
@mock .patch .dict (os .environ , {
172
202
'SHUB_SETTINGS' : '{"project_settings": {"SETTING....' })
0 commit comments