some improvements
[tiramisu.git] / test / test_option_validator.py
index dc08c82..eedffb6 100644 (file)
@@ -1,4 +1,6 @@
-import autopath
+from autopath import do_autopath
+do_autopath()
+
 import warnings
 from py.test import raises
 
@@ -9,14 +11,18 @@ from tiramisu.error import ValueWarning
 from tiramisu.i18n import _
 
 
+msg_err = _('attention, "{0}" could be an invalid {1} for "{2}", {3}')
+
+
 def return_true(value, param=None):
     if value == 'val' and param in [None, 'yes']:
         return True
+    return ValueError('test error')
 
 
 def return_false(value, param=None):
     if value == 'val' and param in [None, 'yes']:
-        raise ValueError('error')
+        return ValueError('test error')
 
 
 def return_val(value, param=None):
@@ -25,7 +31,7 @@ def return_val(value, param=None):
 
 def return_if_val(value):
     if value != 'val':
-        raise ValueError('error')
+        return ValueError('test error')
 
 
 def test_validator():
@@ -57,8 +63,13 @@ def test_validator_params_key():
 
 
 def test_validator_params_option():
-    opt0 = StrOption('opt0', '', default='val')
-    raises(ValueError, "opt1 = StrOption('opt1', '', validator=return_true, validator_params={'': ((opt0, False),)}, default='val')")
+    opt0 = StrOption('opt0', '', default='yes')
+    opt1 = StrOption('opt1', '', validator=return_true, validator_params={'': ((opt0, False),)}, default='val')
+    r = OptionDescription('root', '', [opt0, opt1])
+    cfg = Config(r)
+    cfg.opt1
+    cfg.opt0 = 'val'
+    raises(ValueError, "cfg.opt1")
 
 
 def test_validator_multi():
@@ -88,7 +99,7 @@ def test_validator_warning():
         cfg.opt2 = 'val'
     assert len(w) == 1
     assert w[0].message.opt == opt2
-    assert str(w[0].message) == _('invalid value for option {0}: {1}').format('opt2', 'error')
+    assert str(w[0].message) == msg_err.format('val', opt2._display_name, 'opt2', 'test error')
     #
     with warnings.catch_warnings(record=True) as w:
         cfg.opt3.append('val')
@@ -98,7 +109,7 @@ def test_validator_warning():
         cfg.opt3.append('val1')
     assert len(w) == 1
     assert w[0].message.opt == opt3
-    assert str(w[0].message) == _('invalid value for option {0}: {1}').format('opt3', 'error')
+    assert str(w[0].message) == msg_err.format('val1', opt3._display_name, 'opt3', 'test error')
     raises(ValueError, "cfg.opt2 = 1")
     #
     with warnings.catch_warnings(record=True) as w:
@@ -106,14 +117,48 @@ def test_validator_warning():
         cfg.opt3.append('val')
     assert len(w) == 2
     assert w[0].message.opt == opt2
-    assert str(w[0].message) == _('invalid value for option {0}: {1}').format('opt2', 'error')
+    assert str(w[0].message) == msg_err.format('val', opt2._display_name, 'opt2', 'test error')
     assert w[1].message.opt == opt3
-    assert str(w[1].message) == _('invalid value for option {0}: {1}').format('opt3', 'error')
+    assert str(w[0].message) == msg_err.format('val', opt2._display_name, 'opt2', 'test error')
+
+
+def test_validator_warning_disabled():
+    opt1 = StrOption('opt1', '', validator=return_true, default='val', warnings_only=True)
+    opt2 = StrOption('opt2', '', validator=return_false, warnings_only=True)
+    opt3 = StrOption('opt3', '', validator=return_if_val, multi=True, warnings_only=True)
+    root = OptionDescription('root', '', [opt1, opt2, opt3])
+    cfg = Config(root)
+    cfg.cfgimpl_get_settings().remove('warnings')
+    assert cfg.opt1 == 'val'
+    warnings.simplefilter("always", ValueWarning)
+    with warnings.catch_warnings(record=True) as w:
+        cfg.opt1 = 'val'
+    assert w == []
+    #
+    with warnings.catch_warnings(record=True) as w:
+        cfg.opt2 = 'val'
+    assert w == []
+    #
+    with warnings.catch_warnings(record=True) as w:
+        cfg.opt3.append('val')
+    assert w == []
+    #
+    with warnings.catch_warnings(record=True) as w:
+        cfg.opt3.append('val1')
+    assert w == []
+    raises(ValueError, "cfg.opt2 = 1")
+    #
+    with warnings.catch_warnings(record=True) as w:
+        cfg.opt2 = 'val'
+        cfg.opt3.append('val')
+    assert w == []
 
 
 def test_validator_warning_master_slave():
