allow number as first letter of a domainname with netbios type
[tiramisu.git] / test / test_config.py
index 17e863a..6ac48d4 100644 (file)
@@ -6,10 +6,12 @@
 import autopath
 from py.test import raises
 
-from tiramisu.config import Config
+from tiramisu.config import Config, SubConfig
 from tiramisu.option import IntOption, FloatOption, StrOption, ChoiceOption, \
     BoolOption, UnicodeOption, OptionDescription
-from tiramisu.error import ConflictError
+from tiramisu.i18n import _
+from tiramisu.error import ConflictError, ConfigError, PropertiesOptionError
+import weakref
 
 
 def make_description():
@@ -21,7 +23,7 @@ def make_description():
     intoption = IntOption('int', 'Test int option', default=0)
     floatoption = FloatOption('float', 'Test float option', default=2.3)
     stroption = StrOption('str', 'Test string option', default="abc", properties=('mandatory', ))
-    boolop = BoolOption('boolop', 'Test boolean option op', default=True)
+    boolop = BoolOption('boolop', 'Test boolean option op', default=True, properties=('hidden',))
     wantref_option = BoolOption('wantref', 'Test requires', default=False)
     wantframework_option = BoolOption('wantframework', 'Test requires',
                                       default=False)
@@ -43,7 +45,7 @@ def test_base_config():
     cfg = Config(descr)
     assert cfg.dummy is False
     dm = cfg.unwrap_from_path('dummy')
-    assert dm._name == 'dummy'
+    assert dm.impl_getname() == 'dummy'
 
 
 def test_not_config():
@@ -82,11 +84,20 @@ def test_base_config_and_groups():
     assert config.gc.name == 'ref'
     assert config.bool is False
     nm = config.unwrap_from_path('gc.name')
-    assert nm._name == 'name'
+    assert nm.impl_getname() == 'name'
     gc = config.unwrap_from_path('gc')
-    assert gc._name == 'gc'
+    assert gc.impl_getname() == 'gc'
     #nm = config.unwrap_from_name('name')
-    #assert nm._name == 'name'
+    #assert nm.impl_getname() == 'name'
+
+
+def test_base_config_force_permissive():
+    descr = make_description()
+    config = Config(descr)
+    config.read_write()
+    config.cfgimpl_get_settings().setpermissive(('hidden',))
+    raises(PropertiesOptionError, "config.getattr('boolop')")
+    assert config.getattr('boolop', force_permissive=True) is True
 
 
 def test_base_config_in_a_tree():
@@ -131,8 +142,10 @@ def test_cfgimpl_get_home_by_path():
     config.bool = False
     assert config.cfgimpl_get_home_by_path('gc.dummy')[1] == 'dummy'
     assert config.cfgimpl_get_home_by_path('dummy')[1] == 'dummy'
-    #assert config.getpaths(include_groups=False) == ['gc.name', 'gc.dummy', 'gc.float', 'bool', 'objspace', 'wantref', 'str', 'wantframework', 'int', 'boolop']
-    #assert config.getpaths(include_groups=True) == ['gc', 'gc.name', 'gc.dummy', 'gc.float', 'bool', 'objspace', 'wantref', 'str', 'wantframework', 'int', 'boolop']
+
+
+def test_not_valid_properties():
+    raises(TypeError, "stroption = StrOption('str', 'Test string option', default='abc', properties=['mandatory',])")
 
 
 def test_information_config():
@@ -142,15 +155,19 @@ def test_information_config():
     config.impl_set_information('info', string)
     assert config.impl_get_information('info') == string
     raises(ValueError, "config.impl_get_information('noinfo')")
+    assert config.impl_get_information('noinfo', 'default') == 'default'
 
 
+#FIXME test impl_get_xxx pour OD ou ne pas cacher
 def test_config_impl_get_path_by_opt():
     descr = make_description()
     config = Config(descr)
     dummy = config.unwrap_from_path('gc.dummy')
     boo = config.unwrap_from_path('bool')
+    unknown = IntOption('test', '')
     assert config.cfgimpl_get_description().impl_get_path_by_opt(boo) == 'bool'
     assert config.cfgimpl_get_description().impl_get_path_by_opt(dummy) == 'gc.dummy'
+    raises(AttributeError, "config.cfgimpl_get_description().impl_get_path_by_opt(unknown)")
 
 
 def test_config_impl_get_opt_by_path():
@@ -160,6 +177,7 @@ def test_config_impl_get_opt_by_path():
     boo = config.unwrap_from_path('bool')
     assert config.cfgimpl_get_description().impl_get_opt_by_path('bool') == boo
     assert config.cfgimpl_get_description().impl_get_opt_by_path('gc.dummy') == dummy
