55from random import choice
66from unittest import TestCase
77try :
8- from unittest .mock import call , patch
8+ from unittest .mock import call , patch # type: ignore
99except ImportError :
10- from mock import call , patch
10+ from mock import call , patch # type: ignore
1111
1212from w3lib .http import basic_auth_header
1313from scrapy .downloadermiddlewares .httpproxy import HttpProxyMiddleware
@@ -666,19 +666,24 @@ def test_is_banned(self):
666666 mw = self .mwcls .from_crawler (crawler )
667667 mw .open_spider (self .spider )
668668 req = self ._make_fake_request (self .spider , zyte_smartproxy_enabled = True )
669+
669670 res = Response (req .url , status = 200 )
670671 res = mw .process_response (req , res , self .spider )
671672 self .assertFalse (mw ._is_banned (res ))
672673 res = Response (req .url , status = 503 , headers = {'X-Crawlera-Error' : 'noslaves' })
673674 res = mw .process_response (req , res , self .spider )
674675 self .assertFalse (mw ._is_banned (res ))
675- res = Response (req .url , status = 503 , headers = {'Zyte-Error' : 'noslaves ' })
676+ res = Response (req .url , status = 503 , headers = {'Zyte-Error' : '/limits/over-global-limit ' })
676677 res = mw .process_response (req , res , self .spider )
677678 self .assertFalse (mw ._is_banned (res ))
679+
678680 res = Response (req .url , status = 503 , headers = {'X-Crawlera-Error' : 'banned' })
679681 res = mw .process_response (req , res , self .spider )
680682 self .assertTrue (mw ._is_banned (res ))
681- res = Response (req .url , status = 503 , headers = {'Zyte-Error' : 'banned' })
683+ res = Response (req .url , status = 520 , headers = {'Zyte-Error' : '/download/temporary-error' })
684+ res = mw .process_response (req , res , self .spider )
685+ self .assertTrue (mw ._is_banned (res ))
686+ res = Response (req .url , status = 521 , headers = {'Zyte-Error' : '/download/internal-error' })
682687 res = mw .process_response (req , res , self .spider )
683688 self .assertTrue (mw ._is_banned (res ))
684689
@@ -709,24 +714,38 @@ def test_noslaves_delays(self, random_uniform_patch):
709714 noslaves_req = Request (url , meta = {'download_slot' : slot_key })
710715 assert mw .process_request (noslaves_req , self .spider ) is None
711716 assert httpproxy .process_request (noslaves_req , self .spider ) is None
712- headers = {'X-Crawlera-Error' : 'noslaves' }
713- noslaves_res = self ._mock_zyte_smartproxy_response (
717+
718+ # delays grow exponentially with any throttling error
719+ noslaves_response = self ._mock_zyte_smartproxy_response (
714720 ban_url ,
715- status = self . bancode ,
716- headers = headers ,
721+ status = 503 ,
722+ headers = { 'X-Crawlera-Error' : 'noslaves' } ,
717723 )
718-
719- # delays grow exponentially
720- mw .process_response (noslaves_req , noslaves_res , self .spider )
724+ mw .process_response (noslaves_req , noslaves_response , self .spider )
721725 self .assertEqual (slot .delay , backoff_step )
722726
723- mw .process_response (noslaves_req , noslaves_res , self .spider )
727+ over_use_limit_response = self ._mock_zyte_smartproxy_response (
728+ ban_url ,
729+ status = 429 ,
730+ headers = {'Zyte-Error' : '/limits/over-user-limit' },
731+ )
732+ mw .process_response (noslaves_req , over_use_limit_response , self .spider )
724733 self .assertEqual (slot .delay , backoff_step * 2 ** 1 )
725734
726- mw .process_response (noslaves_req , noslaves_res , self .spider )
735+ over_domain_limit_response = self ._mock_zyte_smartproxy_response (
736+ ban_url ,
737+ status = 429 ,
738+ headers = {'Zyte-Error' : '/limits/over-domain-limit' },
739+ )
740+ mw .process_response (noslaves_req , over_domain_limit_response , self .spider )
727741 self .assertEqual (slot .delay , backoff_step * 2 ** 2 )
728742
729- mw .process_response (noslaves_req , noslaves_res , self .spider )
743+ over_global_limit_response = self ._mock_zyte_smartproxy_response (
744+ ban_url ,
745+ status = 503 ,
746+ headers = {'Zyte-Error' : '/limits/over-global-limit' },
747+ )
748+ mw .process_response (noslaves_req , over_global_limit_response , self .spider )
730749 self .assertEqual (slot .delay , max_delay )
731750
732751 # other responses reset delay
@@ -742,7 +761,7 @@ def test_noslaves_delays(self, random_uniform_patch):
742761 mw .process_response (ban_req , ban_res , self .spider )
743762 self .assertEqual (slot .delay , default_delay )
744763
745- mw .process_response (noslaves_req , noslaves_res , self .spider )
764+ mw .process_response (noslaves_req , noslaves_response , self .spider )
746765 self .assertEqual (slot .delay , backoff_step )
747766
748767 good_req = Request (url , meta = {'download_slot' : slot_key })
0 commit comments