-    ip_admin_eth0 = StrOption('ip_admin_eth0', "ip reseau autorise", multi=True, validator=return_false, warnings_only=True)
-    netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-reseau", multi=True, validator=return_if_val, warnings_only=True)
+    display_name_ip = "ip reseau autorise"
+    display_name_netmask = "masque du sous-reseau"
+    ip_admin_eth0 = StrOption('ip_admin_eth0', display_name_ip, multi=True, validator=return_false, warnings_only=True)
+    netmask_admin_eth0 = StrOption('netmask_admin_eth0', display_name_netmask, multi=True, validator=return_if_val, warnings_only=True)
     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
     interface1.impl_set_group_type(groups.master)
     assert interface1.impl_get_group_type() == groups.master
@@ -128,29 +173,29 @@ def test_validator_warning_master_slave():
         cfg.ip_admin_eth0.netmask_admin_eth0 = ['val1']
     assert len(w) == 1
     assert w[0].message.opt == netmask_admin_eth0
-    assert str(w[0].message) == _('invalid value for option {0}: {1}').format('netmask_admin_eth0', 'error')
+    assert str(w[0].message) == msg_err.format('val1', netmask_admin_eth0._display_name, display_name_netmask, 'test error')
     #
     with warnings.catch_warnings(record=True) as w:
         cfg.ip_admin_eth0.ip_admin_eth0 = ['val']
     assert len(w) == 1
     assert w[0].message.opt == ip_admin_eth0
-    assert str(w[0].message) == _('invalid value for option {0}: {1}').format('ip_admin_eth0', 'error')
+    assert str(w[0].message) == msg_err.format('val', ip_admin_eth0._display_name, display_name_ip, 'test error')
     #
     with warnings.catch_warnings(record=True) as w:
         cfg.ip_admin_eth0.ip_admin_eth0 = ['val', 'val1', 'val1']
     assert len(w) == 1
     assert w[0].message.opt == ip_admin_eth0
-    assert str(w[0].message) == _('invalid value for option {0}: {1}').format('ip_admin_eth0', 'error')
+    assert str(w[0].message) == msg_err.format('val', ip_admin_eth0._display_name, display_name_ip, 'test error')
     #
     with warnings.catch_warnings(record=True) as w:
         cfg.ip_admin_eth0.ip_admin_eth0 = ['val1', 'val', 'val1']
     assert len(w) == 1
     assert w[0].message.opt == ip_admin_eth0
-    assert str(w[0].message) == _('invalid value for option {0}: {1}').format('ip_admin_eth0', 'error')
+    assert str(w[0].message) == msg_err.format('val', ip_admin_eth0._display_name, display_name_ip, 'test error')
     #
     warnings.resetwarnings()
     with warnings.catch_warnings(record=True) as w:
         cfg.ip_admin_eth0.ip_admin_eth0 = ['val1', 'val1', 'val']
     assert len(w) == 1
     assert w[0].message.opt == ip_admin_eth0
-    assert str(w[0].message) == _('invalid value for option {0}: {1}').format('ip_admin_eth0', 'error')
+    assert str(w[0].message) == msg_err.format('val', ip_admin_eth0._display_name, display_name_ip, 'test error')