added FakeInput class to usecase tests

main
Fabien Benureau 12 years ago
parent f29f1a96b5
commit d109d93341

@ -11,6 +11,9 @@ from papers import papers_cmd
from papers import color
from papers.p3 import io
# code for fake fs
real_os = os
real_open = open
real_shutil = shutil
@ -18,6 +21,18 @@ real_glob = glob
fake_os, fake_open, fake_shutil, fake_glob = None, None, None, None
def _mod_list():
ml = []
import papers
for importer, modname, ispkg in pkgutil.walk_packages(
path=papers.__path__,
prefix=papers.__name__+'.',
onerror=lambda x: None):
ml.append(__import__(modname, fromlist = 'dummy'))
return ml
mod_list = _mod_list()
def _create_fake_fs():
global fake_os, fake_open, fake_shutil, fake_glob
@ -35,12 +50,7 @@ def _create_fake_fs():
sys.modules['shutil'] = fake_shutil
sys.modules['glob'] = fake_glob
import papers
for importer, modname, ispkg in pkgutil.walk_packages(
path=papers.__path__,
prefix=papers.__name__+'.',
onerror=lambda x: None):
md = __import__(modname, fromlist = 'dummy')
for md in mod_list:
md.os = fake_os
md.shutil = fake_shutil
@ -56,6 +66,9 @@ def _copy_data(fs):
if real_os.path.isdir(filepath):
fs.CreateDirectory(filepath)
# redirecting output
def redirect(f):
def newf(*args, **kwargs):
old_stderr, old_stdout = sys.stderr, sys.stdout
@ -68,7 +81,35 @@ def redirect(f):
sys.stderr, sys.stdout = old_stderr, old_stdout
return newf
#@redirect
# automating input
class FakeInput():
""" Replace the input() command, and mock user input during tests
Instanciate as :
input = FakeInput(['yes', 'no'])
Then :
input() returns 'yes'
input() returns 'no'
input() raise IndexError
"""
def __init__(self, inputs = None):
self.inputs = list(inputs) or []
self._cursor = 0
def add_input(self, inp):
self.inputs.append(inp)
def __call__(self):
inp = self.inputs[self._cursor]
self._cursor += 1
return inp
# putting it all together
def _execute_cmds(cmds, fs = None):
if fs is None:
fs = _create_fake_fs()
@ -122,6 +163,15 @@ class TestList(unittest.TestCase):
papers_cmd.execute('papers add -b /data/pagerank.bib -d /data/pagerank.pdf'.split())
papers_cmd.execute('papers list'.split())
class TestInput(unittest.TestCase):
def test_input(self):
input = FakeInput(['yes', 'no'])
self.assertEqual(input(), 'yes')
self.assertEqual(input(), 'no')
with self.assertRaises(IndexError):
input()
class TestUsecase(unittest.TestCase):
@ -175,3 +225,5 @@ class TestUsecase(unittest.TestCase):
]
_execute_cmds(cmds)

Loading…
Cancel
Save