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 rest_framework.test import APIRequestFactory | |||||
from swh.web.api.apiresponse import ( | from swh.web.api.apiresponse import ( | ||||
compute_link_header, transform, make_api_response, | compute_link_header, transform, make_api_response, | ||||
filter_by_fields | filter_by_fields | ||||
) | ) | ||||
api_request_factory = APIRequestFactory() | |||||
def test_compute_link_header(): | def test_compute_link_header(api_request_factory): | ||||
next_link = '/api/endpoint/next' | |||||
prev_link = '/api/endpoint/prev' | |||||
rv = { | rv = { | ||||
'headers': {'link-next': 'foo', 'link-prev': 'bar'}, | 'headers': {'link-next': next_link, 'link-prev': prev_link}, | ||||
'results': [1, 2, 3] | 'results': [1, 2, 3] | ||||
} | } | ||||
options = {} | options = {} | ||||
headers = compute_link_header(rv, options) | request = api_request_factory.get('/api/endpoint/') | ||||
assert headers == {'Link': '<foo>; rel="next",<bar>; rel="previous"'} | headers = compute_link_header(request, rv, options) | ||||
assert headers == { | |||||
'Link': (f'<{request.build_absolute_uri(next_link)}>; rel="next",' | |||||
f'<{request.build_absolute_uri(prev_link)}>; rel="previous"') | |||||
} | |||||
def test_compute_link_header_nothing_changed(): | def test_compute_link_header_nothing_changed(api_request_factory): | ||||
rv = {} | rv = {} | ||||
options = {} | options = {} | ||||
headers = compute_link_header(rv, options) | request = api_request_factory.get('/api/test/path/') | ||||
headers = compute_link_header(request, rv, options) | |||||
assert headers == {} | assert headers == {} | ||||
def test_compute_link_header_nothing_changed_2(): | def test_compute_link_header_nothing_changed_2(api_request_factory): | ||||
rv = {'headers': {}} | rv = {'headers': {}} | ||||
options = {} | options = {} | ||||
headers = compute_link_header(rv, options) | request = api_request_factory.get('/api/test/path/') | ||||
headers = compute_link_header(request, rv, options) | |||||
assert headers == {} | assert headers == {} | ||||
def test_transform_only_return_results_1(): | def test_transform_only_return_results_1(): | ||||
rv = {'results': {'some-key': 'some-value'}} | rv = {'results': {'some-key': 'some-value'}} | ||||
assert transform(rv) == {'some-key': 'some-value'} | assert transform(rv) == {'some-key': 'some-value'} | ||||
Show All 14 Lines | |||||
def test_transform_do_nothing(): | def test_transform_do_nothing(): | ||||
rv = {'some-key': 'some-value'} | rv = {'some-key': 'some-value'} | ||||
assert transform(rv) == {'some-key': 'some-value'} | assert transform(rv) == {'some-key': 'some-value'} | ||||
def test_swh_multi_response_mimetype(mocker): | 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 = { | ||||
'data': [12, 34], | 'data': [12, 34], | ||||
'id': 'adc83b19e793491b1c6ea0fd8b46cd9f32e592fc' | 'id': 'adc83b19e793491b1c6ea0fd8b46cd9f32e592fc' | ||||
} | } | ||||
Show All 35 Lines | for format in accepted_response_formats: | ||||
mock_filter.assert_called_with(request, data) | mock_filter.assert_called_with(request, data) | ||||
assert rv.status_code == 200, rv.data | assert rv.status_code == 200, rv.data | ||||
assert rv.data == expected_data | assert rv.data == expected_data | ||||
if mime_type == 'text/html': | if mime_type == 'text/html': | ||||
assert rv.template_name == 'api/apidoc.html' | assert rv.template_name == 'api/apidoc.html' | ||||
def test_swh_filter_renderer_do_nothing(): | 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) | ||||
actual_data = filter_by_fields(request, input_data) | actual_data = filter_by_fields(request, input_data) | ||||
assert actual_data == input_data | assert actual_data == input_data | ||||
def test_swh_filter_renderer_do_filter(mocker): | def test_swh_filter_renderer_do_filter(mocker, api_request_factory): | ||||
mock_ffk = mocker.patch('swh.web.api.apiresponse.utils.filter_field_keys') | mock_ffk = mocker.patch('swh.web.api.apiresponse.utils.filter_field_keys') | ||||
mock_ffk.return_value = {'a': 'some-data'} | mock_ffk.return_value = {'a': 'some-data'} | ||||
request = api_request_factory.get('/api/test/path/', | request = api_request_factory.get('/api/test/path/', | ||||
data={'fields': 'a,c'}) | data={'fields': 'a,c'}) | ||||
setattr(request, 'query_params', request.GET) | setattr(request, 'query_params', request.GET) | ||||
input_data = {'a': 'some-data', | input_data = {'a': 'some-data', | ||||
'b': 'some-other-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'}) |