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