Changeset View
Changeset View
Standalone View
Standalone View
swh/web/tests/api/views/test_origin.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 hypothesis import given | |||||
from rest_framework.test import APITestCase | |||||
from unittest.mock import patch | from unittest.mock import patch | ||||
from hypothesis import given, strategies | |||||
import pytest | |||||
from requests.utils import parse_header_links | |||||
from rest_framework.test import APITestCase | |||||
from swh.storage.exc import StorageDBError, StorageAPIError | from swh.storage.exc import StorageDBError, StorageAPIError | ||||
from swh.web.common.utils import reverse | from swh.web.common.utils import reverse | ||||
from swh.web.common.origin_visits import get_origin_visits | from swh.web.common.origin_visits import get_origin_visits | ||||
from swh.web.tests.strategies import ( | from swh.web.tests.strategies import ( | ||||
origin, new_origin, visit_dates, new_snapshots | origin, new_origin, visit_dates, new_snapshots | ||||
) | ) | ||||
from swh.web.tests.testcase import WebTestCase | from swh.web.tests.testcase import WebTestCase | ||||
from swh.web.tests.data import get_tests_data | |||||
class OriginApiTestCase(WebTestCase, APITestCase): | class OriginApiTestCase(WebTestCase, APITestCase): | ||||
@patch('swh.web.api.views.origin.get_origin_visits') | @patch('swh.web.api.views.origin.get_origin_visits') | ||||
def test_api_lookup_origin_visits_raise_error( | def test_api_lookup_origin_visits_raise_error( | ||||
self, mock_get_origin_visits, | self, mock_get_origin_visits, | ||||
): | ): | ||||
▲ Show 20 Lines • Show All 264 Lines • ▼ Show 20 Lines | def test_api_lookup_origin_visit_not_found(self, origin): | ||||
self.assertEqual(rv.status_code, 404, rv.data) | self.assertEqual(rv.status_code, 404, rv.data) | ||||
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': 'Origin %s or its visit with id %s not found!' % | 'reason': 'Origin %s or its visit with id %s not found!' % | ||||
(origin['url'], max_visit_id+1) | (origin['url'], max_visit_id+1) | ||||
}) | }) | ||||
@pytest.mark.origin_id | |||||
def test_api_origins(self): | |||||
origins = get_tests_data()['origins'] | |||||
origin_urls = {origin['url'] for origin in origins} | |||||
# Get only one | |||||
url = reverse('api-1-origins', | |||||
query_params={'origin_count': 1}) | |||||
rv = self.client.get(url) | |||||
self.assertEqual(rv.status_code, 200, rv.data) | |||||
self.assertEqual(rv['Content-Type'], 'application/json') | |||||
self.assertEqual(len(rv.data), 1) | |||||
self.assertLess({origin['url'] for origin in rv.data}, origin_urls) | |||||
# Get all | |||||
url = reverse('api-1-origins', | |||||
query_params={'origin_count': len(origins)}) | |||||
rv = self.client.get(url) | |||||
self.assertEqual(rv.status_code, 200, rv.data) | |||||
self.assertEqual(rv['Content-Type'], 'application/json') | |||||
self.assertEqual(len(rv.data), len(origins)) | |||||
self.assertEqual({origin['url'] for origin in rv.data}, origin_urls) | |||||
# Get "all + 10" | |||||
url = reverse('api-1-origins', | |||||
query_params={'origin_count': len(origins)+10}) | |||||
rv = self.client.get(url) | |||||
self.assertEqual(rv.status_code, 200, rv.data) | |||||
self.assertEqual(rv['Content-Type'], 'application/json') | |||||
self.assertEqual(len(rv.data), len(origins)) | |||||
self.assertEqual({origin['url'] for origin in rv.data}, origin_urls) | |||||
@pytest.mark.origin_id | |||||
@given(strategies.integers(min_value=1)) | |||||
def test_api_origins_scroll(self, origin_count): | |||||
origins = get_tests_data()['origins'] | |||||
origin_urls = {origin['url'] for origin in origins} | |||||
url = reverse('api-1-origins', | |||||
query_params={'origin_count': origin_count}) | |||||
results = [] | |||||
while True: | |||||
rv = self.client.get(url) | |||||
self.assertEqual(rv.status_code, 200, rv.data) | |||||
self.assertEqual(rv['Content-Type'], 'application/json') | |||||
results.extend(rv.data) | |||||
if 'Link' in rv: | |||||
for link in parse_header_links(rv['Link']): | |||||
if link['rel'] == 'next': | |||||
# Found link to next page of results | |||||
url = link['url'] | |||||
break | |||||
else: | |||||
# No link with 'rel=next' | |||||
break | |||||
else: | |||||
# No Link header | |||||
break | |||||
self.assertEqual(len(results), len(origins)) | |||||
self.assertEqual({origin['url'] for origin in results}, origin_urls) | |||||
@given(origin()) | @given(origin()) | ||||
def test_api_origin_by_url(self, origin): | def test_api_origin_by_url(self, origin): | ||||
url = reverse('api-1-origin', | url = reverse('api-1-origin', | ||||
url_args={'origin_url': origin['url']}) | url_args={'origin_url': origin['url']}) | ||||
rv = self.client.get(url) | rv = self.client.get(url) | ||||
expected_origin = self.origin_get(origin) | expected_origin = self.origin_get(origin) | ||||
▲ Show 20 Lines • Show All 191 Lines • Show Last 20 Lines |