Basic fixtures for testing with GitHub repos

Add simple fixtures for creating GitHub repos and forks.

Change-Id: I4ad30c26db60680166b88b434a521c4e885381e8
This commit is contained in:
Darragh Bailey 2018-07-10 10:01:02 +01:00
parent 545037556d
commit 8ece79aca2
1 changed files with 125 additions and 0 deletions

125
fixtures_git/github.py Normal file
View File

@ -0,0 +1,125 @@
# Copyright (c) 2018 Hewlett Packard Enterprise Development Company LP
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
import os
import tempfile
import time
import fixtures
import github3 as github
try:
import urlparse as parse
except ImportError:
from urllib import parse
TEST_REPO_DESC = "########## Auto-generated test repository ##########"
class GithubRepoFixture(fixtures.Fixture):
"""
Fixture to create a new repo in GitHub and remove once finished.
"""
default_repo_name_template = 'workflow-test-XXXXXX'
def __init__(self, owner, token, url="https://github.com",
name_template=None):
super(GithubRepoFixture, self).__init__()
self.owner = owner
self.token = token
self.name_template = name_template or self.default_repo_name_template
self.repo = None
self.repo_name = None
if parse.urlparse(url).netloc == "github.com":
github_login = github.login
else:
github_login = github.enterprise_login
self.github = github_login(token=token, url=url)
# try an auth'ed request to make sure we have a valid token
# note this requires the token to have read on user
self.me = self.github.me()
def _setUp(self):
template_parts = self.name_template.split('XXXXXX')
prefix = template_parts[0]
suffix = template_parts[-1]
tfile = tempfile.NamedTemporaryFile(
suffix=suffix, prefix=prefix, delete=False)
self.addCleanup(os.remove, tfile.name)
self.repo_name = os.path.basename(tfile.name)
self.addCleanup(self._delete_repo)
org = self.github.organization(self.owner)
self.repo = org.create_repository(
name=self.repo_name,
description=TEST_REPO_DESC,
has_issues=False,
has_wiki=False,
auto_init=True,
)
def _delete_repo(self):
if self.repo is not None:
self.repo.delete()
elif self.repo_name is not None:
repo = self.github.repository(self.owner, self.repo_name)
if repo:
repo.delete()
class GithubForkedRepoFixture(fixtures.Fixture):
"""
Fixture to create and delete a fork of the given repo in the
default GitHub org of the token user
"""
def __init__(self, src_repo, token, url="https://github.com"):
super(GithubForkedRepoFixture, self).__init__()
self.src_repo = src_repo
self.token = token
self.repo = None
if parse.urlparse(url).netloc == "github.com":
github_login = github.login
else:
github_login = github.enterprise_login
self.github = github_login(token=token, url=url)
# try an auth'ed request to make sure we have a valid token
# note this requires the token to have read on user
self.me = self.github.me()
def _setUp(self):
owner, repo_name = self.src_repo.split('/')
upstream_repo = self.github.repository(owner, repo_name)
self.addCleanup(self._delete_repo)
self.repo = upstream_repo.create_fork()
# wait for the fork to be available
while self.github.repository(self.me, repo_name) is None:
time.sleep(2)
def _delete_repo(self):
repo_name = self.src_repo.split('/')[-1]
repo = self.github.repository((self.github.me()).login, repo_name)
if repo and repo.description == TEST_REPO_DESC:
repo.delete()