Changeset View
Changeset View
Standalone View
Standalone View
swh/web/tests/api/test_apiresponse.py
# Copyright (C) 2015-2018 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 rest_framework.test import APIRequestFactory | ||||
from unittest.mock import patch | |||||
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 | ||||
) | ) | ||||
from swh.web.tests.testcase import WebTestCase | |||||
api_request_factory = APIRequestFactory() | api_request_factory = APIRequestFactory() | ||||
class SWHComputeLinkHeaderTest(WebTestCase): | def test_compute_link_header(): | ||||
def test_compute_link_header(self): | |||||
rv = { | rv = { | ||||
'headers': {'link-next': 'foo', 'link-prev': 'bar'}, | 'headers': {'link-next': 'foo', 'link-prev': 'bar'}, | ||||
'results': [1, 2, 3] | 'results': [1, 2, 3] | ||||
} | } | ||||
options = {} | options = {} | ||||
# when | headers = compute_link_header(rv, options) | ||||
headers = compute_link_header( | |||||
rv, options) | assert headers == {'Link': '<foo>; rel="next",<bar>; rel="previous"'} | ||||
self.assertEqual(headers, { | |||||
'Link': '<foo>; rel="next",<bar>; rel="previous"', | |||||
}) | |||||
def test_compute_link_header_nothing_changed(self): | def test_compute_link_header_nothing_changed(): | ||||
rv = {} | rv = {} | ||||
options = {} | options = {} | ||||
# when | headers = compute_link_header(rv, options) | ||||
headers = compute_link_header( | |||||
rv, options) | |||||
self.assertEqual(headers, {}) | assert headers == {} | ||||
def test_compute_link_header_nothing_changed_2(self): | |||||
def test_compute_link_header_nothing_changed_2(): | |||||
rv = {'headers': {}} | rv = {'headers': {}} | ||||
options = {} | options = {} | ||||
# when | headers = compute_link_header(rv, options) | ||||
headers = compute_link_header( | |||||
rv, options) | |||||
self.assertEqual(headers, {}) | assert headers == {} | ||||
class SWHTransformProcessorTest(WebTestCase): | def test_transform_only_return_results_1(): | ||||
def test_transform_only_return_results_1(self): | |||||
rv = {'results': {'some-key': 'some-value'}} | rv = {'results': {'some-key': 'some-value'}} | ||||
self.assertEqual(transform(rv), {'some-key': 'some-value'}) | assert transform(rv) == {'some-key': 'some-value'} | ||||
def test_transform_only_return_results_2(self): | def test_transform_only_return_results_2(): | ||||
rv = {'headers': {'something': 'do changes'}, | rv = {'headers': {'something': 'do changes'}, | ||||
'results': {'some-key': 'some-value'}} | 'results': {'some-key': 'some-value'}} | ||||
self.assertEqual(transform(rv), {'some-key': 'some-value'}) | assert transform(rv) == {'some-key': 'some-value'} | ||||
def test_transform_do_remove_headers(self): | def test_transform_do_remove_headers(): | ||||
rv = {'headers': {'something': 'do changes'}, | rv = {'headers': {'something': 'do changes'}, | ||||
'some-key': 'some-value'} | 'some-key': 'some-value'} | ||||
self.assertEqual(transform(rv), {'some-key': 'some-value'}) | assert transform(rv) == {'some-key': 'some-value'} | ||||
def test_transform_do_nothing(self): | |||||
def test_transform_do_nothing(): | |||||
rv = {'some-key': 'some-value'} | rv = {'some-key': 'some-value'} | ||||
self.assertEqual(transform(rv), {'some-key': 'some-value'}) | assert transform(rv) == {'some-key': 'some-value'} | ||||
class RendererTestCase(WebTestCase): | def test_swh_multi_response_mimetype(mocker): | ||||
mock_shorten_path = mocker.patch('swh.web.api.apiresponse.shorten_path') | |||||
mock_filter = mocker.patch('swh.web.api.apiresponse.filter_by_fields') | |||||
mock_json = mocker.patch('swh.web.api.apiresponse.json') | |||||
@patch('swh.web.api.apiresponse.json') | |||||
@patch('swh.web.api.apiresponse.filter_by_fields') | |||||
@patch('swh.web.api.apiresponse.shorten_path') | |||||
def test_swh_multi_response_mimetype(self, mock_shorten_path, | |||||
mock_filter, mock_json): | |||||
# given | |||||
data = { | data = { | ||||
'data': [12, 34], | 'data': [12, 34], | ||||
'id': 'adc83b19e793491b1c6ea0fd8b46cd9f32e592fc' | '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' | ||||
accepted_response_formats = {'html': 'text/html', | accepted_response_formats = {'html': 'text/html', | ||||
'yaml': 'application/yaml', | 'yaml': 'application/yaml', | ||||
'json': 'application/json'} | 'json': 'application/json'} | ||||
for format in accepted_response_formats: | for 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] | mime_type = accepted_response_formats[format] | ||||
setattr(request, 'accepted_media_type', mime_type) | setattr(request, 'accepted_media_type', mime_type) | ||||
if mime_type == 'text/html': | if mime_type == 'text/html': | ||||
expected_data = { | expected_data = { | ||||
'response_data': json.dumps(data), | 'response_data': json.dumps(data), | ||||
'request': { | 'request': { | ||||
'path': request.path, | 'path': request.path, | ||||
'method': request.method, | 'method': request.method, | ||||
'absolute_uri': request.build_absolute_uri() | 'absolute_uri': request.build_absolute_uri() | ||||
}, | }, | ||||
'headers_data': {}, | 'headers_data': {}, | ||||
'heading': 'my_short_path', | 'heading': 'my_short_path', | ||||
'status_code': 200 | 'status_code': 200 | ||||
} | } | ||||
mock_json.dumps.return_value = json.dumps(data) | mock_json.dumps.return_value = json.dumps(data) | ||||
else: | else: | ||||
expected_data = data | expected_data = data | ||||
# when | |||||
rv = make_api_response(request, data) | rv = make_api_response(request, data) | ||||
# then | |||||
mock_filter.assert_called_with(request, data) | mock_filter.assert_called_with(request, data) | ||||
self.assertEqual(rv.data, expected_data) | |||||
self.assertEqual(rv.status_code, 200, rv.data) | assert rv.status_code == 200, rv.data | ||||
assert rv.data == expected_data | |||||
if mime_type == 'text/html': | if mime_type == 'text/html': | ||||
self.assertEqual(rv.template_name, 'api/apidoc.html') | assert rv.template_name == 'api/apidoc.html' | ||||
def test_swh_filter_renderer_do_nothing(self): | |||||
# given | def test_swh_filter_renderer_do_nothing(): | ||||
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) | ||||
# when | |||||
actual_data = filter_by_fields(request, input_data) | actual_data = filter_by_fields(request, input_data) | ||||
# then | assert actual_data == input_data | ||||
self.assertEqual(actual_data, input_data) | |||||
@patch('swh.web.api.apiresponse.utils.filter_field_keys') | def test_swh_filter_renderer_do_filter(mocker): | ||||
def test_swh_filter_renderer_do_filter(self, mock_ffk): | mock_ffk = mocker.patch('swh.web.api.apiresponse.utils.filter_field_keys') | ||||
# given | |||||
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'} | ||||
# when | |||||
actual_data = filter_by_fields(request, input_data) | actual_data = filter_by_fields(request, input_data) | ||||
# then | assert actual_data == {'a': 'some-data'} | ||||
self.assertEqual(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'}) |