diff --git a/swh/web/tests/api/views/test_content.py b/swh/web/tests/api/views/test_content.py --- a/swh/web/tests/api/views/test_content.py +++ b/swh/web/tests/api/views/test_content.py @@ -3,223 +3,138 @@ # License: GNU Affero General Public License version 3, or any later version # See top-level LICENSE file for more information +import pytest + +from hypothesis import given 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): - @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 - rv = self.client.get( - '/api/1/content/' - 'sha1_git:b04caf10e9535160d90e874b45aa426de762f19f/filetype/') - - # then + + @given(content()) + def test_api_content_filetype(self, content): + + 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) + self.assertEqual(rv.status_code, 200) self.assertEqual(rv['Content-Type'], 'application/json') - self.assertEqual(rv.data, { - 'accepted_media_type': 'application/xml', - 'encoding': 'ascii', - 'id': '34571b8614fcd89ccd17ca2b1d9e66c5b00a6d03', - 'content_url': '/api/1/content/' - 'sha1:34571b8614fcd89ccd17ca2b1d9e66c5b00a6d03/', - }) + content_url = reverse('api-content', + url_args={'q': 'sha1:%s' % content['sha1']}) + expected_data = self.content_get_mimetype(content['sha1']) + expected_data['content_url'] = content_url + self.assertEqual(rv.data, expected_data) - mock_service.lookup_content_filetype.assert_called_once_with( - 'sha1_git:b04caf10e9535160d90e874b45aa426de762f19f') + @given(unknown_content()) + def test_api_content_filetype_sha_not_found(self, unknown_content): - @patch('swh.web.api.views.content.service') - def test_api_content_filetype_sha_not_found(self, mock_service): - # given - mock_service.lookup_content_filetype.return_value = None + url = reverse('api-content-filetype', + url_args={'q': 'sha1:%s' % unknown_content['sha1']}) + rv = self.client.get(url) - # when - rv = self.client.get( - '/api/1/content/sha1:40e71b8614fcd89ccd17ca2b1d9e66c5b00a6d03/' - 'filetype/') - - # then self.assertEqual(rv.status_code, 404) self.assertEqual(rv['Content-Type'], 'application/json') self.assertEqual(rv.data, { 'exception': 'NotFoundExc', 'reason': 'No filetype information found for content ' - 'sha1:40e71b8614fcd89ccd17ca2b1d9e66c5b00a6d03.' + 'sha1:%s.' % unknown_content['sha1'] }) - mock_service.lookup_content_filetype.assert_called_once_with( - 'sha1:40e71b8614fcd89ccd17ca2b1d9e66c5b00a6d03') - - @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 + @given(content()) + def test_api_content_language(self, content): - # when - rv = self.client.get( - '/api/1/content/' - 'sha1_git:b04caf10e9535160d90e874b45aa426de762f19f/language/') + self.content_add_language(content['sha1']) + url = reverse('api-content-language', + url_args={'q': 'sha1_git:%s' % content['sha1_git']}) + rv = self.client.get(url) - # then self.assertEqual(rv.status_code, 200) self.assertEqual(rv['Content-Type'], 'application/json') - self.assertEqual(rv.data, { - 'lang': 'lisp', - 'id': '34571b8614fcd89ccd17ca2b1d9e66c5b00a6d03', - 'content_url': '/api/1/content/' - 'sha1:34571b8614fcd89ccd17ca2b1d9e66c5b00a6d03/', - }) + content_url = reverse('api-content', + url_args={'q': 'sha1:%s' % content['sha1']}) + expected_data = self.content_get_language(content['sha1']) + expected_data['content_url'] = content_url + self.assertEqual(rv.data, expected_data) - mock_service.lookup_content_language.assert_called_once_with( - 'sha1_git:b04caf10e9535160d90e874b45aa426de762f19f') + @given(unknown_content()) + def test_api_content_language_sha_not_found(self, unknown_content): - @patch('swh.web.api.views.content.service') - def test_api_content_language_sha_not_found(self, mock_service): - # given - mock_service.lookup_content_language.return_value = None + url = reverse('api-content-language', + url_args={'q': 'sha1:%s' % unknown_content['sha1']}) + rv = self.client.get(url) - # when - rv = self.client.get( - '/api/1/content/sha1:40e71b8614fcd89ccd17ca2b1d9e66c5b00a6d03' - '/language/') - - # then self.assertEqual(rv.status_code, 404) self.assertEqual(rv['Content-Type'], 'application/json') self.assertEqual(rv.data, { 'exception': 'NotFoundExc', 'reason': 'No language information found for content ' - 'sha1:40e71b8614fcd89ccd17ca2b1d9e66c5b00a6d03.' + 'sha1:%s.' % unknown_content['sha1'] }) - mock_service.lookup_content_language.assert_called_once_with( - 'sha1:40e71b8614fcd89ccd17ca2b1d9e66c5b00a6d03') - - @patch('swh.web.api.views.content.service') - def test_api_content_symbol(self, mock_service): - stub_ctag = [{ - 'sha1': '34571b8614fcd89ccd17ca2b1d9e66c5b00a6d03', - 'name': 'foobar', - 'kind': 'Haskell', - 'line': 10, - }] - mock_service.lookup_expression.return_value = stub_ctag + @pytest.mark.skipif(ctags_json_missing, + 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) - # when - rv = self.client.get('/api/1/content/symbol/foo/?last_sha1=sha1') - - # then self.assertEqual(rv.status_code, 200) self.assertEqual(rv['Content-Type'], 'application/json') - 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/', - }]) + for entry in rv.data: + content_sha1 = entry['sha1'] + expected_entry = expected_data[content_sha1] + for key, view_name in (('content_url', 'api-content'), + ('data_url', 'api-content-raw'), + ('license_url', 'api-content-license'), + ('language_url', 'api-content-language'), + ('filetype_url', 'api-content-filetype')): + expected_entry[key] = reverse(view_name, + url_args={'q': 'sha1:%s' % + content_sha1}) + expected_entry['sha1'] = content_sha1 + del expected_entry['id'] + self.assertEqual(entry, expected_entry) self.assertFalse('Link' in rv) - mock_service.lookup_expression.assert_called_once_with( - 'foo', 'sha1', 10) - - @patch('swh.web.api.views.content.service') - def test_api_content_symbol_2(self, mock_service): - stub_ctag = [{ - 'sha1': '12371b8614fcd89ccd17ca2b1d9e66c5b00a6456', - 'name': 'foobar', - 'kind': 'Haskell', - 'line': 10, - }, { - 'sha1': '34571b8614fcd89ccd17ca2b1d9e66c5b00a6678', - 'name': 'foo', - 'kind': 'Lisp', - 'line': 10, - }] - mock_service.lookup_expression.return_value = stub_ctag - - # 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'] == '; rel="next"' or # noqa - rv['Link'] == '; 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 + url = reverse('api-content-symbol', + url_args={'q': contents_with_ctags['symbol_name']}, + query_params={'per_page': 2}) + rv = self.client.get(url) + + next_url = reverse('api-content-symbol', + url_args={'q': contents_with_ctags['symbol_name']}, + query_params={'last_sha1': rv.data[1]['sha1'], + 'per_page': 2}) + self.assertEqual(rv['Link'], '<%s>; rel="next"' % next_url) + + @pytest.mark.xfail(reason='FIXME: exception should be raised in service') + @given(unknown_content()) + def test_api_content_symbol_not_found(self, unknown_content): + + url = reverse('api-content-symbol', url_args={'q': 'bar'}, + query_params={'last_sha1': 'hash'}) + rv = self.client.get(url) + self.assertEqual(rv.status_code, 404) self.assertEqual(rv['Content-Type'], 'application/json') self.assertEqual(rv.data, { @@ -228,232 +143,146 @@ }) self.assertFalse('Link' in rv) - mock_service.lookup_expression.assert_called_once_with( - 'bar', 'hash', 10) + @pytest.mark.skipif(ctags_json_missing, + reason="requires ctags with json output support") + @given(content()) + def test_api_content_ctags(self, content): - @patch('swh.web.api.views.content.service') - def test_api_content_ctags(self, mock_service): - stub_ctags = { - 'id': '34571b8614fcd89ccd17ca2b1d9e66c5b00a6d03', - 'ctags': [] - } - mock_service.lookup_content_ctags.return_value = stub_ctags + self.content_add_ctags(content['sha1']) + url = reverse('api-content-ctags', + url_args={'q': 'sha1_git:%s' % content['sha1_git']}) + rv = self.client.get(url) - # when - rv = self.client.get( - '/api/1/content/' - 'sha1_git:b04caf10e9535160d90e874b45aa426de762f19f/ctags/') - - # then self.assertEqual(rv.status_code, 200) self.assertEqual(rv['Content-Type'], 'application/json') - self.assertEqual(rv.data, { - 'id': '34571b8614fcd89ccd17ca2b1d9e66c5b00a6d03', - 'ctags': [], - 'content_url': '/api/1/content/' - 'sha1:34571b8614fcd89ccd17ca2b1d9e66c5b00a6d03/', - }) - - mock_service.lookup_content_ctags.assert_called_once_with( - 'sha1_git:b04caf10e9535160d90e874b45aa426de762f19f') - - @patch('swh.web.api.views.content.service') - 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 - rv = self.client.get( - '/api/1/content/' - 'sha1_git:b04caf10e9535160d90e874b45aa426de762f19f/license/') + content_url = reverse('api-content', + url_args={'q': 'sha1:%s' % content['sha1']}) + expected_data = list(self.content_get_ctags(content['sha1'])) + for e in expected_data: + e['content_url'] = content_url + self.assertEqual(rv.data, expected_data) + + @pytest.mark.skipif(fossology_missing, + reason="requires fossology-nomossa installed") + @given(content()) + def test_api_content_license(self, content): + + self.content_add_license(content['sha1']) + url = reverse('api-content-license', + url_args={'q': 'sha1_git:%s' % content['sha1_git']}) + rv = self.client.get(url) - # then self.assertEqual(rv.status_code, 200) self.assertEqual(rv['Content-Type'], 'application/json') - self.assertEqual(rv.data, { - 'licenses': ['No_license_found', 'Apache-2.0'], - 'id': '34571b8614fcd89ccd17ca2b1d9e66c5b00a6d03', - 'tool_name': 'nomos', - 'content_url': '/api/1/content/' - 'sha1:34571b8614fcd89ccd17ca2b1d9e66c5b00a6d03/', - }) - - mock_service.lookup_content_license.assert_called_once_with( - 'sha1_git:b04caf10e9535160d90e874b45aa426de762f19f') + content_url = reverse('api-content', + url_args={'q': 'sha1:%s' % content['sha1']}) + expected_data = self.content_get_license(content['sha1']) + expected_data['content_url'] = content_url + self.assertEqual(rv.data, expected_data) - @patch('swh.web.api.views.content.service') - def test_api_content_license_sha_not_found(self, mock_service): - # given - mock_service.lookup_content_license.return_value = None + @given(unknown_content()) + def test_api_content_license_sha_not_found(self, unknown_content): - # when - rv = self.client.get( - '/api/1/content/sha1:40e71b8614fcd89ccd17ca2b1d9e66c5b00a6d03/' - 'license/') + url = reverse('api-content-license', + url_args={'q': 'sha1:%s' % unknown_content['sha1']}) + rv = self.client.get(url) - # then self.assertEqual(rv.status_code, 404) self.assertEqual(rv['Content-Type'], 'application/json') self.assertEqual(rv.data, { 'exception': 'NotFoundExc', 'reason': 'No license information found for content ' - 'sha1:40e71b8614fcd89ccd17ca2b1d9e66c5b00a6d03.' + 'sha1:%s.' % unknown_content['sha1'] }) - mock_service.lookup_content_license.assert_called_once_with( - 'sha1:40e71b8614fcd89ccd17ca2b1d9e66c5b00a6d03') - - @patch('swh.web.api.views.content.service') - def test_api_content_metadata(self, mock_service): - # given - mock_service.lookup_content.return_value = { - 'checksums': { - 'blake2s256': '685395c5dc57cada459364f0946d3dd45bad5f' - 'cbabc1048edb44380f1d31d0aa', - 'sha1': '40e71b8614fcd89ccd17ca2b1d9e66c5b00a6d03', - 'sha1_git': 'b4e8f472ffcb01a03875b26e462eb568739f6882', - 'sha256': '83c0e67cc80f60caf1fcbec2d84b0ccd7968b3be47' - '35637006560cde9b067a4f', - }, - 'length': 17, - 'status': 'visible' - } + @given(content()) + def test_api_content_metadata(self, content): - # when - rv = self.client.get( - '/api/1/content/sha1:40e71b8614fcd89ccd17ca2b1d9e66c5b00a6d03/') + url = reverse('api-content', {'q': 'sha1:%s' % content['sha1']}) + rv = self.client.get(url) self.assertEqual(rv.status_code, 200) self.assertEqual(rv['Content-Type'], 'application/json') - self.assertEqual(rv.data, { - 'checksums': { - 'blake2s256': '685395c5dc57cada459364f0946d3dd45bad5f' - 'cbabc1048edb44380f1d31d0aa', - 'sha1': '40e71b8614fcd89ccd17ca2b1d9e66c5b00a6d03', - 'sha1_git': 'b4e8f472ffcb01a03875b26e462eb568739f6882', - 'sha256': '83c0e67cc80f60caf1fcbec2d84b0ccd7968b3be47' - '35637006560cde9b067a4f', - }, - 'data_url': '/api/1/content/' - 'sha1:40e71b8614fcd89ccd17ca2b1d9e66c5b00a6d03/raw/', - 'filetype_url': '/api/1/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/') - + expected_data = self.content_get_metadata(content['sha1']) + for key, view_name in (('data_url', 'api-content-raw'), + ('license_url', 'api-content-license'), + ('language_url', 'api-content-language'), + ('filetype_url', 'api-content-filetype')): + expected_data[key] = reverse(view_name, + url_args={'q': 'sha1:%s' % + content['sha1']}) + self.assertEqual(rv.data, expected_data) + + @given(unknown_content()) + def test_api_content_not_found_as_json(self, unknown_content): + + 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['Content-Type'], 'application/json') self.assertEqual(rv.data, { 'exception': 'NotFoundExc', - 'reason': 'Content with sha256:83c0e67cc80f60caf1fcbec2d84b0ccd79' - '68b3be4735637006560c not found.' + 'reason': 'Content with sha1 checksum equals to %s not found!' + % unknown_content['sha1'] }) - mock_service.lookup_content.assert_called_once_with( - 'sha256:83c0e67cc80f60caf1fcbec2d84b0ccd7968b3' - 'be4735637006560c') + @given(unknown_content()) + def test_api_content_not_found_as_yaml(self, unknown_content): - @patch('swh.web.api.views.content.service') - def test_api_content_not_found_as_yaml(self, mock_service): - # given - mock_service.lookup_content.return_value = None - - # when - rv = self.client.get( - '/api/1/content/sha256:83c0e67cc80f60caf1fcbec2d84b0ccd7968b3' - 'be4735637006560c/', - HTTP_ACCEPT='application/yaml') + url = reverse('api-content', + url_args={'q': 'sha256:%s' % unknown_content['sha256']}) + rv = self.client.get(url, HTTP_ACCEPT='application/yaml') self.assertEqual(rv.status_code, 404) self.assertTrue('application/yaml' in rv['Content-Type']) self.assertEqual(rv.data, { 'exception': 'NotFoundExc', - 'reason': 'Content with sha256:83c0e67cc80f60caf1fcbec2d84b0ccd79' - '68b3be4735637006560c not found.' + 'reason': 'Content with sha256 checksum equals to %s not found!' % + unknown_content['sha256'] }) - mock_service.lookup_content.assert_called_once_with( - 'sha256:83c0e67cc80f60caf1fcbec2d84b0ccd7968b3' - 'be4735637006560c') - - @patch('swh.web.api.views.content.service') - def test_api_content_raw_ko_not_found(self, mock_service): - # given - mock_service.lookup_content_raw.return_value = None + @given(unknown_content()) + def test_api_content_raw_ko_not_found(self, unknown_content): - # when - rv = self.client.get( - '/api/1/content/sha1:40e71b8614fcd89ccd17ca2b1d9e66c5b00a6d03' - '/raw/') + url = reverse('api-content-raw', + url_args={'q': 'sha1:%s' % unknown_content['sha1']}) + rv = self.client.get(url) self.assertEqual(rv.status_code, 404) self.assertEqual(rv['Content-Type'], 'application/json') self.assertEqual(rv.data, { 'exception': 'NotFoundExc', - 'reason': 'Content sha1:40e71b8614fcd89ccd17ca2b1d9e6' - '6c5b00a6d03 is not found.' + 'reason': 'Content with sha1 checksum equals to %s not found!' % + unknown_content['sha1'] }) - mock_service.lookup_content_raw.assert_called_once_with( - 'sha1:40e71b8614fcd89ccd17ca2b1d9e66c5b00a6d03') + @given(content()) + def test_api_content_raw_text(self, content): - @patch('swh.web.api.views.content.service') - 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 + url = reverse('api-content-raw', + url_args={'q': 'sha1:%s' % content['sha1']}) - # when - rv = self.client.get( - '/api/1/content/sha1:40e71b8614fcd89ccd17ca2b1d9e66c5b00a6d03' - '/raw/') + rv = self.client.get(url) self.assertEqual(rv.status_code, 200) self.assertEqual(rv['Content-Type'], 'application/octet-stream') self.assertEqual( rv['Content-disposition'], - 'attachment; filename=content_sha1_' - '40e71b8614fcd89ccd17ca2b1d9e66c5b00a6d03_raw') + 'attachment; filename=content_sha1_%s_raw' % content['sha1']) self.assertEqual( 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( - 'sha1:40e71b8614fcd89ccd17ca2b1d9e66c5b00a6d03') + @given(content()) + def test_api_content_raw_text_with_filename(self, content): - @patch('swh.web.api.views.content.service') - def test_api_content_raw_text_with_filename(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/?filename=filename.txt') + url = reverse('api-content-raw', + url_args={'q': 'sha1:%s' % content['sha1']}, + query_params={'filename': 'filename.txt'}) + rv = self.client.get(url) self.assertEqual(rv.status_code, 200) self.assertEqual(rv['Content-Type'], 'application/octet-stream') @@ -462,117 +291,88 @@ 'attachment; filename=filename.txt') self.assertEqual( rv['Content-Type'], 'application/octet-stream') - self.assertEqual(rv.content, stub_content['data']) - - mock_service.lookup_content_raw.assert_called_once_with( - 'sha1:40e71b8614fcd89ccd17ca2b1d9e66c5b00a6d03') + expected_data = self.content_get(content['sha1']) + self.assertEqual(rv.content, expected_data['data']) - @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'} - ] + @given(content()) + def test_api_check_content_known(self, content): - expected_result = { - 'search_stats': {'nbfiles': 1, 'pct': 100}, - 'search_res': [{'sha1': 'sha1:blah', - 'found': True}] - } - - # when - rv = self.client.get('/api/1/content/known/sha1:blah/') + url = reverse('api-content-known', + url_args={'q': content['sha1']}) + rv = self.client.get(url) self.assertEqual(rv.status_code, 200) self.assertEqual(rv['Content-Type'], 'application/json') - self.assertEqual(rv.data, expected_result) - mock_service.lookup_multiple_hashes.assert_called_once_with( - [{'filename': None, 'sha1': 'sha1:blah'}]) - - @patch('swh.web.api.views.content.service') - def test_api_check_content_known_as_yaml(self, mock_service): - # 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}] - } - - # when - rv = self.client.get('/api/1/content/known/sha1:halb,sha1_git:hello/', - HTTP_ACCEPT='application/yaml') + + self.assertEqual(rv.data, { + 'search_res': [ + { + 'found': True, + 'sha1': content['sha1'] + } + ], + 'search_stats': {'nbfiles': 1, 'pct': 100.0} + }) + + @given(content()) + def test_api_check_content_known_as_yaml(self, content): + + 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.assertTrue('application/yaml' in rv['Content-Type']) - self.assertEqual(rv.data, expected_result) - - mock_service.lookup_multiple_hashes.assert_called_once_with( - [{'filename': None, 'sha1': 'sha1:halb'}, - {'filename': None, 'sha1': 'sha1_git:hello'}]) - - @patch('swh.web.api.views.content.service') - 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 - } - - # when + self.assertEqual(rv['Content-Type'], 'application/yaml') + + self.assertEqual(rv.data, { + 'search_res': [ + { + 'found': True, + 'sha1': content['sha1'] + } + ], + 'search_stats': {'nbfiles': 1, 'pct': 100.0} + }) + + @given(content()) + def test_api_check_content_known_post_as_yaml(self, content): + + url = reverse('api-content-known') rv = self.client.post( - '/api/1/content/known/search/', - data=dict( - q='7e62b1fe10c88a3eddbba930b156bee2956b2435', - filepath='8e62b1fe10c88a3eddbba930b156bee2956b2435', - filename='64025b5d1520c615061842a6ce6a456cad962a3f'), + url, + data={ + 'q': content['sha1'] + }, HTTP_ACCEPT='application/yaml' ) self.assertEqual(rv.status_code, 200) self.assertTrue('application/yaml' in rv['Content-Type']) - self.assertEqual(rv.data, expected_result) - - @patch('swh.web.api.views.content.service') - def test_api_check_content_known_not_found(self, mock_service): - # given - stub_result = [{'sha1': 'sha1:halb', - 'found': False}] - mock_service.lookup_multiple_hashes.return_value = stub_result + self.assertEqual(rv.data, { + 'search_res': [ + { + 'found': True, + 'sha1': content['sha1'] + } + ], + 'search_stats': {'nbfiles': 1, 'pct': 100.0} + }) - expected_result = { - 'search_stats': {'nbfiles': 1, 'pct': 0.0}, - 'search_res': stub_result - } + @given(unknown_content()) + def test_api_check_content_known_not_found(self, unknown_content): - # when - rv = self.client.get('/api/1/content/known/sha1:halb/') + 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['Content-Type'], 'application/json') - self.assertEqual(rv.data, expected_result) - - mock_service.lookup_multiple_hashes.assert_called_once_with( - [{'filename': None, 'sha1': 'sha1:halb'}]) + self.assertEqual(rv.data, { + 'search_res': [ + { + 'found': False, + 'sha1': unknown_content['sha1'] + } + ], + 'search_stats': {'nbfiles': 1, 'pct': 0.0} + })