def get_installations(integration): # pragma: no cover # FIXME(sileht): This is currently always mocked in tests installs = [] url = "https://api.github.com/app/installations" token = "Bearer {}".format(integration.create_jwt()) session = requests.Session() while True: response = session.get( url, headers={ "Authorization": token, "Accept": "application/vnd.github.machine-man-preview+json", "User-Agent": "PyGithub/Python" }) if response.status_code == 200: installs.extend(response.json()) if "next" in response.links: url = response.links["next"]["url"] continue else: return installs elif response.status_code == 403: raise github.BadCredentialsException(status=response.status_code, data=response.text) elif response.status_code == 404: raise github.UnknownObjectException(status=response.status_code, data=response.text) raise github.GithubException(status=response.status_code, data=response.text)
def get_repositories_setuped(token, install_id): # pragma: no cover repositories = [] url = ("https://api.%s/user/installations/%s/repositories" % (config.GITHUB_DOMAIN, install_id)) token = "token {}".format(token) session = requests.Session() while True: response = session.get( url, headers={ "Authorization": token, "Accept": "application/vnd.github.machine-man-preview+json", "User-Agent": "PyGithub/Python" }) if response.status_code == 200: repositories.extend(response.json()["repositories"]) if "next" in response.links: url = response.links["next"]["url"] continue else: return repositories elif response.status_code == 403: raise github.BadCredentialsException(status=response.status_code, data=response.text) elif response.status_code == 404: raise github.UnknownObjectException(status=response.status_code, data=response.text) raise github.GithubException(status=response.status_code, data=response.text)
def get_installation_id(integration, owner, repo=None, account_type=None): if not account_type and not repo: raise RuntimeError("repo or account_type must be passed") if repo: url = "https://api.%s/repos/%s/%s/installation" % ( config.GITHUB_DOMAIN, owner, repo, ) else: url = "https://api.%s/%s/%s/installation" % ( config.GITHUB_DOMAIN, "users" if account_type.lower() == "User" else "orgs", owner, ) token = "Bearer {}".format(integration.create_jwt()) response = requests.get( url, headers={ "Authorization": token, "Accept": "application/vnd.github.machine-man-preview+json", "User-Agent": "PyGithub/Python", }, ) if response.status_code == 200: return response.json()["id"] elif response.status_code == 403: raise github.BadCredentialsException(status=response.status_code, data=response.text) elif response.status_code == 404: raise github.UnknownObjectException(status=response.status_code, data=response.text) raise github.GithubException(status=response.status_code, data=response.text)
class ApiTestCase(test.APITestCase): """Test case for API.""" def setUp(self): self.owner = 'wieczorek1990' self.repository_name = 'wieczorek1990.github.io' @mock.patch('api.views.RepositoriesView.get_external_data', return_value=dict(factories.RepositoryFactory())) def test_repositories(self, mock_get_external_data): response = self.client.get( shortcuts.reverse('repositories', kwargs={ 'owner': self.owner, 'repository_name': self.repository_name, })) self.assertTrue(mock_get_external_data.called) self.assertEqual(response.status_code, status.HTTP_200_OK) @mock.patch('api.views.RepositoriesView.get_external_data', side_effect=github.UnknownObjectException( data={ 'message': 'Not Found', 'documentation_url': 'https://developer.github.com/v3' }, status=404, )) def test_non_existing_repository(self, get_external_data): response = self.client.get( '/repositories/{owner}/{repository_name}/'.format( owner=self.owner, repository_name='non-existing-repository-name', )) self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
def test_get_profile_raises_error_on_unknown_user(self): client = GithubClient() error = github.UnknownObjectException('test error', None) with mock.patch.object(client.client, 'get_user', side_effect=error): with self.assertRaises(UnknownProfileError) as cm: client.get_profile('foobar') self.assertEqual(str(cm.exception), 'No such GitHub account: foobar')
def get_access_token(self, installation_id, user_id=None): """ Get an access token for the given installation id. POSTs https://api.github.com/installations/<installation_id>/access_tokens :param user_id: int :param installation_id: int :return: :class:`github.InstallationAuthorization.InstallationAuthorization` """ body = {} if user_id: body = {"user_id": user_id} response = requests.post( f"{self.__github_url}/installations/{installation_id}/access_tokens", headers={ "Authorization": "Bearer {}".format(self.create_jwt()), "Accept": github.Consts.mediaTypeIntegrationPreview, "User-Agent": "PyGithub/Python" }, json=body ) if response.status_code == 201: return github.InstallationAuthorization.InstallationAuthorization( requester=None, # not required, this is a NonCompletableGithubObject headers={}, # not required, this is a NonCompletableGithubObject attributes=response.json(), completed=True ) elif response.status_code == 403: raise github.BadCredentialsException( status=response.status_code, data=response.text ) elif response.status_code == 404: raise github.UnknownObjectException( status=response.status_code, data=response.text ) raise github.GithubException( status=response.status_code, data=response.text )
def _delete_tag(self): """Attempt to delete tags both from GitHub and git.""" if self.args.opts["internal_cmd"] \ == Arguments.INTERNAL_CMD_DELETE_TAG \ or self.args.flags["include_tag"]: logger.info("Cleaning tag(s): %s", self.args.opts["tag"]) for tag in self.args.repo.get_tags(): if fnmatch.fnmatch(tag.name, self.args.opts["tag"]): try: release = self.args.repo.get_release(tag.name) if self.args.flags["force"]: logger.info("Deleting release: %s", release.title) release.delete_release() raise github.UnknownObjectException( "404", "Spoof to hit except", headers=None) logger.info( "Tag %s still connected to release: %s", tag.name, "not deleting") except github.UnknownObjectException: # No release exists, get rid of tag # delete the local tag (if any) logger.info("Deleting local tag: %s", tag.name) try: subprocess.run( ['git', 'tag', '--delete', tag.name], check=True) except subprocess.CalledProcessError as err: logger.info("Trouble deleting local tag: %s", err) # delete the remote tag (if any) logger.info("Deleting remote tag: %s", tag.name) try: subprocess.run( ['git', 'push', '--delete', 'origin', tag.name], check=True) except subprocess.CalledProcessError as err: logger.info("Trouble deleting remote tag: %s", err)
def mock_delete(unused_self): raise github.UnknownObjectException(status='', data='')
def exception_side_effect(_): raise github.UnknownObjectException('test', 'test')