Fix test decorators

These tests aren't actually run by nose because the private decorator
doesn't properly wrap its test. This is also a useful pattern, and so we
move it into its own file (note that even better would be to use
testtools and fixtures, but that's a bigger refactor).

In addition, we don't need to use the git CLI, when we have gitpython,
which produces cleaner code and doesn't spray stuff all over our stderr.

Finally, the outdir creating decorator wasn't as reusable as I thought
it would be, so removing it for inline code for now.

Change-Id: Ibe1b993235b68a1a59bc398ded9c822a02475570
This commit is contained in:
Clint Byrum 2016-07-09 15:26:50 -07:00
parent 46829604c3
commit e0853bb40d
2 changed files with 53 additions and 42 deletions

View File

@ -12,52 +12,20 @@
# License for the specific language governing permissions and limitations
# under the License.
import os
import shutil
import subprocess
import tempfile
import unittest2 as unittest
from giftwrap.openstack_git_repo import OpenstackGitRepo
from giftwrap.openstack_commit import OpenstackCommit
def _make_outdir(test):
def wrapper(*args, **kwargs):
try:
outdir = tempfile.mkdtemp()
kwargs['outdir'] = outdir
return test(*args, **kwargs)
finally:
shutil.rmtree(outdir)
return wrapper
def _make_test_repo(test):
def wrapper(*args, **kwargs):
startdir = os.getcwd()
try:
testrepo = tempfile.mkdtemp()
kwargs['testrepo'] = testrepo
os.chdir(testrepo)
subprocess.check_call(['git', 'init'])
tf_path = os.path.join(testrepo, 'testfile.txt')
with open(tf_path, 'w') as tf:
tf.write('test content')
subprocess.check_call(['git', 'add', 'testfile.txt'])
subprocess.check_call(['git', 'commit', '-m', 'test commit'])
os.chdir(startdir)
return test(*args, **kwargs)
finally:
shutil.rmtree(testrepo)
return wrapper
from giftwrap.tests import utils
class TestRepo(unittest.TestCase):
def test_repo(self):
OpenstackGitRepo(None)
@_make_test_repo
@utils.make_test_repo()
def test_repo_properties(self, testrepo):
repo = OpenstackGitRepo(testrepo, project='baz')
self.assertFalse(repo.cloned)
@ -68,11 +36,14 @@ class TestRepo(unittest.TestCase):
except AttributeError:
self.assertTrue(True)
@_make_outdir
@_make_test_repo
def test_repo_clone(self, outdir, testrepo):
repo = OpenstackGitRepo(testrepo, project='bobafett')
repo.clone(outdir)
self.assertTrue(repo.cloned)
self.assertTrue(isinstance(repo.head, OpenstackCommit))
self.assertEquals(['HEAD', 'master'], repo.branches)
@utils.make_test_repo()
def test_repo_clone(self, testrepo):
try:
outdir = tempfile.mkdtemp()
repo = OpenstackGitRepo(testrepo, project='bobafett')
repo.clone(outdir)
self.assertTrue(repo.cloned)
self.assertTrue(isinstance(repo.head, OpenstackCommit))
self.assertEquals(['HEAD', 'master'], repo.branches)
finally:
shutil.rmtree(outdir)

40
giftwrap/tests/utils.py Normal file
View File

@ -0,0 +1,40 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
#
# 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 functools
import os
import shutil
import tempfile
import git
def make_test_repo(name='testrepo'):
def decorator(test):
@functools.wraps(test)
def wrapper(*args, **kwargs):
try:
testrepo = tempfile.mkdtemp()
kwargs[name] = testrepo
repo = git.Repo.init(testrepo)
tf_path = os.path.join(testrepo, 'testfile.txt')
with open(tf_path, 'w') as tf:
tf.write('test content')
repo.index.add([tf_path])
repo.index.commit('test commit')
return test(*args, **kwargs)
finally:
shutil.rmtree(testrepo)
return wrapper
return decorator