2cf11f014c
* Create jenkins_jobs.config module with JJBConfig class. * Move DEFAULT_CONF from jenkins_jobs.cmd into jenkins_jobs.config * Move configuration initialization into JJBConfig * Create method, "do_magical_things" to handle arbitration between config file and arguments as well as setting default values for config file settings if it doesn't contain the expected keys. * Move JenkinsJobs.create_parser into its own module, jenkins_jobs.cli.parser, it can be used to provide default settings in the JJBConfig class when an argparse namespace object is not provided; this is primarily necessary because most of the original configuration initialization code relies on this being a namespace object (simple descendant of the object class). At this point JJBConfig isn't much more than an object-oriented version of the way configuration handling happened previously. Its current form, however, is more amenable to the ultimate goal of the 2.0 refactorings--namely, being able to pass a single config object around rather than breaking it up into apparently arbitrary settings necessary to instantiate the Builder class and its delegate objects. Change-Id: Ic0147e1dccbe620aaaba039a434e7cea6c670054
137 lines
4.8 KiB
Python
137 lines
4.8 KiB
Python
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 CacheStorage class
|
|
# attempting to create the cache directory multiple times as the tests
|
|
# are run in parallel. Stub out the CacheStorage to ensure that each
|
|
# test can safely create the object without effect.
|
|
@mock.patch('jenkins_jobs.builder.CacheStorage', 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']))
|