Changeset View
Changeset View
Standalone View
Standalone View
swh/web/tests/api/test_apiresponse.py
# Copyright (C) 2015-2019 The Software Heritage developers | # Copyright (C) 2015-2019 The Software Heritage developers | ||||
# See the AUTHORS file at the top-level directory of this distribution | # See the AUTHORS file at the top-level directory of this distribution | ||||
# License: GNU Affero General Public License version 3, or any later version | # License: GNU Affero General Public License version 3, or any later version | ||||
# See top-level LICENSE file for more information | # See top-level LICENSE file for more information | ||||
import json | import json | ||||
from swh.web.api.apiresponse import ( | from swh.web.api.apiresponse import ( | ||||
compute_link_header, | compute_link_header, | ||||
filter_by_fields, | filter_by_fields, | ||||
make_api_response, | make_api_response, | ||||
transform, | transform, | ||||
) | ) | ||||
from swh.web.common.utils import reverse | |||||
from swh.web.tests.django_asserts import assert_contains | |||||
def test_compute_link_header(): | def test_compute_link_header(): | ||||
next_link = "/api/endpoint/next" | next_link = "/api/endpoint/next" | ||||
prev_link = "/api/endpoint/prev" | prev_link = "/api/endpoint/prev" | ||||
rv = { | rv = { | ||||
"headers": {"link-next": next_link, "link-prev": prev_link}, | "headers": {"link-next": next_link, "link-prev": prev_link}, | ||||
"results": [1, 2, 3], | "results": [1, 2, 3], | ||||
▲ Show 20 Lines • Show All 49 Lines • ▼ Show 20 Lines | def test_swh_multi_response_mimetype(mocker, api_request_factory): | ||||
mock_shorten_path = mocker.patch("swh.web.api.apiresponse.shorten_path") | mock_shorten_path = mocker.patch("swh.web.api.apiresponse.shorten_path") | ||||
mock_filter = mocker.patch("swh.web.api.apiresponse.filter_by_fields") | mock_filter = mocker.patch("swh.web.api.apiresponse.filter_by_fields") | ||||
mock_json = mocker.patch("swh.web.api.apiresponse.json") | mock_json = mocker.patch("swh.web.api.apiresponse.json") | ||||
data = {"data": [12, 34], "id": "adc83b19e793491b1c6ea0fd8b46cd9f32e592fc"} | data = {"data": [12, 34], "id": "adc83b19e793491b1c6ea0fd8b46cd9f32e592fc"} | ||||
mock_filter.return_value = data | mock_filter.return_value = data | ||||
mock_shorten_path.return_value = "my_short_path" | mock_shorten_path.return_value = "my_short_path" | ||||
mock_json.dumps.return_value = json.dumps(data) | |||||
accepted_response_formats = { | accepted_response_formats = { | ||||
"html": "text/html", | "html": "text/html", | ||||
"yaml": "application/yaml", | "yaml": "application/yaml", | ||||
"json": "application/json", | "json": "application/json", | ||||
} | } | ||||
for format in accepted_response_formats: | for resp_format in accepted_response_formats: | ||||
request = api_request_factory.get("/api/test/path/") | request = api_request_factory.get("/api/test/path/") | ||||
mime_type = accepted_response_formats[format] | content_type = accepted_response_formats[resp_format] | ||||
setattr(request, "accepted_media_type", mime_type) | setattr(request, "accepted_media_type", content_type) | ||||
if mime_type == "text/html": | |||||
expected_data = { | |||||
"response_data": json.dumps(data), | |||||
"headers_data": {}, | |||||
"heading": "my_short_path", | |||||
"status_code": 200, | |||||
} | |||||
mock_json.dumps.return_value = json.dumps(data) | |||||
else: | |||||
expected_data = data | |||||
rv = make_api_response(request, data) | rv = make_api_response(request, data) | ||||
mock_filter.assert_called_with(request, data) | mock_filter.assert_called_with(request, data) | ||||
if resp_format != "html": | |||||
assert rv.status_code == 200, rv.data | assert rv.status_code == 200, rv.data | ||||
assert rv.data == expected_data | assert rv.data == data | ||||
if mime_type == "text/html": | else: | ||||
assert rv.template_name == "api/apidoc.html" | assert rv.status_code == 200, rv.content | ||||
assert_contains(rv, json.dumps(data)) | |||||
def test_swh_filter_renderer_do_nothing(api_request_factory): | def test_swh_filter_renderer_do_nothing(api_request_factory): | ||||
input_data = {"a": "some-data"} | input_data = {"a": "some-data"} | ||||
request = api_request_factory.get("/api/test/path/", data={}) | request = api_request_factory.get("/api/test/path/", data={}) | ||||
setattr(request, "query_params", request.GET) | setattr(request, "query_params", request.GET) | ||||
Show All 11 Lines | def test_swh_filter_renderer_do_filter(mocker, api_request_factory): | ||||
input_data = {"a": "some-data", "b": "some-other-data"} | input_data = {"a": "some-data", "b": "some-other-data"} | ||||
actual_data = filter_by_fields(request, input_data) | actual_data = filter_by_fields(request, input_data) | ||||
assert actual_data == {"a": "some-data"} | assert actual_data == {"a": "some-data"} | ||||
mock_ffk.assert_called_once_with(input_data, {"a", "c"}) | mock_ffk.assert_called_once_with(input_data, {"a", "c"}) | ||||
def test_error_response_handler(mocker, api_client): | |||||
mock_archive = mocker.patch("swh.web.api.views.stat.archive") | |||||
mock_archive.stat_counters.side_effect = Exception("Something went wrong") | |||||
url = reverse("api-1-stat-counters") | |||||
resp = api_client.get(url) | |||||
assert resp.status_code == 500 |