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 | import pytest | ||||
from hypothesis import given | from hypothesis import given | ||||
from rest_framework.test import APITestCase | from rest_framework.test import APITestCase | ||||
from swh.web.common.utils import reverse | from swh.web.common.utils import reverse | ||||
from swh.web.tests.data import random_content | |||||
from swh.web.tests.strategies import ( | from swh.web.tests.strategies import ( | ||||
content, unknown_content, contents_with_ctags | content, contents_with_ctags | ||||
) | ) | ||||
from swh.web.tests.testcase import ( | from swh.web.tests.testcase import ( | ||||
WebTestCase, ctags_json_missing, fossology_missing | WebTestCase, ctags_json_missing, fossology_missing | ||||
) | ) | ||||
class ContentApiTestCase(WebTestCase, APITestCase): | class ContentApiTestCase(WebTestCase, APITestCase): | ||||
@given(content()) | @given(content()) | ||||
def test_api_content_filetype(self, content): | def test_api_content_filetype(self, content): | ||||
self.content_add_mimetype(content['sha1']) | self.content_add_mimetype(content['sha1']) | ||||
url = reverse('api-content-filetype', | url = reverse('api-content-filetype', | ||||
url_args={'q': 'sha1_git:%s' % content['sha1_git']}) | url_args={'q': 'sha1_git:%s' % content['sha1_git']}) | ||||
rv = self.client.get(url) | 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') | ||||
content_url = reverse('api-content', | content_url = reverse('api-content', | ||||
url_args={'q': 'sha1:%s' % content['sha1']}) | url_args={'q': 'sha1:%s' % content['sha1']}) | ||||
expected_data = self.content_get_mimetype(content['sha1']) | expected_data = self.content_get_mimetype(content['sha1']) | ||||
expected_data['content_url'] = content_url | expected_data['content_url'] = content_url | ||||
self.assertEqual(rv.data, expected_data) | self.assertEqual(rv.data, expected_data) | ||||
@given(unknown_content()) | def test_api_content_filetype_sha_not_found(self): | ||||
def test_api_content_filetype_sha_not_found(self, unknown_content): | unknown_content_ = random_content() | ||||
url = reverse('api-content-filetype', | url = reverse('api-content-filetype', | ||||
url_args={'q': 'sha1:%s' % unknown_content['sha1']}) | url_args={'q': 'sha1:%s' % unknown_content_['sha1']}) | ||||
rv = self.client.get(url) | rv = self.client.get(url) | ||||
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:%s.' % unknown_content['sha1'] | 'sha1:%s.' % unknown_content_['sha1'] | ||||
}) | }) | ||||
@pytest.mark.xfail # Language indexer is disabled | @pytest.mark.xfail # Language indexer is disabled | ||||
@given(content()) | @given(content()) | ||||
def test_api_content_language(self, content): | def test_api_content_language(self, content): | ||||
self.content_add_language(content['sha1']) | self.content_add_language(content['sha1']) | ||||
url = reverse('api-content-language', | url = reverse('api-content-language', | ||||
url_args={'q': 'sha1_git:%s' % content['sha1_git']}) | url_args={'q': 'sha1_git:%s' % content['sha1_git']}) | ||||
rv = self.client.get(url) | 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') | ||||
content_url = reverse('api-content', | content_url = reverse('api-content', | ||||
url_args={'q': 'sha1:%s' % content['sha1']}) | url_args={'q': 'sha1:%s' % content['sha1']}) | ||||
expected_data = self.content_get_language(content['sha1']) | expected_data = self.content_get_language(content['sha1']) | ||||
expected_data['content_url'] = content_url | expected_data['content_url'] = content_url | ||||
self.assertEqual(rv.data, expected_data) | self.assertEqual(rv.data, expected_data) | ||||
@given(unknown_content()) | def test_api_content_language_sha_not_found(self): | ||||
def test_api_content_language_sha_not_found(self, unknown_content): | unknown_content_ = random_content() | ||||
url = reverse('api-content-language', | url = reverse('api-content-language', | ||||
url_args={'q': 'sha1:%s' % unknown_content['sha1']}) | url_args={'q': 'sha1:%s' % unknown_content_['sha1']}) | ||||
rv = self.client.get(url) | rv = self.client.get(url) | ||||
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:%s.' % unknown_content['sha1'] | 'sha1:%s.' % unknown_content_['sha1'] | ||||
}) | }) | ||||
@pytest.mark.xfail # Language indexer is disabled | @pytest.mark.xfail # Language indexer is disabled | ||||
@pytest.mark.skipif(ctags_json_missing, | @pytest.mark.skipif(ctags_json_missing, | ||||
reason="requires ctags with json output support") | reason="requires ctags with json output support") | ||||
@given(contents_with_ctags()) | @given(contents_with_ctags()) | ||||
def test_api_content_symbol(self, contents_with_ctags): | def test_api_content_symbol(self, contents_with_ctags): | ||||
▲ Show 20 Lines • Show All 83 Lines • ▼ Show 20 Lines | def test_api_content_license(self, content): | ||||
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') | ||||
content_url = reverse('api-content', | content_url = reverse('api-content', | ||||
url_args={'q': 'sha1:%s' % content['sha1']}) | url_args={'q': 'sha1:%s' % content['sha1']}) | ||||
expected_data = self.content_get_license(content['sha1']) | expected_data = self.content_get_license(content['sha1']) | ||||
expected_data['content_url'] = content_url | expected_data['content_url'] = content_url | ||||
self.assertEqual(rv.data, expected_data) | self.assertEqual(rv.data, expected_data) | ||||
@given(unknown_content()) | def test_api_content_license_sha_not_found(self): | ||||
def test_api_content_license_sha_not_found(self, unknown_content): | unknown_content_ = random_content() | ||||
url = reverse('api-content-license', | url = reverse('api-content-license', | ||||
url_args={'q': 'sha1:%s' % unknown_content['sha1']}) | url_args={'q': 'sha1:%s' % unknown_content_['sha1']}) | ||||
rv = self.client.get(url) | rv = self.client.get(url) | ||||
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:%s.' % unknown_content['sha1'] | 'sha1:%s.' % unknown_content_['sha1'] | ||||
}) | }) | ||||
@given(content()) | @given(content()) | ||||
def test_api_content_metadata(self, content): | def test_api_content_metadata(self, content): | ||||
url = reverse('api-content', {'q': 'sha1:%s' % content['sha1']}) | url = reverse('api-content', {'q': 'sha1:%s' % content['sha1']}) | ||||
rv = self.client.get(url) | 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') | ||||
expected_data = self.content_get_metadata(content['sha1']) | expected_data = self.content_get_metadata(content['sha1']) | ||||
for key, view_name in (('data_url', 'api-content-raw'), | for key, view_name in (('data_url', 'api-content-raw'), | ||||
('license_url', 'api-content-license'), | ('license_url', 'api-content-license'), | ||||
('language_url', 'api-content-language'), | ('language_url', 'api-content-language'), | ||||
('filetype_url', 'api-content-filetype')): | ('filetype_url', 'api-content-filetype')): | ||||
expected_data[key] = reverse(view_name, | expected_data[key] = reverse(view_name, | ||||
url_args={'q': 'sha1:%s' % | url_args={'q': 'sha1:%s' % | ||||
content['sha1']}) | content['sha1']}) | ||||
self.assertEqual(rv.data, expected_data) | self.assertEqual(rv.data, expected_data) | ||||
@given(unknown_content()) | def test_api_content_not_found_as_json(self): | ||||
def test_api_content_not_found_as_json(self, unknown_content): | unknown_content_ = random_content() | ||||
url = reverse('api-content', | url = reverse('api-content', | ||||
url_args={'q': 'sha1:%s' % unknown_content['sha1']}) | url_args={'q': 'sha1:%s' % unknown_content_['sha1']}) | ||||
rv = self.client.get(url) | rv = self.client.get(url) | ||||
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 with sha1 checksum equals to %s not found!' | 'reason': 'Content with sha1 checksum equals to %s not found!' | ||||
% unknown_content['sha1'] | % unknown_content_['sha1'] | ||||
}) | }) | ||||
@given(unknown_content()) | def test_api_content_not_found_as_yaml(self): | ||||
def test_api_content_not_found_as_yaml(self, unknown_content): | unknown_content_ = random_content() | ||||
url = reverse('api-content', | url = reverse('api-content', | ||||
url_args={'q': 'sha256:%s' % unknown_content['sha256']}) | url_args={'q': 'sha256:%s' % unknown_content_['sha256']}) | ||||
rv = self.client.get(url, HTTP_ACCEPT='application/yaml') | rv = self.client.get(url, 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 checksum equals to %s not found!' % | 'reason': 'Content with sha256 checksum equals to %s not found!' % | ||||
unknown_content['sha256'] | unknown_content_['sha256'] | ||||
}) | }) | ||||
@given(unknown_content()) | def test_api_content_raw_ko_not_found(self): | ||||
def test_api_content_raw_ko_not_found(self, unknown_content): | unknown_content_ = random_content() | ||||
url = reverse('api-content-raw', | url = reverse('api-content-raw', | ||||
url_args={'q': 'sha1:%s' % unknown_content['sha1']}) | url_args={'q': 'sha1:%s' % unknown_content_['sha1']}) | ||||
rv = self.client.get(url) | rv = self.client.get(url) | ||||
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 with sha1 checksum equals to %s not found!' % | 'reason': 'Content with sha1 checksum equals to %s not found!' % | ||||
unknown_content['sha1'] | unknown_content_['sha1'] | ||||
}) | }) | ||||
@given(content()) | @given(content()) | ||||
def test_api_content_raw_text(self, content): | def test_api_content_raw_text(self, content): | ||||
url = reverse('api-content-raw', | url = reverse('api-content-raw', | ||||
url_args={'q': 'sha1:%s' % content['sha1']}) | url_args={'q': 'sha1:%s' % content['sha1']}) | ||||
▲ Show 20 Lines • Show All 86 Lines • ▼ Show 20 Lines | def test_api_check_content_known_post_as_yaml(self, content): | ||||
{ | { | ||||
'found': True, | 'found': True, | ||||
'sha1': content['sha1'] | 'sha1': content['sha1'] | ||||
} | } | ||||
], | ], | ||||
'search_stats': {'nbfiles': 1, 'pct': 100.0} | 'search_stats': {'nbfiles': 1, 'pct': 100.0} | ||||
}) | }) | ||||
@given(unknown_content()) | def test_api_check_content_known_not_found(self): | ||||
def test_api_check_content_known_not_found(self, unknown_content): | unknown_content_ = random_content() | ||||
url = reverse('api-content-known', | url = reverse('api-content-known', | ||||
url_args={'q': unknown_content['sha1']}) | url_args={'q': unknown_content_['sha1']}) | ||||
rv = self.client.get(url) | 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, { | self.assertEqual(rv.data, { | ||||
'search_res': [ | 'search_res': [ | ||||
{ | { | ||||
'found': False, | 'found': False, | ||||
'sha1': unknown_content['sha1'] | 'sha1': unknown_content_['sha1'] | ||||
} | } | ||||
], | ], | ||||
'search_stats': {'nbfiles': 1, 'pct': 0.0} | 'search_stats': {'nbfiles': 1, 'pct': 0.0} | ||||
}) | }) | ||||
@given(content()) | @given(content()) | ||||
def test_api_content_uppercase(self, content): | def test_api_content_uppercase(self, content): | ||||
url = reverse('api-content-uppercase-checksum', | url = reverse('api-content-uppercase-checksum', | ||||
Show All 9 Lines |