diff --git a/test/new_api/test_symlink.py b/test/new_api/test_symlink.py new file mode 100644 index 0000000..7b5e468 --- /dev/null +++ b/test/new_api/test_symlink.py @@ -0,0 +1,164 @@ +# coding: utf-8 +from .autopath import do_autopath +do_autopath() + +from tiramisu import BoolOption, StrOption, SymLinkOption, \ + OptionDescription, MasterSlaves, Config, getapi +from tiramisu.error import PropertiesOptionError, ConfigError +from tiramisu.setting import groups, owners + +from py.test import raises + + +def return_value(): + pass + + +#____________________________________________________________ +def test_symlink_option(): + boolopt = BoolOption("b", "", default=False) + linkopt = SymLinkOption("c", boolopt) + descr = OptionDescription("opt", "", + [linkopt, OptionDescription("s1", "", [boolopt])]) + api = getapi(Config(descr)) + assert api.option('s1.b').value.get() is False + api.option("s1.b").value.set(True) + api.option("s1.b").value.set(False) + assert api.option('s1.b').value.get() is False + assert api.option('c').value.get() is False + api.option('s1.b').value.set(True) + assert api.option('s1.b').value.get() is True + assert api.option('c').value.get() is True + api.option('s1.b').value.set(False) + assert api.option('s1.b').value.get() is False + assert api.option('c').value.get() is False + + +def test_symlink_getproperties(): + boolopt = BoolOption('b', '', default=True, properties=('test',)) + linkopt = SymLinkOption("c", boolopt) + descr = OptionDescription('opt', '', [boolopt, linkopt]) + api = getapi(Config(descr)) + api.property.read_write() + assert boolopt.impl_getproperties() == linkopt.impl_getproperties() == {'test'} + assert boolopt.impl_has_callback() == linkopt.impl_has_callback() == False + + +def test_symlink_getcallback(): + boolopt = BoolOption('b', '', callback=return_value) + linkopt = SymLinkOption("c", boolopt) + descr = OptionDescription('opt', '', [boolopt, linkopt]) + api = getapi(Config(descr)) + api.property.read_write() + assert boolopt.impl_has_callback() == linkopt.impl_has_callback() == True + assert boolopt.impl_get_callback() == linkopt.impl_get_callback() == (return_value, {}) + + +def test_symlink_requires(): + boolopt = BoolOption('b', '', default=True) + stropt = StrOption('s', '', requires=[{'option': boolopt, + 'expected': False, + 'action': 'disabled'}]) + linkopt = SymLinkOption("c", stropt) + descr = OptionDescription('opt', '', [boolopt, stropt, linkopt]) + api = getapi(Config(descr)) + api.property.read_write() + assert api.option('b').value.get() is True + assert api.option('s').value.get() is None + assert api.option('c').value.get() is None + api.option('b').value.set(False) + # + props = [] + try: + api.option('s').value.get() + except PropertiesOptionError as err: + props = err.proptype + assert props == {'disabled'} + # + props = [] + try: + api.option('c').value.get() + except PropertiesOptionError as err: + props = err.proptype + assert props == {'disabled'} + + +def test_symlink_multi(): + boolopt = BoolOption("b", "", default=[False], multi=True) + linkopt = SymLinkOption("c", boolopt) + descr = OptionDescription("opt", "", + [linkopt, OptionDescription("s1", "", [boolopt])]) + api = getapi(Config(descr)) + assert api.option('s1.b').value.get() == [False] + assert api.option('c').value.get() == [False] + api.option('s1.b').value.set([True]) + assert api.option('s1.b').value.get() == [True] + assert api.option('c').value.get() == [True] + api.option('s1.b').value.set([False]) + assert api.option('s1.b').value.get() == [False] + assert api.option('c').value.get() == [False] + api.option('s1.b').value.set([False, True]) + assert api.option('s1.b').value.get() == [False, True] + assert api.option('c').value.get() == [False, True] + assert boolopt.impl_is_multi() is True + assert linkopt.impl_is_multi() is True + + +def test_symlink_assign(): + boolopt = BoolOption("b", "", default=False) + linkopt = SymLinkOption("c", boolopt) + descr = OptionDescription("opt", "", + [linkopt, OptionDescription("s1", "", [boolopt])]) + api = getapi(Config(descr)) + raises(ConfigError, "api.option('c').value.set(True)") + + +def test_symlink_owner(): + boolopt = BoolOption("b", "", default=False) + linkopt = SymLinkOption("c", boolopt) + descr = OptionDescription("opt", "", + [linkopt, OptionDescription("s1", "", [boolopt])]) + api = getapi(Config(descr)) + assert api.option('s1.b').owner.isdefault() + assert api.option('c').owner.isdefault() + api.option('s1.b').value.set(True) + assert not api.option('s1.b').owner.isdefault() + assert not api.option('c').owner.isdefault() + + +def test_symlink_get_information(): + boolopt = BoolOption("b", "", default=False) + linkopt = SymLinkOption("c", boolopt) + boolopt.impl_set_information('test', 'test') + assert boolopt.impl_get_information('test') == 'test' + assert linkopt.impl_get_information('test') == 'test' + boolopt.impl_set_information('test', 'test2') + assert boolopt.impl_get_information('test') == 'test2' + assert linkopt.impl_get_information('test') == 'test2' + + +def test_symlink_master(): + a = StrOption('a', "", multi=True) + ip_admin_eth0 = SymLinkOption('ip_admin_eth0', a) + netmask_admin_eth0 = StrOption('netmask_admin_eth0', "", multi=True) + raises(ValueError, "MasterSlaves('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])") + + +def test_symlink_slaves(): + a = StrOption('a', "", multi=True) + ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True) + netmask_admin_eth0 = SymLinkOption('netmask_admin_eth0', a) + raises(ValueError, "MasterSlaves('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])") + + +#____________________________________________________________ +def test_symlink_dependency(): + boolopt = BoolOption("b", "", default=False) + linkopt = SymLinkOption("c", boolopt) + descr = OptionDescription("opt", "", + [linkopt, OptionDescription("s1", "", [boolopt])]) + api = getapi(Config(descr)) + assert api.option('s1.b').option.has_dependency() is False + assert api.option('c').option.has_dependency() is True + assert api.option('s1.b').option.has_dependency(False) is True + assert api.option('c').option.has_dependency(False) is False diff --git a/tiramisu/config.py b/tiramisu/config.py index 9fe3413..6d7403b 100644 --- a/tiramisu/config.py +++ b/tiramisu/config.py @@ -291,9 +291,9 @@ class SubConfig(object): self) if config_bag.option.impl_is_optiondescription() or \ isinstance(config_bag.option, SynDynOptionDescription): - raise TypeError(_("can't assign to an OptionDescription")) # pragma: optional cover + raise ConfigError(_("can't assign to an OptionDescription")) # pragma: optional cover elif config_bag.option.impl_is_symlinkoption(): - raise TypeError(_("can't assign to a SymLinkOption")) + raise ConfigError(_("can't assign to a SymLinkOption")) else: path = self._get_subpath(name) if config_bag.setting_properties: