Changeset View
Changeset View
Standalone View
Standalone View
swh/web/tests/api/views/test_origin.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 | ||||
from nose.tools import istest | |||||
from rest_framework.test import APITestCase | from rest_framework.test import APITestCase | ||||
from unittest.mock import patch | from unittest.mock import patch | ||||
from swh.storage.exc import StorageDBError, StorageAPIError | from swh.storage.exc import StorageDBError, StorageAPIError | ||||
from swh.web.tests.testcase import SWHWebTestCase | from swh.web.tests.testcase import SWHWebTestCase | ||||
Show All 10 Lines | def setUp(self): | ||||
self.origin1 = { | self.origin1 = { | ||||
'id': 1234, | 'id': 1234, | ||||
'url': 'ftp://some/url/to/origin/0', | 'url': 'ftp://some/url/to/origin/0', | ||||
'type': 'ftp' | 'type': 'ftp' | ||||
} | } | ||||
@patch('swh.web.api.views.origin.get_origin_visits') | @patch('swh.web.api.views.origin.get_origin_visits') | ||||
@istest | def test_api_1_lookup_origin_visits_raise_error( | ||||
def api_1_lookup_origin_visits_raise_error(self, mock_get_origin_visits): | self, mock_get_origin_visits, | ||||
): | |||||
# given | # given | ||||
mock_get_origin_visits.side_effect = ValueError( | mock_get_origin_visits.side_effect = ValueError( | ||||
'voluntary error to check the bad request middleware.') | 'voluntary error to check the bad request middleware.') | ||||
# when | # when | ||||
rv = self.client.get('/api/1/origin/2/visits/') | rv = self.client.get('/api/1/origin/2/visits/') | ||||
# then | # then | ||||
self.assertEquals(rv.status_code, 400) | self.assertEquals(rv.status_code, 400) | ||||
self.assertEquals(rv['Content-Type'], 'application/json') | self.assertEquals(rv['Content-Type'], 'application/json') | ||||
self.assertEquals(rv.data, { | self.assertEquals(rv.data, { | ||||
'exception': 'ValueError', | 'exception': 'ValueError', | ||||
'reason': 'voluntary error to check the bad request middleware.'}) | 'reason': 'voluntary error to check the bad request middleware.'}) | ||||
@patch('swh.web.common.utils.service') | @patch('swh.web.common.utils.service') | ||||
@istest | def test_api_1_lookup_origin_visits_raise_swh_storage_error_db( | ||||
def api_1_lookup_origin_visits_raise_swh_storage_error_db( | |||||
self, mock_service): | self, mock_service): | ||||
# given | # given | ||||
mock_service.lookup_origin_visits.side_effect = StorageDBError( | mock_service.lookup_origin_visits.side_effect = StorageDBError( | ||||
'SWH Storage exploded! Will be back online shortly!') | 'SWH Storage exploded! Will be back online shortly!') | ||||
# when | # when | ||||
rv = self.client.get('/api/1/origin/2/visits/') | rv = self.client.get('/api/1/origin/2/visits/') | ||||
# then | # then | ||||
self.assertEquals(rv.status_code, 503) | self.assertEquals(rv.status_code, 503) | ||||
self.assertEquals(rv['Content-Type'], 'application/json') | self.assertEquals(rv['Content-Type'], 'application/json') | ||||
self.assertEquals(rv.data, { | self.assertEquals(rv.data, { | ||||
'exception': 'StorageDBError', | 'exception': 'StorageDBError', | ||||
'reason': | 'reason': | ||||
'An unexpected error occurred in the backend: ' | 'An unexpected error occurred in the backend: ' | ||||
'SWH Storage exploded! Will be back online shortly!'}) | 'SWH Storage exploded! Will be back online shortly!'}) | ||||
@patch('swh.web.common.utils.service') | @patch('swh.web.common.utils.service') | ||||
@istest | def test_api_1_lookup_origin_visits_raise_swh_storage_error_api( | ||||
def api_1_lookup_origin_visits_raise_swh_storage_error_api( | |||||
self, mock_service): | self, mock_service): | ||||
# given | # given | ||||
mock_service.lookup_origin_visits.side_effect = StorageAPIError( | mock_service.lookup_origin_visits.side_effect = StorageAPIError( | ||||
'SWH Storage API dropped dead! Will resurrect from its ashes asap!' | 'SWH Storage API dropped dead! Will resurrect from its ashes asap!' | ||||
) | ) | ||||
# when | # when | ||||
rv = self.client.get('/api/1/origin/2/visits/') | rv = self.client.get('/api/1/origin/2/visits/') | ||||
# then | # then | ||||
self.assertEquals(rv.status_code, 503) | self.assertEquals(rv.status_code, 503) | ||||
self.assertEquals(rv['Content-Type'], 'application/json') | self.assertEquals(rv['Content-Type'], 'application/json') | ||||
self.assertEquals(rv.data, { | self.assertEquals(rv.data, { | ||||
'exception': 'StorageAPIError', | 'exception': 'StorageAPIError', | ||||
'reason': | 'reason': | ||||
'An unexpected error occurred in the api backend: ' | 'An unexpected error occurred in the api backend: ' | ||||
'SWH Storage API dropped dead! Will resurrect from its ashes asap!' | 'SWH Storage API dropped dead! Will resurrect from its ashes asap!' | ||||
}) | }) | ||||
@patch('swh.web.api.views.origin.get_origin_visits') | @patch('swh.web.api.views.origin.get_origin_visits') | ||||
@istest | def test_api_1_lookup_origin_visits(self, mock_get_origin_visits): | ||||
def api_1_lookup_origin_visits(self, mock_get_origin_visits): | |||||
# given | # given | ||||
stub_visits = [ | stub_visits = [ | ||||
{ | { | ||||
'date': 1293919200.0, | 'date': 1293919200.0, | ||||
'origin': 2, | 'origin': 2, | ||||
'snapshot': '1234', | 'snapshot': '1234', | ||||
'visit': 1 | 'visit': 1 | ||||
}, | }, | ||||
Show All 40 Lines | def test_api_1_lookup_origin_visits(self, mock_get_origin_visits): | ||||
'visit': 1, | 'visit': 1, | ||||
'origin_visit_url': '/api/1/origin/2/visit/1/', | 'origin_visit_url': '/api/1/origin/2/visit/1/', | ||||
'snapshot_url': '/api/1/snapshot/1234/' | 'snapshot_url': '/api/1/snapshot/1234/' | ||||
}, | }, | ||||
]) | ]) | ||||
@patch('swh.web.api.views.origin.service') | @patch('swh.web.api.views.origin.service') | ||||
@istest | def test_api_1_lookup_origin_visit(self, mock_service): | ||||
def api_1_lookup_origin_visit(self, mock_service): | |||||
# given | # given | ||||
origin_visit = self.origin_visit1.copy() | origin_visit = self.origin_visit1.copy() | ||||
origin_visit.update({ | origin_visit.update({ | ||||
'snapshot': '57478754' | 'snapshot': '57478754' | ||||
}) | }) | ||||
mock_service.lookup_origin_visit.return_value = origin_visit | mock_service.lookup_origin_visit.return_value = origin_visit | ||||
Show All 9 Lines | def test_api_1_lookup_origin_visit(self, mock_service): | ||||
self.assertEquals(rv.status_code, 200) | self.assertEquals(rv.status_code, 200) | ||||
self.assertEquals(rv['Content-Type'], 'application/json') | self.assertEquals(rv['Content-Type'], 'application/json') | ||||
self.assertEquals(rv.data, expected_origin_visit) | self.assertEquals(rv.data, expected_origin_visit) | ||||
mock_service.lookup_origin_visit.assert_called_once_with('10', '100') | mock_service.lookup_origin_visit.assert_called_once_with('10', '100') | ||||
@patch('swh.web.api.views.origin.service') | @patch('swh.web.api.views.origin.service') | ||||
@istest | def test_api_1_lookup_origin_visit_not_found(self, mock_service): | ||||
def api_1_lookup_origin_visit_not_found(self, mock_service): | |||||
# given | # given | ||||
mock_service.lookup_origin_visit.return_value = None | mock_service.lookup_origin_visit.return_value = None | ||||
# when | # when | ||||
rv = self.client.get('/api/1/origin/1/visit/1000/') | rv = self.client.get('/api/1/origin/1/visit/1000/') | ||||
self.assertEquals(rv.status_code, 404) | self.assertEquals(rv.status_code, 404) | ||||
self.assertEquals(rv['Content-Type'], 'application/json') | self.assertEquals(rv['Content-Type'], 'application/json') | ||||
self.assertEquals(rv.data, { | self.assertEquals(rv.data, { | ||||
'exception': 'NotFoundExc', | 'exception': 'NotFoundExc', | ||||
'reason': 'No visit 1000 for origin 1 found' | 'reason': 'No visit 1000 for origin 1 found' | ||||
}) | }) | ||||
mock_service.lookup_origin_visit.assert_called_once_with('1', '1000') | mock_service.lookup_origin_visit.assert_called_once_with('1', '1000') | ||||
@patch('swh.web.api.views.origin.service') | @patch('swh.web.api.views.origin.service') | ||||
@istest | def test_api_origin_by_id(self, mock_service): | ||||
def api_origin_by_id(self, mock_service): | |||||
# given | # given | ||||
mock_service.lookup_origin.return_value = self.origin1 | mock_service.lookup_origin.return_value = self.origin1 | ||||
expected_origin = self.origin1.copy() | expected_origin = self.origin1.copy() | ||||
expected_origin.update({ | expected_origin.update({ | ||||
'origin_visits_url': '/api/1/origin/1234/visits/' | 'origin_visits_url': '/api/1/origin/1234/visits/' | ||||
}) | }) | ||||
# when | # when | ||||
rv = self.client.get('/api/1/origin/1234/') | rv = self.client.get('/api/1/origin/1234/') | ||||
# then | # then | ||||
self.assertEquals(rv.status_code, 200) | self.assertEquals(rv.status_code, 200) | ||||
self.assertEquals(rv['Content-Type'], 'application/json') | self.assertEquals(rv['Content-Type'], 'application/json') | ||||
self.assertEquals(rv.data, expected_origin) | self.assertEquals(rv.data, expected_origin) | ||||
mock_service.lookup_origin.assert_called_with({'id': '1234'}) | mock_service.lookup_origin.assert_called_with({'id': '1234'}) | ||||
@patch('swh.web.api.views.origin.service') | @patch('swh.web.api.views.origin.service') | ||||
@istest | def test_api_origin_by_type_url(self, mock_service): | ||||
def api_origin_by_type_url(self, mock_service): | |||||
# given | # given | ||||
stub_origin = self.origin1.copy() | stub_origin = self.origin1.copy() | ||||
stub_origin.update({ | stub_origin.update({ | ||||
'id': 987 | 'id': 987 | ||||
}) | }) | ||||
mock_service.lookup_origin.return_value = stub_origin | mock_service.lookup_origin.return_value = stub_origin | ||||
expected_origin = stub_origin.copy() | expected_origin = stub_origin.copy() | ||||
Show All 10 Lines | def test_api_origin_by_type_url(self, mock_service): | ||||
self.assertEquals(rv['Content-Type'], 'application/json') | self.assertEquals(rv['Content-Type'], 'application/json') | ||||
self.assertEquals(rv.data, expected_origin) | self.assertEquals(rv.data, expected_origin) | ||||
mock_service.lookup_origin.assert_called_with( | mock_service.lookup_origin.assert_called_with( | ||||
{'url': 'ftp://some/url/to/origin/0/', | {'url': 'ftp://some/url/to/origin/0/', | ||||
'type': 'ftp'}) | 'type': 'ftp'}) | ||||
@patch('swh.web.api.views.origin.service') | @patch('swh.web.api.views.origin.service') | ||||
@istest | def test_api_origin_not_found(self, mock_service): | ||||
def api_origin_not_found(self, mock_service): | |||||
# given | # given | ||||
mock_service.lookup_origin.return_value = None | mock_service.lookup_origin.return_value = None | ||||
# when | # when | ||||
rv = self.client.get('/api/1/origin/4321/') | rv = self.client.get('/api/1/origin/4321/') | ||||
# then | # then | ||||
self.assertEquals(rv.status_code, 404) | self.assertEquals(rv.status_code, 404) | ||||
self.assertEquals(rv['Content-Type'], 'application/json') | self.assertEquals(rv['Content-Type'], 'application/json') | ||||
self.assertEquals(rv.data, { | self.assertEquals(rv.data, { | ||||
'exception': 'NotFoundExc', | 'exception': 'NotFoundExc', | ||||
'reason': 'Origin with id 4321 not found.' | 'reason': 'Origin with id 4321 not found.' | ||||
}) | }) | ||||
mock_service.lookup_origin.assert_called_with({'id': '4321'}) | mock_service.lookup_origin.assert_called_with({'id': '4321'}) |