first version with sqlalchemy option's storage
[tiramisu.git] / test / test_requires.py
1 # coding: utf-8
2 import autopath
3 from copy import copy
4 from tiramisu import setting
5 setting.expires_time = 1
6 from tiramisu.option import IPOption, OptionDescription, BoolOption, IntOption, StrOption
7 from tiramisu.config import Config
8 from tiramisu.error import PropertiesOptionError, RequirementError
9 from py.test import raises
10
11
12 def test_requires():
13     a = BoolOption('activate_service', '', True)
14     b = IPOption('ip_address_service', '',
15                  requires=[{'option': a, 'expected': False, 'action': 'disabled'}])
16     od = OptionDescription('service', '', [a, b])
17     c = Config(od)
18     c.read_write()
19     c.ip_address_service
20     c.activate_service = False
21     props = []
22     try:
23         c.ip_address_service
24     except PropertiesOptionError as err:
25         props = err.proptype
26     assert props == ['disabled']
27
28
29 def test_requires_same_action():
30     a = BoolOption('activate_service', '', True)
31     b = BoolOption('activate_service_web', '', True,
32                    requires=[{'option': a, 'expected': False, 'action': 'new'}])
33
34     d = IPOption('ip_address_service_web', '',
35                  requires=[{'option': b, 'expected': False,
36                             'action': 'disabled', 'inverse': False,
37                             'transitive': True, 'same_action': False}])
38     od = OptionDescription('service', '', [a, b, d])
39     c = Config(od)
40     c.read_write()
41     c.cfgimpl_get_settings().append('new')
42     c.activate_service
43     c.activate_service_web
44     c.ip_address_service_web
45     c.activate_service = False
46     #
47     props = []
48     try:
49         c.activate_service_web
50     except PropertiesOptionError as err:
51         props = err.proptype
52     assert props == ['new']
53     #
54     props = []
55     try:
56         c.ip_address_service_web
57     except PropertiesOptionError as err:
58         props = err.proptype
59     assert props == ['disabled']
60
61
62 def test_multiple_requires():
63     a = StrOption('activate_service', '')
64     b = IPOption('ip_address_service', '',
65                  requires=[{'option': a, 'expected': 'yes', 'action': 'disabled'},
66                            {'option': a, 'expected': 'ok', 'action': 'disabled'}])
67     od = OptionDescription('service', '', [a, b])
68     c = Config(od)
69     c.read_write()
70     c.ip_address_service
71     c.activate_service = 'yes'
72     props = []
73     try:
74         c.ip_address_service
75     except PropertiesOptionError as err:
76         props = err.proptype
77     assert props == ['disabled']
78
79     c.activate_service = 'ok'
80     props = []
81     try:
82         c.ip_address_service
83     except PropertiesOptionError as err:
84         props = err.proptype
85     assert props == ['disabled']
86
87     c.activate_service = 'no'
88     c.ip_address_service
89
90
91 def test_multiple_requires_cumulative():
92     a = StrOption('activate_service', '')
93     b = IPOption('ip_address_service', '',
94                  requires=[{'option': a, 'expected': 'yes', 'action': 'disabled'},
95                            {'option': a, 'expected': 'yes', 'action': 'hidden'}])
96     od = OptionDescription('service', '', [a, b])
97     c = Config(od)
98     c.read_write()
99     c.ip_address_service
100     c.activate_service = 'yes'
101     props = []
102     try:
103         c.ip_address_service
104     except PropertiesOptionError as err:
105         props = err.proptype
106     assert set(props) == set(['hidden', 'disabled'])
107
108     c.activate_service = 'ok'
109     c.ip_address_service
110
111     c.activate_service = 'no'
112     c.ip_address_service
113
114
115 def test_multiple_requires_cumulative_inverse():
116     a = StrOption('activate_service', '')
117     b = IPOption('ip_address_service', '',
118                  requires=[{'option': a, 'expected': 'yes', 'action': 'disabled', 'inverse': True},
119                            {'option': a, 'expected': 'yes', 'action': 'hidden', 'inverse': True}])
120     od = OptionDescription('service', '', [a, b])
121     c = Config(od)
122     c.read_write()
123     props = []
124     try:
125         c.ip_address_service
126     except PropertiesOptionError as err:
127         props = err.proptype
128     assert set(props) == set(['hidden', 'disabled'])
129     c.activate_service = 'yes'
130     c.ip_address_service
131
132     c.activate_service = 'ok'
133     props = []
134     try:
135         c.ip_address_service
136     except PropertiesOptionError as err:
137         props = err.proptype
138     assert set(props) == set(['hidden', 'disabled'])
139
140     c.activate_service = 'no'
141     props = []
142     try:
143         c.ip_address_service
144     except PropertiesOptionError as err:
145         props = err.proptype
146     assert set(props) == set(['hidden', 'disabled'])
147
148
149 def test_multiple_requires_inverse():
150     a = StrOption('activate_service', '')
151     b = IPOption('ip_address_service', '',
152                  requires=[{'option': a, 'expected': 'yes', 'action': 'disabled', 'inverse': True},
153                            {'option': a, 'expected': 'ok', 'action': 'disabled', 'inverse': True}])
154     od = OptionDescription('service', '', [a, b])
155     c = Config(od)
156     c.read_write()
157     props = []
158     try:
159         c.ip_address_service
160     except PropertiesOptionError as err:
161         props = err.proptype
162     assert props == ['disabled']
163
164     c.activate_service = 'yes'
165     c.ip_address_service
166
167     c.activate_service = 'ok'
168     c.ip_address_service
169
170     c.activate_service = 'no'
171     props = []
172     try:
173         c.ip_address_service
174     except PropertiesOptionError as err:
175         props = err.proptype
176     assert props == ['disabled']
177
178
179 def test_requires_transitive():
180     a = BoolOption('activate_service', '', True)
181     b = BoolOption('activate_service_web', '', True,
182                    requires=[{'option': a, 'expected': False, 'action': 'disabled'}])
183
184     d = IPOption('ip_address_service_web', '',
185                  requires=[{'option': b, 'expected': False, 'action': 'disabled'}])
186     od = OptionDescription('service', '', [a, b, d])
187     c = Config(od)
188     c.read_write()
189     c.activate_service
190     c.activate_service_web
191     c.ip_address_service_web
192     c.activate_service = False
193     #
194     props = []
195     try:
196         c.activate_service_web
197     except PropertiesOptionError as err:
198         props = err.proptype
199     assert props == ['disabled']
200     #
201     props = []
202     try:
203         c.ip_address_service_web
204     except PropertiesOptionError as err:
205         props = err.proptype
206     assert props == ['disabled']
207
208
209 def test_requires_transitive_bis():
210     a = BoolOption('activate_service', '', True)
211     abis = BoolOption('activate_service_bis', '', True)
212     b = BoolOption('activate_service_web', '', True,
213                    requires=[{'option': a, 'expected': True, 'action': 'disabled', 'inverse': True}])
214
215     d = IPOption('ip_address_service_web', '',
216                  requires=[{'option': b, 'expected': True, 'action': 'disabled', 'inverse': True}])
217     od = OptionDescription('service', '', [a, abis, b, d])
218     c = Config(od)
219     c.read_write()
220     #
221     c.activate_service_web
222     c.ip_address_service_web
223     c.activate_service = False
224     #
225     props = []
226     try:
227         c.activate_service_web
228     except PropertiesOptionError as err:
229         props = err.proptype
230     assert props == ['disabled']
231     #
232     props = []
233     try:
234         c.ip_address_service_web
235     except PropertiesOptionError as err:
236         props = err.proptype
237     assert props == ['disabled']
238
239
240 def test_requires_transitive_hidden_disabled():
241     a = BoolOption('activate_service', '', True)
242     b = BoolOption('activate_service_web', '', True,
243                    requires=[{'option': a, 'expected': False, 'action': 'hidden'}])
244     d = IPOption('ip_address_service_web', '',
245                  requires=[{'option': b, 'expected': False, 'action': 'disabled'}])
246     od = OptionDescription('service', '', [a, b, d])
247     c = Config(od)
248     c.read_write()
249     c.activate_service
250     c.activate_service_web
251     c.ip_address_service_web
252     c.activate_service = False
253     #
254     props = []
255     try:
256         c.activate_service_web
257     except PropertiesOptionError as err:
258         props = err.proptype
259     assert props == ['hidden']
260     raises(RequirementError, 'c.ip_address_service_web')
261
262
263 def test_requires_not_transitive():
264     a = BoolOption('activate_service', '', True)
265     b = BoolOption('activate_service_web', '', True,
266                    requires=[{'option': a, 'expected': False, 'action': 'disabled'}])
267     d = IPOption('ip_address_service_web', '',
268                  requires=[{'option': b, 'expected': False,
269                             'action': 'disabled', 'transitive': False}])
270     od = OptionDescription('service', '', [a, b, d])
271     c = Config(od)
272     c.read_write()
273     c.activate_service
274     c.activate_service_web
275     c.ip_address_service_web
276     c.activate_service = False
277     #
278     props = []
279     try:
280         c.activate_service_web
281     except PropertiesOptionError as err:
282         props = err.proptype
283     assert props == ['disabled']
284     #
285     c.ip_address_service_web
286
287
288 def test_requires_None():
289     a = BoolOption('activate_service', '')
290     b = IPOption('ip_address_service', '',
291                  requires=[{'option': a, 'expected': None, 'action': 'disabled'}])
292     od = OptionDescription('service', '', [a, b])
293     c = Config(od)
294     c.read_write()
295     props = []
296     try:
297         c.ip_address_service
298     except PropertiesOptionError as err:
299         props = err.proptype
300     assert props == ['disabled']
301     c.activate_service = False
302     c.ip_address_service
303
304
305 def test_requires_multi_disabled():
306     a = BoolOption('activate_service', '')
307     b = IntOption('num_service', '')
308     c = IPOption('ip_address_service', '',
309                  requires=[{'option': a, 'expected': True, 'action': 'disabled'},
310                            {'option': b, 'expected': 1, 'action': 'disabled'}])
311     od = OptionDescription('service', '', [a, b, c])
312     c = Config(od)
313     c.read_write()
314
315     c.ip_address_service
316
317     c.activate_service = True
318     props = []
319     try:
320         c.ip_address_service
321     except PropertiesOptionError as err:
322         props = err.proptype
323     assert props == ['disabled']
324
325     c.activate_service = False
326     c.ip_address_service
327
328     c.num_service = 1
329     props = []
330     try:
331         c.ip_address_service
332     except PropertiesOptionError as err:
333         props = err.proptype
334     assert props == ['disabled']
335
336     c.activate_service = True
337     props = []
338     try:
339         c.ip_address_service
340     except PropertiesOptionError as err:
341         props = err.proptype
342     assert props == ['disabled']
343
344
345 def test_requires_multi_disabled_inverse():
346     a = BoolOption('activate_service', '')
347     b = IntOption('num_service', '')
348     c = IPOption('ip_address_service', '',
349                  requires=[{'option': a, 'expected': True,
350                             'action': 'disabled', 'inverse': True},
351                            {'option': b, 'expected': 1,
352                             'action': 'disabled', 'inverse': True}])
353     od = OptionDescription('service', '', [a, b, c])
354     c = Config(od)
355     c.read_write()
356
357     props = []
358     try:
359         c.ip_address_service
360     except PropertiesOptionError as err:
361         props = err.proptype
362     assert props == ['disabled']
363
364     c.activate_service = True
365     props = []
366     try:
367         c.ip_address_service
368     except PropertiesOptionError as err:
369         props = err.proptype
370     assert props == ['disabled']
371
372     c.activate_service = False
373     props = []
374     try:
375         c.ip_address_service
376     except PropertiesOptionError as err:
377         props = err.proptype
378     assert props == ['disabled']
379
380     c.num_service = 1
381     props = []
382     try:
383         c.ip_address_service
384     except PropertiesOptionError as err:
385         props = err.proptype
386     assert props == ['disabled']
387
388     c.activate_service = True
389     c.ip_address_service
390
391
392 def test_requires_multi_disabled_2():
393     a = BoolOption('a', '')
394     b = BoolOption('b', '')
395     c = BoolOption('c', '')
396     d = BoolOption('d', '')
397     e = BoolOption('e', '')
398     f = BoolOption('f', '')
399     g = BoolOption('g', '')
400     h = BoolOption('h', '')
401     i = BoolOption('i', '')
402     j = BoolOption('j', '')
403     k = BoolOption('k', '')
404     l = BoolOption('l', '')
405     m = BoolOption('m', '')
406     list_bools = [a, b, c, d, e, f, g, h, i, j, k, l, m]
407     requires = []
408     for boo in list_bools:
409         requires.append({'option': boo, 'expected': True, 'action': 'disabled'})
410     z = IPOption('z', '', requires=requires)
411     y = copy(list_bools)
412     y.append(z)
413     od = OptionDescription('service', '', y)
414     cfg = Config(od)
415     cfg.read_write()
416
417     cfg.z
418     for boo in list_bools:
419         setattr(cfg, boo._name, True)
420         props = []
421         try:
422             cfg.z
423         except PropertiesOptionError as err:
424             props = err.proptype
425         assert props == ['disabled']
426     for boo in list_bools:
427         setattr(cfg, boo._name, False)
428         if boo == m:
429             cfg.z
430         else:
431             props = []
432             try:
433                 cfg.z
434             except PropertiesOptionError as err:
435                 props = err.proptype
436             assert props == ['disabled']
437
438
439 def test_requires_multi_disabled_inverse_2():
440     a = BoolOption('a', '')
441     b = BoolOption('b', '')
442     c = BoolOption('c', '')
443     d = BoolOption('d', '')
444     e = BoolOption('e', '')
445     f = BoolOption('f', '')
446     g = BoolOption('g', '')
447     h = BoolOption('h', '')
448     i = BoolOption('i', '')
449     j = BoolOption('j', '')
450     k = BoolOption('k', '')
451     l = BoolOption('l', '')
452     m = BoolOption('m', '')
453     list_bools = [a, b, c, d, e, f, g, h, i, j, k, l, m]
454     requires = []
455     for boo in list_bools:
456         requires.append({'option': boo, 'expected': True, 'action': 'disabled',
457                          'inverse': True})
458     z = IPOption('z', '', requires=requires)
459     y = copy(list_bools)
460     y.append(z)
461     od = OptionDescription('service', '', y)
462     cfg = Config(od)
463     cfg.read_write()
464
465     props = []
466     try:
467         cfg.z
468     except PropertiesOptionError as err:
469         props = err.proptype
470     assert props == ['disabled']
471     for boo in list_bools:
472         setattr(cfg, boo._name, True)
473         if boo == m:
474             cfg.z
475         else:
476             props = []
477             try:
478                 cfg.z
479             except PropertiesOptionError as err:
480                 props = err.proptype
481             assert props == ['disabled']
482     for boo in list_bools:
483         setattr(cfg, boo._name, False)
484         props = []
485         try:
486             cfg.z
487         except PropertiesOptionError as err:
488             props = err.proptype
489         assert props == ['disabled']
490
491
492 #def test_requires_requirement_append():
493 #    a = BoolOption('activate_service', '', True)
494 #    b = IPOption('ip_address_service', '',
495 #                 requires=[{'option': a, 'expected': False, 'action': 'disabled'}])
496 #    od = OptionDescription('service', '', [a, b])
497 #    c = Config(od)
498 #    c.read_write()
499 #    str(c.cfgimpl_get_settings())
500 #    str(c.cfgimpl_get_settings()[b])
501 #    raises(ValueError, 'c.cfgimpl_get_settings()[b].append("disabled")')
502 #    c.activate_service = False
503 #    # disabled is now set, test to remove disabled before store in storage
504 #    c.cfgimpl_get_settings()[b].append("test")
505
506
507 def test_requires_recursive_path():
508     a = BoolOption('activate_service', '', True)
509     b = IPOption('ip_address_service', '',
510                  requires=[{'option': a, 'expected': False, 'action': 'disabled'}])
511     od1 = OptionDescription('service', '', [a, b], requires=[{'option': a, 'expected': False, 'action': 'disabled'}])
512     od = OptionDescription('base', '', [od1])
513     c = Config(od)
514     c.read_write()
515     raises(RequirementError, 'c.service.a')
516
517
518 def test_get_properties_with_None_path():
519     a = BoolOption('activate_service', '', True)
520     b = IPOption('ip_address_service', '',
521                  requires=[{'option': a, 'expected': False, 'action': 'disabled'}])
522     od1 = OptionDescription('service', '', [a, b], requires=[{'option': a, 'expected': False, 'action': 'disabled'}])
523     od = OptionDescription('base', '', [od1])
524     c = Config(od)
525     c.read_write()
526     raises(ValueError, "c.cfgimpl_get_settings()._getproperties(a)")
527
528
529 def test_set_item():
530     a = BoolOption('activate_service', '', True)
531     b = IPOption('ip_address_service', '')
532     od1 = OptionDescription('service', '', [a, b])
533     od = OptionDescription('base', '', [od1])
534     c = Config(od)
535     c.read_write()
536     raises(ValueError, 'c.cfgimpl_get_settings()[a] = ("test",)')
537
538
539 def test_properties_conflict():
540     a = BoolOption('activate_service', '', True)
541     raises(ValueError, "IPOption('ip_address_service', '', properties=('disabled',), requires=[{'option': a, 'expected': False, 'action': 'disabled'}])")
542     raises(ValueError, "od1 = OptionDescription('service', '', [a], properties=('disabled',), requires=[{'option': a, 'expected': False, 'action': 'disabled'}])")