summaryrefslogtreecommitdiff
path: root/test/test_config.py
blob: 3a4717ba97843bb0c8a1e72d6da0bb8ff6920771 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
import unittest
from bottle import ConfigDict, tob, touni

class TestConfDict(unittest.TestCase):
    
    def test_isadict(self):
        """ ConfigDict should behaves like a normal dict. """
        # It is a dict-subclass, so this kind of pointless, but it doen't hurt.
        d, m = dict(), ConfigDict()
        d['key'], m['key'] = 'value', 'value'
        d['k2'], m['k2'] = 'v1', 'v1'
        d['k2'], m['k2'] = 'v2', 'v2'
        self.assertEqual(d.keys(), m.keys())
        self.assertEqual(list(d.values()), list(m.values()))
        self.assertEqual(d.get('key'), m.get('key'))
        self.assertEqual(d.get('cay'), m.get('cay'))
        self.assertEqual(list(iter(d)), list(iter(m)))
        self.assertEqual([k for k in d], [k for k in m])
        self.assertEqual(len(d), len(m))
        self.assertEqual('key' in d, 'key' in m)
        self.assertEqual('cay' in d, 'cay' in m)
        self.assertRaises(KeyError, lambda: m['cay'])

    def test_write(self):
        c = ConfigDict()
        c['key'] = 'value'
        self.assertEqual(c['key'], 'value')
        self.assertTrue('key' in c)
        c['key'] = 'value2'
        self.assertEqual(c['key'], 'value2')

    def test_save_types(self):
        """ Types that are considered save (immutable) are stored as is
            (but may still be copied). """
        c = ConfigDict()
        for value in (True, False,
                      1, -1024, 0.5,
                      tob('abc'), touni('abc'),
                      (1,2,3), frozenset([3,4,5]),
                      (1,2,3,(4,5),'6', frozenset([3,(4,5),6]))):
            c['key'] = value
            self.assertEquals(c['key'], value)

    def test_immutable_values(self):
        """ Config values must be immutable. For some types (list, set) we do this
            automagically, even for nested structures. For others, we don't. """
        c = ConfigDict()
        c['key'] = [1,2,set([3,4]),5, '6']
        self.assertEquals(c['key'], (1,2,frozenset([3,4]),5, '6'))
        self.assertRaises(TypeError, c.__setitem__, 'key', dict())
        self.assertRaises(TypeError, c.__setitem__, 'key', ['a', {}])
        self.assertRaises(TypeError, c.__setitem__, 'key', ('a', {}))

    def test_update(self):
        c = ConfigDict()
        c['key'] = 'value'
        c.update(key='value2', key2='value3')
        self.assertEqual(c['key'], 'value2')
        self.assertEqual(c['key2'], 'value3')

    def test_namespaces(self):
        c = ConfigDict()
        c.update('a.b', key='value')
        self.assertEqual(c['a.b.key'], 'value')

    def test_meta(self):
        c = ConfigDict()
        c.meta_set('bool', 'filter', bool)
        c.meta_set('int', 'filter', int)
        c['bool'] = 'I am so true!'
        c['int']  = '6'
        self.assertTrue(c['bool'] is True)
        self.assertEqual(c['int'], 6)
        self.assertRaises(ValueError, lambda: c.update(int='not an int'))

    def test_load_dict(self):
        c = ConfigDict()
        d = dict(a=dict(b=dict(foo=5, bar=6), baz=7))
        c.load_dict(d)
        self.assertEqual(c['a.b.foo'], 5)
        self.assertEqual(c['a.b.bar'], 6)
        self.assertEqual(c['a.baz'], 7)
   
if __name__ == '__main__': #pragma: no cover
    unittest.main()