| 
									
										
										
										
											2010-03-25 23:56:33 +00:00
										 |  |  | import os | 
					
						
							|  |  |  | import sys | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import unittest | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class TestDiscovery(unittest.TestCase): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Heavily mocked tests so I can avoid hitting the filesystem | 
					
						
							|  |  |  |     def test_get_name_from_path(self): | 
					
						
							|  |  |  |         loader = unittest.TestLoader() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         loader._top_level_dir = '/foo' | 
					
						
							|  |  |  |         name = loader._get_name_from_path('/foo/bar/baz.py') | 
					
						
							|  |  |  |         self.assertEqual(name, 'bar.baz') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if not __debug__: | 
					
						
							|  |  |  |             # asserts are off | 
					
						
							|  |  |  |             return | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         with self.assertRaises(AssertionError): | 
					
						
							|  |  |  |             loader._get_name_from_path('/bar/baz.py') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_find_tests(self): | 
					
						
							|  |  |  |         loader = unittest.TestLoader() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         original_listdir = os.listdir | 
					
						
							|  |  |  |         def restore_listdir(): | 
					
						
							|  |  |  |             os.listdir = original_listdir | 
					
						
							|  |  |  |         original_isfile = os.path.isfile | 
					
						
							|  |  |  |         def restore_isfile(): | 
					
						
							|  |  |  |             os.path.isfile = original_isfile | 
					
						
							|  |  |  |         original_isdir = os.path.isdir | 
					
						
							|  |  |  |         def restore_isdir(): | 
					
						
							|  |  |  |             os.path.isdir = original_isdir | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         path_lists = [['test1.py', 'test2.py', 'not_a_test.py', 'test_dir', | 
					
						
							|  |  |  |                        'test.foo', 'test-not-a-module.py', 'another_dir'], | 
					
						
							|  |  |  |                       ['test3.py', 'test4.py', ]] | 
					
						
							|  |  |  |         os.listdir = lambda path: path_lists.pop(0) | 
					
						
							|  |  |  |         self.addCleanup(restore_listdir) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         def isdir(path): | 
					
						
							|  |  |  |             return path.endswith('dir') | 
					
						
							|  |  |  |         os.path.isdir = isdir | 
					
						
							|  |  |  |         self.addCleanup(restore_isdir) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         def isfile(path): | 
					
						
							|  |  |  |             # another_dir is not a package and so shouldn't be recursed into | 
					
						
							|  |  |  |             return not path.endswith('dir') and not 'another_dir' in path | 
					
						
							|  |  |  |         os.path.isfile = isfile | 
					
						
							|  |  |  |         self.addCleanup(restore_isfile) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         loader._get_module_from_name = lambda path: path + ' module' | 
					
						
							|  |  |  |         loader.loadTestsFromModule = lambda module: module + ' tests' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         loader._top_level_dir = '/foo' | 
					
						
							|  |  |  |         suite = list(loader._find_tests('/foo', 'test*.py')) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         expected = [name + ' module tests' for name in | 
					
						
							|  |  |  |                     ('test1', 'test2')] | 
					
						
							|  |  |  |         expected.extend([('test_dir.%s' % name) + ' module tests' for name in | 
					
						
							|  |  |  |                     ('test3', 'test4')]) | 
					
						
							|  |  |  |         self.assertEqual(suite, expected) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_find_tests_with_package(self): | 
					
						
							|  |  |  |         loader = unittest.TestLoader() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         original_listdir = os.listdir | 
					
						
							|  |  |  |         def restore_listdir(): | 
					
						
							|  |  |  |             os.listdir = original_listdir | 
					
						
							|  |  |  |         original_isfile = os.path.isfile | 
					
						
							|  |  |  |         def restore_isfile(): | 
					
						
							|  |  |  |             os.path.isfile = original_isfile | 
					
						
							|  |  |  |         original_isdir = os.path.isdir | 
					
						
							|  |  |  |         def restore_isdir(): | 
					
						
							|  |  |  |             os.path.isdir = original_isdir | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         directories = ['a_directory', 'test_directory', 'test_directory2'] | 
					
						
							|  |  |  |         path_lists = [directories, [], [], []] | 
					
						
							|  |  |  |         os.listdir = lambda path: path_lists.pop(0) | 
					
						
							|  |  |  |         self.addCleanup(restore_listdir) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         os.path.isdir = lambda path: True | 
					
						
							|  |  |  |         self.addCleanup(restore_isdir) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         os.path.isfile = lambda path: os.path.basename(path) not in directories | 
					
						
							|  |  |  |         self.addCleanup(restore_isfile) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         class Module(object): | 
					
						
							|  |  |  |             paths = [] | 
					
						
							|  |  |  |             load_tests_args = [] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             def __init__(self, path): | 
					
						
							|  |  |  |                 self.path = path | 
					
						
							|  |  |  |                 self.paths.append(path) | 
					
						
							|  |  |  |                 if os.path.basename(path) == 'test_directory': | 
					
						
							|  |  |  |                     def load_tests(loader, tests, pattern): | 
					
						
							|  |  |  |                         self.load_tests_args.append((loader, tests, pattern)) | 
					
						
							|  |  |  |                         return 'load_tests' | 
					
						
							|  |  |  |                     self.load_tests = load_tests | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             def __eq__(self, other): | 
					
						
							|  |  |  |                 return self.path == other.path | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             # Silence py3k warning | 
					
						
							|  |  |  |             __hash__ = None | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         loader._get_module_from_name = lambda name: Module(name) | 
					
						
							|  |  |  |         def loadTestsFromModule(module, use_load_tests): | 
					
						
							|  |  |  |             if use_load_tests: | 
					
						
							|  |  |  |                 raise self.failureException('use_load_tests should be False for packages') | 
					
						
							|  |  |  |             return module.path + ' module tests' | 
					
						
							|  |  |  |         loader.loadTestsFromModule = loadTestsFromModule | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         loader._top_level_dir = '/foo' | 
					
						
							|  |  |  |         # this time no '.py' on the pattern so that it can match | 
					
						
							|  |  |  |         # a test package | 
					
						
							|  |  |  |         suite = list(loader._find_tests('/foo', 'test*')) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # We should have loaded tests from the test_directory package by calling load_tests | 
					
						
							|  |  |  |         # and directly from the test_directory2 package | 
					
						
							|  |  |  |         self.assertEqual(suite, | 
					
						
							|  |  |  |                          ['load_tests', 'test_directory2' + ' module tests']) | 
					
						
							|  |  |  |         self.assertEqual(Module.paths, ['test_directory', 'test_directory2']) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # load_tests should have been called once with loader, tests and pattern | 
					
						
							|  |  |  |         self.assertEqual(Module.load_tests_args, | 
					
						
							|  |  |  |                          [(loader, 'test_directory' + ' module tests', 'test*')]) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_discover(self): | 
					
						
							|  |  |  |         loader = unittest.TestLoader() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         original_isfile = os.path.isfile | 
					
						
							|  |  |  |         def restore_isfile(): | 
					
						
							|  |  |  |             os.path.isfile = original_isfile | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         os.path.isfile = lambda path: False | 
					
						
							|  |  |  |         self.addCleanup(restore_isfile) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         orig_sys_path = sys.path[:] | 
					
						
							|  |  |  |         def restore_path(): | 
					
						
							|  |  |  |             sys.path[:] = orig_sys_path | 
					
						
							|  |  |  |         self.addCleanup(restore_path) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         full_path = os.path.abspath(os.path.normpath('/foo')) | 
					
						
							|  |  |  |         with self.assertRaises(ImportError): | 
					
						
							|  |  |  |             loader.discover('/foo/bar', top_level_dir='/foo') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.assertEqual(loader._top_level_dir, full_path) | 
					
						
							|  |  |  |         self.assertIn(full_path, sys.path) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         os.path.isfile = lambda path: True | 
					
						
							|  |  |  |         _find_tests_args = [] | 
					
						
							|  |  |  |         def _find_tests(start_dir, pattern): | 
					
						
							|  |  |  |             _find_tests_args.append((start_dir, pattern)) | 
					
						
							|  |  |  |             return ['tests'] | 
					
						
							|  |  |  |         loader._find_tests = _find_tests | 
					
						
							|  |  |  |         loader.suiteClass = str | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         suite = loader.discover('/foo/bar/baz', 'pattern', '/foo/bar') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         top_level_dir = os.path.abspath(os.path.normpath('/foo/bar')) | 
					
						
							|  |  |  |         start_dir = os.path.abspath(os.path.normpath('/foo/bar/baz')) | 
					
						
							|  |  |  |         self.assertEqual(suite, "['tests']") | 
					
						
							|  |  |  |         self.assertEqual(loader._top_level_dir, top_level_dir) | 
					
						
							|  |  |  |         self.assertEqual(_find_tests_args, [(start_dir, 'pattern')]) | 
					
						
							|  |  |  |         self.assertIn(top_level_dir, sys.path) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_discover_with_modules_that_fail_to_import(self): | 
					
						
							|  |  |  |         loader = unittest.TestLoader() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         listdir = os.listdir | 
					
						
							|  |  |  |         os.listdir = lambda _: ['test_this_does_not_exist.py'] | 
					
						
							|  |  |  |         isfile = os.path.isfile | 
					
						
							|  |  |  |         os.path.isfile = lambda _: True | 
					
						
							|  |  |  |         orig_sys_path = sys.path[:] | 
					
						
							|  |  |  |         def restore(): | 
					
						
							|  |  |  |             os.path.isfile = isfile | 
					
						
							|  |  |  |             os.listdir = listdir | 
					
						
							|  |  |  |             sys.path[:] = orig_sys_path | 
					
						
							|  |  |  |         self.addCleanup(restore) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         suite = loader.discover('.') | 
					
						
							|  |  |  |         self.assertIn(os.getcwd(), sys.path) | 
					
						
							|  |  |  |         self.assertEqual(suite.countTestCases(), 1) | 
					
						
							|  |  |  |         test = list(list(suite)[0])[0] # extract test from suite | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         with self.assertRaises(ImportError): | 
					
						
							|  |  |  |             test.test_this_does_not_exist() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_command_line_handling_parseArgs(self): | 
					
						
							|  |  |  |         # Haha - take that uninstantiable class | 
					
						
							|  |  |  |         program = object.__new__(unittest.TestProgram) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         args = [] | 
					
						
							|  |  |  |         def do_discovery(argv): | 
					
						
							|  |  |  |             args.extend(argv) | 
					
						
							|  |  |  |         program._do_discovery = do_discovery | 
					
						
							|  |  |  |         program.parseArgs(['something', 'discover']) | 
					
						
							|  |  |  |         self.assertEqual(args, []) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         program.parseArgs(['something', 'discover', 'foo', 'bar']) | 
					
						
							|  |  |  |         self.assertEqual(args, ['foo', 'bar']) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_command_line_handling_do_discovery_too_many_arguments(self): | 
					
						
							|  |  |  |         class Stop(Exception): | 
					
						
							|  |  |  |             pass | 
					
						
							|  |  |  |         def usageExit(): | 
					
						
							|  |  |  |             raise Stop | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         program = object.__new__(unittest.TestProgram) | 
					
						
							|  |  |  |         program.usageExit = usageExit | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         with self.assertRaises(Stop): | 
					
						
							|  |  |  |             # too many args | 
					
						
							|  |  |  |             program._do_discovery(['one', 'two', 'three', 'four']) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_command_line_handling_do_discovery_calls_loader(self): | 
					
						
							|  |  |  |         program = object.__new__(unittest.TestProgram) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         class Loader(object): | 
					
						
							|  |  |  |             args = [] | 
					
						
							|  |  |  |             def discover(self, start_dir, pattern, top_level_dir): | 
					
						
							|  |  |  |                 self.args.append((start_dir, pattern, top_level_dir)) | 
					
						
							|  |  |  |                 return 'tests' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         program._do_discovery(['-v'], Loader=Loader) | 
					
						
							|  |  |  |         self.assertEqual(program.verbosity, 2) | 
					
						
							|  |  |  |         self.assertEqual(program.test, 'tests') | 
					
						
							|  |  |  |         self.assertEqual(Loader.args, [('.', 'test*.py', None)]) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         Loader.args = [] | 
					
						
							|  |  |  |         program = object.__new__(unittest.TestProgram) | 
					
						
							|  |  |  |         program._do_discovery(['--verbose'], Loader=Loader) | 
					
						
							|  |  |  |         self.assertEqual(program.test, 'tests') | 
					
						
							|  |  |  |         self.assertEqual(Loader.args, [('.', 'test*.py', None)]) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         Loader.args = [] | 
					
						
							|  |  |  |         program = object.__new__(unittest.TestProgram) | 
					
						
							|  |  |  |         program._do_discovery([], Loader=Loader) | 
					
						
							|  |  |  |         self.assertEqual(program.test, 'tests') | 
					
						
							|  |  |  |         self.assertEqual(Loader.args, [('.', 'test*.py', None)]) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         Loader.args = [] | 
					
						
							|  |  |  |         program = object.__new__(unittest.TestProgram) | 
					
						
							|  |  |  |         program._do_discovery(['fish'], Loader=Loader) | 
					
						
							|  |  |  |         self.assertEqual(program.test, 'tests') | 
					
						
							|  |  |  |         self.assertEqual(Loader.args, [('fish', 'test*.py', None)]) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         Loader.args = [] | 
					
						
							|  |  |  |         program = object.__new__(unittest.TestProgram) | 
					
						
							|  |  |  |         program._do_discovery(['fish', 'eggs'], Loader=Loader) | 
					
						
							|  |  |  |         self.assertEqual(program.test, 'tests') | 
					
						
							|  |  |  |         self.assertEqual(Loader.args, [('fish', 'eggs', None)]) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         Loader.args = [] | 
					
						
							|  |  |  |         program = object.__new__(unittest.TestProgram) | 
					
						
							|  |  |  |         program._do_discovery(['fish', 'eggs', 'ham'], Loader=Loader) | 
					
						
							|  |  |  |         self.assertEqual(program.test, 'tests') | 
					
						
							|  |  |  |         self.assertEqual(Loader.args, [('fish', 'eggs', 'ham')]) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         Loader.args = [] | 
					
						
							|  |  |  |         program = object.__new__(unittest.TestProgram) | 
					
						
							|  |  |  |         program._do_discovery(['-s', 'fish'], Loader=Loader) | 
					
						
							|  |  |  |         self.assertEqual(program.test, 'tests') | 
					
						
							|  |  |  |         self.assertEqual(Loader.args, [('fish', 'test*.py', None)]) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         Loader.args = [] | 
					
						
							|  |  |  |         program = object.__new__(unittest.TestProgram) | 
					
						
							|  |  |  |         program._do_discovery(['-t', 'fish'], Loader=Loader) | 
					
						
							|  |  |  |         self.assertEqual(program.test, 'tests') | 
					
						
							|  |  |  |         self.assertEqual(Loader.args, [('.', 'test*.py', 'fish')]) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         Loader.args = [] | 
					
						
							|  |  |  |         program = object.__new__(unittest.TestProgram) | 
					
						
							|  |  |  |         program._do_discovery(['-p', 'fish'], Loader=Loader) | 
					
						
							|  |  |  |         self.assertEqual(program.test, 'tests') | 
					
						
							|  |  |  |         self.assertEqual(Loader.args, [('.', 'fish', None)]) | 
					
						
							|  |  |  |         self.assertFalse(program.failfast) | 
					
						
							| 
									
										
										
										
											2010-03-26 03:18:31 +00:00
										 |  |  |         self.assertFalse(program.catchbreak) | 
					
						
							| 
									
										
										
										
											2010-03-25 23:56:33 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         Loader.args = [] | 
					
						
							|  |  |  |         program = object.__new__(unittest.TestProgram) | 
					
						
							| 
									
										
										
										
											2010-03-26 03:18:31 +00:00
										 |  |  |         program._do_discovery(['-p', 'eggs', '-s', 'fish', '-v', '-f', '-c'], | 
					
						
							|  |  |  |                               Loader=Loader) | 
					
						
							| 
									
										
										
										
											2010-03-25 23:56:33 +00:00
										 |  |  |         self.assertEqual(program.test, 'tests') | 
					
						
							|  |  |  |         self.assertEqual(Loader.args, [('fish', 'eggs', None)]) | 
					
						
							|  |  |  |         self.assertEqual(program.verbosity, 2) | 
					
						
							|  |  |  |         self.assertTrue(program.failfast) | 
					
						
							| 
									
										
										
										
											2010-03-26 03:18:31 +00:00
										 |  |  |         self.assertTrue(program.catchbreak) | 
					
						
							| 
									
										
										
										
											2010-03-25 23:56:33 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if __name__ == '__main__': | 
					
						
							|  |  |  |     unittest.main() |