diff --git a/tests/mockserver/http_resources.py b/tests/mockserver/http_resources.py index cb028bc10..d86a3d6df 100644 --- a/tests/mockserver/http_resources.py +++ b/tests/mockserver/http_resources.py @@ -380,11 +380,13 @@ class UriResource(BaseResource): class ResponseHeadersResource(BaseResource): - """Return a response with headers set from the JSON request body""" + """Return a response with headers set from the JSON request body, and the + status code set from the *n* URL parameter, 200 by default.""" def render(self, request: Request) -> bytes: assert request.content body = json.loads(request.content.read().decode()) + request.setResponseCode(getarg(request, b"n", 200, type_=int)) for header_name, header_value in body.items(): request.responseHeaders.setRawHeaders(header_name, [header_value]) return json.dumps(body).encode("utf-8") diff --git a/tests/test_cookies.py b/tests/test_cookies.py deleted file mode 100644 index db78f9f18..000000000 --- a/tests/test_cookies.py +++ /dev/null @@ -1,73 +0,0 @@ -import json - -from twisted.internet import defer -from twisted.trial.unittest import TestCase - -from scrapy.crawler import CrawlerRunner -from scrapy.http import Request -from tests.mockserver import MockServer -from tests.spiders import MetaSpider - - -class CookiesSpider(MetaSpider): - name = "cookies" - - def start_requests(self): - url = self.mockserver.url("/echo2/") - for status in [200, 302, 503]: - # Response params that mockserver will return - body = { - "status": status, - "headers": { - "Set-cookie": f"status={status}", - }, - "body": "", - } - - if status == 302: - body["headers"]["location"] = self.mockserver.url("/") - - yield Request( - url, - callback=self.parse, - meta={"cookiejar": status}, - body=json.dumps(body), - ) - - def parse(self, response): - pass - - def close(self, spider): - mw = [ - m - for m in self.crawler.engine.downloader.middleware.middlewares - if "Cookies" in str(type(m)) - ][0] - jars_data = {} - for k, jar in mw.jars.items(): - jars_data[k] = { - s: v.value for s, v in jar._cookies["127.0.0.1"]["/echo2"].items() - } - self.crawler.stats._stats["cookies_values"] = jars_data - - -class CookiesTestCase(TestCase): - def setUp(self): - self.mockserver = MockServer() - self.mockserver.__enter__() - self.runner = CrawlerRunner() - - def tearDown(self): - self.mockserver.__exit__(None, None, None) - - @defer.inlineCallbacks - def test_cookies(self): - crawler = CrawlerRunner().create_crawler(CookiesSpider) - yield crawler.crawl(mockserver=self.mockserver) - cookies_stats = crawler.stats._stats.get("cookies_values") - expected_cookies = { - 200: {"status": "200"}, - 302: {"status": "302"}, - 503: {"status": "503"}, - } - self.assertEqual(cookies_stats, expected_cookies) diff --git a/tests/utils/bases/download_handlers_http.py b/tests/utils/bases/download_handlers_http.py index e44f9bcb8..3f4953447 100644 --- a/tests/utils/bases/download_handlers_http.py +++ b/tests/utils/bases/download_handlers_http.py @@ -284,6 +284,20 @@ class TestHttpBase(ABC): header_value.encode(encoding="utf-8") ] + @coroutine_test + async def test_download_has_correct_response_status_and_headers( + self, mockserver: MockServer + ) -> None: + request = Request( + mockserver.url("/response-headers?n=302", is_secure=self.is_secure), + headers={"content-type": "application/json"}, + body=json.dumps({"Set-Cookie": "status=302"}), + ) + async with self.get_dh() as download_handler: + response = await download_handler.download_request(request) + assert response.status == 302 + assert response.headers.getlist("Set-Cookie") == [b"status=302"] + @coroutine_test async def test_download_no_extra_response_headers( self, mockserver: MockServer