Changeset View
Changeset View
Standalone View
Standalone View
swh/web/tests/api/views/test_content.py
# Copyright (C) 2015-2018 The Software Heritage developers | # Copyright (C) 2015-2018 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 pytest | |||||
from hypothesis import given | |||||
from rest_framework.test import APITestCase | from rest_framework.test import APITestCase | ||||
from unittest.mock import patch | |||||
from swh.web.tests.testcase import WebTestCase | from swh.web.common.utils import reverse | ||||
from swh.web.tests.strategies import ( | |||||
content, unknown_content, contents_with_ctags | |||||
) | |||||
from swh.web.tests.testcase import ( | |||||
WebTestCase, ctags_json_missing, fossology_missing | |||||
) | |||||
class ContentApiTestCase(WebTestCase, APITestCase): | class ContentApiTestCase(WebTestCase, APITestCase): | ||||
@patch('swh.web.api.views.content.service') | |||||
def test_api_content_filetype(self, mock_service): | |||||
stub_filetype = { | |||||
'accepted_media_type': 'application/xml', | |||||
'encoding': 'ascii', | |||||
'id': '34571b8614fcd89ccd17ca2b1d9e66c5b00a6d03', | |||||
} | |||||
mock_service.lookup_content_filetype.return_value = stub_filetype | |||||
# when | @given(content()) | ||||
rv = self.client.get( | def test_api_content_filetype(self, content): | ||||
'/api/1/content/' | |||||
'sha1_git:b04caf10e9535160d90e874b45aa426de762f19f/filetype/') | self.content_add_mimetype(content['sha1']) | ||||
url = reverse('api-content-filetype', | |||||
url_args={'q': 'sha1_git:%s' % content['sha1_git']}) | |||||
rv = self.client.get(url) | |||||
# then | |||||
self.assertEqual(rv.status_code, 200) | self.assertEqual(rv.status_code, 200) | ||||
self.assertEqual(rv['Content-Type'], 'application/json') | self.assertEqual(rv['Content-Type'], 'application/json') | ||||
self.assertEqual(rv.data, { | content_url = reverse('api-content', | ||||
'accepted_media_type': 'application/xml', | url_args={'q': 'sha1:%s' % content['sha1']}) | ||||
'encoding': 'ascii', | expected_data = self.content_get_mimetype(content['sha1']) | ||||
'id': '34571b8614fcd89ccd17ca2b1d9e66c5b00a6d03', | expected_data['content_url'] = content_url | ||||
'content_url': '/api/1/content/' | self.assertEqual(rv.data, expected_data) | ||||
'sha1:34571b8614fcd89ccd17ca2b1d9e66c5b00a6d03/', | |||||
}) | |||||
mock_service.lookup_content_filetype.assert_called_once_with( | @given(unknown_content()) | ||||
'sha1_git:b04caf10e9535160d90e874b45aa426de762f19f') | def test_api_content_filetype_sha_not_found(self, unknown_content): | ||||
@patch('swh.web.api.views.content.service') | url = reverse('api-content-filetype', | ||||
def test_api_content_filetype_sha_not_found(self, mock_service): | url_args={'q': 'sha1:%s' % unknown_content['sha1']}) | ||||
# given | rv = self.client.get(url) | ||||
mock_service.lookup_content_filetype.return_value = None | |||||
# when | |||||
rv = self.client.get( | |||||
'/api/1/content/sha1:40e71b8614fcd89ccd17ca2b1d9e66c5b00a6d03/' | |||||
'filetype/') | |||||
# then | |||||
self.assertEqual(rv.status_code, 404) | self.assertEqual(rv.status_code, 404) | ||||
self.assertEqual(rv['Content-Type'], 'application/json') | self.assertEqual(rv['Content-Type'], 'application/json') | ||||
self.assertEqual(rv.data, { | self.assertEqual(rv.data, { | ||||
'exception': 'NotFoundExc', | 'exception': 'NotFoundExc', | ||||
'reason': 'No filetype information found for content ' | 'reason': 'No filetype information found for content ' | ||||
'sha1:40e71b8614fcd89ccd17ca2b1d9e66c5b00a6d03.' | 'sha1:%s.' % unknown_content['sha1'] | ||||
}) | }) | ||||
mock_service.lookup_content_filetype.assert_called_once_with( | @given(content()) | ||||
'sha1:40e71b8614fcd89ccd17ca2b1d9e66c5b00a6d03') | def test_api_content_language(self, content): | ||||
@patch('swh.web.api.views.content.service') | |||||
def test_api_content_language(self, mock_service): | |||||
stub_language = { | |||||
'lang': 'lisp', | |||||
'id': '34571b8614fcd89ccd17ca2b1d9e66c5b00a6d03', | |||||
} | |||||
mock_service.lookup_content_language.return_value = stub_language | |||||
# when | self.content_add_language(content['sha1']) | ||||
rv = self.client.get( | url = reverse('api-content-language', | ||||
'/api/1/content/' | url_args={'q': 'sha1_git:%s' % content['sha1_git']}) | ||||
'sha1_git:b04caf10e9535160d90e874b45aa426de762f19f/language/') | rv = self.client.get(url) | ||||
# then | |||||
self.assertEqual(rv.status_code, 200) | self.assertEqual(rv.status_code, 200) | ||||
self.assertEqual(rv['Content-Type'], 'application/json') | self.assertEqual(rv['Content-Type'], 'application/json') | ||||
self.assertEqual(rv.data, { | content_url = reverse('api-content', | ||||
'lang': 'lisp', | url_args={'q': 'sha1:%s' % content['sha1']}) | ||||
'id': '34571b8614fcd89ccd17ca2b1d9e66c5b00a6d03', | expected_data = self.content_get_language(content['sha1']) | ||||
'content_url': '/api/1/content/' | expected_data['content_url'] = content_url | ||||
'sha1:34571b8614fcd89ccd17ca2b1d9e66c5b00a6d03/', | self.assertEqual(rv.data, expected_data) | ||||
}) | |||||
mock_service.lookup_content_language.assert_called_once_with( | |||||
'sha1_git:b04caf10e9535160d90e874b45aa426de762f19f') | |||||
@patch('swh.web.api.views.content.service') | @given(unknown_content()) | ||||
def test_api_content_language_sha_not_found(self, mock_service): | def test_api_content_language_sha_not_found(self, unknown_content): | ||||
# given | |||||
mock_service.lookup_content_language.return_value = None | |||||
# when | url = reverse('api-content-language', | ||||
rv = self.client.get( | url_args={'q': 'sha1:%s' % unknown_content['sha1']}) | ||||
'/api/1/content/sha1:40e71b8614fcd89ccd17ca2b1d9e66c5b00a6d03' | rv = self.client.get(url) | ||||
'/language/') | |||||
# then | |||||
self.assertEqual(rv.status_code, 404) | self.assertEqual(rv.status_code, 404) | ||||
self.assertEqual(rv['Content-Type'], 'application/json') | self.assertEqual(rv['Content-Type'], 'application/json') | ||||
self.assertEqual(rv.data, { | self.assertEqual(rv.data, { | ||||
'exception': 'NotFoundExc', | 'exception': 'NotFoundExc', | ||||
'reason': 'No language information found for content ' | 'reason': 'No language information found for content ' | ||||
'sha1:40e71b8614fcd89ccd17ca2b1d9e66c5b00a6d03.' | 'sha1:%s.' % unknown_content['sha1'] | ||||
}) | }) | ||||
mock_service.lookup_content_language.assert_called_once_with( | @pytest.mark.skipif(ctags_json_missing, | ||||
'sha1:40e71b8614fcd89ccd17ca2b1d9e66c5b00a6d03') | reason="requires ctags with json output support") | ||||
@given(contents_with_ctags()) | |||||
def test_api_content_symbol(self, contents_with_ctags): | |||||
expected_data = {} | |||||
for content_sha1 in contents_with_ctags['sha1s']: | |||||
self.content_add_ctags(content_sha1) | |||||
for ctag in self.content_get_ctags(content_sha1): | |||||
if ctag['name'] == contents_with_ctags['symbol_name']: | |||||
expected_data[content_sha1] = ctag | |||||
break | |||||
url = reverse('api-content-symbol', | |||||
url_args={'q': contents_with_ctags['symbol_name']}, | |||||
query_params={'per_page': 100}) | |||||
rv = self.client.get(url) | |||||
@patch('swh.web.api.views.content.service') | self.assertEqual(rv.status_code, 200) | ||||
vlorentz: This condition is computed twice, it should be a class variable or a global instead. | |||||
def test_api_content_symbol(self, mock_service): | self.assertEqual(rv['Content-Type'], 'application/json') | ||||
stub_ctag = [{ | for entry in rv.data: | ||||
'sha1': '34571b8614fcd89ccd17ca2b1d9e66c5b00a6d03', | content_sha1 = entry['sha1'] | ||||
'name': 'foobar', | expected_entry = expected_data[content_sha1] | ||||
'kind': 'Haskell', | for key, view_name in (('content_url', 'api-content'), | ||||
'line': 10, | ('data_url', 'api-content-raw'), | ||||
}] | ('license_url', 'api-content-license'), | ||||
mock_service.lookup_expression.return_value = stub_ctag | ('language_url', 'api-content-language'), | ||||
('filetype_url', 'api-content-filetype')): | |||||
# when | expected_entry[key] = reverse(view_name, | ||||
rv = self.client.get('/api/1/content/symbol/foo/?last_sha1=sha1') | url_args={'q': 'sha1:%s' % | ||||
content_sha1}) | |||||
# then | expected_entry['sha1'] = content_sha1 | ||||
self.assertEqual(rv.status_code, 200) | del expected_entry['id'] | ||||
self.assertEqual(rv['Content-Type'], 'application/json') | self.assertEqual(entry, expected_entry) | ||||
self.assertEqual(rv.data, [{ | |||||
'sha1': '34571b8614fcd89ccd17ca2b1d9e66c5b00a6d03', | |||||
'name': 'foobar', | |||||
'kind': 'Haskell', | |||||
'line': 10, | |||||
'content_url': '/api/1/content/' | |||||
'sha1:34571b8614fcd89ccd17ca2b1d9e66c5b00a6d03/', | |||||
'data_url': '/api/1/content/' | |||||
'sha1:34571b8614fcd89ccd17ca2b1d9e66c5b00a6d03/raw/', | |||||
'license_url': '/api/1/content/' | |||||
'sha1:34571b8614fcd89ccd17ca2b1d9e66c5b00a6d03/license/', | |||||
'language_url': '/api/1/content/' | |||||
'sha1:34571b8614fcd89ccd17ca2b1d9e66c5b00a6d03/language/', | |||||
'filetype_url': '/api/1/content/' | |||||
'sha1:34571b8614fcd89ccd17ca2b1d9e66c5b00a6d03/filetype/', | |||||
}]) | |||||
self.assertFalse('Link' in rv) | self.assertFalse('Link' in rv) | ||||
mock_service.lookup_expression.assert_called_once_with( | url = reverse('api-content-symbol', | ||||
'foo', 'sha1', 10) | url_args={'q': contents_with_ctags['symbol_name']}, | ||||
query_params={'per_page': 2}) | |||||
Not Done Inline ActionsThis can probably be factorized in a for loop. vlorentz: This can probably be factorized in a `for` loop. | |||||
@patch('swh.web.api.views.content.service') | rv = self.client.get(url) | ||||
def test_api_content_symbol_2(self, mock_service): | |||||
stub_ctag = [{ | next_url = reverse('api-content-symbol', | ||||
'sha1': '12371b8614fcd89ccd17ca2b1d9e66c5b00a6456', | url_args={'q': contents_with_ctags['symbol_name']}, | ||||
'name': 'foobar', | query_params={'last_sha1': rv.data[1]['sha1'], | ||||
'kind': 'Haskell', | 'per_page': 2}) | ||||
'line': 10, | self.assertEqual(rv['Link'], '<%s>; rel="next"' % next_url) | ||||
}, { | |||||
'sha1': '34571b8614fcd89ccd17ca2b1d9e66c5b00a6678', | @pytest.mark.xfail(reason='FIXME: exception should be raised in service') | ||||
'name': 'foo', | @given(unknown_content()) | ||||
'kind': 'Lisp', | def test_api_content_symbol_not_found(self, unknown_content): | ||||
'line': 10, | |||||
}] | url = reverse('api-content-symbol', url_args={'q': 'bar'}, | ||||
mock_service.lookup_expression.return_value = stub_ctag | query_params={'last_sha1': 'hash'}) | ||||
rv = self.client.get(url) | |||||
# when | |||||
rv = self.client.get( | |||||
'/api/1/content/symbol/foo/?last_sha1=prev-sha1&per_page=2') | |||||
# then | |||||
self.assertEqual(rv.status_code, 200) | |||||
self.assertEqual(rv['Content-Type'], 'application/json') | |||||
self.assertEqual(rv.data, stub_ctag) | |||||
self.assertTrue( | |||||
rv['Link'] == '</api/1/content/symbol/foo/?last_sha1=34571b8614fcd89ccd17ca2b1d9e66c5b00a6678&per_page=2>; rel="next"' or # noqa | |||||
rv['Link'] == '</api/1/content/symbol/foo/?per_page=2&last_sha1=34571b8614fcd89ccd17ca2b1d9e66c5b00a6678>; rel="next"' # noqa | |||||
) | |||||
mock_service.lookup_expression.assert_called_once_with( | |||||
'foo', 'prev-sha1', 2) | |||||
@patch('swh.web.api.views.content.service') | |||||
def test_api_content_symbol_3(self, mock_service): | |||||
stub_ctag = [{ | |||||
'sha1': '67891b8614fcd89ccd17ca2b1d9e66c5b00a6d03', | |||||
'name': 'foo', | |||||
'kind': 'variable', | |||||
'line': 100, | |||||
}] | |||||
mock_service.lookup_expression.return_value = stub_ctag | |||||
# when | |||||
rv = self.client.get('/api/1/content/symbol/foo/') | |||||
# then | |||||
self.assertEqual(rv.status_code, 200) | |||||
self.assertEqual(rv['Content-Type'], 'application/json') | |||||
self.assertEqual(rv.data, [{ | |||||
'sha1': '67891b8614fcd89ccd17ca2b1d9e66c5b00a6d03', | |||||
'name': 'foo', | |||||
'kind': 'variable', | |||||
'line': 100, | |||||
'content_url': '/api/1/content/' | |||||
'sha1:67891b8614fcd89ccd17ca2b1d9e66c5b00a6d03/', | |||||
'data_url': '/api/1/content/' | |||||
'sha1:67891b8614fcd89ccd17ca2b1d9e66c5b00a6d03/raw/', | |||||
'license_url': '/api/1/content/' | |||||
'sha1:67891b8614fcd89ccd17ca2b1d9e66c5b00a6d03/license/', | |||||
'language_url': '/api/1/content/' | |||||
'sha1:67891b8614fcd89ccd17ca2b1d9e66c5b00a6d03/language/', | |||||
'filetype_url': '/api/1/content/' | |||||
'sha1:67891b8614fcd89ccd17ca2b1d9e66c5b00a6d03/filetype/', | |||||
}]) | |||||
self.assertFalse(rv.has_header('Link')) | |||||
mock_service.lookup_expression.assert_called_once_with('foo', None, 10) | |||||
@patch('swh.web.api.views.content.service') | |||||
def test_api_content_symbol_not_found(self, mock_service): | |||||
# given | |||||
mock_service.lookup_expression.return_value = [] | |||||
# when | |||||
rv = self.client.get('/api/1/content/symbol/bar/?last_sha1=hash') | |||||
# then | |||||
self.assertEqual(rv.status_code, 404) | self.assertEqual(rv.status_code, 404) | ||||
self.assertEqual(rv['Content-Type'], 'application/json') | self.assertEqual(rv['Content-Type'], 'application/json') | ||||
self.assertEqual(rv.data, { | self.assertEqual(rv.data, { | ||||
'exception': 'NotFoundExc', | 'exception': 'NotFoundExc', | ||||
'reason': 'No indexed raw content match expression \'bar\'.' | 'reason': 'No indexed raw content match expression \'bar\'.' | ||||
}) | }) | ||||
self.assertFalse('Link' in rv) | self.assertFalse('Link' in rv) | ||||
mock_service.lookup_expression.assert_called_once_with( | @pytest.mark.skipif(ctags_json_missing, | ||||
'bar', 'hash', 10) | reason="requires ctags with json output support") | ||||
@given(content()) | |||||
@patch('swh.web.api.views.content.service') | def test_api_content_ctags(self, content): | ||||
def test_api_content_ctags(self, mock_service): | |||||
stub_ctags = { | |||||
'id': '34571b8614fcd89ccd17ca2b1d9e66c5b00a6d03', | |||||
'ctags': [] | |||||
} | |||||
mock_service.lookup_content_ctags.return_value = stub_ctags | |||||
Not Done Inline Actionssame vlorentz: same | |||||
# when | self.content_add_ctags(content['sha1']) | ||||
rv = self.client.get( | url = reverse('api-content-ctags', | ||||
'/api/1/content/' | url_args={'q': 'sha1_git:%s' % content['sha1_git']}) | ||||
'sha1_git:b04caf10e9535160d90e874b45aa426de762f19f/ctags/') | rv = self.client.get(url) | ||||
# then | |||||
self.assertEqual(rv.status_code, 200) | self.assertEqual(rv.status_code, 200) | ||||
self.assertEqual(rv['Content-Type'], 'application/json') | self.assertEqual(rv['Content-Type'], 'application/json') | ||||
self.assertEqual(rv.data, { | content_url = reverse('api-content', | ||||
'id': '34571b8614fcd89ccd17ca2b1d9e66c5b00a6d03', | url_args={'q': 'sha1:%s' % content['sha1']}) | ||||
'ctags': [], | expected_data = list(self.content_get_ctags(content['sha1'])) | ||||
'content_url': '/api/1/content/' | for e in expected_data: | ||||
'sha1:34571b8614fcd89ccd17ca2b1d9e66c5b00a6d03/', | e['content_url'] = content_url | ||||
}) | self.assertEqual(rv.data, expected_data) | ||||
mock_service.lookup_content_ctags.assert_called_once_with( | @pytest.mark.skipif(fossology_missing, | ||||
'sha1_git:b04caf10e9535160d90e874b45aa426de762f19f') | reason="requires fossology-nomossa installed") | ||||
@given(content()) | |||||
@patch('swh.web.api.views.content.service') | def test_api_content_license(self, content): | ||||
def test_api_content_license(self, mock_service): | |||||
stub_license = { | |||||
'licenses': ['No_license_found', 'Apache-2.0'], | |||||
'id': '34571b8614fcd89ccd17ca2b1d9e66c5b00a6d03', | |||||
'tool_name': 'nomos', | |||||
} | |||||
mock_service.lookup_content_license.return_value = stub_license | |||||
# when | self.content_add_license(content['sha1']) | ||||
rv = self.client.get( | url = reverse('api-content-license', | ||||
'/api/1/content/' | url_args={'q': 'sha1_git:%s' % content['sha1_git']}) | ||||
'sha1_git:b04caf10e9535160d90e874b45aa426de762f19f/license/') | rv = self.client.get(url) | ||||
# then | |||||
self.assertEqual(rv.status_code, 200) | self.assertEqual(rv.status_code, 200) | ||||
self.assertEqual(rv['Content-Type'], 'application/json') | self.assertEqual(rv['Content-Type'], 'application/json') | ||||
self.assertEqual(rv.data, { | content_url = reverse('api-content', | ||||
'licenses': ['No_license_found', 'Apache-2.0'], | url_args={'q': 'sha1:%s' % content['sha1']}) | ||||
'id': '34571b8614fcd89ccd17ca2b1d9e66c5b00a6d03', | expected_data = self.content_get_license(content['sha1']) | ||||
'tool_name': 'nomos', | expected_data['content_url'] = content_url | ||||
'content_url': '/api/1/content/' | self.assertEqual(rv.data, expected_data) | ||||
'sha1:34571b8614fcd89ccd17ca2b1d9e66c5b00a6d03/', | |||||
}) | |||||
mock_service.lookup_content_license.assert_called_once_with( | |||||
'sha1_git:b04caf10e9535160d90e874b45aa426de762f19f') | |||||
@patch('swh.web.api.views.content.service') | @given(unknown_content()) | ||||
def test_api_content_license_sha_not_found(self, mock_service): | def test_api_content_license_sha_not_found(self, unknown_content): | ||||
# given | |||||
mock_service.lookup_content_license.return_value = None | |||||
# when | url = reverse('api-content-license', | ||||
rv = self.client.get( | url_args={'q': 'sha1:%s' % unknown_content['sha1']}) | ||||
'/api/1/content/sha1:40e71b8614fcd89ccd17ca2b1d9e66c5b00a6d03/' | rv = self.client.get(url) | ||||
'license/') | |||||
# then | |||||
self.assertEqual(rv.status_code, 404) | self.assertEqual(rv.status_code, 404) | ||||
self.assertEqual(rv['Content-Type'], 'application/json') | self.assertEqual(rv['Content-Type'], 'application/json') | ||||
self.assertEqual(rv.data, { | self.assertEqual(rv.data, { | ||||
'exception': 'NotFoundExc', | 'exception': 'NotFoundExc', | ||||
'reason': 'No license information found for content ' | 'reason': 'No license information found for content ' | ||||
'sha1:40e71b8614fcd89ccd17ca2b1d9e66c5b00a6d03.' | 'sha1:%s.' % unknown_content['sha1'] | ||||
}) | }) | ||||
mock_service.lookup_content_license.assert_called_once_with( | @given(content()) | ||||
'sha1:40e71b8614fcd89ccd17ca2b1d9e66c5b00a6d03') | def test_api_content_metadata(self, content): | ||||
@patch('swh.web.api.views.content.service') | url = reverse('api-content', {'q': 'sha1:%s' % content['sha1']}) | ||||
def test_api_content_metadata(self, mock_service): | rv = self.client.get(url) | ||||
# given | |||||
mock_service.lookup_content.return_value = { | |||||
'checksums': { | |||||
'blake2s256': '685395c5dc57cada459364f0946d3dd45bad5f' | |||||
'cbabc1048edb44380f1d31d0aa', | |||||
'sha1': '40e71b8614fcd89ccd17ca2b1d9e66c5b00a6d03', | |||||
'sha1_git': 'b4e8f472ffcb01a03875b26e462eb568739f6882', | |||||
'sha256': '83c0e67cc80f60caf1fcbec2d84b0ccd7968b3be47' | |||||
'35637006560cde9b067a4f', | |||||
}, | |||||
'length': 17, | |||||
'status': 'visible' | |||||
} | |||||
# when | |||||
rv = self.client.get( | |||||
'/api/1/content/sha1:40e71b8614fcd89ccd17ca2b1d9e66c5b00a6d03/') | |||||
self.assertEqual(rv.status_code, 200) | self.assertEqual(rv.status_code, 200) | ||||
self.assertEqual(rv['Content-Type'], 'application/json') | self.assertEqual(rv['Content-Type'], 'application/json') | ||||
self.assertEqual(rv.data, { | expected_data = self.content_get_metadata(content['sha1']) | ||||
'checksums': { | for key, view_name in (('data_url', 'api-content-raw'), | ||||
'blake2s256': '685395c5dc57cada459364f0946d3dd45bad5f' | ('license_url', 'api-content-license'), | ||||
'cbabc1048edb44380f1d31d0aa', | ('language_url', 'api-content-language'), | ||||
'sha1': '40e71b8614fcd89ccd17ca2b1d9e66c5b00a6d03', | ('filetype_url', 'api-content-filetype')): | ||||
'sha1_git': 'b4e8f472ffcb01a03875b26e462eb568739f6882', | expected_data[key] = reverse(view_name, | ||||
'sha256': '83c0e67cc80f60caf1fcbec2d84b0ccd7968b3be47' | url_args={'q': 'sha1:%s' % | ||||
'35637006560cde9b067a4f', | content['sha1']}) | ||||
}, | self.assertEqual(rv.data, expected_data) | ||||
'data_url': '/api/1/content/' | |||||
'sha1:40e71b8614fcd89ccd17ca2b1d9e66c5b00a6d03/raw/', | @given(unknown_content()) | ||||
'filetype_url': '/api/1/content/' | def test_api_content_not_found_as_json(self, unknown_content): | ||||
'sha1:40e71b8614fcd89ccd17ca2b1d9e66c5b00a6d03/filetype/', | |||||
'language_url': '/api/1/content/' | |||||
'sha1:40e71b8614fcd89ccd17ca2b1d9e66c5b00a6d03/language/', | |||||
'license_url': '/api/1/content/' | |||||
'sha1:40e71b8614fcd89ccd17ca2b1d9e66c5b00a6d03/license/', | |||||
'length': 17, | |||||
'status': 'visible' | |||||
}) | |||||
mock_service.lookup_content.assert_called_once_with( | |||||
'sha1:40e71b8614fcd89ccd17ca2b1d9e66c5b00a6d03') | |||||
@patch('swh.web.api.views.content.service') | |||||
def test_api_content_not_found_as_json(self, mock_service): | |||||
# given | |||||
mock_service.lookup_content.return_value = None | |||||
# when | |||||
rv = self.client.get( | |||||
'/api/1/content/sha256:83c0e67cc80f60caf1fcbec2d84b0ccd7968b3' | |||||
'be4735637006560c/') | |||||
url = reverse('api-content', | |||||
url_args={'q': 'sha1:%s' % unknown_content['sha1']}) | |||||
rv = self.client.get(url) | |||||
self.assertEqual(rv.status_code, 404) | self.assertEqual(rv.status_code, 404) | ||||
Not Done Inline Actionssame vlorentz: same | |||||
self.assertEqual(rv['Content-Type'], 'application/json') | self.assertEqual(rv['Content-Type'], 'application/json') | ||||
self.assertEqual(rv.data, { | self.assertEqual(rv.data, { | ||||
'exception': 'NotFoundExc', | 'exception': 'NotFoundExc', | ||||
'reason': 'Content with sha256:83c0e67cc80f60caf1fcbec2d84b0ccd79' | 'reason': 'Content with sha1 checksum equals to %s not found!' | ||||
'68b3be4735637006560c not found.' | % unknown_content['sha1'] | ||||
}) | }) | ||||
mock_service.lookup_content.assert_called_once_with( | @given(unknown_content()) | ||||
'sha256:83c0e67cc80f60caf1fcbec2d84b0ccd7968b3' | def test_api_content_not_found_as_yaml(self, unknown_content): | ||||
'be4735637006560c') | |||||
url = reverse('api-content', | |||||
@patch('swh.web.api.views.content.service') | url_args={'q': 'sha256:%s' % unknown_content['sha256']}) | ||||
def test_api_content_not_found_as_yaml(self, mock_service): | rv = self.client.get(url, HTTP_ACCEPT='application/yaml') | ||||
# given | |||||
mock_service.lookup_content.return_value = None | |||||
# when | |||||
rv = self.client.get( | |||||
'/api/1/content/sha256:83c0e67cc80f60caf1fcbec2d84b0ccd7968b3' | |||||
'be4735637006560c/', | |||||
HTTP_ACCEPT='application/yaml') | |||||
self.assertEqual(rv.status_code, 404) | self.assertEqual(rv.status_code, 404) | ||||
self.assertTrue('application/yaml' in rv['Content-Type']) | self.assertTrue('application/yaml' in rv['Content-Type']) | ||||
self.assertEqual(rv.data, { | self.assertEqual(rv.data, { | ||||
'exception': 'NotFoundExc', | 'exception': 'NotFoundExc', | ||||
'reason': 'Content with sha256:83c0e67cc80f60caf1fcbec2d84b0ccd79' | 'reason': 'Content with sha256 checksum equals to %s not found!' % | ||||
'68b3be4735637006560c not found.' | unknown_content['sha256'] | ||||
}) | }) | ||||
mock_service.lookup_content.assert_called_once_with( | @given(unknown_content()) | ||||
'sha256:83c0e67cc80f60caf1fcbec2d84b0ccd7968b3' | def test_api_content_raw_ko_not_found(self, unknown_content): | ||||
'be4735637006560c') | |||||
url = reverse('api-content-raw', | |||||
@patch('swh.web.api.views.content.service') | url_args={'q': 'sha1:%s' % unknown_content['sha1']}) | ||||
def test_api_content_raw_ko_not_found(self, mock_service): | rv = self.client.get(url) | ||||
# given | |||||
mock_service.lookup_content_raw.return_value = None | |||||
# when | |||||
rv = self.client.get( | |||||
'/api/1/content/sha1:40e71b8614fcd89ccd17ca2b1d9e66c5b00a6d03' | |||||
'/raw/') | |||||
self.assertEqual(rv.status_code, 404) | self.assertEqual(rv.status_code, 404) | ||||
self.assertEqual(rv['Content-Type'], 'application/json') | self.assertEqual(rv['Content-Type'], 'application/json') | ||||
self.assertEqual(rv.data, { | self.assertEqual(rv.data, { | ||||
'exception': 'NotFoundExc', | 'exception': 'NotFoundExc', | ||||
'reason': 'Content sha1:40e71b8614fcd89ccd17ca2b1d9e6' | 'reason': 'Content with sha1 checksum equals to %s not found!' % | ||||
'6c5b00a6d03 is not found.' | unknown_content['sha1'] | ||||
}) | }) | ||||
mock_service.lookup_content_raw.assert_called_once_with( | @given(content()) | ||||
'sha1:40e71b8614fcd89ccd17ca2b1d9e66c5b00a6d03') | def test_api_content_raw_text(self, content): | ||||
url = reverse('api-content-raw', | |||||
url_args={'q': 'sha1:%s' % content['sha1']}) | |||||
@patch('swh.web.api.views.content.service') | rv = self.client.get(url) | ||||
def test_api_content_raw_text(self, mock_service): | |||||
# given | |||||
stub_content = {'data': b'some content data'} | |||||
mock_service.lookup_content_raw.return_value = stub_content | |||||
# when | |||||
rv = self.client.get( | |||||
'/api/1/content/sha1:40e71b8614fcd89ccd17ca2b1d9e66c5b00a6d03' | |||||
'/raw/') | |||||
self.assertEqual(rv.status_code, 200) | self.assertEqual(rv.status_code, 200) | ||||
self.assertEqual(rv['Content-Type'], 'application/octet-stream') | self.assertEqual(rv['Content-Type'], 'application/octet-stream') | ||||
self.assertEqual( | self.assertEqual( | ||||
rv['Content-disposition'], | rv['Content-disposition'], | ||||
'attachment; filename=content_sha1_' | 'attachment; filename=content_sha1_%s_raw' % content['sha1']) | ||||
'40e71b8614fcd89ccd17ca2b1d9e66c5b00a6d03_raw') | |||||
self.assertEqual( | self.assertEqual( | ||||
rv['Content-Type'], 'application/octet-stream') | rv['Content-Type'], 'application/octet-stream') | ||||
self.assertEqual(rv.content, stub_content['data']) | expected_data = self.content_get(content['sha1']) | ||||
self.assertEqual(rv.content, expected_data['data']) | |||||
mock_service.lookup_content_raw.assert_called_once_with( | @given(content()) | ||||
'sha1:40e71b8614fcd89ccd17ca2b1d9e66c5b00a6d03') | def test_api_content_raw_text_with_filename(self, content): | ||||
@patch('swh.web.api.views.content.service') | url = reverse('api-content-raw', | ||||
def test_api_content_raw_text_with_filename(self, mock_service): | url_args={'q': 'sha1:%s' % content['sha1']}, | ||||
# given | query_params={'filename': 'filename.txt'}) | ||||
stub_content = {'data': b'some content data'} | rv = self.client.get(url) | ||||
mock_service.lookup_content_raw.return_value = stub_content | |||||
# when | |||||
rv = self.client.get( | |||||
'/api/1/content/sha1:40e71b8614fcd89ccd17ca2b1d9e66c5b00a6d03' | |||||
'/raw/?filename=filename.txt') | |||||
self.assertEqual(rv.status_code, 200) | self.assertEqual(rv.status_code, 200) | ||||
self.assertEqual(rv['Content-Type'], 'application/octet-stream') | self.assertEqual(rv['Content-Type'], 'application/octet-stream') | ||||
self.assertEqual( | self.assertEqual( | ||||
rv['Content-disposition'], | rv['Content-disposition'], | ||||
'attachment; filename=filename.txt') | 'attachment; filename=filename.txt') | ||||
self.assertEqual( | self.assertEqual( | ||||
rv['Content-Type'], 'application/octet-stream') | rv['Content-Type'], 'application/octet-stream') | ||||
self.assertEqual(rv.content, stub_content['data']) | expected_data = self.content_get(content['sha1']) | ||||
self.assertEqual(rv.content, expected_data['data']) | |||||
mock_service.lookup_content_raw.assert_called_once_with( | @given(content()) | ||||
'sha1:40e71b8614fcd89ccd17ca2b1d9e66c5b00a6d03') | def test_api_check_content_known(self, content): | ||||
@patch('swh.web.api.views.content.service') | |||||
def test_api_check_content_known(self, mock_service): | |||||
# given | |||||
mock_service.lookup_multiple_hashes.return_value = [ | |||||
{'found': True, | |||||
'filename': None, | |||||
'sha1': 'sha1:blah'} | |||||
] | |||||
expected_result = { | |||||
'search_stats': {'nbfiles': 1, 'pct': 100}, | |||||
'search_res': [{'sha1': 'sha1:blah', | |||||
'found': True}] | |||||
} | |||||
# when | url = reverse('api-content-known', | ||||
rv = self.client.get('/api/1/content/known/sha1:blah/') | url_args={'q': content['sha1']}) | ||||
rv = self.client.get(url) | |||||
self.assertEqual(rv.status_code, 200) | self.assertEqual(rv.status_code, 200) | ||||
self.assertEqual(rv['Content-Type'], 'application/json') | self.assertEqual(rv['Content-Type'], 'application/json') | ||||
self.assertEqual(rv.data, expected_result) | |||||
mock_service.lookup_multiple_hashes.assert_called_once_with( | self.assertEqual(rv.data, { | ||||
[{'filename': None, 'sha1': 'sha1:blah'}]) | 'search_res': [ | ||||
{ | |||||
@patch('swh.web.api.views.content.service') | 'found': True, | ||||
def test_api_check_content_known_as_yaml(self, mock_service): | 'sha1': content['sha1'] | ||||
# given | |||||
mock_service.lookup_multiple_hashes.return_value = [ | |||||
{'found': True, | |||||
'filename': None, | |||||
'sha1': 'sha1:halb'}, | |||||
{'found': False, | |||||
'filename': None, | |||||
'sha1': 'sha1_git:hello'} | |||||
] | |||||
expected_result = { | |||||
'search_stats': {'nbfiles': 2, 'pct': 50}, | |||||
'search_res': [{'sha1': 'sha1:halb', | |||||
'found': True}, | |||||
{'sha1': 'sha1_git:hello', | |||||
'found': False}] | |||||
} | } | ||||
], | |||||
'search_stats': {'nbfiles': 1, 'pct': 100.0} | |||||
}) | |||||
# when | @given(content()) | ||||
rv = self.client.get('/api/1/content/known/sha1:halb,sha1_git:hello/', | def test_api_check_content_known_as_yaml(self, content): | ||||
HTTP_ACCEPT='application/yaml') | |||||
url = reverse('api-content-known', | |||||
url_args={'q': content['sha1']}) | |||||
rv = self.client.get(url, HTTP_ACCEPT='application/yaml') | |||||
self.assertEqual(rv.status_code, 200) | self.assertEqual(rv.status_code, 200) | ||||
self.assertTrue('application/yaml' in rv['Content-Type']) | self.assertEqual(rv['Content-Type'], 'application/yaml') | ||||
self.assertEqual(rv.data, expected_result) | |||||
mock_service.lookup_multiple_hashes.assert_called_once_with( | self.assertEqual(rv.data, { | ||||
[{'filename': None, 'sha1': 'sha1:halb'}, | 'search_res': [ | ||||
{'filename': None, 'sha1': 'sha1_git:hello'}]) | { | ||||
'found': True, | |||||
@patch('swh.web.api.views.content.service') | 'sha1': content['sha1'] | ||||
def test_api_check_content_known_post_as_yaml(self, mock_service): | |||||
# given | |||||
stub_result = [{'sha1': '7e62b1fe10c88a3eddbba930b156bee2956b2435', | |||||
'found': True}, | |||||
{'filename': 'filepath', | |||||
'sha1': '8e62b1fe10c88a3eddbba930b156bee2956b2435', | |||||
'found': True}, | |||||
{'filename': 'filename', | |||||
'sha1': '64025b5d1520c615061842a6ce6a456cad962a3f', | |||||
'found': False}] | |||||
mock_service.lookup_multiple_hashes.return_value = stub_result | |||||
expected_result = { | |||||
'search_stats': {'nbfiles': 3, 'pct': 2/3 * 100}, | |||||
'search_res': stub_result | |||||
} | } | ||||
], | |||||
'search_stats': {'nbfiles': 1, 'pct': 100.0} | |||||
}) | |||||
# when | @given(content()) | ||||
def test_api_check_content_known_post_as_yaml(self, content): | |||||
url = reverse('api-content-known') | |||||
rv = self.client.post( | rv = self.client.post( | ||||
'/api/1/content/known/search/', | url, | ||||
data=dict( | data={ | ||||
q='7e62b1fe10c88a3eddbba930b156bee2956b2435', | 'q': content['sha1'] | ||||
filepath='8e62b1fe10c88a3eddbba930b156bee2956b2435', | }, | ||||
filename='64025b5d1520c615061842a6ce6a456cad962a3f'), | |||||
HTTP_ACCEPT='application/yaml' | HTTP_ACCEPT='application/yaml' | ||||
) | ) | ||||
self.assertEqual(rv.status_code, 200) | self.assertEqual(rv.status_code, 200) | ||||
self.assertTrue('application/yaml' in rv['Content-Type']) | self.assertTrue('application/yaml' in rv['Content-Type']) | ||||
self.assertEqual(rv.data, expected_result) | self.assertEqual(rv.data, { | ||||
'search_res': [ | |||||
@patch('swh.web.api.views.content.service') | { | ||||
def test_api_check_content_known_not_found(self, mock_service): | 'found': True, | ||||
# given | 'sha1': content['sha1'] | ||||
stub_result = [{'sha1': 'sha1:halb', | |||||
'found': False}] | |||||
mock_service.lookup_multiple_hashes.return_value = stub_result | |||||
expected_result = { | |||||
'search_stats': {'nbfiles': 1, 'pct': 0.0}, | |||||
'search_res': stub_result | |||||
} | } | ||||
], | |||||
'search_stats': {'nbfiles': 1, 'pct': 100.0} | |||||
}) | |||||
# when | @given(unknown_content()) | ||||
rv = self.client.get('/api/1/content/known/sha1:halb/') | def test_api_check_content_known_not_found(self, unknown_content): | ||||
url = reverse('api-content-known', | |||||
url_args={'q': unknown_content['sha1']}) | |||||
rv = self.client.get(url) | |||||
self.assertEqual(rv.status_code, 200) | self.assertEqual(rv.status_code, 200) | ||||
self.assertEqual(rv['Content-Type'], 'application/json') | self.assertEqual(rv['Content-Type'], 'application/json') | ||||
self.assertEqual(rv.data, expected_result) | self.assertEqual(rv.data, { | ||||
'search_res': [ | |||||
mock_service.lookup_multiple_hashes.assert_called_once_with( | { | ||||
[{'filename': None, 'sha1': 'sha1:halb'}]) | 'found': False, | ||||
'sha1': unknown_content['sha1'] | |||||
} | |||||
], | |||||
'search_stats': {'nbfiles': 1, 'pct': 0.0} | |||||
}) |
This condition is computed twice, it should be a class variable or a global instead.