Skip to content

Commit

Permalink
added lots of tests and made some code mods to match
Browse files Browse the repository at this point in the history
  • Loading branch information
Adam Kaufman committed Dec 31, 2014
1 parent d36c2ad commit 722012e
Show file tree
Hide file tree
Showing 2 changed files with 150 additions and 19 deletions.
44 changes: 27 additions & 17 deletions fencepy/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
l.basicConfig(filename=os.path.join(FENCEPY_ROOT, 'fencepy.log'))

VENV_ROOT = os.path.join(FENCEPY_ROOT, 'virtualenvs')
QUIET = False

def _get_args():
"""Do all parsing and processing for command-line arguments"""
Expand All @@ -47,8 +48,13 @@ def _get_args():
help='Silence all console output')
args = vars(p.parse_args())

# make sure we area globally quiet
if args['quiet']:
global QUIET
QUIET = True

# set up logging
if not args['quiet']:
else:
f = l.Formatter('[%(levelname)s] %(message)s')
h = l.StreamHandler()
h.setFormatter(f)
Expand All @@ -59,11 +65,11 @@ def _get_args():
if not args['dir']:
args['dir'] = os.getcwd()
if not args['plain']:
output = sh.git('rev-parse', '--show-toplevel')
if not output.exit_code:
try:
output = sh.git('rev-parse', '--show-toplevel')
args['dir'] = str(output).strip()
else:
l.error("tried to handle {0} as a git repository but it isn't one".format(args['dir']))
except sh.ErrorReturnCode:
l.warning("tried to handle {0} as a git repository but it isn't one".format(args['dir']))

# reset the virtualenv root, if necessary
if not args['virtualenv_dir']:
Expand Down Expand Up @@ -152,7 +158,8 @@ def _locate_subdirs(pattern, root):

def _print(line):
"""Wrapper function for printing sh output is necessary for python 2 compatibility"""
print(line)
if not QUIET:
print(line)


def _create(args):
Expand All @@ -167,26 +174,29 @@ def _create(args):
l.error('virtual environment already exists, quitting')
return 1

# also make sure the project dir does exist
if not os.path.exists(pdir):
l.error('{0} does not exist, quitting'.format(pdir))
return 1

# go ahead and create the environment
old_argv = copy.copy(sys.argv)
sys.argv = ['virtualenv', vdir]
l.info('creating virtual environment')
print(''.ljust(40, '='))
ret = virtualenv.main()
print(''.ljust(40, '='))
sys.argv = old_argv
if ret:
l.error('there was a problem: (TODO: get output from virtualenv.main())')
virtualenv = os.path.join(os.path.dirname(sys.argv[0]), 'virtualenv')
_print(''.ljust(40, '='))
output = sh.Command(virtualenv)(vdir, _out=_print, _err=_print)
output.wait()
_print(''.ljust(40, '='))
if output.exit_code:
l.error('there was a problem: {0}'.format(str(output)))
return 1

# install requirements, if they exist
rtxt = os.path.join(pdir, 'requirements.txt')
if os.path.exists(rtxt):
l.info('loading requirements from {0}'.format(rtxt))
print(''.ljust(40, '='))
_print(''.ljust(40, '='))
output = sh.Command(os.path.join(vdir, 'bin', 'pip'))('install', '-r', rtxt, _out=_print, _err=_print)
output.wait()
print(''.ljust(40, '='))
_print(''.ljust(40, '='))
if output.exit_code:
return 1
l.info('finished installing requirements')
Expand Down
125 changes: 123 additions & 2 deletions tests/test_fencepy.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,126 @@
from unittest import TestCase
import tempfile
import fencepy
import os
import shutil
import copy
import sys
import sh
from contextlib import contextmanager
if sys.version.startswith('2'):
from StringIO import StringIO
else:
from io import StringIO

@contextmanager
def redirected(out=sys.stdout, err=sys.stderr):
saved = sys.stdout, sys.stderr
sys.stdout, sys.stderr = out, err
try:
yield
finally:
sys.stdout, sys.stderr = saved

