import os from tests.base import mock import testtools from jenkins_jobs import utils def fake_os_walk(paths): """Helper function for mocking os.walk() where must test that manipulation of the returned dirs variable works as expected """ paths_dict = dict(paths) def os_walk(top, topdown=True): dirs, nondirs = paths_dict[top] yield top, dirs, nondirs for name in dirs: # hard code use of '/' to ensure the test data can be defined as # simple strings otherwise tests using this helper will break on # platforms where os.path.sep is different. new_path = "/".join([top, name]) for x in os_walk(new_path, topdown): yield x return os_walk # Testing the utils module can sometimes result in the JobCache class # attempting to create the cache directory multiple times as the tests # are run in parallel. Stub out the JobCache to ensure that each # test can safely create the object without effect. @mock.patch("jenkins_jobs.builder.JobCache", mock.MagicMock) class CmdRecursePath(testtools.TestCase): @mock.patch("jenkins_jobs.utils.os.walk") def test_recursive_path_option_exclude_pattern(self, oswalk_mock): """ Test paths returned by the recursive processing when using pattern excludes. testing paths /jjb_configs/dir1/test1/ /jjb_configs/dir1/file /jjb_configs/dir2/test2/ /jjb_configs/dir3/bar/ /jjb_configs/test3/bar/ /jjb_configs/test3/baz/ """ os_walk_paths = [ ("/jjb_configs", (["dir1", "dir2", "dir3", "test3"], ())), ("/jjb_configs/dir1", (["test1"], ("file"))), ("/jjb_configs/dir2", (["test2"], ())), ("/jjb_configs/dir3", (["bar"], ())), ("/jjb_configs/dir3/bar", ([], ())), ("/jjb_configs/test3/bar", None), ("/jjb_configs/test3/baz", None), ] paths = [k for k, v in os_walk_paths if v is not None] oswalk_mock.side_effect = fake_os_walk(os_walk_paths) self.assertEqual(paths, utils.recurse_path("/jjb_configs", ["test*"])) @mock.patch("jenkins_jobs.utils.os.walk") def test_recursive_path_option_exclude_absolute(self, oswalk_mock): """ Test paths returned by the recursive processing when using absolute excludes. testing paths /jjb_configs/dir1/test1/ /jjb_configs/dir1/file /jjb_configs/dir2/test2/ /jjb_configs/dir3/bar/ /jjb_configs/test3/bar/ /jjb_configs/test3/baz/ """ os_walk_paths = [ ("/jjb_configs", (["dir1", "dir2", "dir3", "test3"], ())), ("/jjb_configs/dir1", None), ("/jjb_configs/dir2", (["test2"], ())), ("/jjb_configs/dir3", (["bar"], ())), ("/jjb_configs/test3", (["bar", "baz"], ())), ("/jjb_configs/dir2/test2", ([], ())), ("/jjb_configs/dir3/bar", ([], ())), ("/jjb_configs/test3/bar", ([], ())), ("/jjb_configs/test3/baz", ([], ())), ] paths = [k for k, v in os_walk_paths if v is not None] oswalk_mock.side_effect = fake_os_walk(os_walk_paths) self.assertEqual( paths, utils.recurse_path("/jjb_configs", ["/jjb_configs/dir1"]) ) @mock.patch("jenkins_jobs.utils.os.walk") def test_recursive_path_option_exclude_relative(self, oswalk_mock): """ Test paths returned by the recursive processing when using relative excludes. testing paths ./jjb_configs/dir1/test/ ./jjb_configs/dir1/file ./jjb_configs/dir2/test/ ./jjb_configs/dir3/bar/ ./jjb_configs/test3/bar/ ./jjb_configs/test3/baz/ """ os_walk_paths = [ ("jjb_configs", (["dir1", "dir2", "dir3", "test3"], ())), ("jjb_configs/dir1", (["test"], ("file"))), ("jjb_configs/dir2", (["test2"], ())), ("jjb_configs/dir3", (["bar"], ())), ("jjb_configs/test3", (["bar", "baz"], ())), ("jjb_configs/dir1/test", ([], ())), ("jjb_configs/dir2/test2", ([], ())), ("jjb_configs/dir3/bar", ([], ())), ("jjb_configs/test3/bar", None), ("jjb_configs/test3/baz", ([], ())), ] rel_os_walk_paths = [ (os.path.abspath(os.path.join(os.path.curdir, k)), v) for k, v in os_walk_paths ] paths = [k for k, v in rel_os_walk_paths if v is not None] oswalk_mock.side_effect = fake_os_walk(rel_os_walk_paths) self.assertEqual( paths, utils.recurse_path("jjb_configs", ["jjb_configs/test3/bar"]) )