コード例 #1
0
class TestConfig(unittest.TestCase):
    def setUp(self):
        self.cfg = Config()
        self.cfg.load(TEST_CONFIG)

    def test_get(self):
        # Invalid:
        for urn in ['', '.', '..', '  ', 'profiles.', 'profiles..', 'profiles.default.']:
            self.assertEqual(self.cfg.get(urn), None)

        with self.assertRaises(ValueError):
            self.cfg.get('profiles.default.host.')

        # Valid:
        self.assertEqual(self.cfg.get('profiles.default.port'), 6600)

    def test_set_get_combo(self):
        # Create new node not present in default
        self.cfg.set('some.new_value', 42)
        self.assertEqual(self.cfg.get('some.new_value'), 42)

        # This shouldn't work, new_value is an "endpoint"
        with self.assertRaises(ValueError):
            self.cfg.set('some.new_value.oh_crap', 3)

        # test non-existent key
        self.assertEqual(self.cfg.get('some_value'), None)
        self.assertEqual(self.cfg.get('some.value'), None)

        defaults = {
            'some_value': 42,
            'some': {
                'value': 21
            },
            'active_profile': 'Ha! Override it!'
        }

        self.cfg.add_defaults(defaults)
        self.assertEqual(self.cfg.get('some_value'), 42)
        self.cfg.set('some_value', 0)
        self.assertEqual(self.cfg.get('some_value'), 0)
        self.assertEqual(self.cfg.get('some.value'), 21)
        self.assertEqual(self.cfg.get('active_profile'), 'default')

        # Manually overwrite values:
        self.cfg.set('some.value', 1)

        self.assertEqual(self.cfg.get('some_value'), 0)
        self.assertEqual(self.cfg.get('some.value'), 1)
        self.cfg.add_defaults(defaults)
        self.assertEqual(self.cfg.get('some_value'), 0)
        self.assertEqual(self.cfg.get('some.value'), 1)

    def test_add_default(self):
        # Recursive merging of two dicts is difficutlt,
        # therefore stress this a bit.
        self.cfg.set('a.aa', 2)
        self.cfg.set('b.bb', 2)

        self.cfg.add_defaults({
            'a': {
                'aa': {
                    'aaa': 1
                }
            },
            'b': {
                'bb': 1
            },
            'c': {
                'cc': 1
            },
            'd': 1
        })
        self.cfg.set('a.aa', 2)

        self.assertEqual(self.cfg.get('a.aa'), 2)
        with self.assertRaises(ValueError):
            self.cfg.get('a.aa.aaa', None)
        self.assertEqual(self.cfg.get('b.bb'), 2)
        self.assertEqual(self.cfg.get('c.cc'), 1)
        self.assertEqual(self.cfg.get('d'), 1)

    def test_operators(self):
        self.assertEqual(self.cfg.get('profiles.default.host'), self.cfg['profiles.default.host'])
        self.assertEqual(self.cfg.get('profiles.default.port'), 6600)
        self.cfg['profiles.default.port'] = 6666
        self.assertEqual(self.cfg.get('profiles.default.port'), 6666)

    def test_save(self):
        try:
            self.cfg.save('')
        except FileNotFoundError:
            pass

        path = '/tmp/.test_config.save'
        self.cfg.save(path)
        with open(path, 'r') as f:
            content = f.read()
            self.assertEqual(content.strip(), TEST_CONFIG.strip())

    def test_malformed(self):
        # Pass in a HTML Document. Whyever.
        # Handle it gracefully, i.e. without exception
        self.cfg.load('''
                <html>
                    <head>
                        <title>Faulty Config</title>
                    </head>
                    <body>
                        <p>Config Body.</p>
                    </body>
                </html>
        ''')
        self.cfg.load('')
        self.cfg.load('''
            empty_key:
        ''')