PROJECT_NAME = 'fencepytest'
ORIGINAL_DIR = os.getcwd()
ORIGINAL_ARGV = copy.copy(sys.argv)

class TestFencepy(TestCase):
def test_fencepy_import(self):
import fencepy

def _fence(self, *args):
sys.argv = ['fencepy'] + list(args)
ret = fencepy.fence()
sys.argv = ORIGINAL_ARGV
return ret

def _get_arg_dict(self, *args):
sys.argv = ['fencepy', '-q'] + list(args)
ret = fencepy._get_args()
sys.argv = ORIGINAL_ARGV
return ret

def setUp(self):
self.tempdir = tempfile.mkdtemp()
self.pdir = os.path.join(self.tempdir, PROJECT_NAME)
os.mkdir(self.pdir)
os.chdir(self.pdir)
self.default_args = self._get_arg_dict()

def tearDown(self):
if os.path.exists(self.default_args['virtualenv_dir']):
shutil.rmtree(self.default_args['virtualenv_dir'])
os.chdir(ORIGINAL_DIR)
shutil.rmtree(self.tempdir)

def _create_and_assert(self, *args):
ret = self._fence('-q', '-c', *args)
self.assertEqual(ret, 0, 'create command failed')
self.assertTrue(os.path.exists(self.default_args['virtualenv_dir']))

def test_create_plain(self):
self._create_and_assert('-p')

def test_create_nongit_without_plain(self):
self._create_and_assert()

def test_create_git(self):
sh.git.init('.')
os.mkdir('test')
os.chdir('test')
self._create_and_assert()

def test_create_with_pdir_does_exist(self):
project_name = 'project'
project_dir = os.path.join(self.tempdir, project_name)
os.mkdir(project_dir)
args = self._get_arg_dict('-d', project_dir)
self.assertTrue(project_name in args['virtualenv_dir'])
ret = self._fence('-q', '-c', '-d', project_dir)
self.assertEqual(ret, 0, 'create command failed')
self.assertTrue(os.path.exists(args['virtualenv_dir']))
shutil.rmtree(args['virtualenv_dir'])

def test_create_with_pdir_does_not_exist(self):
project_name = 'notarealpath'
project_dir = os.path.join(tempfile.gettempdir(), project_name)
args = self._get_arg_dict('-d', project_dir)
self.assertTrue(project_name in args['virtualenv_dir'])
ret = self._fence('-q', '-c', '-d', project_dir)
self.assertNotEqual(ret, 0, 'create command should not succeed')
self.assertFalse(os.path.exists(args['virtualenv_dir']))

def test_create_with_vdir(self):
vdir = os.path.join(self.tempdir, 'virtualenv')
args = self._get_arg_dict('-D', vdir)
self.assertEqual(vdir, args['virtualenv_dir'])
ret = self._fence('-q', '-c', '-D', vdir)
self.assertEqual(ret, 0, 'create command failed')
self.assertTrue(os.path.exists(vdir))

def test_erase(self):
self.test_create_plain()
ret = self._fence('-q', '-e')
self.assertEqual(ret, 0, 'erase command failed')
self.assertFalse(os.path.exists(self.default_args['virtualenv_dir']))

def _test_activate(self, shell, script):
self.test_create_plain()
os.environ['SHELL'] = shell
tempout = StringIO()
with redirected(out=tempout):
ret = self._fence('-q', '-a')
output = tempout.getvalue()
self.assertEqual(ret, 0, 'activate printing failed')
self.assertTrue(self.default_args['virtualenv_dir'] in output)
self.assertTrue(script in output)

def test_activate_fish(self):
self._test_activate('fish', 'activate.fish')

def test_activate_csh(self):
self._test_activate('csh', 'activate.csh')

def test_activate_bash(self):
self._test_activate('bash', 'activate')


0 comments on commit 722012e

Please sign in to comment.