+    raises(AttributeError, "config.cfgimpl_get_description().impl_get_opt_by_path('gc.unknown')")
 
 
 def test_information_display():
@@ -225,8 +243,105 @@ def test_duplicated_option():
     g1 = IntOption('g1', '', 1)
     #in same OptionDescription
     raises(ConflictError, "d1 = OptionDescription('od', '', [g1, g1])")
+
+
+def test_duplicated_option_diff_od():
+    g1 = IntOption('g1', '', 1)
     d1 = OptionDescription('od1', '', [g1])
-    d2 = OptionDescription('od2', '', [g1])
-    root = OptionDescription('root', '', [d1, d2])
     #in different OptionDescription
-    raises(ConflictError, "config = Config(root)")
+    d2 = OptionDescription('od2', '', [g1, d1])
+    raises(ConflictError, 'Config(d2)')
+
+
+def test_cannot_assign_value_to_option_description():
+    descr = make_description()
+    cfg = Config(descr)
+    raises(TypeError, "cfg.gc = 3")
+
+
+def test_config_multi():
+    i1 = IntOption('test1', '', multi=True)
+    i2 = IntOption('test2', '', multi=True, default_multi=1)
+    i3 = IntOption('test3', '', default=[2], multi=True, default_multi=1)
+    od = OptionDescription('test', '', [i1, i2, i3])
+    config = Config(od)
+    assert config.test1 == []
+    assert config.test2 == []
+    config.test2.append()
+    assert config.test2 == [1]
+    assert config.test3 == [2]
+    config.test3.append()
+    assert config.test3 == [2, 1]
+
+
+def test_no_validation():
+    i1 = IntOption('test1', '')
+    od = OptionDescription('test', '', [i1])
+    c = Config(od)
+    setting = c.cfgimpl_get_settings()
+    c.test1 = 1
+    raises(ValueError, 'c.test1 = "yes"')
+    assert c.test1 == 1
+    setting.remove('validator')
+    c.test1 = "yes"
+    assert c.test1 == "yes"
+    setting.append('validator')
+    raises(ValueError, 'c.test1')
+    del(c.test1)
+    assert c.test1 is None
+
+
+def test_delete_config_with_subconfig():
+    test = IntOption('test', '')
+    multi = IntOption('multi', '', multi=True)
+    od = OptionDescription('od', '', [test, multi])
+    odroot = OptionDescription('odroot', '', [od])
+    c = Config(odroot)
+    sub = c.od
+    val = c.cfgimpl_get_values()
+    setting = c.cfgimpl_get_settings()
+    val[test]
+    val[multi]
+    setting[test]
+    sub.make_dict()
+    del(c)
+    raises(ConfigError, 'val[test]')
+    raises(ConfigError, 'val[multi]')
+    raises(ConfigError, 'setting[test]')
+    raises(ConfigError, 'sub.make_dict()')
+
+
+def test_config_weakref():
+    o = OptionDescription('val', '', [])
+    o2 = OptionDescription('val', '', [o])
+    c = Config(o2)
+    SubConfig(o, weakref.ref(c))
+    raises(ValueError, "SubConfig(o, c)")
+    s = SubConfig(o, weakref.ref(c))
+    assert s._cfgimpl_get_context() == c
+    del(c)
+    raises(ConfigError, "s._cfgimpl_get_context()")
+
+
+def test_config_str():
+    gcdummy = BoolOption('dummy', 'dummy', default=False)
+    gcdummy1 = BoolOption('dummy1', 'dummy', default=False, properties=('disabled',))
+    o = OptionDescription('o', '', [gcdummy, gcdummy1])
+    descr = OptionDescription('tiramisu', '', [o])
+    cfg = Config(descr)
+    cfg.read_only()
+    str(cfg)
+    str(cfg.o)
+
+
+def test_config_od_function():
+    gcdummy = BoolOption('dummy', 'dummy', default=False)
+    gcdummy1 = BoolOption('dummy1', 'dummy', default=False, properties=('disabled',))
+    o = OptionDescription('o', '', [gcdummy, gcdummy1])
+    descr = OptionDescription('tiramisu', '', [o])
+    cfg = Config(descr)
+    try:
+        print cfg.impl_get_opt_by_path()
+    except AttributeError, err:
+        assert str(err) == _('unknown Option {0} in OptionDescription {1}'
+                             '').format('impl_get_opt_by_path', descr.impl_getname())