def test__get_next_endpoint_Should_ReturnExpected_When_CalledWithNextEndpoint( self, *patches): client = GitHubAPI('api.github.com', bearer_token='bearer-token') link_header = '<https://api.github.com/organizations/27781926/repos?page=2>; rel="prev", <https://api.github.com/organizations/27781926/repos?page=4>; rel="next", <https://api.github.com/organizations/27781926/repos?page=4>; rel="last", <https://api.github.com/organizations/27781926/repos?page=1>; rel="first"' result = client.get_next_endpoint(link_header) expected_result = '/organizations/27781926/repos?page=4' self.assertEqual(result, expected_result)
def test__get_version_tags_Should_Return_When_NoLatestTagVersion( self, get_latest_version_patch, filter_version_tags_patch, *patches): get_latest_version_patch.return_value = (None, None) client = GitHubAPI('api.github.com', bearer_token='bearer-token') client.get_version_tags(repo='org1/repo1', branch='master') filter_version_tags_patch.assert_not_called()
def test__remove_version_tags_Should_Return_When_NoTags( self, get_version_tags_patch, ratelimit_request_patch, *patches): get_version_tags_patch.return_value = None client = GitHubAPI('api.github.com', bearer_token='bearer-token') client.remove_version_tags(repo='org1/repo1', branch='master', noop=False) ratelimit_request_patch.assert_not_called()
def test__get_version_tags_Should_CallAndReturnExpected_When_Called( self, get_latest_version_patch, filter_version_tags_patch, *patches): get_latest_version_patch.return_value = Version('1.2.3-dev.1'), 'sha0' client = GitHubAPI('api.github.com', bearer_token='bearer-token') result = client.get_version_tags(repo='org1/repo1', branch='master') expected_result = (filter_version_tags_patch.return_value, Version('1.2.3-dev.1'), 'sha0') self.assertEqual(result, expected_result)
def test__read_Should_CallExpected_When_Called(self, read_all_patch, match_keys_patch, *patches): client = GitHubAPI('api.github.com', bearer_token='bearer-token') endpoint = '/repos/edgexfoundry/cd-management/milestones' attributes = ['key1', 'key2'] result = client.read(endpoint, attributes=attributes) read_all_patch.assert_called_once_with(endpoint) match_keys_patch.assert_called_once_with(read_all_patch.return_value, attributes) self.assertEqual(result, match_keys_patch.return_value)
def test__remove_version_tags_Should_CallExpected_When_Called( self, get_version_tags_patch, ratelimit_request_patch, *patches): get_version_tags_patch.return_value = ([ ('tag1', 'sha1'), ('tag2', 'sha2') ], '-latest-version-', '-latest-version-sha-') client = GitHubAPI('api.github.com', bearer_token='bearer-token') client.remove_version_tags(repo='org1/repo1', branch='master', noop=True) ratelimit_request_patch.assert_called_with( client.delete, '/repos/org1/repo1/git/refs/tags/tag2', noop=True)
def test__ratelimit_request_Should_CallAndReturnExpected_When_NoRawResponse( self, *patches): client = GitHubAPI('api.github.com', bearer_token='bearer-token') function_mock = Mock() result = client.ratelimit_request(function_mock, 'one', 2, True, k1='v1', k2='v2') function_mock.assert_called_once_with('one', 2, True, k1='v1', k2='v2') self.assertEqual(result, function_mock.return_value)
def test__read_page_Should_ReturnExpected_When_NoEndpoint( self, ratelimit_request_patch, get_next_endpoint_patch, *patches): response_mock1 = Mock() response_mock1.json.return_value = ['page1', 'page2'] ratelimit_request_patch.side_effect = [response_mock1] get_next_endpoint_patch.side_effect = [None] client = GitHubAPI('api.github.com', bearer_token='bearer-token') result = client.read_page('endpoint') self.assertEqual(next(result), 'page1') self.assertEqual(next(result), 'page2') with self.assertRaises(StopIteration): next(result)
def test__log_ratelimit_Should_LogExpected_When_Header( self, logger_patch, datetime_patch, *patches): datetime_patch.now.return_value = datetime(2020, 5, 6, 18, 22, 45, 12065) datetime_patch.fromtimestamp.return_value = datetime( 2020, 5, 6, 19, 20, 51) header = { 'X-RateLimit-Reset': '1588792851', 'X-RateLimit-Remaining': '4999', 'X-RateLimit-Limit': '5000' } GitHubAPI.log_ratelimit(header) logger_patch.debug.assert_called_with('4999/5000 resets in 58 min')
def test__get_version_tags_report_Should_ReturnExpected_When_Called( self, get_version_tags_patch, generate_version_report, *patches): get_version_tags_patch.side_effect = [ ('-tags-', '-latest-version-', '-latest-version-sha-'), None, ('-tags-', '-latest-version-', '-latest-version-sha-'), ] generate_version_report.side_effect = [{'repo1': {}}, {'repo3': {}}] client = GitHubAPI('api.github.com', bearer_token='bearer-token') repos = ['repo1', 'repo2', 'repo3'] expression = '<=1.1.1' result = client.get_version_tags_report(repos=repos, expression=expression) expected_result = {'repo1': {}, 'repo2': {}, 'repo3': {}} self.assertEqual(result, expected_result)
def test__read_all_Should_ReturnExpected_When_GetReturnsDict( self, ratelimit_request_patch, get_next_endpoint_patch, *patches): response_mock1 = Mock() response_mock1.json.return_value = {'key1': 'value1'} response_mock2 = Mock() response_mock2.json.return_value = {'key2': 'value2'} ratelimit_request_patch.side_effect = [response_mock1, response_mock2] get_next_endpoint_patch.side_effect = [{ 'Link': 'link-header-value' }, {}] client = GitHubAPI('api.github.com', bearer_token='bearer-token') result = client.read_all( '/repos/edgexfoundry/cd-management/milestones') expected_result = [{'key1': 'value1'}, {'key2': 'value2'}] self.assertEqual(result, expected_result)
def test__get_latest_version_Should_ReturnExpected_When_NoTagFound( self, read_page_patch, lookup_tag_patch, get_version_patch, *patches): read_page_patch.return_value = [{ 'sha': '-sha1-' }, { 'sha': '-sha2-' }, { 'sha': '-sha3-' }] lookup_tag_patch.side_effect = [None, None, None] client = GitHubAPI('api.github.com', bearer_token='bearer-token') tags = ['tag1', 'tag2'] result = client.get_latest_version(repo='soda480/repo1', tags=tags) self.assertEqual(result, (None, None))
def test__get_repos_Should_CallAndReturnExpected_When_OrganizationExcludeAttributes( self, read_all_patch, match_repos_patch, *patches): client = GitHubAPI('api.github.com', bearer_token='bearer-token') result = client.get_repos(organization='org1', exclude=['repo1', 'repo2'], archived=False, disabled=False) read_all_patch.assert_called_once_with('/orgs/org1/repos') match_repos_patch.assert_called_once_with( repos=read_all_patch.return_value, owner='org1', include=None, exclude=['repo1', 'repo2'], archived=False, disabled=False) self.assertEqual(result, match_repos_patch.return_value)
def test__get_repos_Should_CallAndReturnExpected_When_UserRegexAttributes( self, read_all_patch, match_repos_patch, *patches): client = GitHubAPI('api.github.com', bearer_token='bearer-token') result = client.get_repos(user='******', include=r'^test_repo.*$', archived=False, disabled=False) read_all_patch.assert_called_once_with('/users/soda480/repos') match_repos_patch.assert_called_once_with( repos=read_all_patch.return_value, owner='soda480', include='^test_repo.*$', exclude=None, archived=False, disabled=False) self.assertEqual(result, match_repos_patch.return_value)
def test__get_latest_version_Should_CallAndReturnExpected_When_Called( self, read_page_patch, lookup_tag_patch, get_version_patch, *patches): read_page_patch.return_value = [{ 'sha': '-sha1-' }, { 'sha': '-sha2-' }, { 'sha': '-sha3-' }] client = GitHubAPI('api.github.com', bearer_token='bearer-token') tags = ['tag1', 'tag2'] result = client.get_latest_version(repo='soda480/repo1', tags=tags) self.assertEqual(result, (get_version_patch.return_value, '-sha1-')) read_page_patch.assert_called_once_with( '/repos/soda480/repo1/commits?sha=master') lookup_tag_patch.assert_called_with(tags=tags, sha='-sha1-')
def test__remove_version_tags_Should_LogErrorAndContinue_When_Exception( self, get_version_tags_patch, ratelimit_request_patch, logger_patch, *patches): get_version_tags_patch.return_value = ([ ('tag1', 'sha1'), ('tag2', 'sha2') ], '-latest-version-', '-latest-version-sha-') ratelimit_request_patch.side_effect = [ Exception('request error'), None ] client = GitHubAPI('api.github.com', bearer_token='bearer-token') client.remove_version_tags(repo='org1/repo1', branch='master', noop=True) ratelimit_request_patch.assert_called_with( client.delete, '/repos/org1/repo1/git/refs/tags/tag2', noop=True) logger_patch.error.assert_called_with( 'error occurred removing tag tag1 from repo org1/repo1: request error' )
def test__lookup_tag_Should_ReturnExpected_When_Called(self, *patches): tags = [{ 'commit': { 'sha': 'sha2' } }, { 'commit': { 'sha': 'sha3' } }, { 'commit': { 'sha': 'sha1' } }] result = GitHubAPI.lookup_tag(tags=tags, sha='sha1') expected_result = {'commit': {'sha': 'sha1'}} self.assertEqual(result, expected_result)
def test__filter_version_tags_Should_Return_Expected_When_Called_With_Range( self, *patches): tags = [{ 'name': 'v1.2.4', 'commit': { 'sha': 'sha1' } }, { 'name': 'v1.2.3-dev.1', 'commit': { 'sha': 'sha2' } }, { 'name': 'v1.2.2', 'commit': { 'sha': 'sha3' } }, { 'name': 'v1.2.1', 'commit': { 'sha': 'sha4' } }, { 'name': 'v1.2.0-dev.1', 'commit': { 'sha': 'sha5' } }, { 'name': 'v1.1.9', 'commit': { 'sha': 'sha6' } }, { 'name': 'v1.1.4-dev.1', 'commit': { 'sha': 'sha7' } }] result = GitHubAPI.filter_version_tags(tags=tags, exclude=Version('1.2.3-dev.2'), expression='<1.2.4,>1.1.4') expected_result = [('v1.2.3-dev.1', 'sha2'), ('v1.2.2', 'sha3'), ('v1.2.1', 'sha4'), ('v1.2.0-dev.1', 'sha5'), ('v1.1.9', 'sha6')] self.assertEqual(result, expected_result)
def test__generate_version_report_Should_ReturnExpected_When_Called( self, *patches): tags = [('v1.2.4', 'sha3'), ('v1.2.3', 'sha2'), ('v1.2.2', 'sha1')] result = GitHubAPI.generate_version_report( repo='repo1', version_tags=tags, latest_version=Version('1.2.4'), latest_version_sha='sha0') expected_result = { 'repo1': { 'latest_version': ('1.2.4', 'sha0'), 'version_tags': [('v1.2.4', 'sha3'), ('v1.2.3', 'sha2'), ('v1.2.2', 'sha1')], 'version_tags_count': 3 } } self.assertEqual(result, expected_result)
def test__generate_prerelease_report_Should_ReturnExpected_When_Called( self, *patches): prerelease_tags = [('v1.2.2-dev.1', 'sha1'), ('v1.2.1-dev.2', 'sha2'), ('v1.2.1-dev.1', 'sha3')] result = GitHubAPI.generate_preprelease_report( repo='soda480/repo1', prerelease_tags=prerelease_tags, latest_version=Version('1.2.3'), latest_version_sha='sha0') expected_result = { 'soda480/repo1': { 'latest_version': ('1.2.3', 'sha0'), 'prerelease_tags': [('v1.2.2-dev.1', 'sha1'), ('v1.2.1-dev.2', 'sha2'), ('v1.2.1-dev.1', 'sha3')], 'prerelease_tags_count': 3 } } self.assertEqual(result, expected_result)
def test__match_repos_Should_ReturnExpected_When_Called(self, *patches): repos = [{ 'name': 'repo1' }, { 'name': 'test_repo1', 'key1': 'value1' }, { 'name': 'repo2' }, { 'name': 'test_repo2', 'key1': 'value1', 'key2': 'value2' }] result = GitHubAPI.match_repos(repos=repos, owner='soda480', include=r'^test_repo.*$', exclude='test_repo2', key1='value1') expected_result = ['soda480/test_repo1'] self.assertEqual(result, expected_result)
def test__log_ratelimit_Should_NotLog_When_NoHeader( self, logger_patch, *patches): GitHubAPI.log_ratelimit({}) logger_patch.debug.assert_not_called()
def test__get_response_Should_CallExpected_When_Called( self, log_ratelimit_patch, *patches): client = GitHubAPI('api.github.com', bearer_token='bearer-token') response_mock = Mock(headers={'key': 'value'}) client.get_response(response_mock) log_ratelimit_patch.assert_called_once_with(response_mock.headers)
def test__get_headers_Should_SetAcceptHeader_When_Called(self, *patches): client = GitHubAPI('api.github.com', bearer_token='bearer-token') result = client.get_headers() self.assertEqual(result['Accept'], 'application/vnd.github.v3+json')
def test__get_next_endpoint_Should_ReturnNone_When_NoLinkHeader( self, *patches): client = GitHubAPI('api.github.com', bearer_token='bearer-token') self.assertIsNone(client.get_next_endpoint(None))
def test__get_version_tags_Should_Return_When_NoTags( self, read_all_patch, get_latest_version_patch, *patches): read_all_patch.return_value = [] client = GitHubAPI('api.github.com', bearer_token='bearer-token') client.get_version_tags(repo='org1/repo1', branch='master') get_latest_version_patch.assert_not_called()
def test__get_next_endpoint_Should_ReturnNone_When_NoNextEndpoint( self, *patches): client = GitHubAPI('api.github.com', bearer_token='bearer-token') link_header = '<https://api.github.com/organizations/27781926/repos?page=3>; rel="prev", <https://api.github.com/organizations/27781926/repos?page=1>; rel="first"' result = client.get_next_endpoint(link_header) self.assertIsNone(result)
def test__init__Should_RaiseValueError_When_NoBearerToken(self, *patches): with self.assertRaises(ValueError): GitHubAPI('api.github.com')
def test__get_client_Should_CallAndReturnExpected_When_Called( self, githubapi_patch, getenv_patch, *patches): getenv_patch.side_effect = ['url', 'token'] result = GitHubAPI.get_client() githubapi_patch.assert_called_once_with('url', bearer_token='token') self.assertEqual(result, githubapi_patch.return_value)
def test__get_version_Should_ReturnExpected_When_Called(self, *patches): result = GitHubAPI.get_version(name='enjambre') self.assertIsNone(result)