tiramisu/tests/test_dyn_optiondescription.py

1635 lines
86 KiB
Python

# coding: utf-8
from .autopath import do_autopath
do_autopath()
import pytest
from tiramisu.setting import groups, owners
from tiramisu import BoolOption, StrOption, ChoiceOption, IPOption, \
NetworkOption, NetmaskOption, IntOption, FloatOption, \
StrOption, PortOption, BroadcastOption, DomainnameOption, \
EmailOption, URLOption, UsernameOption, FilenameOption, SymLinkOption, \
OptionDescription, DynOptionDescription, SynDynOption, submulti, Leadership, \
Config, Params, ParamOption, ParamValue, ParamSuffix, ParamSelfOption, ParamIndex, Calculation, calc_value
from tiramisu.error import PropertiesOptionError, ConfigError, ConflictError
from tiramisu.storage import list_sessions
class ConvertDynOptionDescription(DynOptionDescription):
def convert_suffix_to_path(self, suffix):
# remove dot with is illegal
return suffix.replace('.', '')
def teardown_function(function):
assert list_sessions() == [], 'session list is not empty when leaving "{}"'.format(function.__name__)
def return_true(value, param=None, suffix=None):
if value == 'val' and param in [None, 'yes']:
return
raise ValueError('no value')
def return_dynval(value='val', suffix=None):
return value
def return_list2(suffix):
return [str(suffix), 'val2']
def return_list(val=None, suffix=None):
if val:
return val
else:
return ['val1', 'val2']
def return_list_dot(val=None, suffix=None):
return ['val.1', 'val.2']
def return_same_list(*args, **kwargs):
return ['val1', 'val1']
def return_wrong_list(*args, **kwargs):
return ['---', ' ']
def return_raise(suffix):
raise Exception('error')
def return_str(*args, **kwargs):
return 'str'
@pytest.mark.asyncio
async def test_build_dyndescription():
st1 = StrOption('st', '')
dod = DynOptionDescription('dod', '', [st1], suffixes=Calculation(return_list))
od1 = OptionDescription('od', '', [dod])
cfg = await Config(od1)
assert await cfg.value.dict() == {'dodval1.stval1': None, 'dodval2.stval2': None}
@pytest.mark.asyncio
async def test_build_dyndescription_raise():
st1 = StrOption('st', '')
dod = DynOptionDescription('dod', '', [st1], suffixes=Calculation(return_raise))
od1 = OptionDescription('od', '', [dod])
cfg = await Config(od1)
with pytest.raises(ConfigError):
await cfg.value.dict()
@pytest.mark.asyncio
async def test_build_dyndescription_not_list():
st1 = StrOption('st', '')
dod = DynOptionDescription('dod', '', [st1], suffixes=Calculation(return_str))
od1 = OptionDescription('od', '', [dod])
cfg = await Config(od1)
with pytest.raises(ValueError):
await cfg.value.dict()
@pytest.mark.asyncio
async def test_subpath_dyndescription():
st1 = StrOption('st', '')
dod = DynOptionDescription('dod', '', [st1], suffixes=Calculation(return_list))
od1 = OptionDescription('od', '', [dod])
od2 = OptionDescription('od', '', [od1])
cfg = await Config(od2)
assert await cfg.value.dict() == {'od.dodval1.stval1': None, 'od.dodval2.stval2': None}
@pytest.mark.asyncio
async def test_list_dyndescription():
st = StrOption('st', '')
dod = DynOptionDescription('dod', '', [st], suffixes=Calculation(return_list))
od = OptionDescription('od', '', [dod])
od2 = OptionDescription('od', '', [od])
cfg = await Config(od2)
assert await cfg.option('od.dodval1.stval1').value.get() is None
assert await cfg.option('od.dodval2.stval2').value.get() is None
@pytest.mark.asyncio
async def test_unknown_dyndescription():
st = StrOption('st', '')
dod = DynOptionDescription('dod', '', [st], suffixes=Calculation(return_list))
od = OptionDescription('od', '', [dod])
od2 = OptionDescription('od', '', [od])
cfg = await Config(od2)
with pytest.raises(AttributeError):
await cfg.option('od.dodval3').value.get()
with pytest.raises(AttributeError):
await cfg.option('od.dodval1.novalue').value.get()
with pytest.raises(AttributeError):
await cfg.option('od.dodval1.stnoval1').value.get()
@pytest.mark.asyncio
async def test_getdoc_dyndescription():
st1 = StrOption('st', 'doc1')
dod = DynOptionDescription('dod', 'doc2', [st1], suffixes=Calculation(return_list))
od1 = OptionDescription('od', '', [dod])
od2 = OptionDescription('od', '', [od1])
cfg = await Config(od2)
assert await cfg.option('od.dodval1.stval1').option.name() == 'stval1'
assert await cfg.option('od.dodval2.stval2').option.name() == 'stval2'
assert await cfg.option('od.dodval1').option.name() == 'dodval1'
assert await cfg.option('od.dodval2').option.name() == 'dodval2'
assert await cfg.option('od.dodval1.stval1').option.doc() == 'doc1'
assert await cfg.option('od.dodval2.stval2').option.doc() == 'doc1'
assert await cfg.option('od.dodval1').option.doc() == 'doc2val1'
assert await cfg.option('od.dodval2').option.doc() == 'doc2val2'
@pytest.mark.asyncio
async def test_mod_dyndescription():
st = StrOption('st', '')
dod = DynOptionDescription('dod', '', [st], suffixes=Calculation(return_list))
od = OptionDescription('od', '', [dod])
od2 = OptionDescription('od', '', [od])
cfg = await Config(od2)
owner = await cfg.owner.get()
#
assert await cfg.option('od.dodval1.stval1').value.get() is None
assert await cfg.option('od.dodval2.stval2').value.get() is None
assert await cfg.option('od.dodval1.stval1').owner.isdefault()
assert await cfg.option('od.dodval2.stval2').owner.isdefault()
#
await cfg.option('od.dodval1.stval1').value.set('yes')
assert await cfg.option('od.dodval1.stval1').value.get() == 'yes'
assert await cfg.option('od.dodval2.stval2').value.get() is None
assert await cfg.option('od.dodval1.stval1').owner.get() == owner
assert await cfg.option('od.dodval2.stval2').owner.isdefault()
#
await cfg.option('od.dodval2.stval2').value.set('no')
assert await cfg.option('od.dodval1.stval1').value.get() == 'yes'
assert await cfg.option('od.dodval2.stval2').value.get() == 'no'
assert await cfg.option('od.dodval1.stval1').owner.get() == owner
assert await cfg.option('od.dodval2.stval2').owner.get() == owner
@pytest.mark.asyncio
async def test_del_dyndescription():
st = StrOption('st', '')
dod = DynOptionDescription('dod', '', [st], suffixes=Calculation(return_list))
od = OptionDescription('od', '', [dod])
od2 = OptionDescription('od', '', [od])
cfg = await Config(od2)
owner = await cfg.owner.get()
assert await cfg.option('od.dodval1.stval1').value.get() is None
assert await cfg.option('od.dodval2.stval2').value.get() is None
await cfg.option('od.dodval1.stval1').value.set('yes')
assert await cfg.option('od.dodval1.stval1').owner.get() == owner
await cfg.option('od.dodval1.stval1').value.reset()
assert await cfg.option('od.dodval1.stval1').owner.isdefault()
@pytest.mark.asyncio
async def test_multi_dyndescription():
st = StrOption('st', '', multi=True)
dod = DynOptionDescription('dod', '', [st], suffixes=Calculation(return_list))
od = OptionDescription('od', '', [dod])
od2 = OptionDescription('od', '', [od])
cfg = await Config(od2)
owner = await cfg.owner.get()
assert await cfg.option('od.dodval1.stval1').value.get() == []
assert await cfg.option('od.dodval2.stval2').value.get() == []
assert await cfg.option('od.dodval1.stval1').owner.isdefault()
assert await cfg.option('od.dodval2.stval2').owner.isdefault()
await cfg.option('od.dodval1.stval1').value.set(['yes'])
assert await cfg.option('od.dodval1.stval1').value.get() == ['yes']
assert await cfg.option('od.dodval2.stval2').value.get() == []
assert await cfg.option('od.dodval1.stval1').owner.get() == owner
assert await cfg.option('od.dodval2.stval2').owner.isdefault()
await cfg.option('od.dodval2.stval2').value.set(['no'])
assert await cfg.option('od.dodval1.stval1').value.get() == ['yes']
assert await cfg.option('od.dodval2.stval2').value.get() == ['no']
assert await cfg.option('od.dodval1.stval1').owner.get() == owner
assert await cfg.option('od.dodval2.stval2').owner.get() == owner
await cfg.option('od.dodval1.stval1').value.set(['yes', 'no'])
assert await cfg.option('od.dodval1.stval1').value.get() == ['yes', 'no']
await cfg.option('od.dodval1.stval1').value.set(['yes'])
assert await cfg.option('od.dodval1.stval1').value.get() == ['yes']
@pytest.mark.asyncio
async def test_prop_dyndescription():
st = StrOption('st', '', properties=('test',))
dod = DynOptionDescription('dod', '', [st], suffixes=Calculation(return_list))
od = OptionDescription('od', '', [dod])
od2 = OptionDescription('od', '', [od])
cfg = await Config(od2)
assert set(await cfg.option('od.dodval1.stval1').property.get()) == set(['test'])
assert set(await cfg.option('od.dodval2.stval2').property.get()) == set(['test'])
await cfg.option('od.dodval2.stval2').property.add('test2')
assert set(await cfg.option('od.dodval1.stval1').property.get()) == set(['test'])
assert set(await cfg.option('od.dodval2.stval2').property.get()) == set(['test', 'test2'])
await cfg.option('od.dodval1.stval1').property.pop('test')
assert set(await cfg.option('od.dodval1.stval1').property.get()) == set([])
#
assert set(await cfg.option('od.dodval1').property.get()) == set([])
assert set(await cfg.option('od.dodval2').property.get()) == set([])
await cfg.option('od.dodval1').property.add('test1')
assert set(await cfg.option('od.dodval1').property.get()) == set(['test1'])
assert set(await cfg.option('od.dodval2').property.get()) == set([])
await cfg.option('od.dodval1').property.pop('test1')
assert set(await cfg.option('od.dodval1').property.get()) == set([])
assert set(await cfg.option('od.dodval2').property.get()) == set([])
@pytest.mark.asyncio
async def test_prop_dyndescription_force_store_value():
st = StrOption('st', '', properties=('force_store_value',))
dod = DynOptionDescription('dod', '', [st], suffixes=Calculation(return_list))
od = OptionDescription('od', '', [dod])
od2 = OptionDescription('od', '', [od])
with pytest.raises(ConfigError):
await Config(od2)
@pytest.mark.asyncio
async def test_callback_dyndescription():
st = StrOption('st', '', Calculation(return_dynval))
dod = DynOptionDescription('dod', '', [st], suffixes=Calculation(return_list))
od = OptionDescription('od', '', [dod])
od2 = OptionDescription('od', '', [od])
cfg = await Config(od2)
owner = await cfg.owner.get()
assert await cfg.option('od.dodval1.stval1').value.get() == 'val'
assert await cfg.option('od.dodval2.stval2').value.get() == 'val'
assert await cfg.option('od.dodval1.stval1').owner.isdefault()
assert await cfg.option('od.dodval2.stval2').owner.isdefault()
await cfg.option('od.dodval1.stval1').value.set('val2')
assert await cfg.option('od.dodval1.stval1').value.get() == 'val2'
assert await cfg.option('od.dodval2.stval2').value.get() == 'val'
assert await cfg.option('od.dodval1.stval1').owner.get() == owner
assert await cfg.option('od.dodval2.stval2').owner.isdefault()
await cfg.option('od.dodval1.stval1').value.reset()
assert await cfg.option('od.dodval1.stval1').value.get() == 'val'
assert await cfg.option('od.dodval2.stval2').value.get() == 'val'
assert await cfg.option('od.dodval1.stval1').owner.isdefault()
assert await cfg.option('od.dodval2.stval2').owner.isdefault()
@pytest.mark.asyncio
async def test_callback_list_dyndescription():
st = StrOption('st', '', Calculation(return_list2, Params(ParamSuffix())), multi=True, properties=('notunique',))
dod = DynOptionDescription('dod', '', [st], suffixes=Calculation(return_list))
od = OptionDescription('od', '', [dod])
od2 = OptionDescription('od', '', [od])
cfg = await Config(od2)
owner = await cfg.owner.get()
assert await cfg.option('od.dodval1.stval1').value.get() == ['val1', 'val2']
assert await cfg.option('od.dodval2.stval2').value.get() == ['val2', 'val2']
assert await cfg.option('od.dodval1.stval1').owner.isdefault()
assert await cfg.option('od.dodval2.stval2').owner.isdefault()
await cfg.option('od.dodval1.stval1').value.set(['val3', 'val2'])
assert await cfg.option('od.dodval1.stval1').value.get() == ['val3', 'val2']
assert await cfg.option('od.dodval2.stval2').value.get() == ['val2', 'val2']
assert await cfg.option('od.dodval1.stval1').owner.get() == owner
assert await cfg.option('od.dodval2.stval2').owner.isdefault()
@pytest.mark.asyncio
async def test_mandatory_dyndescription():
st = StrOption('st', '', properties=('mandatory',))
dod = DynOptionDescription('dod', '', [st], suffixes=Calculation(return_list))
od = OptionDescription('od', '', [dod])
od2 = OptionDescription('od', '', [od])
cfg = await Config(od2)
await cfg.property.read_only()
with pytest.raises(PropertiesOptionError):
await cfg.option('od.dodval1.stval1').value.get()
with pytest.raises(PropertiesOptionError):
await cfg.option('od.dodval2.stval2').value.get()
await cfg.property.read_write()
await cfg.option('od.dodval1.stval1').value.set('val')
await cfg.property.read_only()
assert await cfg.option('od.dodval1.stval1').value.get() == 'val'
with pytest.raises(PropertiesOptionError):
await cfg.option('od.dodval2.stval2').value.get()
await cfg.property.read_write()
await cfg.option('od.dodval1.stval1').value.reset()
await cfg.property.read_only()
with pytest.raises(PropertiesOptionError):
await cfg.option('od.dodval1.stval1').value.get()
assert list(await cfg.value.mandatory()) == ['od.dodval1.stval1', 'od.dodval2.stval2']
@pytest.mark.asyncio
async def test_build_dyndescription_context():
val1 = StrOption('val1', '', ['val1', 'val2'], multi=True)
st1 = StrOption('st', '')
dod = DynOptionDescription('dod', '', [st1], suffixes=Calculation(return_list, Params(ParamOption(val1))))
od1 = OptionDescription('od', '', [dod, val1])
cfg = await Config(od1)
assert await cfg.value.dict() == {'dodval1.stval1': None, 'dodval2.stval2': None, 'val1': ['val1', 'val2']}
@pytest.mark.asyncio
async def test_subpath_dyndescription_context():
val1 = StrOption('val1', '', ['val1', 'val2'], multi=True)
st1 = StrOption('st', '')
dod = DynOptionDescription('dod', '', [st1], suffixes=Calculation(return_list, Params(ParamOption(val1))))
od1 = OptionDescription('od', '', [dod, val1])
od2 = OptionDescription('od', '', [od1])
cfg = await Config(od2)
assert await cfg.value.dict() == {'od.dodval1.stval1': None, 'od.dodval2.stval2': None, 'od.val1': ['val1', 'val2']}
@pytest.mark.asyncio
async def test_list_dyndescription_context():
val1 = StrOption('val1', '', ['val1', 'val2'], multi=True)
st = StrOption('st', '')
dod = DynOptionDescription('dod', '', [st], suffixes=Calculation(return_list, Params(ParamOption(val1))))
od = OptionDescription('od', '', [dod, val1])
od2 = OptionDescription('od', '', [od])
cfg = await Config(od2)
assert await cfg.option('od.dodval1.stval1').value.get() is None
assert await cfg.option('od.dodval2.stval2').value.get() is None
with pytest.raises(AttributeError):
await cfg.option('od.dodval3').value.get()
@pytest.mark.asyncio
async def test_mod_dyndescription_context():
val1 = StrOption('val1', '', ['val1', 'val2'], multi=True)
st = StrOption('st', '')
dod = DynOptionDescription('dod', '', [st], suffixes=Calculation(return_list, Params(ParamOption(val1))))
od = OptionDescription('od', '', [dod, val1])
od2 = OptionDescription('od', '', [od])
cfg = await Config(od2)
owner = await cfg.owner.get()
assert await cfg.option('od.dodval1.stval1').value.get() is None
assert await cfg.option('od.dodval2.stval2').value.get() is None
assert await cfg.option('od.dodval1.stval1').owner.isdefault()
assert await cfg.option('od.dodval2.stval2').owner.isdefault()
await cfg.option('od.dodval1.stval1').value.set('yes')
assert await cfg.option('od.dodval1.stval1').value.get() == 'yes'
assert await cfg.option('od.dodval2.stval2').value.get() is None
assert await cfg.option('od.dodval1.stval1').owner.get() == owner
assert await cfg.option('od.dodval2.stval2').owner.isdefault()
await cfg.option('od.dodval2.stval2').value.set('no')
assert await cfg.option('od.dodval1.stval1').value.get() == 'yes'
assert await cfg.option('od.dodval2.stval2').value.get() == 'no'
assert await cfg.option('od.dodval1.stval1').owner.get() == owner
assert await cfg.option('od.dodval2.stval2').owner.get() == owner
@pytest.mark.asyncio
async def test_del_dyndescription_context():
val1 = StrOption('val1', '', ['val1', 'val2'], multi=True)
st = StrOption('st', '')
dod = DynOptionDescription('dod', '', [st], suffixes=Calculation(return_list, Params(ParamOption(val1))))
od = OptionDescription('od', '', [dod, val1])
od2 = OptionDescription('od', '', [od])
cfg = await Config(od2)
owner = await cfg.owner.get()
assert await cfg.option('od.dodval1.stval1').value.get() is None
assert await cfg.option('od.dodval2.stval2').value.get() is None
await cfg.option('od.dodval1.stval1').value.set('yes')
assert await cfg.option('od.dodval1.stval1').owner.get() == owner
await cfg.option('od.dodval1.stval1').value.reset()
assert await cfg.option('od.dodval1.stval1').owner.isdefault()
@pytest.mark.asyncio
async def test_multi_dyndescription_context():
val1 = StrOption('val1', '', ['val1', 'val2'], multi=True)
st = StrOption('st', '', multi=True, properties=('notunique',))
dod = DynOptionDescription('dod', '', [st], suffixes=Calculation(return_list, Params(ParamOption(val1))))
od = OptionDescription('od', '', [dod, val1])
od2 = OptionDescription('od', '', [od])
cfg = await Config(od2)
owner = await cfg.owner.get()
assert await cfg.option('od.dodval1.stval1').value.get() == []
assert await cfg.option('od.dodval2.stval2').value.get() == []
assert await cfg.option('od.dodval1.stval1').owner.isdefault()
assert await cfg.option('od.dodval2.stval2').owner.isdefault()
await cfg.option('od.dodval1.stval1').value.set(['yes'])
assert await cfg.option('od.dodval1.stval1').value.get() == ['yes']
assert await cfg.option('od.dodval2.stval2').value.get() == []
assert await cfg.option('od.dodval1.stval1').owner.get() == owner
assert await cfg.option('od.dodval2.stval2').owner.isdefault()
await cfg.option('od.dodval2.stval2').value.set(['no'])
assert await cfg.option('od.dodval1.stval1').value.get() == ['yes']
assert await cfg.option('od.dodval2.stval2').value.get() == ['no']
assert await cfg.option('od.dodval1.stval1').owner.get() == owner
assert await cfg.option('od.dodval2.stval2').owner.get() == owner
await cfg.option('od.dodval1.stval1').value.set(['yes', 'yes'])
assert await cfg.option('od.dodval1.stval1').value.get() == ['yes', 'yes']
await cfg.option('od.dodval1.stval1').value.set(['yes'])
assert await cfg.option('od.dodval1.stval1').value.get() == ['yes']
@pytest.mark.asyncio
async def test_prop_dyndescription_context():
val1 = StrOption('val1', '', ['val1', 'val2'], multi=True)
st = StrOption('st', '', properties=('test',))
dod = DynOptionDescription('dod', '', [st], suffixes=Calculation(return_list, Params(ParamOption(val1))))
od = OptionDescription('od', '', [dod, val1])
od2 = OptionDescription('od', '', [od])
cfg = await Config(od2)
assert set(await cfg.option('od.dodval1.stval1').property.get()) == set(['test'])
assert set(await cfg.option('od.dodval2.stval2').property.get()) == set(['test'])
await cfg.option('od.dodval2.stval2').property.add('test2')
assert set(await cfg.option('od.dodval1.stval1').property.get()) == set(['test'])
assert set(await cfg.option('od.dodval2.stval2').property.get()) == set(['test', 'test2'])
await cfg.option('od.dodval1.stval1').property.pop('test')
assert set(await cfg.option('od.dodval1.stval1').property.get()) == set([])
assert set(await cfg.option('od.dodval2.stval2').property.get()) == set(['test', 'test2'])
@pytest.mark.asyncio
async def test_callback_dyndescription_context():
val1 = StrOption('val1', '', ['val1', 'val2'], multi=True)
st = StrOption('st', '', Calculation(return_dynval))
dod = DynOptionDescription('dod', '', [st], suffixes=Calculation(return_list))
od = OptionDescription('od', '', [dod, val1])
od2 = OptionDescription('od', '', [od])
cfg = await Config(od2)
owner = await cfg.owner.get()
assert await cfg.option('od.dodval1.stval1').value.get() == 'val'
assert await cfg.option('od.dodval2.stval2').value.get() == 'val'
assert await cfg.option('od.dodval1.stval1').owner.isdefault()
assert await cfg.option('od.dodval2.stval2').owner.isdefault()
await cfg.option('od.dodval1.stval1').value.set('val2')
assert await cfg.option('od.dodval1.stval1').value.get() == 'val2'
assert await cfg.option('od.dodval2.stval2').value.get() == 'val'
assert await cfg.option('od.dodval1.stval1').owner.get() == owner
assert await cfg.option('od.dodval2.stval2').owner.isdefault()
await cfg.option('od.dodval1.stval1').value.reset()
assert await cfg.option('od.dodval1.stval1').value.get() == 'val'
assert await cfg.option('od.dodval2.stval2').value.get() == 'val'
assert await cfg.option('od.dodval1.stval1').owner.isdefault()
assert await cfg.option('od.dodval2.stval2').owner.isdefault()
@pytest.mark.asyncio
async def test_mandatory_dyndescription_context():
val1 = StrOption('val1', '', ['val1', 'val2'], multi=True)
st = StrOption('st', '', properties=('mandatory',))
dod = DynOptionDescription('dod', '', [st], suffixes=Calculation(return_list, Params(ParamOption(val1))))
od = OptionDescription('od', '', [dod, val1])
od2 = OptionDescription('od', '', [od])
cfg = await Config(od2)
await cfg.property.read_only()
with pytest.raises(PropertiesOptionError):
await cfg.option('od.dodval1.stval1').value.get()
with pytest.raises(PropertiesOptionError):
await cfg.option('od.dodval2.stval2').value.get()
await cfg.property.read_write()
await cfg.option('od.dodval1.stval1').value.set('val')
await cfg.property.read_only()
assert await cfg.option('od.dodval1.stval1').value.get() == 'val'
with pytest.raises(PropertiesOptionError):
await cfg.option('od.dodval2.stval2').value.get()
await cfg.property.read_write()
await cfg.option('od.dodval1.stval1').value.reset()
await cfg.property.read_only()
with pytest.raises(PropertiesOptionError):
await cfg.option('od.dodval1.stval1').value.get()
assert list(await cfg.value.mandatory()) == ['od.dodval1.stval1', 'od.dodval2.stval2']
@pytest.mark.asyncio
async def test_increase_dyndescription_context():
val1 = StrOption('val1', '', ['val1', 'val2'], multi=True)
st = StrOption('st', '', properties=('mandatory',))
dod = DynOptionDescription('dod', '', [st], suffixes=Calculation(return_list, Params(ParamOption(val1))))
od = OptionDescription('od', '', [dod, val1])
od2 = OptionDescription('od', '', [od])
cfg = await Config(od2)
await cfg.property.read_write()
assert await cfg.option('od.dodval1.stval1').value.get() is None
assert await cfg.option('od.dodval2.stval2').value.get() is None
with pytest.raises(AttributeError):
await cfg.option('od.dodval3.stval3').value.get()
await cfg.option('od.val1').value.set(['val1', 'val2', 'val3'])
assert await cfg.option('od.dodval1.stval1').value.get() is None
assert await cfg.option('od.dodval2.stval2').value.get() is None
assert await cfg.option('od.dodval3.stval3').value.get() is None
@pytest.mark.asyncio
async def test_decrease_dyndescription_context():
val1 = StrOption('val1', '', ['val1', 'val2'], multi=True)
st = StrOption('st', '', properties=('mandatory',))
dod = DynOptionDescription('dod', '', [st], suffixes=Calculation(return_list, Params(ParamOption(val1))))
od = OptionDescription('od', '', [dod, val1])
od2 = OptionDescription('od', '', [od])
cfg = await Config(od2)
owner = await cfg.owner.get()
await cfg.property.read_write()
assert await cfg.option('od.dodval1.stval1').value.get() is None
assert await cfg.option('od.dodval2.stval2').value.get() is None
await cfg.option('od.dodval2.stval2').value.set('yes')
assert await cfg.option('od.dodval1.stval1').value.get() is None
assert await cfg.option('od.dodval2.stval2').value.get() == 'yes'
assert await cfg.option('od.dodval1.stval1').owner.isdefault()
assert await cfg.option('od.dodval2.stval2').owner.get() == owner
with pytest.raises(AttributeError):
await cfg.option('od.dodval3').value.get()
await cfg.option('od.val1').value.set(['val1'])
assert await cfg.option('od.dodval1.stval1').value.get() is None
with pytest.raises(AttributeError):
await cfg.option('od.dodval2').value.get()
with pytest.raises(AttributeError):
await cfg.option('od.dodval3').value.get()
assert await cfg.option('od.dodval1.stval1').owner.isdefault()
with pytest.raises(AttributeError):
await cfg.option('od.dodval2.stval2').owner.get()
with pytest.raises(AttributeError):
await cfg.option('od.dodval2.stval2').value.get()
@pytest.mark.asyncio
async def test_dyndescription_root():
boolean = BoolOption('boolean', '', True)
disabled_property = Calculation(calc_value,
Params(ParamValue('disabled'),
kwargs={'condition': ParamOption(boolean),
'expected': ParamValue(False),
'default': ParamValue(None)}))
st1 = StrOption('st', '', properties=(disabled_property,))
dod = DynOptionDescription('dod', '', [boolean, st1], suffixes=Calculation(return_list))
with pytest.raises(ConfigError):
await Config(dod)
@pytest.mark.asyncio
async def test_requires_dyndescription():
boolean = BoolOption('boolean', '', True)
disabled_property = Calculation(calc_value,
Params(ParamValue('disabled'),
kwargs={'condition': ParamOption(boolean, raisepropertyerror=True),
'expected': ParamValue(False),
'default': ParamValue(None)}))
st1 = StrOption('st', '', properties=(disabled_property,))
dod = DynOptionDescription('dod', '', [st1], suffixes=Calculation(return_list))
od1 = OptionDescription('od', '', [dod])
od2 = OptionDescription('od', '', [od1, boolean])
cfg = await Config(od2)
await cfg.property.read_write()
assert await cfg.option('od.dodval1.stval1').value.get() is None
assert await cfg.option('od.dodval2.stval2').value.get() is None
#
await cfg.option('boolean').value.set(False)
props = []
try:
await cfg.option('od.dodval1.stval1').value.get()
except PropertiesOptionError as err:
props = err.proptype
assert frozenset(props) == frozenset(['disabled'])
props = []
try:
await cfg.option('od.dodval2.stval2').value.get()
except PropertiesOptionError as err:
props = err.proptype
assert frozenset(props) == frozenset(['disabled'])
#
await cfg.option('boolean').value.set(True)
assert await cfg.option('od.dodval1.stval1').value.get() is None
assert await cfg.option('od.dodval2.stval2').value.get() is None
#transitive
await cfg.option('boolean').property.add('disabled')
props = []
try:
await cfg.option('od.dodval1.stval1').value.get()
except PropertiesOptionError as err:
props = err.proptype
assert frozenset(props) == frozenset(['disabled'])
props = []
try:
await cfg.option('od.dodval2.stval2').value.get()
except PropertiesOptionError as err:
props = err.proptype
assert frozenset(props) == frozenset(['disabled'])
@pytest.mark.asyncio
async def test_requires_dyndescription_boolean():
boolean1 = BoolOption('boolean1', '', True)
disabled_property = Calculation(calc_value,
Params(ParamValue('disabled'),
kwargs={'condition': ParamOption(boolean1, raisepropertyerror=True),
'expected': ParamValue(False),
'default': ParamValue(None)}))
boolean = BoolOption('boolean', '', True, properties=(disabled_property,))
disabled_property = Calculation(calc_value,
Params(ParamValue('disabled'),
kwargs={'condition': ParamOption(boolean, raisepropertyerror=True),
'expected': ParamValue(False),
'default': ParamValue(None)}))
st = StrOption('st', '', properties=(disabled_property,))
dod = DynOptionDescription('dod', '', [st], suffixes=Calculation(return_list))
od = OptionDescription('od', '', [dod])
od2 = OptionDescription('od', '', [od, boolean1, boolean])
cfg = await Config(od2)
await cfg.property.read_write()
assert await cfg.value.dict() == {'boolean1': True,
'boolean': True,
'od.dodval1.stval1': None,
'od.dodval2.stval2': None}
#
await cfg.option('boolean').value.set(False)
assert await cfg.value.dict() == {'boolean1': True,
'boolean': False}
#
await cfg.option('boolean').value.set(True)
assert await cfg.value.dict() == {'boolean1': True,
'boolean': True,
'od.dodval1.stval1': None,
'od.dodval2.stval2': None}
#
await cfg.option('boolean1').value.set(False)
assert await cfg.value.dict() == {'boolean1': False}
@pytest.mark.asyncio
async def test_requires_dyndescription_in_dyn():
boolean = BoolOption('boolean', '', True)
disabled_property = Calculation(calc_value,
Params(ParamValue('disabled'),
kwargs={'condition': ParamOption(boolean, raisepropertyerror=True),
'expected': ParamValue(False),
'default': ParamValue(None)}))
st = StrOption('st', '', properties=(disabled_property,))
dod = DynOptionDescription('dod', '', [boolean, st], suffixes=Calculation(return_list))
od = OptionDescription('od', '', [dod])
od2 = OptionDescription('od', '', [od])
cfg = await Config(od2)
await cfg.property.read_write()
assert await cfg.option('od.dodval1.stval1').value.get() is None
assert await cfg.option('od.dodval2.stval2').value.get() is None
#
await cfg.option('od.dodval1.booleanval1').value.set(False)
props = []
try:
await cfg.option('od.dodval1.stval1').value.get()
except PropertiesOptionError as err:
props = err.proptype
assert props == frozenset(['disabled'])
props = []
await cfg.option('od.dodval2.stval2').value.get()
#
await cfg.option('od.dodval1.booleanval1').value.set(True)
assert await cfg.option('od.dodval1.stval1').value.get() is None
assert await cfg.option('od.dodval2.stval2').value.get() is None
@pytest.mark.asyncio
async def test_requires_dyndescription2():
boolean = BoolOption('boolean', '', True)
st1 = StrOption('st', '')
disabled_property = Calculation(calc_value,
Params(ParamValue('disabled'),
kwargs={'condition': ParamOption(boolean, raisepropertyerror=True),
'expected': ParamValue(False),
'default': ParamValue(None)}))
dod = DynOptionDescription('dod', '', [st1], suffixes=Calculation(return_list), properties=(disabled_property,))
od1 = OptionDescription('od', '', [dod])
od2 = OptionDescription('od', '', [od1, boolean])
cfg = await Config(od2)
await cfg.property.read_write()
assert await cfg.option('od.dodval1.stval1').value.get() is None
assert await cfg.option('od.dodval2.stval2').value.get() is None
#
await cfg.option('boolean').value.set(False)
props = []
try:
await cfg.option('od.dodval1.stval1').value.get()
except PropertiesOptionError as err:
props = err.proptype
assert frozenset(props) == frozenset(['disabled'])
props = []
try:
await cfg.option('od.dodval2.stval2').value.get()
except PropertiesOptionError as err:
props = err.proptype
assert frozenset(props) == frozenset(['disabled'])
#
await cfg.option('boolean').value.set(True)
assert await cfg.option('od.dodval1.stval1').value.get() is None
assert await cfg.option('od.dodval2.stval2').value.get() is None
#transitive
await cfg.option('boolean').property.add('disabled')
props = []
try:
await cfg.option('od.dodval1.stval1').value.get()
except PropertiesOptionError as err:
props = err.proptype
assert frozenset(props) == frozenset(['disabled'])
props = []
try:
await cfg.option('od.dodval2.stval2').value.get()
except PropertiesOptionError as err:
props = err.proptype
assert frozenset(props) == frozenset(['disabled'])
@pytest.mark.asyncio
async def test_validator_dyndescription():
val1 = StrOption('val1', '', ['val1', 'val2'], multi=True)
st = StrOption('st', '', validators=[Calculation(return_true, Params((ParamSelfOption(), ParamValue('yes'))))], default='val')
dod = DynOptionDescription('dod', '', [st], suffixes=Calculation(return_list))
od = OptionDescription('od', '', [dod, val1])
od2 = OptionDescription('od', '', [od])
cfg = await Config(od2)
assert await cfg.option('od.dodval1.stval1').value.get() == 'val'
with pytest.raises(ValueError):
await cfg.option('od.dodval1.stval1').value.set('no')
await cfg.option('od.dodval1.stval1').value.set('val')
@pytest.mark.asyncio
async def test_makedict_dyndescription_context():
val1 = StrOption('val1', '', ['val1', 'val2'], multi=True)
st = StrOption('st', '')
dod = DynOptionDescription('dod', '', [st], suffixes=Calculation(return_list))
od = OptionDescription('od', '', [dod, val1])
od2 = OptionDescription('od', '', [od])
cfg = await Config(od2)
await cfg.option('od.dodval1.stval1').value.set('yes')
assert await cfg.value.dict() == {'od.val1': ['val1', 'val2'], 'od.dodval1.stval1': 'yes', 'od.dodval2.stval2': None}
assert await cfg.value.dict(flatten=True) == {'val1': ['val1', 'val2'], 'stval1': 'yes', 'stval2': None}
@pytest.mark.asyncio
async def test_find_dyndescription_context():
val1 = StrOption('val1', '', ['val1', 'val2'], multi=True)
st = StrOption('st', '')
dod = DynOptionDescription('dod', '', [st], suffixes=Calculation(return_list))
od = OptionDescription('od', '', [dod, val1])
od2 = OptionDescription('od', '', [od])
cfg = await Config(od2)
await cfg.option('od.dodval1.stval1').value.set('yes')
ret = await cfg.option.find('stval1', first=True)
assert await ret.value.get() == "yes"
ret = await cfg.option.find('stval1', first=True)
assert isinstance(await ret.option.get(), SynDynOption)
#assert await cfg.option.find(bytype=StrOption, type='path') == ['od.dodval1.stval1', 'od.dodval2.stval2', 'od.val1']
#opts = await cfg.option.find(byvalue='yes')
#assert len(opts) == 1
#assert isinstance(opts[0], SynDynOption)
#assert opts[0].impl_getname() == 'stval1'
with pytest.raises(AttributeError):
list(await cfg.option.find('strnotexists'))
@pytest.mark.asyncio
async def test_information_dyndescription_context():
val1 = StrOption('val1', '', ['val1', 'val2'], multi=True)
st = StrOption('st', '')
dod = DynOptionDescription('dod', '', [st], suffixes=Calculation(return_list))
od = OptionDescription('od', '', [dod, val1])
od2 = OptionDescription('od', '', [od])
dod.impl_set_information('testod', 'val1')
st.impl_set_information('testst', 'val2')
cfg = await Config(od2)
await cfg.information.set('testcfgod', 'val3')
assert await cfg.option('od.dodval1').information.get('testod') == 'val1'
assert await cfg.option('od.dodval2').information.get('testod') == 'val1'
assert await cfg.option('od.dodval1.stval1').information.get('testst') == 'val2'
assert await cfg.option('od.dodval2.stval2').information.get('testst') == 'val2'
assert await cfg.information.get('testcfgod') == 'val3'
@pytest.mark.asyncio
async def test_all_dyndescription():
st = StrOption('st', '')
ip = IPOption('ip', '')
network = NetworkOption('network', '')
netmask = NetmaskOption('netmask', '')
ch = ChoiceOption('ch', '', ('val1', 'val2', 'val3'))
ch1 = ChoiceOption('ch1', '', Calculation(return_list))
boo = BoolOption('boo', '')
intr = IntOption('intr', '')
floa = FloatOption('floa', '')
uni = StrOption('uni', '')
port = PortOption('port', '')
broad = BroadcastOption('broad', '')
domain = DomainnameOption('domain', '')
email = EmailOption('email', '')
url = URLOption('url', '')
username = UsernameOption('username', '')
filename = FilenameOption('filename', '')
dod = DynOptionDescription('dod', '', [st, ip, network, netmask, ch, ch1,
boo, intr, floa, uni, port, broad,
domain, email, url, username,
filename], suffixes=Calculation(return_list))
od = OptionDescription('od', '', [dod])
cfg = await Config(od)
assert await cfg.option('dodval1.stval1').value.get() is None
assert await cfg.option('dodval1.ipval1').value.get() is None
assert await cfg.option('dodval1.networkval1').value.get() is None
assert await cfg.option('dodval1.netmaskval1').value.get() is None
assert await cfg.option('dodval1.chval1').value.get() is None
assert await cfg.option('dodval1.ch1val1').value.get() is None
assert await cfg.option('dodval1.booval1').value.get() is None
assert await cfg.option('dodval1.intrval1').value.get() is None
assert await cfg.option('dodval1.floaval1').value.get() is None
assert await cfg.option('dodval1.unival1').value.get() is None
assert await cfg.option('dodval1.portval1').value.get() is None
assert await cfg.option('dodval1.broadval1').value.get() is None
assert await cfg.option('dodval1.domainval1').value.get() is None
assert await cfg.option('dodval1.emailval1').value.get() is None
assert await cfg.option('dodval1.urlval1').value.get() is None
assert await cfg.option('dodval1.usernameval1').value.get() is None
assert await cfg.option('dodval1.filenameval1').value.get() is None
#
await cfg.option('dodval1.stval1').value.set("no")
await cfg.option('dodval1.ipval1').value.set("1.1.1.1")
await cfg.option('dodval1.networkval1').value.set("1.1.1.0")
await cfg.option('dodval1.netmaskval1').value.set("255.255.255.0")
await cfg.option('dodval1.chval1').value.set("val1")
await cfg.option('dodval1.ch1val1').value.set("val2")
await cfg.option('dodval1.booval1').value.set(True)
await cfg.option('dodval1.intrval1').value.set(1)
await cfg.option('dodval1.floaval1').value.set(0.1)
await cfg.option('dodval1.unival1').value.set(u"no")
await cfg.option('dodval1.portval1').value.set('80')
await cfg.option('dodval1.broadval1').value.set("1.1.1.255")
await cfg.option('dodval1.domainval1').value.set("test.com")
await cfg.option('dodval1.emailval1').value.set("test@test.com")
await cfg.option('dodval1.urlval1').value.set("http://test.com")
await cfg.option('dodval1.usernameval1').value.set("user1")
await cfg.option('dodval1.filenameval1').value.set("/tmp")
assert await cfg.option('dodval1.stval1').value.get() == "no"
assert await cfg.option('dodval1.ipval1').value.get() == "1.1.1.1"
assert await cfg.option('dodval1.networkval1').value.get() == "1.1.1.0"
assert await cfg.option('dodval1.netmaskval1').value.get() == "255.255.255.0"
assert await cfg.option('dodval1.chval1').value.get() == "val1"
assert await cfg.option('dodval1.ch1val1').value.get() == "val2"
assert await cfg.option('dodval1.booval1').value.get() is True
assert await cfg.option('dodval1.intrval1').value.get() == 1
assert await cfg.option('dodval1.floaval1').value.get() == 0.1
assert await cfg.option('dodval1.unival1').value.get() == u"no"
assert await cfg.option('dodval1.portval1').value.get() == '80'
assert await cfg.option('dodval1.broadval1').value.get() == "1.1.1.255"
assert await cfg.option('dodval1.domainval1').value.get() == "test.com"
assert await cfg.option('dodval1.emailval1').value.get() == "test@test.com"
assert await cfg.option('dodval1.urlval1').value.get() == "http://test.com"
assert await cfg.option('dodval1.usernameval1').value.get() == "user1"
assert await cfg.option('dodval1.filenameval1').value.get() == "/tmp"
assert await cfg.option('dodval2.stval2').value.get() is None
assert await cfg.option('dodval2.ipval2').value.get() is None
assert await cfg.option('dodval2.networkval2').value.get() is None
assert await cfg.option('dodval2.netmaskval2').value.get() is None
assert await cfg.option('dodval2.chval2').value.get() is None
assert await cfg.option('dodval2.ch1val2').value.get() is None
assert await cfg.option('dodval2.booval2').value.get() is None
assert await cfg.option('dodval2.intrval2').value.get() is None
assert await cfg.option('dodval2.floaval2').value.get() is None
assert await cfg.option('dodval2.unival2').value.get() is None
assert await cfg.option('dodval2.portval2').value.get() is None
assert await cfg.option('dodval2.broadval2').value.get() is None
assert await cfg.option('dodval2.domainval2').value.get() is None
assert await cfg.option('dodval2.emailval2').value.get() is None
assert await cfg.option('dodval2.urlval2').value.get() is None
assert await cfg.option('dodval2.usernameval2').value.get() is None
assert await cfg.option('dodval2.filenameval2').value.get() is None
@pytest.mark.asyncio
async def test_leadership_dyndescription():
st1 = StrOption('st1', "", multi=True)
st2 = StrOption('st2', "", multi=True)
stm = Leadership('st1', '', [st1, st2])
st = DynOptionDescription('st', '', [stm], suffixes=Calculation(return_list))
od = OptionDescription('od', '', [st])
od2 = OptionDescription('od', '', [od])
cfg = await Config(od2)
owner = await cfg.owner.get()
#
assert await cfg.value.dict() == {'od.stval1.st1val1.st2val1': [], 'od.stval2.st1val2.st2val2': [], 'od.stval2.st1val2.st1val2': [], 'od.stval1.st1val1.st1val1': []}
assert await cfg.option('od.stval1.st1val1.st1val1').value.get() == []
assert await cfg.option('od.stval2.st1val2.st1val2').value.get() == []
assert await cfg.option('od.stval1.st1val1.st1val1').owner.isdefault()
assert await cfg.option('od.stval2.st1val2.st1val2').owner.isdefault()
#
await cfg.option('od.stval1.st1val1.st1val1').value.set(['yes'])
assert await cfg.value.dict() == {'od.stval1.st1val1.st2val1': [None], 'od.stval2.st1val2.st2val2': [], 'od.stval2.st1val2.st1val2': [], 'od.stval1.st1val1.st1val1': ['yes']}
assert await cfg.option('od.stval1.st1val1.st1val1').value.get() == ['yes']
assert await cfg.option('od.stval1.st1val1.st2val1', 0).value.get() == None
assert await cfg.option('od.stval2.st1val2.st1val2').value.get() == []
assert await cfg.option('od.stval1.st1val1.st1val1').owner.get() == owner
assert await cfg.option('od.stval1.st1val1.st2val1', 0).owner.isdefault()
assert await cfg.option('od.stval2.st1val2.st1val2').owner.isdefault()
#
await cfg.option('od.stval1.st1val1.st2val1', 0).value.set('no')
assert await cfg.option('od.stval1.st1val1.st1val1').value.get() == ['yes']
assert await cfg.option('od.stval1.st1val1.st2val1', 0).value.get() == 'no'
assert await cfg.option('od.stval2.st1val2.st1val2').value.get() == []
assert await cfg.option('od.stval1.st1val1.st1val1').owner.get() == owner
assert await cfg.option('od.stval1.st1val1.st2val1', 0).owner.get() == owner
assert await cfg.option('od.stval2.st1val2.st1val2').owner.isdefault()
#
await cfg.option('od.stval1.st1val1.st1val1').value.pop(0)
assert await cfg.option('od.stval1.st1val1.st1val1').value.get() == []
assert await cfg.option('od.stval2.st1val2.st1val2').value.get() == []
assert await cfg.option('od.stval1.st1val1.st1val1').owner.get() == owner
assert await cfg.option('od.stval2.st1val2.st1val2').owner.isdefault()
#
await cfg.option('od.stval1.st1val1.st1val1').value.set(['yes'])
await cfg.option('od.stval1.st1val1.st2val1', 0).value.set('yes')
assert await cfg.option('od.stval1.st1val1.st1val1').owner.get() == owner
assert await cfg.option('od.stval1.st1val1.st2val1', 0).owner.get() == owner
assert await cfg.option('od.stval2.st1val2.st1val2').owner.isdefault()
assert await cfg.option('od.stval1.st1val1.st1val1').owner.get() == owner
await cfg.option('od.stval1.st1val1.st2val1', 0).value.reset()
assert await cfg.option('od.stval1.st1val1.st1val1').owner.get() == owner
assert await cfg.option('od.stval1.st1val1.st2val1', 0).owner.isdefault()
#
await cfg.option('od.stval1.st1val1.st1val1').value.set(['yes'])
await cfg.option('od.stval1.st1val1.st2val1', 0).value.set('yes')
await cfg.option('od.stval1.st1val1.st1val1').value.reset()
assert await cfg.option('od.stval1.st1val1.st1val1').value.get() == []
assert await cfg.option('od.stval2.st1val2.st1val2').value.get() == []
assert await cfg.option('od.stval1.st1val1.st1val1').owner.isdefault()
assert await cfg.option('od.stval2.st1val2.st1val2').owner.isdefault()
@pytest.mark.asyncio
async def test_leadership_default_multi_dyndescription():
st1 = StrOption('st1', "", multi=True)
st2 = StrOption('st2', "", multi=True, default_multi='no')
stm = Leadership('st1', '', [st1, st2])
st = DynOptionDescription('st', '', [stm], suffixes=Calculation(return_list))
od = OptionDescription('od', '', [st])
od2 = OptionDescription('od', '', [od])
cfg = await Config(od2)
owner = await cfg.owner.get()
#
assert await cfg.option('od.stval1.st1val1.st1val1').value.get() == []
assert await cfg.option('od.stval2.st1val2.st1val2').value.get() == []
assert await cfg.option('od.stval1.st1val1.st1val1').owner.isdefault()
assert await cfg.option('od.stval2.st1val2.st1val2').owner.isdefault()
#
await cfg.option('od.stval1.st1val1.st1val1').value.set(['yes'])
assert await cfg.option('od.stval1.st1val1.st1val1').value.get() == ['yes']
assert await cfg.option('od.stval1.st1val1.st2val1', 0).value.get() == 'no'
assert await cfg.option('od.stval2.st1val2.st1val2').value.get() == []
assert await cfg.option('od.stval1.st1val1.st1val1').owner.get() == owner
assert await cfg.option('od.stval1.st1val1.st2val1', 0).owner.isdefault()
assert await cfg.option('od.stval2.st1val2.st1val2').owner.isdefault()
@pytest.mark.asyncio
async def test_leadership_dyndescription_param():
val1 = StrOption('val1', '', ['val1', 'val2'], multi=True)
odval = OptionDescription('odval1', '', [val1])
st1 = StrOption('st1', "", multi=True)
st2 = StrOption('st2', "", multi=True)
stm = Leadership('st1', '', [st1, st2])
st = DynOptionDescription('st', '', [stm], suffixes=Calculation(return_list, Params(ParamOption(val1))))
od = OptionDescription('od', '', [st, odval])
od2 = OptionDescription('od', '', [od])
cfg = await Config(od2)
owner = await cfg.owner.get()
assert await cfg.value.dict() == {'od.stval1.st1val1.st2val1': [], 'od.stval2.st1val2.st2val2': [], 'od.stval2.st1val2.st1val2': [], 'od.stval1.st1val1.st1val1': [], 'od.odval1.val1': ['val1', 'val2']}
assert await cfg.option('od.stval1.st1val1.st1val1').value.get() == []
assert await cfg.option('od.stval2.st1val2.st1val2').value.get() == []
assert await cfg.option('od.stval1.st1val1.st1val1').owner.get() == owners.default
assert await cfg.option('od.stval2.st1val2.st1val2').owner.get() == owners.default
#
await cfg.option('od.stval1.st1val1.st1val1').value.set(['yes'])
assert await cfg.value.dict() == {'od.stval1.st1val1.st2val1': [None], 'od.stval2.st1val2.st2val2': [], 'od.stval2.st1val2.st1val2': [], 'od.stval1.st1val1.st1val1': ['yes'], 'od.odval1.val1': ['val1', 'val2']}
assert await cfg.option('od.stval1.st1val1.st1val1').value.get() == ['yes']
assert await cfg.option('od.stval1.st1val1.st2val1', 0).value.get() == None
assert await cfg.option('od.stval2.st1val2.st1val2').value.get() == []
assert await cfg.option('od.stval1.st1val1.st1val1').owner.get() == owner
assert await cfg.option('od.stval1.st1val1.st2val1', 0).owner.get() == owners.default
assert await cfg.option('od.stval2.st1val2.st1val2').owner.get() == owners.default
#
await cfg.option('od.stval1.st1val1.st2val1', 0).value.set('no')
assert await cfg.option('od.stval1.st1val1.st1val1').value.get() == ['yes']
assert await cfg.option('od.stval1.st1val1.st2val1', 0).value.get() == 'no'
assert await cfg.option('od.stval2.st1val2.st1val2').value.get() == []
assert await cfg.option('od.stval1.st1val1.st1val1').owner.get() == owner
assert await cfg.option('od.stval1.st1val1.st2val1', 0).owner.get() == owner
assert await cfg.option('od.stval2.st1val2.st1val2').owner.get() == owners.default
#
await cfg.option('od.stval1.st1val1.st1val1').value.pop(0)
assert await cfg.option('od.stval1.st1val1.st1val1').value.get() == []
assert await cfg.option('od.stval2.st1val2.st1val2').value.get() == []
assert await cfg.option('od.stval1.st1val1.st1val1').owner.get() == owner
assert await cfg.option('od.stval2.st1val2.st1val2').owner.get() == owners.default
#
await cfg.option('od.stval1.st1val1.st1val1').value.set(['yes'])
await cfg.option('od.stval1.st1val1.st2val1', 0).value.set('yes')
assert await cfg.option('od.stval1.st1val1.st1val1').owner.get() == owner
assert await cfg.option('od.stval1.st1val1.st2val1', 0).owner.get() == owner
assert await cfg.option('od.stval2.st1val2.st1val2').owner.get() == owners.default
#
await cfg.option('od.stval1.st1val1.st2val1', 0).value.reset()
assert await cfg.option('od.stval1.st1val1.st1val1').owner.get() == owner
assert await cfg.option('od.stval1.st1val1.st2val1', 0).owner.get() == owners.default
assert await cfg.option('od.stval2.st1val2.st1val2').owner.get() == owners.default
#
await cfg.option('od.stval1.st1val1.st1val1').value.set(['yes'])
await cfg.option('od.stval1.st1val1.st2val1', 0).value.set('yes')
await cfg.option('od.stval1.st1val1.st1val1').value.reset()
assert await cfg.option('od.stval1.st1val1.st1val1').value.get() == []
assert await cfg.option('od.stval2.st1val2.st1val2').value.get() == []
assert await cfg.option('od.stval1.st1val1.st1val1').owner.get() == owners.default
assert await cfg.option('od.stval2.st1val2.st1val2').owner.get() == owners.default
@pytest.mark.asyncio
async def test_leadership_default_multi_dyndescription():
st1 = StrOption('st1', "", multi=True)
st2 = StrOption('st2', "", multi=True, default_multi='no')
stm = Leadership('st1', '', [st1, st2])
st = DynOptionDescription('st', '', [stm], suffixes=Calculation(return_list))
od = OptionDescription('od', '', [st])
od2 = OptionDescription('od', '', [od])
cfg = await Config(od2)
owner = await cfg.owner.get()
#
assert await cfg.option('od.stval1.st1val1.st1val1').value.get() == []
assert await cfg.option('od.stval2.st1val2.st1val2').value.get() == []
assert await cfg.option('od.stval1.st1val1.st1val1').owner.isdefault()
assert await cfg.option('od.stval2.st1val2.st1val2').owner.isdefault()
#
await cfg.option('od.stval1.st1val1.st1val1').value.set(['yes'])
assert await cfg.option('od.stval1.st1val1.st1val1').value.get() == ['yes']
assert await cfg.option('od.stval1.st1val1.st2val1', 0).value.get() == 'no'
assert await cfg.option('od.stval2.st1val2.st1val2').value.get() == []
assert await cfg.option('od.stval1.st1val1.st1val1').owner.get() == owner
assert await cfg.option('od.stval1.st1val1.st2val1', 0).owner.isdefault()
assert await cfg.option('od.stval2.st1val2.st1val2').owner.isdefault()
async def _test_leadership(cfg):
owner = await cfg.owner.get()
await cfg.option('od.val1.val1').value.set(['val1', 'val2'])
await cfg.option('od.val1.val2', 0).value.set('val1')
await cfg.option('od.val1.val2', 1).value.set('val2')
assert await cfg.value.dict() == {'od.stval1.st1val1.st2val1': [], 'od.stval2.st1val2.st2val2': [], 'od.stval2.st1val2.st1val2': [], 'od.stval1.st1val1.st1val1': [], 'od.val1.val1': ['val1', 'val2'], 'od.val1.val2': ['val1', 'val2']}
assert await cfg.option('od.stval1.st1val1.st1val1').value.get() == []
assert await cfg.option('od.stval2.st1val2.st1val2').value.get() == []
assert await cfg.option('od.stval1.st1val1.st1val1').owner.get() == owners.default
assert await cfg.option('od.stval2.st1val2.st1val2').owner.get() == owners.default
#
await cfg.option('od.stval1.st1val1.st1val1').value.set(['yes'])
assert await cfg.value.dict() == {'od.stval1.st1val1.st2val1': [None], 'od.stval2.st1val2.st2val2': [], 'od.stval2.st1val2.st1val2': [], 'od.stval1.st1val1.st1val1': ['yes'], 'od.val1.val1': ['val1', 'val2'], 'od.val1.val2': ['val1', 'val2']}
assert await cfg.option('od.stval1.st1val1.st1val1').value.get() == ['yes']
assert await cfg.option('od.stval1.st1val1.st2val1', 0).value.get() == None
assert await cfg.option('od.stval2.st1val2.st1val2').value.get() == []
assert await cfg.option('od.stval1.st1val1.st1val1').owner.get() == owner
assert await cfg.option('od.stval1.st1val1.st2val1', 0).owner.get() == owners.default
assert await cfg.option('od.stval2.st1val2.st1val2').owner.get() == owners.default
#
await cfg.option('od.stval1.st1val1.st2val1', 0).value.set('no')
assert await cfg.option('od.stval1.st1val1.st1val1').value.get() == ['yes']
assert await cfg.option('od.stval1.st1val1.st2val1', 0).value.get() == 'no'
assert await cfg.option('od.stval2.st1val2.st1val2').value.get() == []
assert await cfg.option('od.stval1.st1val1.st1val1').owner.get() == owner
assert await cfg.option('od.stval1.st1val1.st2val1', 0).owner.get() == owner
assert await cfg.option('od.stval2.st1val2.st1val2').owner.get() == owners.default
#
await cfg.option('od.stval1.st1val1.st1val1').value.pop(0)
assert await cfg.option('od.stval1.st1val1.st1val1').value.get() == []
assert await cfg.option('od.stval2.st1val2.st1val2').value.get() == []
assert await cfg.option('od.stval1.st1val1.st1val1').owner.get() == owner
assert await cfg.option('od.stval2.st1val2.st1val2').owner.get() == owners.default
#
await cfg.option('od.stval1.st1val1.st1val1').value.set(['yes'])
await cfg.option('od.stval1.st1val1.st2val1', 0).value.set('yes')
assert await cfg.option('od.stval1.st1val1.st1val1').owner.get() == owner
assert await cfg.option('od.stval1.st1val1.st2val1', 0).owner.get() == owner
assert await cfg.option('od.stval2.st1val2.st1val2').owner.get() == owners.default
#
await cfg.option('od.stval1.st1val1.st2val1', 0).value.reset()
assert await cfg.option('od.stval1.st1val1.st1val1').owner.get() == owner
assert await cfg.option('od.stval1.st1val1.st2val1', 0).owner.get() == owners.default
assert await cfg.option('od.stval2.st1val2.st1val2').owner.get() == owners.default
#
await cfg.option('od.stval1.st1val1.st1val1').value.set(['yes'])
await cfg.option('od.stval1.st1val1.st2val1', 0).value.set('yes')
await cfg.option('od.stval1.st1val1.st1val1').value.reset()
assert await cfg.option('od.stval1.st1val1.st1val1').value.get() == []
assert await cfg.option('od.stval2.st1val2.st1val2').value.get() == []
assert await cfg.option('od.stval1.st1val1.st1val1').owner.get() == owners.default
assert await cfg.option('od.stval2.st1val2.st1val2').owner.get() == owners.default
@pytest.mark.asyncio
async def test_leadership_dyndescription_param_leader():
val1 = StrOption('val1', "", multi=True)
val2 = StrOption('val2', "", multi=True)
odval = Leadership('val1', '', [val1, val2])
st1 = StrOption('st1', "", multi=True)
st2 = StrOption('st2', "", multi=True)
stm = Leadership('st1', '', [st1, st2])
st = DynOptionDescription('st', '', [stm], suffixes=Calculation(return_list, Params(ParamOption(val1))))
od = OptionDescription('od', '', [st, odval])
od2 = OptionDescription('od', '', [od])
cfg = await Config(od2)
await _test_leadership(cfg)
@pytest.mark.asyncio
async def test_leadership_default_multi_dyndescription():
st1 = StrOption('st1', "", multi=True)
st2 = StrOption('st2', "", multi=True, default_multi='no')
stm = Leadership('st1', '', [st1, st2])
st = DynOptionDescription('st', '', [stm], suffixes=Calculation(return_list))
od = OptionDescription('od', '', [st])
od2 = OptionDescription('od', '', [od])
cfg = await Config(od2)
owner = await cfg.owner.get()
#
assert await cfg.option('od.stval1.st1val1.st1val1').value.get() == []
assert await cfg.option('od.stval2.st1val2.st1val2').value.get() == []
assert await cfg.option('od.stval1.st1val1.st1val1').owner.isdefault()
assert await cfg.option('od.stval2.st1val2.st1val2').owner.isdefault()
#
await cfg.option('od.stval1.st1val1.st1val1').value.set(['yes'])
assert await cfg.option('od.stval1.st1val1.st1val1').value.get() == ['yes']
assert await cfg.option('od.stval1.st1val1.st2val1', 0).value.get() == 'no'
assert await cfg.option('od.stval2.st1val2.st1val2').value.get() == []
assert await cfg.option('od.stval1.st1val1.st1val1').owner.get() == owner
assert await cfg.option('od.stval1.st1val1.st2val1', 0).owner.isdefault()
assert await cfg.option('od.stval2.st1val2.st1val2').owner.isdefault()
@pytest.mark.asyncio
async def test_leadership_dyndescription_param_follower():
val1 = StrOption('val1', "", multi=True)
val2 = StrOption('val2', "", multi=True)
odval = Leadership('val1', '', [val1, val2])
st1 = StrOption('st1', "", multi=True)
st2 = StrOption('st2', "", multi=True)
stm = Leadership('st1', '', [st1, st2])
st = DynOptionDescription('st', '', [stm], suffixes=Calculation(return_list, Params(ParamOption(val2))))
od = OptionDescription('od', '', [st, odval])
od2 = OptionDescription('od', '', [od])
cfg = await Config(od2)
await _test_leadership(cfg)
@pytest.mark.asyncio
async def test_leadership_default_multi_dyndescription():
st1 = StrOption('st1', "", multi=True)
st2 = StrOption('st2', "", multi=True, default_multi='no')
stm = Leadership('st1', '', [st1, st2])
st = DynOptionDescription('st', '', [stm], suffixes=Calculation(return_list))
od = OptionDescription('od', '', [st])
od2 = OptionDescription('od', '', [od])
cfg = await Config(od2)
owner = await cfg.owner.get()
#
assert await cfg.option('od.stval1.st1val1.st1val1').value.get() == []
assert await cfg.option('od.stval2.st1val2.st1val2').value.get() == []
assert await cfg.option('od.stval1.st1val1.st1val1').owner.isdefault()
assert await cfg.option('od.stval2.st1val2.st1val2').owner.isdefault()
#
await cfg.option('od.stval1.st1val1.st1val1').value.set(['yes'])
assert await cfg.option('od.stval1.st1val1.st1val1').value.get() == ['yes']
assert await cfg.option('od.stval1.st1val1.st2val1', 0).value.get() == 'no'
assert await cfg.option('od.stval2.st1val2.st1val2').value.get() == []
assert await cfg.option('od.stval1.st1val1.st1val1').owner.get() == owner
assert await cfg.option('od.stval1.st1val1.st2val1', 0).owner.isdefault()
assert await cfg.option('od.stval2.st1val2.st1val2').owner.isdefault()
@pytest.mark.asyncio
async def test_leadership_submulti_dyndescription():
st1 = StrOption('st1', "", multi=True)
st2 = StrOption('st2', "", multi=submulti)
stm = Leadership('st1', '', [st1, st2])
std = DynOptionDescription('st', '', [stm], suffixes=Calculation(return_list))
od1 = OptionDescription('od', '', [std])
od2 = OptionDescription('od', '', [od1])
cfg = await Config(od2)
owner = await cfg.owner.get()
#
assert await cfg.option('od.stval1.st1val1.st1val1').value.get() == []
assert await cfg.option('od.stval2.st1val2.st1val2').value.get() == []
assert await cfg.option('od.stval1.st1val1.st1val1').owner.isdefault()
assert await cfg.option('od.stval2.st1val2.st1val2').owner.isdefault()
#
await cfg.option('od.stval1.st1val1.st1val1').value.set(['yes'])
assert await cfg.option('od.stval1.st1val1.st1val1').value.get() == ['yes']
assert await cfg.option('od.stval1.st1val1.st2val1', 0).value.get() == []
assert await cfg.option('od.stval2.st1val2.st1val2').value.get() == []
assert await cfg.option('od.stval1.st1val1.st1val1').owner.get() == owner
assert await cfg.option('od.stval1.st1val1.st2val1', 0).owner.isdefault()
assert await cfg.option('od.stval2.st1val2.st1val2').owner.isdefault()
#
await cfg.option('od.stval1.st1val1.st2val1', 0).value.set(['no'])
assert await cfg.option('od.stval1.st1val1.st1val1').value.get() == ['yes']
assert await cfg.option('od.stval1.st1val1.st2val1', 0).value.get() == ['no']
assert await cfg.option('od.stval2.st1val2.st1val2').value.get() == []
assert await cfg.option('od.stval1.st1val1.st1val1').owner.get() == owner
assert await cfg.option('od.stval1.st1val1.st2val1', 0).owner.get() == owner
assert await cfg.option('od.stval2.st1val2.st1val2').owner.isdefault()
@pytest.mark.asyncio
async def test_leadership_callback_dyndescription():
st1 = StrOption('st1', "", multi=True)
st2 = StrOption('st2', "", Calculation(return_dynval, Params(kwargs={'value': ParamOption(st1)})), multi=True)
stm = Leadership('st1', '', [st1, st2])
st1 = DynOptionDescription('st', '', [stm], suffixes=Calculation(return_list))
od1 = OptionDescription('od', '', [st1])
od2 = OptionDescription('od', '', [od1])
cfg = await Config(od2)
owner = await cfg.owner.get()
assert await cfg.value.dict() == {'od.stval1.st1val1.st2val1': [], 'od.stval2.st1val2.st2val2': [], 'od.stval2.st1val2.st1val2': [], 'od.stval1.st1val1.st1val1': []}
assert await cfg.option('od.stval1.st1val1.st1val1').value.get() ==[]
assert await cfg.option('od.stval2.st1val2.st1val2').value.get() == []
assert await cfg.option('od.stval1.st1val1.st1val1').owner.isdefault()
assert await cfg.option('od.stval2.st1val2.st1val2').owner.isdefault()
#
await cfg.option('od.stval1.st1val1.st1val1').value.set(['yes'])
assert await cfg.value.dict() == {'od.stval1.st1val1.st2val1': ['yes'], 'od.stval2.st1val2.st2val2': [], 'od.stval2.st1val2.st1val2': [], 'od.stval1.st1val1.st1val1': ['yes']}
assert await cfg.option('od.stval1.st1val1.st1val1').value.get() == ['yes']
assert await cfg.option('od.stval1.st1val1.st2val1', 0).value.get() == 'yes'
assert await cfg.option('od.stval2.st1val2.st1val2').value.get() == []
assert await cfg.option('od.stval1.st1val1.st1val1').owner.get() == owner
assert await cfg.option('od.stval1.st1val1.st2val1', 0).owner.isdefault()
assert await cfg.option('od.stval2.st1val2.st1val2').owner.isdefault()
#
await cfg.option('od.stval1.st1val1.st2val1', 0).value.set('no')
assert await cfg.option('od.stval1.st1val1.st1val1').value.get() == ['yes']
assert await cfg.option('od.stval1.st1val1.st2val1', 0).value.get() == 'no'
assert await cfg.option('od.stval2.st1val2.st1val2').value.get() == []
assert await cfg.option('od.stval1.st1val1.st1val1').owner.get() == owner
assert await cfg.option('od.stval1.st1val1.st2val1', 0).owner.get() == owner
assert await cfg.option('od.stval2.st1val2.st1val2').owner.isdefault()
#
await cfg.option('od.stval1.st1val1.st1val1').value.pop(0)
assert await cfg.option('od.stval1.st1val1.st1val1').value.get() == []
assert await cfg.option('od.stval2.st1val2.st1val2').value.get() == []
assert await cfg.option('od.stval1.st1val1.st1val1').owner.get() == owner
assert await cfg.option('od.stval2.st1val2.st1val2').owner.isdefault()
#
await cfg.option('od.stval1.st1val1.st1val1').value.set(['yes'])
await cfg.option('od.stval1.st1val1.st2val1', 0).value.set('yes')
assert await cfg.option('od.stval1.st1val1.st1val1').owner.get() == owner
assert await cfg.option('od.stval1.st1val1.st1val1').owner.get() == owner
assert await cfg.option('od.stval1.st1val1.st2val1', 0).owner.get() == owner
assert await cfg.option('od.stval2.st1val2.st1val2').owner.isdefault()
await cfg.option('od.stval1.st1val1.st2val1', 0).value.reset()
assert await cfg.option('od.stval1.st1val1.st1val1').owner.get() == owner
assert await cfg.option('od.stval1.st1val1.st2val1', 0).owner.isdefault()
assert await cfg.option('od.stval2.st1val2.st1val2').owner.isdefault()
#
await cfg.option('od.stval1.st1val1.st1val1').value.set(['yes'])
await cfg.option('od.stval1.st1val1.st2val1', 0).value.set('yes')
await cfg.option('od.stval1.st1val1.st1val1').value.reset()
assert await cfg.option('od.stval1.st1val1.st1val1').value.get() == []
assert await cfg.option('od.stval2.st1val2.st1val2').value.get() == []
assert await cfg.option('od.stval1.st1val1.st1val1').owner.isdefault()
assert await cfg.option('od.stval2.st1val2.st1val2').owner.isdefault()
#
await cfg.option('od.stval1.st1val1.st1val1').value.set(['yes'])
assert await cfg.option('od.stval1.st1val1.st2val1', 0).value.get() == 'yes'
@pytest.mark.asyncio
async def test_leadership_callback_value_dyndescription():
st1 = StrOption('st1', "", multi=True)
st2 = StrOption('st2', "", Calculation(return_dynval, Params(kwargs={'value': ParamValue('val')})), multi=True)
stm = Leadership('st1', '', [st1, st2])
st = DynOptionDescription('st', '', [stm], suffixes=Calculation(return_list))
od = OptionDescription('od', '', [st])
od2 = OptionDescription('od', '', [od])
cfg = await Config(od2)
assert await cfg.option('od.stval1.st1val1.st1val1').value.get() == []
await cfg.option('od.stval1.st1val1.st1val1').value.set(['yes'])
assert await cfg.option('od.stval1.st1val1.st1val1').value.get() == ['yes']
await cfg.option('od.stval1.st1val1.st2val1', 0).value.set('val')
assert await cfg.option('od.stval1.st1val1.st2val1', 0).value.get() == 'val'
@pytest.mark.asyncio
async def test_leadership_callback_nomulti_dyndescription():
v11 = StrOption('v1', '', "val")
st1 = StrOption('st1', "", multi=True)
st2 = StrOption('st2', "", Calculation(return_dynval, Params(ParamOption(v11))), multi=True)
stm = Leadership('st1', '', [st1, st2])
stt = DynOptionDescription('st', '', [stm], suffixes=Calculation(return_list))
od1 = OptionDescription('od', '', [stt])
od2 = OptionDescription('od', '', [od1, v11])
cfg = await Config(od2)
assert await cfg.option('od.stval1.st1val1.st1val1').value.get() == []
await cfg.option('od.stval1.st1val1.st1val1').value.set(['yes'])
assert await cfg.option('od.stval1.st1val1.st1val1').value.get() == ['yes']
assert await cfg.option('od.stval1.st1val1.st2val1', 0).value.get() == 'val'
@pytest.mark.asyncio
async def test_leadership_callback_samegroup_dyndescription():
st1 = StrOption('st1', "", multi=True)
st2 = StrOption('st2', "", multi=True)
st3 = StrOption('st3', "", Calculation(return_dynval, Params(ParamOption(st2))), multi=True)
stm = Leadership('st1', '', [st1, st2, st3])
stt = DynOptionDescription('st', '', [stm], suffixes=Calculation(return_list))
od1 = OptionDescription('od', '', [stt])
od2 = OptionDescription('od', '', [od1])
cfg = await Config(od2)
owner = await cfg.owner.get()
assert await cfg.value.dict() == {'od.stval1.st1val1.st1val1': [],
'od.stval1.st1val1.st2val1': [],
'od.stval1.st1val1.st3val1': [],
'od.stval2.st1val2.st1val2': [],
'od.stval2.st1val2.st2val2': [],
'od.stval2.st1val2.st3val2': []}
assert await cfg.option('od.stval1.st1val1.st1val1').value.get() == []
assert await cfg.option('od.stval2.st1val2.st1val2').value.get() == []
assert await cfg.option('od.stval1.st1val1.st1val1').owner.isdefault()
assert await cfg.option('od.stval2.st1val2.st1val2').owner.isdefault()
#
await cfg.option('od.stval1.st1val1.st1val1').value.set(['yes'])
assert await cfg.value.dict() == {'od.stval1.st1val1.st1val1': ['yes'],
'od.stval1.st1val1.st2val1': [None],
'od.stval1.st1val1.st3val1': [None],
'od.stval2.st1val2.st1val2': [],
'od.stval2.st1val2.st2val2': [],
'od.stval2.st1val2.st3val2': []}
assert await cfg.option('od.stval1.st1val1.st1val1').owner.get() == owner
assert await cfg.option('od.stval1.st1val1.st2val1', 0).owner.isdefault()
assert await cfg.option('od.stval1.st1val1.st3val1', 0).owner.isdefault()
assert await cfg.option('od.stval2.st1val2.st1val2').owner.isdefault()
#
await cfg.option('od.stval1.st1val1.st2val1', 0).value.set('yes')
assert await cfg.value.dict() == {'od.stval1.st1val1.st1val1': ['yes'],
'od.stval1.st1val1.st2val1': ['yes'],
'od.stval1.st1val1.st3val1': ['yes'],
'od.stval2.st1val2.st1val2': [],
'od.stval2.st1val2.st2val2': [],
'od.stval2.st1val2.st3val2': []}
assert await cfg.option('od.stval1.st1val1.st1val1').owner.get() == owner
assert await cfg.option('od.stval1.st1val1.st2val1', 0).owner.get() == owner
assert await cfg.option('od.stval1.st1val1.st3val1', 0).owner.isdefault()
assert await cfg.option('od.stval2.st1val2.st1val2').owner.isdefault()
@pytest.mark.asyncio
async def test_invalid_conflict_dyndescription():
st = StrOption('st', '')
dod = DynOptionDescription('dod', '', [st], suffixes=Calculation(return_list))
dodinvalid = StrOption('dodinvalid', '')
dod, dodinvalid
with pytest.raises(ConflictError):
OptionDescription('od', '', [dod, dodinvalid])
@pytest.mark.asyncio
async def test_invalid_subod_dyndescription():
st2 = StrOption('st2', '')
od1 = OptionDescription('od1', '', [st2])
od1
with pytest.raises(ConfigError):
DynOptionDescription('dod', '', [od1], suffixes=Calculation(return_list))
@pytest.mark.asyncio
async def test_invalid_subdynod_dyndescription():
st2 = StrOption('st2', '')
od1 = DynOptionDescription('od1', '', [st2], suffixes=Calculation(return_list))
od1
with pytest.raises(ConfigError):
DynOptionDescription('dod', '', [od1], suffixes=Calculation(return_list))
@pytest.mark.asyncio
async def test_invalid_symlink_dyndescription():
st = StrOption('st', '')
st2 = SymLinkOption('st2', st)
st2
with pytest.raises(ConfigError):
DynOptionDescription('dod', '', [st, st2], suffixes=Calculation(return_list))
@pytest.mark.asyncio
async def test_nocallback_dyndescription():
st = StrOption('st', '')
st2 = StrOption('st2', '')
st, st2
with pytest.raises(TypeError):
DynOptionDescription('dod', '', [st, st2])
@pytest.mark.asyncio
async def test_invalid_samevalue_dyndescription():
st1 = StrOption('st', '')
dod = DynOptionDescription('dod', '', [st1], suffixes=Calculation(return_same_list))
od1 = OptionDescription('od', '', [dod])
cfg = await Config(od1)
with pytest.raises(ValueError):
await cfg.value.dict()
@pytest.mark.asyncio
async def test_invalid_name_dyndescription():
st1 = StrOption('st', '')
dod = DynOptionDescription('dod', '', [st1], suffixes=Calculation(return_wrong_list))
od1 = OptionDescription('od', '', [dod])
cfg = await Config(od1)
with pytest.raises(ValueError):
await cfg.value.dict()
@pytest.mark.asyncio
async def test_leadership_dyndescription_convert():
st1 = StrOption('st1', "", multi=True)
st2 = StrOption('st2', "", multi=True)
stm = Leadership('st1', '', [st1, st2])
st = ConvertDynOptionDescription('st', '', [stm], suffixes=Calculation(return_list_dot))
od = OptionDescription('od', '', [st])
od2 = OptionDescription('od', '', [od])
cfg = await Config(od2)
owner = await cfg.owner.get()
#
assert await cfg.value.dict() == {'od.stval1.st1val1.st2val1': [], 'od.stval2.st1val2.st2val2': [], 'od.stval2.st1val2.st1val2': [], 'od.stval1.st1val1.st1val1': []}
assert await cfg.option('od.stval1.st1val1.st1val1').value.get() == []
assert await cfg.option('od.stval2.st1val2.st1val2').value.get() == []
assert await cfg.option('od.stval1.st1val1.st1val1').owner.isdefault()
assert await cfg.option('od.stval2.st1val2.st1val2').owner.isdefault()
#
await cfg.option('od.stval1.st1val1.st1val1').value.set(['yes'])
assert await cfg.value.dict() == {'od.stval1.st1val1.st2val1': [None], 'od.stval2.st1val2.st2val2': [], 'od.stval2.st1val2.st1val2': [], 'od.stval1.st1val1.st1val1': ['yes']}
assert await cfg.option('od.stval1.st1val1.st1val1').value.get() == ['yes']
assert await cfg.option('od.stval1.st1val1.st2val1', 0).value.get() == None
assert await cfg.option('od.stval2.st1val2.st1val2').value.get() == []
assert await cfg.option('od.stval1.st1val1.st1val1').owner.get() == owner
assert await cfg.option('od.stval1.st1val1.st2val1', 0).owner.isdefault()
assert await cfg.option('od.stval2.st1val2.st1val2').owner.isdefault()
#
await cfg.option('od.stval1.st1val1.st2val1', 0).value.set('no')
assert await cfg.option('od.stval1.st1val1.st1val1').value.get() == ['yes']
assert await cfg.option('od.stval1.st1val1.st2val1', 0).value.get() == 'no'
assert await cfg.option('od.stval2.st1val2.st1val2').value.get() == []
assert await cfg.option('od.stval1.st1val1.st1val1').owner.get() == owner
assert await cfg.option('od.stval1.st1val1.st2val1', 0).owner.get() == owner
assert await cfg.option('od.stval2.st1val2.st1val2').owner.isdefault()
#
await cfg.option('od.stval1.st1val1.st1val1').value.pop(0)
assert await cfg.option('od.stval1.st1val1.st1val1').value.get() == []
assert await cfg.option('od.stval2.st1val2.st1val2').value.get() == []
assert await cfg.option('od.stval1.st1val1.st1val1').owner.get() == owner
assert await cfg.option('od.stval2.st1val2.st1val2').owner.isdefault()
#
await cfg.option('od.stval1.st1val1.st1val1').value.set(['yes'])
await cfg.option('od.stval1.st1val1.st2val1', 0).value.set('yes')
assert await cfg.option('od.stval1.st1val1.st1val1').owner.get() == owner
assert await cfg.option('od.stval1.st1val1.st2val1', 0).owner.get() == owner
assert await cfg.option('od.stval2.st1val2.st1val2').owner.isdefault()
assert await cfg.option('od.stval1.st1val1.st1val1').owner.get() == owner
await cfg.option('od.stval1.st1val1.st2val1', 0).value.reset()
assert await cfg.option('od.stval1.st1val1.st1val1').owner.get() == owner
assert await cfg.option('od.stval1.st1val1.st2val1', 0).owner.isdefault()
#
await cfg.option('od.stval1.st1val1.st1val1').value.set(['yes'])
await cfg.option('od.stval1.st1val1.st2val1', 0).value.set('yes')
await cfg.option('od.stval1.st1val1.st1val1').value.reset()
assert await cfg.option('od.stval1.st1val1.st1val1').value.get() == []
assert await cfg.option('od.stval2.st1val2.st1val2').value.get() == []
assert await cfg.option('od.stval1.st1val1.st1val1').owner.isdefault()
assert await cfg.option('od.stval2.st1val2.st1val2').owner.isdefault()
@pytest.mark.asyncio
async def test_leadership_callback_samegroup_dyndescription_convert():
st1 = StrOption('st1', "", multi=True)
st2 = StrOption('st2', "", multi=True)
st3 = StrOption('st3', "", Calculation(return_dynval, Params(ParamOption(st2))), multi=True)
stm = Leadership('st1', '', [st1, st2, st3])
stt = ConvertDynOptionDescription('st', '', [stm], suffixes=Calculation(return_list_dot))
od1 = OptionDescription('od', '', [stt])
od2 = OptionDescription('od', '', [od1])
cfg = await Config(od2)
owner = await cfg.owner.get()
assert await cfg.value.dict() == {'od.stval1.st1val1.st1val1': [],
'od.stval1.st1val1.st2val1': [],
'od.stval1.st1val1.st3val1': [],
'od.stval2.st1val2.st1val2': [],
'od.stval2.st1val2.st2val2': [],
'od.stval2.st1val2.st3val2': []}
assert await cfg.option('od.stval1.st1val1.st1val1').value.get() == []
assert await cfg.option('od.stval2.st1val2.st1val2').value.get() == []
assert await cfg.option('od.stval1.st1val1.st1val1').owner.isdefault()
assert await cfg.option('od.stval2.st1val2.st1val2').owner.isdefault()
#
await cfg.option('od.stval1.st1val1.st1val1').value.set(['yes'])
assert await cfg.value.dict() == {'od.stval1.st1val1.st1val1': ['yes'],
'od.stval1.st1val1.st2val1': [None],
'od.stval1.st1val1.st3val1': [None],
'od.stval2.st1val2.st1val2': [],
'od.stval2.st1val2.st2val2': [],
'od.stval2.st1val2.st3val2': []}
assert await cfg.option('od.stval1.st1val1.st1val1').owner.get() == owner
assert await cfg.option('od.stval1.st1val1.st2val1', 0).owner.isdefault()
assert await cfg.option('od.stval1.st1val1.st3val1', 0).owner.isdefault()
assert await cfg.option('od.stval2.st1val2.st1val2').owner.isdefault()
#
await cfg.option('od.stval1.st1val1.st2val1', 0).value.set('yes')
assert await cfg.value.dict() == {'od.stval1.st1val1.st1val1': ['yes'],
'od.stval1.st1val1.st2val1': ['yes'],
'od.stval1.st1val1.st3val1': ['yes'],
'od.stval2.st1val2.st1val2': [],
'od.stval2.st1val2.st2val2': [],
'od.stval2.st1val2.st3val2': []}
assert await cfg.option('od.stval1.st1val1.st1val1').owner.get() == owner
assert await cfg.option('od.stval1.st1val1.st2val1', 0).owner.get() == owner
assert await cfg.option('od.stval1.st1val1.st3val1', 0).owner.isdefault()
assert await cfg.option('od.stval2.st1val2.st1val2').owner.isdefault()
@pytest.mark.asyncio
async def test_dyn_with_leader_hidden_in_config():
ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True, properties=('hidden',))
interface1 = Leadership('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0], properties=('hidden',))
dyn = DynOptionDescription('leader', '', [interface1], suffixes=Calculation(return_list))
od = OptionDescription('root', '', [dyn])
cfg = await Config(od)
await cfg.property.read_write()
await cfg.permissive.add('hidden')
assert await cfg.forcepermissive.option('leaderval1.ip_admin_eth0val1.ip_admin_eth0val1').value.get() == []
await cfg.forcepermissive.option('leaderval1.ip_admin_eth0val1.ip_admin_eth0val1').value.set(['192.168.1.1'])
assert await cfg.forcepermissive.option('leaderval1.ip_admin_eth0val1.netmask_admin_eth0val1', 0).value.get() is None
with pytest.raises(PropertiesOptionError):
await cfg.option('leaderval1.ip_admin_eth0val1.ip_admin_eth0val1').value.get()
with pytest.raises(PropertiesOptionError):
await cfg.option('leaderval1.ip_admin_eth0val1.netmask_admin_eth0val1', 0).value.get()
await cfg.value.dict(leader_to_list=True) == {'leaderval1.ip_admin_eth0val1.ip_admin_eth0val1': [{'leaderval1.ip_admin_eth0val1.ip_admin_eth0val1': '192.168.1.1'}],
'leaderval2.ip_admin_eth0val2.ip_admin_eth0val2': [{'leaderval2.ip_admin_eth0val2.ip_admin_eth0val2': '192.168.1.1'}]}
@pytest.mark.asyncio
async def test_dyn_leadership_requires():
ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True, properties=('notunique',))
disabled_property = Calculation(calc_value,
Params(ParamValue('disabled'),
kwargs={'condition': ParamOption(ip_admin_eth0, notraisepropertyerror=True),
'expected': ParamValue('192.168.1.1'),
'no_condition_is_invalid': ParamValue(True),
'index': ParamIndex()}))
netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True, properties=(disabled_property,))
interface1 = Leadership('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
dyn = DynOptionDescription('leader', '', [interface1], suffixes=Calculation(return_list))
od = OptionDescription('toto', '', [dyn])
cfg = await Config(od)
await cfg.property.read_write()
assert await cfg.option('leaderval1.ip_admin_eth0val1.ip_admin_eth0val1').value.get() == []
await cfg.option('leaderval1.ip_admin_eth0val1.ip_admin_eth0val1').value.set(['192.168.1.2'])
assert await cfg.option('leaderval1.ip_admin_eth0val1.netmask_admin_eth0val1', 0).value.get() is None
assert await cfg.option('leaderval1.ip_admin_eth0val1.ip_admin_eth0val1').value.get() == ['192.168.1.2']
#
await cfg.option('leaderval1.ip_admin_eth0val1.ip_admin_eth0val1').value.set(['192.168.1.2', '192.168.1.1'])
assert await cfg.option('leaderval1.ip_admin_eth0val1.netmask_admin_eth0val1', 0).value.get() is None
with pytest.raises(PropertiesOptionError):
await cfg.option('leaderval1.ip_admin_eth0val1.netmask_admin_eth0val1', 1).value.get()
#
await cfg.option('leaderval1.ip_admin_eth0val1.ip_admin_eth0val1').value.set(['192.168.1.2', '192.168.1.2'])
assert await cfg.option('leaderval1.ip_admin_eth0val1.netmask_admin_eth0val1', 0).value.get() is None
assert await cfg.option('leaderval1.ip_admin_eth0val1.netmask_admin_eth0val1', 1).value.get() is None
await cfg.option('leaderval1.ip_admin_eth0val1.netmask_admin_eth0val1', 1).value.set('255.255.255.255')
assert await cfg.option('leaderval1.ip_admin_eth0val1.netmask_admin_eth0val1', 1).value.get() == '255.255.255.255'
assert await cfg.value.dict() == {'leaderval1.ip_admin_eth0val1.ip_admin_eth0val1': ['192.168.1.2', '192.168.1.2'],
'leaderval1.ip_admin_eth0val1.netmask_admin_eth0val1': [None, '255.255.255.255'],
'leaderval2.ip_admin_eth0val2.ip_admin_eth0val2': [],
'leaderval2.ip_admin_eth0val2.netmask_admin_eth0val2': []}
ret = await cfg.value.dict(leader_to_list=True)
assert ret == {'leaderval1.ip_admin_eth0val1.ip_admin_eth0val1': [{'leaderval1.ip_admin_eth0val1.ip_admin_eth0val1': '192.168.1.2', 'leaderval1.ip_admin_eth0val1.netmask_admin_eth0val1': None},
{'leaderval1.ip_admin_eth0val1.ip_admin_eth0val1': '192.168.1.2', 'leaderval1.ip_admin_eth0val1.netmask_admin_eth0val1': '255.255.255.255'}],
'leaderval2.ip_admin_eth0val2.ip_admin_eth0val2': []}
#
await cfg.option('leaderval1.ip_admin_eth0val1.ip_admin_eth0val1').value.set(['192.168.1.2', '192.168.1.1'])
assert await cfg.option('leaderval1.ip_admin_eth0val1.netmask_admin_eth0val1', 0).value.get() is None
with pytest.raises(PropertiesOptionError):
await cfg.option('leaderval1.ip_admin_eth0val1.netmask_admin_eth0val1', 1).value.get()
ret = await cfg.value.dict()
assert set(ret.keys()) == set(['leaderval1.ip_admin_eth0val1.ip_admin_eth0val1', 'leaderval1.ip_admin_eth0val1.netmask_admin_eth0val1', 'leaderval2.ip_admin_eth0val2.ip_admin_eth0val2', 'leaderval2.ip_admin_eth0val2.netmask_admin_eth0val2'])
assert ret['leaderval1.ip_admin_eth0val1.ip_admin_eth0val1'] == ['192.168.1.2', '192.168.1.1']
assert len(ret['leaderval1.ip_admin_eth0val1.netmask_admin_eth0val1']) == 2
assert ret['leaderval1.ip_admin_eth0val1.netmask_admin_eth0val1'][0] is None
assert isinstance(ret['leaderval1.ip_admin_eth0val1.netmask_admin_eth0val1'][1], PropertiesOptionError)
del ret['leaderval1.ip_admin_eth0val1.netmask_admin_eth0val1'][1]
del ret['leaderval1.ip_admin_eth0val1.netmask_admin_eth0val1'][0]
del ret['leaderval1.ip_admin_eth0val1.netmask_admin_eth0val1']
assert await cfg.value.dict(leader_to_list=True) == {'leaderval1.ip_admin_eth0val1.ip_admin_eth0val1': [{'leaderval1.ip_admin_eth0val1.ip_admin_eth0val1': '192.168.1.2',
'leaderval1.ip_admin_eth0val1.netmask_admin_eth0val1': None},
{'leaderval1.ip_admin_eth0val1.ip_admin_eth0val1': '192.168.1.1'}],
'leaderval2.ip_admin_eth0val2.ip_admin_eth0val2': []}
#
assert await cfg.value.dict(leader_to_list=True) == {'leaderval1.ip_admin_eth0val1.ip_admin_eth0val1': [{'leaderval1.ip_admin_eth0val1.ip_admin_eth0val1': '192.168.1.2',
'leaderval1.ip_admin_eth0val1.netmask_admin_eth0val1': None},
{'leaderval1.ip_admin_eth0val1.ip_admin_eth0val1': '192.168.1.1'}],
'leaderval2.ip_admin_eth0val2.ip_admin_eth0val2': []}