@@ -136,8 +136,8 @@ def start_requests(self):
136136 for i in range (spider_requests ):
137137 meta = {"zyte_api" : {"browserHtml" : True }}
138138
139- # Alternating requests between ZAPI and non-ZAPI tests if
140- # ZYTE_API_MAX_REQUESTS solely limits ZAPI Requests .
139+ # Alternating requests between ZAPI and non-ZAPI verifies
140+ # that ZYTE_API_MAX_REQUESTS solely limits ZAPI requests .
141141
142142 if i % 2 :
143143 yield Request (
@@ -166,8 +166,8 @@ def parse(self, response):
166166 f"Maximum Zyte API requests for this crawl is set at { zapi_max_requests } "
167167 in caplog .text
168168 )
169- assert crawler .stats .get_value ("scrapy-zyte-api/success" ) < = zapi_max_requests
170- assert crawler .stats .get_value ("scrapy-zyte-api/processed" ) < = zapi_max_requests
169+ assert crawler .stats .get_value ("scrapy-zyte-api/success" ) = = zapi_max_requests
170+ assert crawler .stats .get_value ("scrapy-zyte-api/processed" ) = = zapi_max_requests
171171 assert crawler .stats .get_value ("item_scraped_count" ) <= zapi_max_requests + 6
172172 assert crawler .stats .get_value ("finish_reason" ) == "closespider_max_zapi_requests"
173173 assert (
@@ -178,6 +178,53 @@ def parse(self, response):
178178 )
179179
180180
181+ @ensureDeferred
182+ async def test_max_requests_race_condition (caplog ):
183+ spider_requests = 8
184+ zapi_max_requests = 1
185+
186+ with MockServer (DelayedResource ) as server :
187+
188+ class TestSpider (Spider ):
189+ name = "test_spider"
190+
191+ def start_requests (self ):
192+ for i in range (spider_requests ):
193+ meta = {"zyte_api" : {"browserHtml" : True }}
194+ yield Request ("https://example.com" , meta = meta , dont_filter = True )
195+
196+ def parse (self , response ):
197+ yield Item ()
198+
199+ settings = {
200+ "DOWNLOADER_MIDDLEWARES" : {
201+ "scrapy_zyte_api.ScrapyZyteAPIDownloaderMiddleware" : 633
202+ },
203+ "ZYTE_API_MAX_REQUESTS" : zapi_max_requests ,
204+ "ZYTE_API_URL" : server .urljoin ("/" ),
205+ ** SETTINGS ,
206+ }
207+
208+ crawler = get_crawler (TestSpider , settings_dict = settings )
209+ with caplog .at_level ("INFO" ):
210+ await crawler .crawl ()
211+
212+ assert (
213+ f"Maximum Zyte API requests for this crawl is set at { zapi_max_requests } "
214+ in caplog .text
215+ )
216+ assert crawler .stats .get_value ("scrapy-zyte-api/success" ) == zapi_max_requests
217+ assert crawler .stats .get_value ("scrapy-zyte-api/processed" ) == zapi_max_requests
218+ assert crawler .stats .get_value ("item_scraped_count" ) == zapi_max_requests
219+ assert crawler .stats .get_value ("finish_reason" ) == "closespider_max_zapi_requests"
220+ assert (
221+ crawler .stats .get_value (
222+ "downloader/exception_type_count/scrapy.exceptions.IgnoreRequest"
223+ )
224+ > 0
225+ )
226+
227+
181228@ensureDeferred
182229async def test_forbidden_domain_start_url ():
183230 class TestSpider (Spider ):
0 commit comments