update sqlalchemy storage for values et settings
[tiramisu.git] / test / test_mandatory.py
1 # coding: utf-8
2 from autopath import do_autopath
3 do_autopath()
4
5 from py.test import raises
6 from tiramisu.config import Config
7 from tiramisu.option import IntOption, StrOption, UnicodeOption, OptionDescription, SymLinkOption
8 from tiramisu.error import PropertiesOptionError, ConfigError
9 from tiramisu.setting import groups
10 from tiramisu.storage import delete_session
11
12
13 def make_description():
14     stroption = StrOption('str', 'Test string option', default="abc",
15                           properties=('mandatory', ))
16     stroption1 = StrOption('str1', 'Test string option',
17                            properties=('mandatory', ))
18     stroption2 = UnicodeOption('unicode2', 'Test string option',
19                                properties=('mandatory', ))
20     stroption3 = StrOption('str3', 'Test string option', multi=True,
21                            properties=('mandatory', ))
22     stroption4 = StrOption('str4', 'Test string option', multi=True,
23                            properties=('mandatory', ), allow_empty_list=True)
24     descr = OptionDescription('tiram', '', [stroption, stroption1, stroption2, stroption3, stroption4])
25     return descr
26
27
28 def return_value(value):
29     return value
30
31
32 def make_description2():
33     stroption = StrOption('str', 'Test string option', default="abc",
34                           properties=('mandatory', ))
35     stroption1 = StrOption('str1', 'Test string option',
36                            properties=('mandatory', ))
37     stroption2 = SymLinkOption('unicode2', stroption1)
38     stroption3 = StrOption('str3', 'Test string option', multi=True,
39                            properties=('mandatory', ))
40     unicode1 = UnicodeOption('unicode1', 'Test string option', callback=return_value, callback_params={'': ((stroption, False),)},  properties=('mandatory', ))
41     descr = OptionDescription('tiram', '', [stroption, stroption1, stroption2, stroption3, unicode1])
42     return descr
43
44
45 def make_description_sym():
46     stroption = StrOption('str', 'Test string option', default="abc",
47                           properties=('mandatory', ))
48     stroption1 = StrOption('str1', 'Test string option',
49                            properties=('mandatory', ))
50     stroption2 = SymLinkOption('unicode2', stroption1)
51     stroption3 = StrOption('str3', 'Test string option', multi=True,
52                            properties=('mandatory', ))
53     descr = OptionDescription('tiram', '', [stroption, stroption1, stroption2, stroption3])
54     return descr
55
56
57 def make_description3():
58     stroption = StrOption('str', 'Test string option', default="abc",
59                           properties=('mandatory', ))
60     stroption1 = StrOption('str1', 'Test string option',
61                            properties=('mandatory', ))
62     stroption2 = SymLinkOption('unicode2', stroption1)
63     stroption3 = StrOption('str3', 'Test string option', multi=True,
64                            properties=('mandatory', ))
65     unicode1 = UnicodeOption('unicode1', 'Test string option', callback=return_value, callback_params={'': ((stroption, False),)},  properties=('mandatory', ))
66     int1 = IntOption('int1', '', callback=return_value, callback_params={'': ((stroption, False),)},  properties=('mandatory', ))
67     descr = OptionDescription('tiram', '', [stroption, stroption1, stroption2, stroption3, unicode1, int1])
68     return descr
69
70
71 def make_description4():
72     stroption = StrOption('str', 'Test string option', default="abc",
73                           properties=('mandatory', ))
74     stroption1 = StrOption('str1', 'Test string option',
75                            properties=('mandatory', ))
76     stroption2 = UnicodeOption('unicode2', 'Test string option',
77                                properties=('mandatory', ))
78     stroption3 = StrOption('str3', 'Test string option', multi=True, requires=[{'option': stroption, 'expected': 'yes', 'action': 'mandatory', 'transitive': False}])
79     descr = OptionDescription('tiram', '', [stroption, stroption1, stroption2, stroption3])
80     return descr
81
82
83 def test_mandatory_ro():
84     descr = make_description()
85     config = Config(descr)
86     config.read_only()
87     prop = []
88     try:
89         config.str1
90     except PropertiesOptionError as err:
91         prop = err.proptype
92     assert 'mandatory' in prop
93     config.read_write()
94     config.str1 = 'yes'
95     config.read_only()
96     assert config.str1 == 'yes'
97
98
99 def test_mandatory_rw():
100     descr = make_description()
101     config = Config(descr)
102     config.read_write()
103     #not mandatory in rw
104     config.str1
105     config.str1 = 'yes'
106     assert config.str1 == 'yes'
107
108
109 def test_mandatory_default():
110     descr = make_description()
111     config = Config(descr)
112     config.read_only()
113     #not mandatory in rw
114     config.str
115     config.read_write()
116     config.str = 'yes'
117     config.read_only()
118     config.str
119     config.read_write()
120     config.str = None
121     config.read_only()
122     prop = []
123     try:
124         config.str
125     except PropertiesOptionError as err:
126         prop = err.proptype
127     assert 'mandatory' in prop
128
129
130 def test_mandatory_delete():
131     descr = make_description()
132     config = Config(descr)
133     config.read_only()
134     config.str
135     try:
136         config.str1
137     except PropertiesOptionError as err:
138         prop = err.proptype
139     assert 'mandatory' in prop
140     config.read_write()
141     config.str1 = 'yes'
142     config.read_only()
143     assert config.str1 == 'yes'
144     config.cfgimpl_get_settings().remove('frozen')
145     prop = []
146     try:
147         del(config.str1)
148     except PropertiesOptionError as err:
149         prop = err.proptype
150     assert 'mandatory' in prop
151     del(config.str)
152     assert config.str1 == 'yes'
153
154
155 #valeur vide : None, '', u'', ...
156 def test_mandatory_none():
157     descr = make_description()
158     config = Config(descr)
159     config.str1 = None
160     assert config.getowner(config.unwrap_from_path('str1')) == 'user'
161     config.read_only()
162     prop = []
163     try:
164         config.str1
165     except PropertiesOptionError as err:
166         prop = err.proptype
167     assert 'mandatory' in prop
168
169
170 def test_mandatory_empty():
171     descr = make_description()
172     config = Config(descr)
173     config.str1 = ''
174     assert config.getowner(config.unwrap_from_path('str1')) == 'user'
175     config.read_only()
176     prop = []
177     try:
178         config.str1
179     except PropertiesOptionError as err:
180         prop = err.proptype
181     assert 'mandatory' in prop
182
183
184 def test_mandatory_multi_none():
185     descr = make_description()
186     config = Config(descr)
187     config.str3 = [None]
188     assert config.getowner(config.unwrap_from_path('str3')) == 'user'
189     config.read_only()
190     prop = []
191     try:
192         config.str3
193     except PropertiesOptionError as err:
194         prop = err.proptype
195     assert 'mandatory' in prop
196     config.read_write()
197     config.str3 = ['yes', None]
198     assert config.getowner(config.unwrap_from_path('str3')) == 'user'
199     config.read_only()
200     prop = []
201     try:
202         config.str3
203     except PropertiesOptionError as err:
204         prop = err.proptype
205     assert 'mandatory' in prop
206
207
208 def test_mandatory_multi_empty():
209     descr = make_description()
210     config = Config(descr)
211     config.str3 = []
212     assert config.getowner(config.unwrap_from_path('str3')) == 'user'
213     config.read_only()
214     prop = []
215     try:
216         config.str3
217     except PropertiesOptionError as err:
218         prop = err.proptype
219     assert 'mandatory' in prop
220     #
221     config.read_write()
222     config.str3 = ['']
223     assert config.getowner(config.unwrap_from_path('str3')) == 'user'
224     config.read_only()
225     prop = []
226     try:
227         config.str3
228     except PropertiesOptionError as err:
229         prop = err.proptype
230     assert 'mandatory' in prop
231     #
232     config.read_write()
233     config.str3 = ['yes', '']
234     assert config.getowner(config.unwrap_from_path('str3')) == 'user'
235     config.read_only()
236     prop = []
237     try:
238         config.str3
239     except PropertiesOptionError as err:
240         prop = err.proptype
241     assert 'mandatory' in prop
242
243
244 def test_mandatory_multi_empty_allow_empty_list():
245     descr = make_description()
246     config = Config(descr)
247     config.str4 = []
248     assert config.getowner(config.unwrap_from_path('str4')) == 'user'
249     config.read_only()
250     prop = []
251     config.str4
252     #
253     config.read_write()
254     config.str4 = ['']
255     assert config.getowner(config.unwrap_from_path('str4')) == 'user'
256     config.read_only()
257     prop = []
258     try:
259         config.str4
260     except PropertiesOptionError as err:
261         prop = err.proptype
262     assert 'mandatory' in prop
263     #
264     config.read_write()
265     config.str4 = ['yes', '']
266     assert config.getowner(config.unwrap_from_path('str4')) == 'user'
267     config.read_only()
268     prop = []
269     try:
270         config.str4
271     except PropertiesOptionError as err:
272         prop = err.proptype
273     assert 'mandatory' in prop
274
275
276 def test_mandatory_multi_append():
277     descr = make_description()
278     config = Config(descr)
279     config.str3 = ['yes']
280     config.read_write()
281     config.str3.append(None)
282
283
284 def test_mandatory_disabled():
285     descr = make_description()
286     config = Config(descr)
287     setting = config.cfgimpl_get_settings()
288     config.str1
289     config.read_only()
290     prop = []
291     try:
292         config.str1
293     except PropertiesOptionError as err:
294         prop = err.proptype
295     assert prop == ['mandatory']
296     setting[descr.str1].append('disabled')
297     prop = []
298     try:
299         config.str1
300     except PropertiesOptionError as err:
301         prop = err.proptype
302     assert set(prop) == set(['disabled', 'mandatory'])
303
304
305 def test_mandatory_unicode():
306     descr = make_description()
307     config = Config(descr)
308     config.unicode2
309     config.read_only()
310     prop = []
311     try:
312         config.unicode2
313     except PropertiesOptionError as err:
314         prop = err.proptype
315     assert prop == ['mandatory']
316     config.read_write()
317     config.unicode2 = u''
318     config.read_only()
319     prop = []
320     try:
321         config.unicode2
322     except PropertiesOptionError as err:
323         prop = err.proptype
324     assert prop == ['mandatory']
325
326
327 def test_mandatory_warnings_ro():
328     descr = make_description()
329     config = Config(descr)
330     config.str = ''
331     config.read_only()
332     proc = []
333     try:
334         config.str
335     except PropertiesOptionError as err:
336         proc = err.proptype
337     assert proc == ['mandatory']
338     assert list(config.cfgimpl_get_values().mandatory_warnings()) == ['str', 'str1', 'unicode2', 'str3']
339     config.read_write()
340     config.str = 'a'
341     config.read_only()
342     assert list(config.cfgimpl_get_values().mandatory_warnings()) == ['str1', 'unicode2', 'str3']
343     assert list(config.cfgimpl_get_values().mandatory_warnings(force_permissive=True)) == ['str1', 'unicode2', 'str3']
344
345
346 def test_mandatory_warnings_rw():
347     descr = make_description()
348     config = Config(descr)
349     config.str = ''
350     config.read_write()
351     config.str
352     assert list(config.cfgimpl_get_values().mandatory_warnings()) == ['str', 'str1', 'unicode2', 'str3']
353     config.str = 'a'
354     assert list(config.cfgimpl_get_values().mandatory_warnings()) == ['str1', 'unicode2', 'str3']
355     assert list(config.cfgimpl_get_values().mandatory_warnings(force_permissive=True)) == ['str1', 'unicode2', 'str3']
356     try:
357         delete_session('config', config.impl_getsessionid())
358     except ValueError:
359         pass
360     del(config)
361
362
363 def test_mandatory_warnings_disabled():
364     descr = make_description()
365     config = Config(descr)
366     config.str = ''
367     setting = config.cfgimpl_get_settings()
368     config.read_write()
369     config.str
370     assert list(config.cfgimpl_get_values().mandatory_warnings()) == ['str', 'str1', 'unicode2', 'str3']
371     setting[descr.str].append('disabled')
372     assert list(config.cfgimpl_get_values().mandatory_warnings()) == ['str1', 'unicode2', 'str3']
373     assert list(config.cfgimpl_get_values().mandatory_warnings(force_permissive=True)) == ['str1', 'unicode2', 'str3']
374     try:
375         delete_session('config', config.impl_getsessionid())
376     except ValueError:
377         pass
378     del(config)
379
380
381 def test_mandatory_warnings_hidden():
382     descr = make_description()
383     config = Config(descr)
384     config.str = ''
385     setting = config.cfgimpl_get_settings()
386     config.read_write()
387     config.cfgimpl_get_settings().setpermissive(('hidden',))
388     config.str
389     assert list(config.cfgimpl_get_values().mandatory_warnings()) == ['str', 'str1', 'unicode2', 'str3']
390     setting[descr.str].append('hidden')
391     assert list(config.cfgimpl_get_values().mandatory_warnings()) == ['str1', 'unicode2', 'str3']
392     assert list(config.cfgimpl_get_values().mandatory_warnings(force_permissive=True)) == ['str', 'str1', 'unicode2', 'str3']
393     try:
394         delete_session('config', config.impl_getsessionid())
395     except ValueError:
396         pass
397     del(config)
398
399
400 def test_mandatory_warnings_frozen():
401     descr = make_description()
402     config = Config(descr)
403     config.str = ''
404     setting = config.cfgimpl_get_settings()
405     config.read_write()
406     config.str
407     assert list(config.cfgimpl_get_values().mandatory_warnings()) == ['str', 'str1', 'unicode2', 'str3']
408     setting[descr.str].append('frozen')
409     config.read_only()
410     assert list(config.cfgimpl_get_values().mandatory_warnings()) == ['str', 'str1', 'unicode2', 'str3']
411     try:
412         delete_session('config', config.impl_getsessionid())
413     except ValueError:
414         pass
415     del(config)
416
417
418 def test_mandatory_master():
419     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True,
420                               properties=('mandatory', ))
421     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau",
422                                    multi=True)
423     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
424     interface1.impl_set_group_type(groups.master)
425     o = OptionDescription('o', '', [interface1])
426     config = Config(o)
427     config.read_only()
428     raises(PropertiesOptionError, 'config.ip_admin_eth0.ip_admin_eth0')
429     raises(PropertiesOptionError, 'config.ip_admin_eth0.netmask_admin_eth0')
430     try:
431         delete_session('config', config.impl_getsessionid())
432     except ValueError:
433         pass
434     del(config)
435
436
437 def test_mandatory_master_empty():
438     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
439     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau",
440                                    multi=True)
441     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
442     interface1.impl_set_group_type(groups.master)
443     o = OptionDescription('o', '', [interface1])
444     config = Config(o)
445     config.read_write()
446     assert config.ip_admin_eth0.ip_admin_eth0 == []
447     assert config.ip_admin_eth0.netmask_admin_eth0 == []
448     #
449     config.ip_admin_eth0.ip_admin_eth0.append()
450     assert config.ip_admin_eth0.ip_admin_eth0 == [None]
451     assert config.ip_admin_eth0.netmask_admin_eth0 == [None]
452     config.read_only()
453     raises(PropertiesOptionError, "config.ip_admin_eth0.ip_admin_eth0")
454     raises(PropertiesOptionError, "config.ip_admin_eth0.netmask_admin_eth0")
455     config.read_write()
456     del(config.ip_admin_eth0.ip_admin_eth0)
457     del(config.ip_admin_eth0.netmask_admin_eth0)
458     assert config.ip_admin_eth0.ip_admin_eth0 == []
459     assert config.ip_admin_eth0.netmask_admin_eth0 == []
460     #
461     config.ip_admin_eth0.ip_admin_eth0.append('')
462     assert config.ip_admin_eth0.ip_admin_eth0 == ['']
463     assert config.ip_admin_eth0.netmask_admin_eth0 == [None]
464     config.read_only()
465     raises(PropertiesOptionError, "config.ip_admin_eth0.ip_admin_eth0")
466     raises(PropertiesOptionError, "config.ip_admin_eth0.netmask_admin_eth0")
467     config.read_write()
468     #
469     config.read_write()
470     config.ip_admin_eth0.ip_admin_eth0 = ['ip']
471     config.read_only()
472     assert config.ip_admin_eth0.ip_admin_eth0 == ['ip']
473     assert config.ip_admin_eth0.netmask_admin_eth0 == [None]
474     try:
475         delete_session('config', config.impl_getsessionid())
476     except ValueError:
477         pass
478     del(config)
479
480
481 def test_mandatory_slave():
482     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
483     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau",
484                                    multi=True, properties=('mandatory', ))
485     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
486     interface1.impl_set_group_type(groups.master)
487     o = OptionDescription('o', '', [interface1])
488     config = Config(o)
489     config.read_only()
490     assert config.ip_admin_eth0.ip_admin_eth0 == []
491     assert config.ip_admin_eth0.netmask_admin_eth0 == []
492     #
493     config.read_write()
494     config.ip_admin_eth0.ip_admin_eth0.append('ip')
495     config.read_only()
496     assert config.ip_admin_eth0.ip_admin_eth0 == ['ip']
497     raises(PropertiesOptionError, 'config.ip_admin_eth0.netmask_admin_eth0')
498     #
499     config.read_write()
500     config.ip_admin_eth0.netmask_admin_eth0 = ['']
501     config.read_only()
502     assert config.ip_admin_eth0.ip_admin_eth0 == ['ip']
503     raises(PropertiesOptionError, 'config.ip_admin_eth0.netmask_admin_eth0')
504     #
505     config.read_write()
506     config.ip_admin_eth0.netmask_admin_eth0 = ['ip']
507     config.read_only()
508     assert config.ip_admin_eth0.ip_admin_eth0 == ['ip']
509     assert config.ip_admin_eth0.netmask_admin_eth0 == ['ip']
510     try:
511         delete_session('config', config.impl_getsessionid())
512     except ValueError:
513         pass
514     del(config)
515
516
517 def test_mandatory_warnings_symlink():
518     descr = make_description_sym()
519     config = Config(descr)
520     config.str = ''
521     setting = config.cfgimpl_get_settings()
522     config.read_write()
523     config.str
524     assert list(config.cfgimpl_get_values().mandatory_warnings()) == ['str', 'str1', 'str3']
525     setting[descr.str].append('frozen')
526     config.read_only()
527     assert list(config.cfgimpl_get_values().mandatory_warnings()) == ['str', 'str1', 'str3']
528     try:
529         delete_session('config', config.impl_getsessionid())
530     except ValueError:
531         pass
532     del(config)
533
534
535 def test_mandatory_warnings_validate():
536     descr = make_description3()
537     config = Config(descr)
538     config.str = ''
539     raises(ValueError, "list(config.cfgimpl_get_values().mandatory_warnings())")
540     assert list(config.cfgimpl_get_values().mandatory_warnings(validate=False)) == ['str', 'str1', 'str3', 'unicode1', 'int1']
541     config.str = 'test'
542     raises(ValueError, "list(config.cfgimpl_get_values().mandatory_warnings())")
543     assert list(config.cfgimpl_get_values().mandatory_warnings(validate=False)) == ['str1', 'str3']
544     try:
545         delete_session('config', config.impl_getsessionid())
546     except ValueError:
547         pass
548     del(config)
549
550
551 def test_mandatory_warnings_validate_empty():
552     descr = make_description2()
553     config = Config(descr)
554     config.str = ''
555     config.read_only()
556     raises(ConfigError, "list(config.cfgimpl_get_values().mandatory_warnings())")
557     assert list(config.cfgimpl_get_values().mandatory_warnings(validate=False)) == ['str', 'str1', 'str3', 'unicode1']
558     try:
559         delete_session('config', config.impl_getsessionid())
560     except ValueError:
561         pass
562     del(config)
563
564
565 def test_mandatory_warnings_requires():
566     descr = make_description4()
567     config = Config(descr)
568     config.str = ''
569     config.read_write()
570     config.str
571     assert list(config.cfgimpl_get_values().mandatory_warnings()) == ['str', 'str1', 'unicode2']
572     config.read_only()
573     assert list(config.cfgimpl_get_values().mandatory_warnings()) == ['str', 'str1', 'unicode2']
574     config.read_write()
575     config.str = 'yes'
576     assert list(config.cfgimpl_get_values().mandatory_warnings()) == ['str1', 'unicode2', 'str3']
577     try:
578         delete_session('config', config.impl_getsessionid())
579     except ValueError:
580         pass
581     del(config)
582
583
584 def test_mandatory_od_disabled():
585     descr = make_description()
586     od = OptionDescription('od', '', [descr])
587     config = Config(od)
588     config.read_only()
589     assert list(config.cfgimpl_get_values().mandatory_warnings()) == ['tiram.str1', 'tiram.unicode2', 'tiram.str3']
590     config.cfgimpl_get_settings()[descr].append('disabled')
591     assert list(config.cfgimpl_get_values().mandatory_warnings()) == []
592     try:
593         delete_session('config', config.impl_getsessionid())
594     except ValueError:
595         pass
596     del(config)