import unittest from pelican import get_config, parse_arguments class TestParseOverrides(unittest.TestCase): def test_flags(self): for flag in ['-e', '--extra-settings']: args = parse_arguments([flag, 'k=1']) self.assertDictEqual(args.overrides, {'k': 1}) def test_parse_multiple_items(self): args = parse_arguments('-e k1=1 k2=2'.split()) self.assertDictEqual(args.overrides, {'k1': 1, 'k2': 2}) def test_parse_valid_json(self): json_values_python_values_map = { '""': '', 'null': None, '"string"': 'string', '["foo", 12, "4", {}]': ['foo', 12, '4', {}] } for k, v in json_values_python_values_map.items(): args = parse_arguments(['-e', 'k=' + k]) self.assertDictEqual(args.overrides, {'k': v}) def test_parse_invalid_syntax(self): invalid_items = ['k= 1', 'k =1', 'k', 'k v'] for item in invalid_items: with self.assertRaises(ValueError): parse_arguments(f'-e {item}'.split()) def test_parse_invalid_json(self): invalid_json = { '', 'False', 'True', 'None', 'some other string', '{"foo": bar}', '[foo]' } for v in invalid_json: with self.assertRaises(ValueError): parse_arguments(['-e ', 'k=' + v]) class TestGetConfigFromArgs(unittest.TestCase): def test_overrides_known_keys(self): args = parse_arguments([ '-e', 'DELETE_OUTPUT_DIRECTORY=false', 'OUTPUT_RETENTION=["1.txt"]', 'SITENAME="Title"' ]) config = get_config(args) config_must_contain = { 'DELETE_OUTPUT_DIRECTORY': False, 'OUTPUT_RETENTION': ['1.txt'], 'SITENAME': 'Title' } self.assertDictEqual(config, {**config, **config_must_contain}) def test_overrides_non_default_type(self): args = parse_arguments([ '-e', 'DISPLAY_PAGES_ON_MENU=123', 'PAGE_TRANSLATION_ID=null', 'TRANSLATION_FEED_RSS_URL="someurl"' ]) config = get_config(args) config_must_contain = { 'DISPLAY_PAGES_ON_MENU': 123, 'PAGE_TRANSLATION_ID': None, 'TRANSLATION_FEED_RSS_URL': 'someurl' } self.assertDictEqual(config, {**config, **config_must_contain})