Changeset View
Changeset View
Standalone View
Standalone View
swh/web/tests/api/views/test_release.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 | ||||
from datetime import datetime | from datetime import datetime | ||||
from hypothesis import given | from hypothesis import given | ||||
from rest_framework.test import APITestCase | |||||
from swh.model.hashutil import hash_to_bytes | from swh.model.hashutil import hash_to_bytes | ||||
from swh.web.common.utils import reverse | from swh.web.common.utils import reverse | ||||
from swh.web.tests.data import random_sha1 | from swh.web.tests.data import random_sha1 | ||||
from swh.web.tests.strategies import ( | from swh.web.tests.strategies import ( | ||||
release, sha1, content, directory | release, sha1, content, directory | ||||
) | ) | ||||
from swh.web.tests.testcase import WebTestCase | |||||
class ReleaseApiTestCase(WebTestCase, APITestCase): | |||||
@given(release()) | @given(release()) | ||||
def test_api_release(self, release): | def test_api_release(api_client, archive_data, release): | ||||
url = reverse('api-1-release', url_args={'sha1_git': release}) | url = reverse('api-1-release', url_args={'sha1_git': release}) | ||||
rv = self.client.get(url) | rv = api_client.get(url) | ||||
expected_release = self.release_get(release) | expected_release = archive_data.release_get(release) | ||||
target_revision = expected_release['target'] | target_revision = expected_release['target'] | ||||
target_url = reverse('api-1-revision', | target_url = reverse('api-1-revision', | ||||
url_args={'sha1_git': target_revision}) | url_args={'sha1_git': target_revision}) | ||||
expected_release['target_url'] = target_url | expected_release['target_url'] = target_url | ||||
self.assertEqual(rv.status_code, 200, rv.data) | assert rv.status_code == 200, rv.data | ||||
self.assertEqual(rv['Content-Type'], 'application/json') | assert rv['Content-Type'] == 'application/json' | ||||
self.assertEqual(rv.data, expected_release) | assert rv.data == expected_release | ||||
@given(sha1(), sha1(), sha1(), content(), directory(), release()) | @given(sha1(), sha1(), sha1(), content(), directory(), release()) | ||||
def test_api_release_target_type_not_a_revision(self, new_rel1, new_rel2, | def test_api_release_target_type_not_a_revision(api_client, archive_data, | ||||
new_rel1, new_rel2, | |||||
new_rel3, content, | new_rel3, content, | ||||
directory, release): | directory, release): | ||||
for new_rel_id, target_type, target in ( | for new_rel_id, target_type, target in ( | ||||
(new_rel1, 'content', content), | (new_rel1, 'content', content), | ||||
(new_rel2, 'directory', directory), | (new_rel2, 'directory', directory), | ||||
(new_rel3, 'release', release)): | (new_rel3, 'release', release)): | ||||
if target_type == 'content': | if target_type == 'content': | ||||
target = target['sha1_git'] | target = target['sha1_git'] | ||||
sample_release = { | sample_release = { | ||||
'author': { | 'author': { | ||||
'email': b'author@company.org', | 'email': b'author@company.org', | ||||
'fullname': b'author <author@company.org>', | 'fullname': b'author <author@company.org>', | ||||
'name': b'author' | 'name': b'author' | ||||
}, | }, | ||||
'date': { | 'date': { | ||||
'timestamp': int(datetime.now().timestamp()), | 'timestamp': int(datetime.now().timestamp()), | ||||
'offset': 0, | 'offset': 0, | ||||
'negative_utc': False, | 'negative_utc': False, | ||||
}, | }, | ||||
'id': hash_to_bytes(new_rel_id), | 'id': hash_to_bytes(new_rel_id), | ||||
'message': b'sample release message', | 'message': b'sample release message', | ||||
'name': b'sample release', | 'name': b'sample release', | ||||
'synthetic': False, | 'synthetic': False, | ||||
'target': hash_to_bytes(target), | 'target': hash_to_bytes(target), | ||||
'target_type': target_type | 'target_type': target_type | ||||
} | } | ||||
self.storage.release_add([sample_release]) | archive_data.release_add([sample_release]) | ||||
url = reverse('api-1-release', url_args={'sha1_git': new_rel_id}) | url = reverse('api-1-release', url_args={'sha1_git': new_rel_id}) | ||||
rv = self.client.get(url) | rv = api_client.get(url) | ||||
expected_release = self.release_get(new_rel_id) | expected_release = archive_data.release_get(new_rel_id) | ||||
if target_type == 'content': | if target_type == 'content': | ||||
url_args = {'q': 'sha1_git:%s' % target} | url_args = {'q': 'sha1_git:%s' % target} | ||||
else: | else: | ||||
url_args = {'sha1_git': target} | url_args = {'sha1_git': target} | ||||
target_url = reverse('api-1-%s' % target_type, | target_url = reverse('api-1-%s' % target_type, | ||||
url_args=url_args) | url_args=url_args) | ||||
expected_release['target_url'] = target_url | expected_release['target_url'] = target_url | ||||
self.assertEqual(rv.status_code, 200, rv.data) | assert rv.status_code == 200, rv.data | ||||
self.assertEqual(rv['Content-Type'], 'application/json') | assert rv['Content-Type'] == 'application/json' | ||||
self.assertEqual(rv.data, expected_release) | assert rv.data == expected_release | ||||
def test_api_release_not_found(self): | |||||
def test_api_release_not_found(api_client): | |||||
unknown_release_ = random_sha1() | unknown_release_ = random_sha1() | ||||
url = reverse('api-1-release', url_args={'sha1_git': unknown_release_}) | url = reverse('api-1-release', url_args={'sha1_git': unknown_release_}) | ||||
rv = self.client.get(url) | rv = api_client.get(url) | ||||
self.assertEqual(rv.status_code, 404, rv.data) | assert rv.status_code == 404, rv.data | ||||
self.assertEqual(rv['Content-Type'], 'application/json') | assert rv['Content-Type'] == 'application/json' | ||||
self.assertEqual(rv.data, { | assert rv.data == { | ||||
'exception': 'NotFoundExc', | 'exception': 'NotFoundExc', | ||||
'reason': 'Release with sha1_git %s not found.' % unknown_release_ | 'reason': 'Release with sha1_git %s not found.' % unknown_release_ | ||||
}) | } | ||||
@given(release()) | @given(release()) | ||||
def test_api_release_uppercase(self, release): | def test_api_release_uppercase(api_client, release): | ||||
url = reverse('api-1-release-uppercase-checksum', | url = reverse('api-1-release-uppercase-checksum', | ||||
url_args={'sha1_git': release.upper()}) | url_args={'sha1_git': release.upper()}) | ||||
resp = self.client.get(url) | resp = api_client.get(url) | ||||
self.assertEqual(resp.status_code, 302) | assert resp.status_code == 302 | ||||
redirect_url = reverse('api-1-release-uppercase-checksum', | redirect_url = reverse('api-1-release-uppercase-checksum', | ||||
url_args={'sha1_git': release}) | url_args={'sha1_git': release}) | ||||
self.assertEqual(resp['location'], redirect_url) | assert resp['location'] == redirect_url |