Skip to content

Commit 59d0a01

Browse files
committed
[resources] readability in start_requests POST handler
+ test for missing "request" argument to POST endpoint
1 parent 79e3e47 commit 59d0a01

File tree

2 files changed

+26
-3
lines changed

2 files changed

+26
-3
lines changed

scrapyrt/resources.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -145,15 +145,19 @@ def render_POST(self, request, **kwargs):
145145
raise Error('400', message=message)
146146

147147
log.msg("{}".format(api_params))
148+
if api_params.get("start_requests"):
149+
# start requests passed so 'request' argument is optional
150+
_request = api_params.get("request", {})
151+
else:
152+
# no start_requests, 'request' is required
153+
_request = self.get_required_argument(api_params, "request")
148154
try:
149155
scrapy_request_args = extract_scrapy_request_args(
150-
api_params.get("request", {}), raise_error=True
156+
_request, raise_error=True
151157
)
152158
except ValueError as e:
153159
raise Error(400, e.message)
154160

155-
if not api_params.get("start_requests"):
156-
self.get_required_argument(api_params, "request")
157161
self.validate_options(scrapy_request_args, api_params)
158162
return self.prepare_crawl(api_params, scrapy_request_args, **kwargs)
159163

tests/test_resource_crawl.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,25 @@ def test_no_url_but_start_requests_present(self, server, method):
126126
assert len(spider_errors) == 0
127127
assert result["stats"].get("downloader/request_count") == 2
128128

129+
def test_no_request_but_start_requests_present(self, server):
130+
"""Test for POST handler checking if everything works fine
131+
if there is no 'request' argument, but 'start_requests' are
132+
present. Not checked above because of the way default test fixtures
133+
are written.
134+
"""
135+
post_data = {
136+
"no_request": {},
137+
"start_requests": True,
138+
"spider_name": "test_with_sr"
139+
}
140+
post_data.update(post_data)
141+
res = requests.post(server.url("crawl.json"),
142+
json=post_data)
143+
assert res.status_code == 200
144+
data = res.json()
145+
assert len(data["items"]) == 2
146+
assert data.get("errors") is None
147+
129148
@pytest.mark.parametrize("method", [
130149
perform_get, perform_post
131150
])

0 commit comments

Comments
 (0)