import os
import io
import unittest
import unittest.mock as mock
from src import cli
[docs]def _parser_from_dict(d, add_site=True):
p = cli.MDTFArgParser()
p_config = cli.CLIParser.from_dict(d)
p_config.configure(p)
if add_site:
p.add_argument('--site', default='local')
return p
[docs]class TestCanonicalArgName(unittest.TestCase):
[docs] def test_canonical_arg_name(self):
self.assertEqual(cli.canonical_arg_name('--flag '), 'flag')
self.assertEqual(cli.canonical_arg_name('--flag-two '), 'flag_two')
self.assertEqual(cli.canonical_arg_name('-flag-three_3'), 'flag_three_3')
[docs]class TestWordWrap(unittest.TestCase):
[docs] def tearDown(self):
# clear contents of Singleton
try:
c = cli.CLIConfigManager()
c._reset()
except:
pass
[docs] def test_word_wrap(self):
str1 = """
Here's a multiline test string; we'll test to see
if the indentation is removed
and if it
gets word wrapped to 80 columns, etc.
"""
str2 = ("Here's a multiline test string; we'll test to see if the "
"indentation is removed\nand if it gets word wrapped to 80 columns, etc.")
self.assertEqual(cli.word_wrap(str1), str2)
[docs] def test_word_wrap_multipara(self):
str1 = """
Here's a multiline test string; we'll test to see
if the indentation is removed
and if it
gets word wrapped to 80 columns, etc.
\n\nExplicit para break
"""
str2 = ("Here's a multiline test string; we'll test to see if the "
"indentation is removed\nand if it\n\ngets word wrapped to 80 columns,"
" etc.\n\nExplicit para break")
self.assertEqual(cli.word_wrap(str1), str2)
[docs]class TestMDTFArgParserBasic(unittest.TestCase):
[docs] def tearDown(self):
# clear contents of Singleton
try:
c = cli.CLIConfigManager()
c._reset()
except:
pass
[docs] def test_flag_aliases(self):
p = _parser_from_dict({
"arguments": [{"name": "multi_word_flag", "short_name": "f"}]})
x = p.parse_args('-f bar')
self.assertEqual(x.multi_word_flag, "bar")
x = p.parse_args('--multi_word_flag bar')
self.assertEqual(x.multi_word_flag, "bar")
x = p.parse_args('--multi-word-flag bar')
self.assertEqual(x.multi_word_flag, "bar")
[docs] def test_flag_synonyms(self):
p = _parser_from_dict({
"arguments": [{"name": ["flag", "multi_word_flag"], "short_name": "f"}]})
x = p.parse_args('-f bar')
self.assertEqual(x.flag, "bar")
x = p.parse_args('--flag bar')
self.assertEqual(x.flag, "bar")
x = p.parse_args('--multi_word_flag bar')
self.assertEqual(x.flag, "bar")
x = p.parse_args('--multi-word-flag bar')
self.assertEqual(x.flag, "bar")
[docs] def test_iter_actions(self):
p = _parser_from_dict({
"arguments": [{"name": "foo"}, {"name": "foo_2"}]})
dests = [a.dest for a in p.iter_actions()]
self.assertCountEqual(dests, ['foo', 'foo_2', 'site'])
[docs]class TestMDTFArgParserRecordDefaults(unittest.TestCase):
[docs] def tearDown(self):
# clear contents of Singleton
try:
c = cli.CLIConfigManager()
c._reset()
except:
pass
[docs] def test_string_defaults(self):
p = _parser_from_dict({"arguments": [{"name": "foo", "default": "bar"}]})
x = p.parse_args('')
self.assertEqual(x.foo, "bar")
self.assertTrue(p.is_default['foo'])
x = p.parse_args('--foo bar')
self.assertEqual(x.foo, "bar")
self.assertFalse(p.is_default['foo'])
x = p.parse_args('--foo baz')
self.assertEqual(x.foo, "baz")
self.assertFalse(p.is_default['foo'])
[docs] def test_bool_defaults_true(self):
p = _parser_from_dict({"arguments": [{"name": "foo", "default": True}]})
x = p.parse_args('')
self.assertTrue(x.foo)
self.assertTrue(p.is_default['foo'])
x = p.parse_args('--foo')
self.assertFalse(x.foo)
self.assertFalse(p.is_default['foo'])
[docs] def test_bool_defaults_false(self):
p = _parser_from_dict({"arguments": [{"name": "foo", "default": False}]})
x = p.parse_args('')
self.assertFalse(x.foo)
self.assertTrue(p.is_default['foo'])
x = p.parse_args('--foo')
self.assertTrue(x.foo)
self.assertFalse(p.is_default['foo'])
[docs]class TestCLIConfigManager(unittest.TestCase):
[docs] def setUp(self):
_ = cli.CLIConfigManager('dummy/test/path', skip_defaults=True)
[docs] def tearDown(self):
# clear contents of Singleton
try:
c = cli.CLIConfigManager()
c._reset()
except:
pass
[docs] def _setup_parser(self):
return _parser_from_dict({
"arguments": [
{"name": "foo"},
{"name": "foo2", "default": "bar"}
],
})
[docs] def test_no_partial_def(self):
c = cli.CLIConfigManager()
p = self._setup_parser()
config = vars(p.parse_args('--foo baz'))
self.assertDictEqual(config, {'foo':'baz', 'foo2': 'bar', 'site': 'local'})
config = vars(p.parse_args('--foo2 baz'))
self.assertDictEqual(config, {'foo':None, 'foo2': 'baz','site':'local'})
[docs] def test_partial_def_1(self):
c = cli.CLIConfigManager()
c.user_defaults = {'foo': 'XX', 'foo2': 'YY'}
p = self._setup_parser()
config = vars(p.parse_args('--foo baz'))
self.assertDictEqual(config, {'foo':'baz', 'foo2': 'YY','site':'local'})
c.user_defaults = {'foo': 'XX'}
p = self._setup_parser()
config = vars(p.parse_args('--foo baz'))
self.assertDictEqual(config, {'foo':'baz', 'foo2': 'bar','site':'local'})
c.user_defaults = {'foo2': 'YY'}
p = self._setup_parser()
config = vars(p.parse_args('--foo baz'))
self.assertDictEqual(config, {'foo':'baz', 'foo2': 'YY','site':'local'})
[docs] def test_partial_def_2(self):
c = cli.CLIConfigManager()
c.site_defaults = {'foo': 'XX'}
p = self._setup_parser()
config = vars(p.parse_args('--foo baz'))
self.assertDictEqual(config, {'foo':'baz', 'foo2': 'bar','site':'local'})
c.site_defaults = {'foo': 'XX', 'foo2': 'YY'}
p = self._setup_parser()
config = vars(p.parse_args('--foo2 baz'))
self.assertDictEqual(config, {'foo':'XX', 'foo2': 'baz','site':'local'})
c.site_defaults = {'foo': 'XX'}
p = self._setup_parser()
config = vars(p.parse_args('--foo2 baz'))
self.assertDictEqual(config, {'foo':'XX', 'foo2': 'baz','site':'local'})
c.site_defaults = {'foo2': 'YY'}
p = self._setup_parser()
config = vars(p.parse_args('--foo2 baz'))
self.assertDictEqual(config, {'foo':None, 'foo2': 'baz','site':'local'})
[docs] def test_partial_def_3(self):
c = cli.CLIConfigManager()
c.user_defaults = {'foo': 'XX', 'foo2': 'YY'}
c.site_defaults = {'foo': 'XXQ', 'foo2': 'YYQ'}
p = self._setup_parser()
config = vars(p.parse_args('--foo baz'))
self.assertDictEqual(config, {'foo':'baz', 'foo2': 'YY','site':'local'})
c.user_defaults = {'foo': 'XX', 'foo2': 'YY'}
c.site_defaults = {'foo': 'XXQ', 'foo2': 'YYQ'}
p = self._setup_parser()
config = vars(p.parse_args('--foo2 baz'))
self.assertDictEqual(config, {'foo':'XX', 'foo2': 'baz','site':'local'})
c.user_defaults = {'foo': 'XX'}
c.site_defaults = {'foo': 'XXQ', 'foo2': 'YYQ'}
p = self._setup_parser()
config = vars(p.parse_args('--foo baz'))
self.assertDictEqual(config, {'foo':'baz', 'foo2': 'YYQ','site':'local'})
c.user_defaults = {'foo2': 'YY'}
c.site_defaults = {'foo': 'XXQ', 'foo2': 'YYQ'}
p = self._setup_parser()
config = vars(p.parse_args('--foo2 baz'))
self.assertDictEqual(config, {'foo':'XXQ', 'foo2': 'baz','site':'local'})