Changeset View
Changeset View
Standalone View
Standalone View
swh/lister/github/tests/test_gh_lister.py
# Copyright (C) 2017-2019 the Software Heritage developers | # Copyright (C) 2017-2019 the Software Heritage developers | ||||
# License: GNU General Public License version 3, or any later version | # License: GNU 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 re | import re | ||||
import unittest | import unittest | ||||
import requests_mock | |||||
from datetime import datetime, timedelta | from datetime import datetime, timedelta | ||||
from swh.lister.core.tests.test_lister import HttpListerTester | from swh.lister.core.tests.test_lister import HttpListerTester | ||||
from swh.lister.github.lister import GitHubLister | from swh.lister.github.lister import GitHubLister | ||||
class GitHubListerTester(HttpListerTester, unittest.TestCase): | class GitHubListerTester(HttpListerTester, unittest.TestCase): | ||||
Lister = GitHubLister | Lister = GitHubLister | ||||
test_re = re.compile(r'/repositories\?since=([^?&]+)') | test_re = re.compile(r'/repositories\?since=([^?&]+)') | ||||
lister_subdir = 'github' | lister_subdir = 'github' | ||||
good_api_response_file = 'api_response.json' | good_api_response_file = 'api_first_response.json' | ||||
bad_api_response_file = 'api_empty_response.json' | bad_api_response_file = 'api_empty_response.json' | ||||
first_index = 0 | first_index = 0 | ||||
last_index = 368 | last_index = 369 | ||||
entries_per_page = 100 | entries_per_page = 100 | ||||
convert_type = int | convert_type = int | ||||
def response_headers(self, request): | def response_headers(self, request): | ||||
headers = {'X-RateLimit-Remaining': '1'} | headers = {'X-RateLimit-Remaining': '1'} | ||||
if self.request_index(request) == self.first_index: | if self.request_index(request) == self.first_index: | ||||
headers.update({ | headers.update({ | ||||
'Link': '<https://api.github.com/repositories?since=367>;' | 'Link': '<https://api.github.com/repositories?since=%s>;' | ||||
' rel="next",' | ' rel="next",' | ||||
'<https://api.github.com/repositories{?since}>;' | '<https://api.github.com/repositories{?since}>;' | ||||
' rel="first"' | ' rel="first"' % self.last_index | ||||
}) | }) | ||||
else: | else: | ||||
headers.update({ | headers.update({ | ||||
'Link': '<https://api.github.com/repositories{?since}>;' | 'Link': '<https://api.github.com/repositories{?since}>;' | ||||
' rel="first"' | ' rel="first"' | ||||
}) | }) | ||||
return headers | return headers | ||||
def mock_rate_quota(self, n, request, context): | def mock_rate_quota(self, n, request, context): | ||||
self.rate_limit += 1 | self.rate_limit += 1 | ||||
context.status_code = 403 | context.status_code = 403 | ||||
context.headers['X-RateLimit-Remaining'] = '0' | context.headers['X-RateLimit-Remaining'] = '0' | ||||
one_second = int((datetime.now() + timedelta(seconds=1.5)).timestamp()) | one_second = int((datetime.now() + timedelta(seconds=1.5)).timestamp()) | ||||
context.headers['X-RateLimit-Reset'] = str(one_second) | context.headers['X-RateLimit-Reset'] = str(one_second) | ||||
return '{"error":"dummy"}' | return '{"error":"dummy"}' | ||||
@requests_mock.Mocker() | |||||
def test_scheduled_tasks(self, http_mocker): | |||||
self.scheduled_tasks_test('api_next_response.json', 876, http_mocker) |