first version with sqlalchemy option's storage
[tiramisu.git] / test / test_option_validator.py
1 import autopath
2 import warnings
3 from py.test import raises
4
5 from tiramisu.config import Config
6 from tiramisu.option import StrOption, OptionDescription
7 from tiramisu.setting import groups
8 from tiramisu.error import ValueWarning
9
10
11 def return_true(value, param=None):
12     if value == 'val' and param in [None, 'yes']:
13         return True
14
15
16 def return_false(value, param=None):
17     if value == 'val' and param in [None, 'yes']:
18         raise ValueError('error')
19
20
21 def return_val(value, param=None):
22     return 'val'
23
24
25 def return_if_val(value):
26     if value != 'val':
27         raise ValueError('error')
28
29
30 #FIXME il y a une validation sur default_multi ?
31
32 def test_validator():
33     opt1 = StrOption('opt1', '', validator=return_true, default='val')
34     raises(ValueError, "StrOption('opt2', '', validator=return_false, default='val')")
35     opt2 = StrOption('opt2', '', validator=return_false)
36     root = OptionDescription('root', '', [opt1, opt2])
37     cfg = Config(root)
38     assert cfg.opt1 == 'val'
39     raises(ValueError, "cfg.opt2 = 'val'")
40
41
42 def test_validator_params():
43     opt1 = StrOption('opt1', '', validator=return_true, validator_params={'': ('yes',)}, default='val')
44     raises(ValueError, "StrOption('opt2', '', validator=return_false, validator_params={'': ('yes',)}, default='val')")
45     opt2 = StrOption('opt2', '', validator=return_false, validator_params={'': ('yes',)})
46     root = OptionDescription('root', '', [opt1, opt2])
47     cfg = Config(root)
48     assert cfg.opt1 == 'val'
49     raises(ValueError, "cfg.opt2 = 'val'")
50
51
52 def test_validator_params_key():
53     opt1 = StrOption('opt1', '', validator=return_true, validator_params={'param': ('yes',)}, default='val')
54     raises(TypeError, "StrOption('opt2', '', validator=return_true, validator_params={'param_unknown': ('yes',)}, default='val')")
55     root = OptionDescription('root', '', [opt1])
56     cfg = Config(root)
57     assert cfg.opt1 == 'val'
58
59
60 def test_validator_params_option():
61     opt0 = StrOption('opt0', '', default='val')
62     raises(ValueError, "opt1 = StrOption('opt1', '', validator=return_true, validator_params={'': ((opt0, False),)}, default='val')")
63
64
65 def test_validator_multi():
66     opt1 = StrOption('opt1', '', validator=return_if_val, multi=True)
67     root = OptionDescription('root', '', [opt1])
68     cfg = Config(root)
69     assert cfg.opt1 == []
70     cfg.opt1.append('val')
71     assert cfg.opt1 == ['val']
72     raises(ValueError, "cfg.opt1.append('val1')")
73     raises(ValueError, "cfg.opt1 = ['val', 'val1']")
74
75
76 def test_validator_warning():
77     opt1 = StrOption('opt1', '', validator=return_true, default='val', warnings_only=True)
78     opt2 = StrOption('opt2', '', validator=return_false, warnings_only=True)
79     opt3 = StrOption('opt3', '', validator=return_if_val, multi=True, warnings_only=True)
80     root = OptionDescription('root', '', [opt1, opt2, opt3])
81     cfg = Config(root)
82     assert cfg.opt1 == 'val'
83     warnings.simplefilter("always", ValueWarning)
84     with warnings.catch_warnings(record=True) as w:
85         cfg.opt1 = 'val'
86     assert w == []
87     #
88     with warnings.catch_warnings(record=True) as w:
89         cfg.opt2 = 'val'
90     assert len(w) == 1
91     assert w[0].message.opt == opt2
92     assert str(w[0].message) == 'invalid value for option opt2: error'
93     #
94     with warnings.catch_warnings(record=True) as w:
95         cfg.opt3.append('val')
96     assert w == []
97     #
98     with warnings.catch_warnings(record=True) as w:
99         cfg.opt3.append('val1')
100     assert len(w) == 1
101     assert w[0].message.opt == opt3
102     assert str(w[0].message) == 'invalid value for option opt3: error'
103     raises(ValueError, "cfg.opt2 = 1")
104     #
105     with warnings.catch_warnings(record=True) as w:
106         cfg.opt2 = 'val'
107         cfg.opt3.append('val')
108     assert len(w) == 2
109     assert w[0].message.opt == opt2
110     assert str(w[0].message) == 'invalid value for option opt2: error'
111     assert w[1].message.opt == opt3
112     assert str(w[1].message) == 'invalid value for option opt3: error'
113
114
115 def test_validator_warning_master_slave():
116     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip reseau autorise", multi=True, validator=return_false, warnings_only=True)
117     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-reseau", multi=True, validator=return_if_val, warnings_only=True)
118     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
119     interface1.impl_set_group_type(groups.master)
120     assert interface1.impl_get_group_type() == groups.master
121     root = OptionDescription('root', '', [interface1])
122     cfg = Config(root)
123     warnings.simplefilter("always", ValueWarning)
124     with warnings.catch_warnings(record=True) as w:
125         cfg.ip_admin_eth0.ip_admin_eth0.append(None)
126     assert w == []
127     #
128     with warnings.catch_warnings(record=True) as w:
129         cfg.ip_admin_eth0.netmask_admin_eth0 = ['val1']
130     assert len(w) == 1
131     assert w[0].message.opt == netmask_admin_eth0
132     assert str(w[0].message) == 'invalid value for option netmask_admin_eth0: error'
133     #
134     with warnings.catch_warnings(record=True) as w:
135         cfg.ip_admin_eth0.ip_admin_eth0 = ['val']
136     assert len(w) == 1
137     assert w[0].message.opt == ip_admin_eth0
138     assert str(w[0].message) == 'invalid value for option ip_admin_eth0: error'
139     #
140     with warnings.catch_warnings(record=True) as w:
141         cfg.ip_admin_eth0.ip_admin_eth0 = ['val', 'val1', 'val1']
142     assert len(w) == 1
143     assert w[0].message.opt == ip_admin_eth0
144     assert str(w[0].message) == 'invalid value for option ip_admin_eth0: error'
145     #
146     with warnings.catch_warnings(record=True) as w:
147         cfg.ip_admin_eth0.ip_admin_eth0 = ['val1', 'val', 'val1']
148     assert len(w) == 1
149     assert w[0].message.opt == ip_admin_eth0
150     assert str(w[0].message) == 'invalid value for option ip_admin_eth0: error'
151     #
152     warnings.resetwarnings()
153     with warnings.catch_warnings(record=True) as w:
154         cfg.ip_admin_eth0.ip_admin_eth0 = ['val1', 'val1', 'val']
155     assert len(w) == 1
156     assert w[0].message.opt == ip_admin_eth0
157     assert str(w[0].message) == 'invalid value for option ip_admin_eth0: error'