Changeset View
Changeset View
Standalone View
Standalone View
swh/web/tests/api/views/test_directory.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 random | |||||
from hypothesis import given | |||||
from rest_framework.test import APITestCase | from rest_framework.test import APITestCase | ||||
from unittest.mock import patch | |||||
from swh.web.common.utils import reverse | |||||
from swh.web.tests.strategies import directory, unknown_directory | |||||
from swh.web.tests.testcase import WebTestCase | from swh.web.tests.testcase import WebTestCase | ||||
class DirectoryApiTestCase(WebTestCase, APITestCase): | class DirectoryApiTestCase(WebTestCase, APITestCase): | ||||
@patch('swh.web.api.views.directory.service') | @given(directory()) | ||||
def test_api_directory(self, mock_service): | def test_api_directory(self, directory): | ||||
# given | |||||
stub_directories = [ | url = reverse('api-directory', url_args={'sha1_git': directory}) | ||||
{ | rv = self.client.get(url) | ||||
'sha1_git': '18d8be353ed3480476f032475e7c233eff7371d5', | |||||
'type': 'file', | |||||
'target': '4568be353ed3480476f032475e7c233eff737123', | |||||
}, | |||||
{ | |||||
'sha1_git': '1d518d8be353ed3480476f032475e7c233eff737', | |||||
'type': 'dir', | |||||
'target': '8be353ed3480476f032475e7c233eff737123456', | |||||
}] | |||||
expected_directories = [ | |||||
{ | |||||
'sha1_git': '18d8be353ed3480476f032475e7c233eff7371d5', | |||||
'type': 'file', | |||||
'target': '4568be353ed3480476f032475e7c233eff737123', | |||||
'target_url': '/api/1/content/' | |||||
'sha1_git:4568be353ed3480476f032475e7c233eff737123/', | |||||
}, | |||||
{ | |||||
'sha1_git': '1d518d8be353ed3480476f032475e7c233eff737', | |||||
'type': 'dir', | |||||
'target': '8be353ed3480476f032475e7c233eff737123456', | |||||
'target_url': | |||||
'/api/1/directory/8be353ed3480476f032475e7c233eff737123456/', | |||||
}] | |||||
mock_service.lookup_directory.return_value = stub_directories | |||||
# when | |||||
rv = self.client.get('/api/1/directory/' | |||||
'18d8be353ed3480476f032475e7c233eff7371d5/') | |||||
# 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, expected_directories) | |||||
mock_service.lookup_directory.assert_called_once_with( | expected_data = list(map(self._enrich_dir_data, | ||||
'18d8be353ed3480476f032475e7c233eff7371d5') | self.directory_ls(directory))) | ||||
@patch('swh.web.api.views.directory.service') | self.assertEqual(rv.data, expected_data) | ||||
def test_api_directory_not_found(self, mock_service): | |||||
# given | |||||
mock_service.lookup_directory.return_value = [] | |||||
# when | @given(unknown_directory()) | ||||
rv = self.client.get('/api/1/directory/' | def test_api_directory_not_found(self, unknown_directory): | ||||
'66618d8be353ed3480476f032475e7c233eff737/') | |||||
url = reverse('api-directory', | |||||
url_args={'sha1_git': unknown_directory}) | |||||
rv = self.client.get(url) | |||||
# 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': 'Directory with sha1_git ' | 'reason': 'Directory with sha1_git %s not found' | ||||
'66618d8be353ed3480476f032475e7c233eff737 not found.'}) | % unknown_directory}) | ||||
@given(directory()) | |||||
def test_api_directory_with_path_found(self, directory): | |||||
@patch('swh.web.api.views.directory.service') | directory_content = self.directory_ls(directory) | ||||
def test_api_directory_with_path_found(self, mock_service): | path = random.choice(directory_content) | ||||
# given | |||||
expected_dir = { | url = reverse('api-directory', | ||||
'sha1_git': '18d8be353ed3480476f032475e7c233eff7371d5', | url_args={'sha1_git': directory, | ||||
'type': 'file', | 'path': path['name']}) | ||||
'name': 'bla', | rv = self.client.get(url) | ||||
'target': '4568be353ed3480476f032475e7c233eff737123', | |||||
'target_url': '/api/1/content/' | |||||
'sha1_git:4568be353ed3480476f032475e7c233eff737123/', | |||||
} | |||||
mock_service.lookup_directory_with_path.return_value = expected_dir | |||||
# when | |||||
rv = self.client.get('/api/1/directory/' | |||||
'18d8be353ed3480476f032475e7c233eff7371d5/bla/') | |||||
# 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, expected_dir) | self.assertEqual(rv.data, self._enrich_dir_data(path)) | ||||
mock_service.lookup_directory_with_path.assert_called_once_with( | @given(directory()) | ||||
'18d8be353ed3480476f032475e7c233eff7371d5', 'bla') | def test_api_directory_with_path_not_found(self, directory): | ||||
@patch('swh.web.api.views.directory.service') | path = 'some/path/to/nonexistent/dir/' | ||||
def test_api_directory_with_path_not_found(self, mock_service): | url = reverse('api-directory', | ||||
# given | url_args={'sha1_git': directory, | ||||
mock_service.lookup_directory_with_path.return_value = None | 'path': path}) | ||||
path = 'some/path/to/dir/' | rv = self.client.get(url) | ||||
# when | |||||
rv = self.client.get(('/api/1/directory/' | |||||
'66618d8be353ed3480476f032475e7c233eff737/%s') | |||||
% path) | |||||
path = path.strip('/') # Path stripped of lead/trail separators | |||||
# 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': (('Entry with path %s relative to ' | 'reason': ('Directory entry with path %s from %s not found' | ||||
'directory with sha1_git ' | % (path, directory))}) | ||||
'66618d8be353ed3480476f032475e7c233eff737 not found.') | |||||
% path)}) | @classmethod | ||||
def _enrich_dir_data(cls, dir_data): | |||||
if dir_data['type'] == 'file': | |||||
dir_data['target_url'] = \ | |||||
reverse('api-content', | |||||
url_args={'q': 'sha1_git:%s' % dir_data['target']}) | |||||
else: | |||||
dir_data['target_url'] = \ | |||||
reverse('api-directory', | |||||
url_args={'sha1_git': dir_data['target']}) | |||||
return dir_data |