strict per item in config_files
This commit is contained in:
parent
153ac4058d
commit
b2b8d5f9cc
8 changed files with 141 additions and 86 deletions
|
|
@ -190,15 +190,17 @@ class ConfigFileTestCase(unittest.TestCase):
|
|||
self.manager.isdir = mock.patch("os.path.isdir").start()
|
||||
self.manager.isfile = mock.patch("os.path.isfile").start()
|
||||
self.manager.access = mock.patch("os.access", return_value=True).start()
|
||||
self.manager.open = mock_open().start()
|
||||
self.manager.cp_clz = mock.patch("six.moves.configparser.ConfigParser",
|
||||
spec=True).start()
|
||||
self.manager.scp_clz = mock.patch("six.moves.configparser.SafeConfigParser",
|
||||
spec=True).start()
|
||||
self.manager.rcp_clz = mock.patch("six.moves.configparser.RawConfigParser",
|
||||
spec=True).start()
|
||||
self.mocks = [self.manager.logging,
|
||||
self.manager.isdir,
|
||||
if six.PY2:
|
||||
self.real_parser_clz = self.manager.scp_clz
|
||||
else:
|
||||
self.real_parser_clz = self.manager.cp_clz
|
||||
self.mocks = [self.manager.isdir,
|
||||
self.manager.isfile,
|
||||
self.manager.access,
|
||||
self.manager.open,
|
||||
|
|
@ -214,42 +216,45 @@ class ConfigFileTestCase(unittest.TestCase):
|
|||
mock.patch.stopall()
|
||||
|
||||
def test_read_config_files(self):
|
||||
|
||||
# bad config_files
|
||||
for files in [0,
|
||||
False,
|
||||
set(),
|
||||
dict(),
|
||||
object(),
|
||||
('string', True),
|
||||
[('str', True, 'str')],
|
||||
[tuple()],]:
|
||||
with self.assertRaises(koji.GenericError):
|
||||
koji.read_config_files(files)
|
||||
|
||||
# string as config_files
|
||||
files = 'test1.conf'
|
||||
default = 'default.conf'
|
||||
self.manager.isdir.return_value = False
|
||||
conf = koji.read_config_files(files, default=default)
|
||||
conf = koji.read_config_files(files)
|
||||
self.manager.isdir.assert_called_once_with(files)
|
||||
self.manager.open.assert_called_once_with(default, 'r')
|
||||
if six.PY2:
|
||||
self.assertTrue(isinstance(conf,
|
||||
six.moves.configparser.SafeConfigParser.__class__))
|
||||
self.manager.scp_clz.assert_called_once()
|
||||
self.manager.scp_clz.return_value.readfp.assert_called_once()
|
||||
self.manager.scp_clz.return_value.read.assert_called_once_with([files])
|
||||
else:
|
||||
self.assertTrue(isinstance(conf,
|
||||
six.moves.configparser.ConfigParser.__class__))
|
||||
self.manager.cp_clz.assert_called_once()
|
||||
self.manager.cp_clz.return_value.read_file.assert_called_once()
|
||||
self.manager.cp_clz.return_value.read.assert_called_once_with([files])
|
||||
|
||||
# no default
|
||||
self.reset_mock()
|
||||
koji.read_config_files(files)
|
||||
self.manager.open.assert_not_called()
|
||||
self.real_parser_clz.assert_called_once()
|
||||
self.real_parser_clz.return_value.read.assert_called_once_with([files])
|
||||
|
||||
# list as config_files
|
||||
self.reset_mock()
|
||||
files = ['test1.conf', 'test2.conf']
|
||||
koji.read_config_files(files)
|
||||
self.manager.open.assert_not_called()
|
||||
|
||||
if six.PY2:
|
||||
parser_clz = self.manager.scp_clz
|
||||
else:
|
||||
parser_clz = self.manager.cp_clz
|
||||
parser_clz.assert_called_once()
|
||||
parser_clz.return_value.read.assert_called_once_with(files)
|
||||
self.real_parser_clz.assert_called_once()
|
||||
self.real_parser_clz.return_value.read.assert_called_once_with(files)
|
||||
|
||||
# tuple as config_files
|
||||
self.reset_mock()
|
||||
files = ('test1.conf', 'test2.conf')
|
||||
koji.read_config_files(files)
|
||||
|
||||
# raw
|
||||
self.reset_mock()
|
||||
|
|
@ -263,31 +268,37 @@ class ConfigFileTestCase(unittest.TestCase):
|
|||
# strict
|
||||
# case1, not a file
|
||||
self.reset_mock()
|
||||
self.manager.isfile.side_effect = [True, False]
|
||||
files = [('test1.conf',), ('test2.conf', True)]
|
||||
self.manager.isfile.return_value = False
|
||||
with self.assertRaises(koji.ConfigurationError) as cm:
|
||||
koji.read_config_files(files, strict=True)
|
||||
koji.read_config_files(files)
|
||||
self.assertEqual(cm.exception.args[0],
|
||||
"Config file test2.conf can't be opened.")
|
||||
self.manager.open.assert_not_called()
|
||||
|
||||
self.assertEqual(self.manager.isdir.call_count, 2)
|
||||
self.assertEqual(self.manager.isfile.call_count, 2)
|
||||
self.manager.access.assert_not_called()
|
||||
|
||||
# case2, inaccessible
|
||||
self.reset_mock()
|
||||
self.manager.isfile.side_effect = None
|
||||
self.manager.isfile.return_value = True
|
||||
self.manager.access.side_effect = [True, False]
|
||||
self.manager.access.return_value = False
|
||||
with self.assertRaises(koji.ConfigurationError) as cm:
|
||||
koji.read_config_files(files, strict=True)
|
||||
koji.read_config_files(files)
|
||||
self.assertEqual(cm.exception.args[0],
|
||||
"Config file test2.conf can't be opened.")
|
||||
self.manager.open.assert_not_called()
|
||||
self.assertEqual(self.manager.isdir.call_count, 2)
|
||||
self.assertEqual(self.manager.isfile.call_count, 2)
|
||||
self.assertEqual(self.manager.access.call_count, 2)
|
||||
|
||||
# directories
|
||||
# strict==False
|
||||
self.reset_mock()
|
||||
files = ['test1.conf', 'testdir1', 'test2.conf', 'testdir2']
|
||||
self.manager.isdir.side_effect = [False, True, False, True]
|
||||
files = ['test1.conf', 'gooddir', 'test2.conf', 'emptydir', 'nonexistdir']
|
||||
self.manager.isdir.side_effect = lambda f: False \
|
||||
if f in ['test1.conf', 'test2.conf', 'nonexistdir'] else True
|
||||
self.manager.isfile.side_effect = lambda f: False \
|
||||
if f == 'test1-4.dir.conf' else True
|
||||
self.manager.access.side_effect = None
|
||||
if f in ['nonexistdir', 'gooddir/test1-4.dir.conf'] else True
|
||||
self.manager.access.return_value = True
|
||||
with mock.patch("os.listdir", side_effect=[['test1-2.conf',
|
||||
'test1-1.conf',
|
||||
|
|
@ -295,20 +306,49 @@ class ConfigFileTestCase(unittest.TestCase):
|
|||
'test1-4.dir.conf'],
|
||||
[]]) as listdir_mock:
|
||||
conf = koji.read_config_files(files)
|
||||
listdir_mock.assert_has_calls([call('testdir1'), call('testdir2')])
|
||||
if six.PY2:
|
||||
parser_clz = self.manager.scp_clz
|
||||
else:
|
||||
parser_clz = self.manager.cp_clz
|
||||
parser_clz.assert_called_once()
|
||||
parser_clz.return_value.read.assert_called_once_with(
|
||||
listdir_mock.assert_has_calls([call('gooddir'), call('emptydir')])
|
||||
self.real_parser_clz.assert_called_once()
|
||||
self.real_parser_clz.return_value.read.assert_called_once_with(
|
||||
['test1.conf',
|
||||
'testdir1/test1-1.conf',
|
||||
'testdir1/test1-2.conf',
|
||||
'testdir1/test1-4.dir.conf',
|
||||
'gooddir/test1-1.conf',
|
||||
'gooddir/test1-2.conf',
|
||||
'test2.conf'])
|
||||
self.manager.logging.debug.assert_called_once_with(
|
||||
"No config files found in directory: testdir2")
|
||||
self.assertEqual(self.manager.isdir.call_count, 5)
|
||||
self.assertEqual(self.manager.isfile.call_count, 6)
|
||||
self.assertEqual(self.manager.access.call_count, 4)
|
||||
|
||||
# strict==True
|
||||
# case1
|
||||
self.reset_mock()
|
||||
files[1] = ('gooddir', True)
|
||||
with mock.patch("os.listdir", return_value=['test1-2.conf',
|
||||
'test1-1.conf',
|
||||
'test1-3.txt',
|
||||
'test1-4.dir.conf']
|
||||
) as listdir_mock:
|
||||
with self.assertRaises(koji.ConfigurationError) as cm:
|
||||
conf = koji.read_config_files(files)
|
||||
self.assertEqual(cm.exception.args[0],
|
||||
"Config file gooddir/test1-4.dir.conf can't be"
|
||||
" opened.")
|
||||
listdir_mock.assert_called_once_with('gooddir')
|
||||
|
||||
# case2
|
||||
self.reset_mock()
|
||||
files[1] = ('gooddir', False)
|
||||
files[3] = ('emptydir', True)
|
||||
with mock.patch("os.listdir", side_effect=[['test1-2.conf',
|
||||
'test1-1.conf',
|
||||
'test1-3.txt',
|
||||
'test1-4.dir.conf'],
|
||||
[]]
|
||||
) as listdir_mock:
|
||||
with self.assertRaises(koji.ConfigurationError) as cm:
|
||||
conf = koji.read_config_files(files)
|
||||
self.assertEqual(cm.exception.args[0],
|
||||
'No config files found in directory: emptydir')
|
||||
self.assertEqual(listdir_mock.call_count, 2)
|
||||
|
||||
|
||||
|
||||
class MavenUtilTestCase(unittest.TestCase):
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue