Changeset View
Changeset View
Standalone View
Standalone View
swh/lister/sourceforge/tests/test_sf_lister.py
- This file was added.
# Copyright (C) 2017 the Software Heritage developers | |||||
# License: GNU General Public License version 3, or any later version | |||||
# See top-level LICENSE file for more information | |||||
import re | |||||
import requests_mock | |||||
import unittest | |||||
from nose.tools import istest | |||||
from unittest.mock import patch | |||||
from swh.lister.core.tests.test_lister import ( | |||||
IndexingHttpListerTesterBase, noop | |||||
) | |||||
from swh.lister.sourceforge.lister import SourceForgeLister | |||||
_sf_baseurl = 'https://sourceforge.net' | |||||
@requests_mock.Mocker() | |||||
class SourceForgeListerTester(IndexingHttpListerTesterBase, unittest.TestCase): | |||||
Lister = SourceForgeLister | |||||
test_re = re.compile(r'/rest/p/([^?&]+)/') | |||||
lister_subdir = 'sourceforge' | |||||
good_api_response_file = 'api_response.json' | |||||
bad_api_response_file = 'api_empty_response.json' | |||||
first_index = 'amiga' | |||||
last_index = 'amiga' | |||||
entries_per_page = 1 | |||||
def get_fl(self, override_config=None): | |||||
if override_config or self.fl is None: | |||||
with patch( | |||||
'swh.scheduler.backend.SchedulerBackend.reconnect', noop | |||||
): | |||||
self.fl = SourceForgeLister( | |||||
lister_name='sourceforge', | |||||
api_baseurl=_sf_baseurl, | |||||
override_config=override_config) | |||||
self.fl.INITIAL_BACKOFF = 1 | |||||
self.fl.reset_backoff() | |||||
return self.fl | |||||
def mock_response(self, request, context): | |||||
self.fl.reset_backoff() | |||||
context.status_code = 200 | |||||
if self.request_index(request) == str(self.first_index): | |||||
with open('swh/lister/%s/tests/%s' % (self.lister_subdir, | |||||
self.good_api_response_file), | |||||
'r', encoding='utf-8') as r: | |||||
return r.read() | |||||
else: | |||||
with open('swh/lister/%s/tests/%s' % (self.lister_subdir, | |||||
self.bad_api_response_file), | |||||
'r', encoding='utf-8') as r: | |||||
return r.read() | |||||
def mock_sf_requests(self, http_mocker): | |||||
http_mocker.get('%s/p/amiga/code/' % _sf_baseurl, text='OK') | |||||
http_mocker.get(self.test_re, | |||||
text=self.mock_response) | |||||
def setUp(self): | |||||
self.list_sf_projects_in_subdir_patch = patch( | |||||
'swh.lister.sourceforge.lister._list_sf_projects_in_subdir') | |||||
self.list_sf_projects_in_subdir = \ | |||||
self.list_sf_projects_in_subdir_patch.start() | |||||
self.list_sf_projects_in_subdir.return_value = ['amiga', | |||||
'amigaone-linux'] | |||||
def tearDown(self): | |||||
self.list_sf_projects_in_subdir_patch.stop() | |||||
@istest | |||||
def test_api_request(self, http_mocker): | |||||
pass | |||||
@istest | |||||
def test_fetch_multiple_pages_nodb(self, http_mocker): | |||||
self.mock_sf_requests(http_mocker) | |||||
super(SourceForgeListerTester, self).test_fetch_multiple_pages_nodb() | |||||
@istest | |||||
def test_fetch_multiple_pages_yesdb(self, http_mocker): | |||||
self.mock_sf_requests(http_mocker) | |||||
super(SourceForgeListerTester, self).test_fetch_multiple_pages_yesdb() | |||||
@istest | |||||
def test_repos_list(self, http_mocker): | |||||
self.mock_sf_requests(http_mocker) | |||||
super(SourceForgeListerTester, self).test_repos_list() | |||||
@istest | |||||
def test_fetch_none_nodb(self, http_mocker): | |||||
self.mock_sf_requests(http_mocker) | |||||
super(SourceForgeListerTester, self).test_fetch_none_nodb() | |||||
@istest | |||||
def test_fetch_one_nodb(self, http_mocker): | |||||
self.mock_sf_requests(http_mocker) | |||||
super(SourceForgeListerTester, self).test_fetch_one_nodb() | |||||
@istest | |||||
def test_is_within_bounds(self, http_mocker): | |||||
fl = self.get_fl() | |||||
self.assertTrue(fl.is_within_bounds("b", "a", "c")) | |||||
self.assertFalse(fl.is_within_bounds("a", "b", "c")) | |||||
self.assertTrue(fl.is_within_bounds("a", None, "c")) | |||||
self.assertTrue(fl.is_within_bounds("a", None, None)) | |||||
self.assertTrue(fl.is_within_bounds("b", "a", None)) | |||||
self.assertFalse(fl.is_within_bounds("a", "b", None)) | |||||
self.assertTrue(fl.is_within_bounds("ac", "ab", "ad")) | |||||
self.assertFalse(fl.is_within_bounds("bu", "bw", "bz")) | |||||
@istest | |||||
def test_model_map(self, http_mocker): | |||||
self.mock_sf_requests(http_mocker) | |||||
super(SourceForgeListerTester, self).test_model_map() |