From d109d93341a0c4ce2533cc92809fd8bdbabb49c0 Mon Sep 17 00:00:00 2001 From: Fabien Benureau Date: Thu, 4 Jul 2013 10:17:34 +0100 Subject: [PATCH] added FakeInput class to usecase tests --- tests/test_usecase.py | 66 ++++++++++++++++++++++++++++++++++++++----- 1 file changed, 59 insertions(+), 7 deletions(-) diff --git a/tests/test_usecase.py b/tests/test_usecase.py index 16d008d..cccadb7 100644 --- a/tests/test_usecase.py +++ b/tests/test_usecase.py @@ -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) + +