You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
calculate-utils-4-lib/tests/parameters/test_parameters.py

1102 lines
52 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

import os
import shutil
import pytest
from collections import OrderedDict
from calculate.parameters.parameters import BaseParameter, Integer, String,\
Description, Parameters,\
ValidationError, Choice, Bool,\
List, CyclicValidationError,\
ParameterError, Table, TableValue
from calculate.variables.loader import Datavars
TESTFILES_PATH = os.path.join(os.getcwd(), 'tests/parameters/testfiles')
GENTOO_PATH = os.path.join(TESTFILES_PATH, 'gentoo')
@pytest.mark.parameters
class TestParameters:
def test_to_make_testfiles(self):
shutil.copytree(os.path.join(TESTFILES_PATH, 'gentoo.backup'),
os.path.join(TESTFILES_PATH, 'gentoo'), symlinks=True)
def test_if_some_parameters_are_created_using_classes_inheriting_the_BaseParameter_class_and_its_types_is_set_in_the_parameter_s_classes__the_parameters_can_be_created_using_this_classes_and_their_instances_types_are_types_from_their_classes(self):
datavars = Datavars(variables_path=os.path.join(TESTFILES_PATH,
'variables'))
PARAMS = Parameters(datavars)
# Описание классов параметров.
class MyShinyParameter(BaseParameter):
type = Integer()
def validate(self, var):
if var.value < 10:
raise ValidationError("The value must be greater than 10")
def bind_method(self, var):
return var.value, None
class AnotherParameter(BaseParameter):
type = String()
def bind_method(self):
return 'default string', None
def validate(self, value):
if not value.startswith('/var/lib'):
raise ValidationError("The value must starts with a"
" '/var/lib'")
class OneMoreParameter(BaseParameter):
type = String()
def bind_method(self):
return 'default string', None
def validate(self, value):
available_set = {'mystery', 'horror', 'weird'}
if value not in available_set:
raise ValidationError(f"The value '{value}' is not in"
f" available. Available values:"
f" {', '.join(available_set)}")
# Создание параметров данных типов.
PARAMS.add(
MyShinyParameter('my-shiny', 'The Shiniest ones',
Description(
short='The shiny parameter',
full='The shiniest thing known to science.',
usage='-S COUNT, --my-shiny COUNT'),
shortname='S').bind('os.linux.test_5'),
AnotherParameter('my-other', 'The Others',
Description(short='Not from this world.'),
shortname='o'),
OneMoreParameter('one-more', 'The Others',
Description(full='Plan 9 from outer space.')))
class AnotherParameter(BaseParameter):
type = String()
def bind_method(self):
return 'default string', None
def validate(self, value):
if not value.startswith('/var/lib'):
raise ValidationError("The value must starts with a"
" '/var/lib'")
shiny_one, another_one, weird_one = PARAMS
shiny_one.set(9)
assert type(shiny_one._parameter_type) == Integer
another_one.set('/var/lib/bla')
assert type(another_one._parameter_type) == String
weird_one.set('weird')
assert type(weird_one._parameter_type) == String
def test_if_parameter_is_created_with_bind_method_with_a_variable_in_its_arguments__the_default_parameter_value_is_calculated_using_this_method_and_a_variable_from_arguments_can_invalidate_the_parameter(self):
datavars = Datavars(variables_path=os.path.join(TESTFILES_PATH,
'variables'))
PARAMS = Parameters(datavars)
# Описание классов параметров.
class TestParameter(BaseParameter):
type = String()
def bind_method(self, fullname):
return fullname.value, None
# Создание параметров данных типов.
PARAMS.add(
TestParameter('test', 'Test',
Description(
short='Test parameter',
full='Test parameters are needed for tests.'),
shortname='t').bind('os.linux.fullname'))
assert PARAMS['test'] == PARAMS['t']
assert PARAMS['test'].value == 'Calculate Linux Desktop'
datavars.os.linux['fullname'].set('Gentoo Linux')
assert PARAMS['test'].value == 'Gentoo Linux'
PARAMS['test'].set('Arch Linux')
assert PARAMS['test'].value == 'Arch Linux'
datavars.os.linux['fullname'].set('Void Linux')
assert PARAMS['test'].value == 'Arch Linux'
def test_if_bind_method_is_set_for_parameter_and_then_the_set_method_is_used_to_change_value__the_parameters_value_is_changed_and_a_variable_from_a_bounded_variable_is_not_able_to_invalidate_parameter_s_value(self):
datavars = Datavars(variables_path=os.path.join(TESTFILES_PATH,
'variables'))
PARAMS = Parameters(datavars)
# Описание классов параметров.
class TestParameter(BaseParameter):
type = String()
def bind_method(self, fullname):
return fullname.value, None
# Создание параметров данных типов.
PARAMS.add(
TestParameter('test', 'Test',
Description(
short='Test parameter',
full='Test parameters are needed for tests.'),
shortname='t').bind('os.linux.fullname'))
assert PARAMS['test'].value == 'Calculate Linux Desktop'
datavars.os.linux['fullname'].set('Gentoo Linux')
assert PARAMS['test'].value == 'Gentoo Linux'
PARAMS['test'].set('Arch Linux')
assert PARAMS['test'].value == 'Arch Linux'
datavars.os.linux['fullname'].set('Void Linux')
assert PARAMS['test'].value == 'Arch Linux'
def test_if_the_bind_method_is_set_for_two_variables__the_bind_method_calculates_parameter_s_default_value__variables_can_invalidate_parameter_s_value_before_the_set_method_is_used__the_set_parameter_can_change_value_of_the_parameter(self):
datavars = Datavars(variables_path=os.path.join(TESTFILES_PATH,
'variables'))
PARAMS = Parameters(datavars)
# Описание классов параметров.
class TestParameter(BaseParameter):
type = String()
def bind_method(self, fullname, shortname):
return f'{fullname.value} -> {shortname.value}', None
# Создание параметров данных типов.
PARAMS.add(
TestParameter('test', 'Test',
Description(
short='Test parameter',
full='Test parameters are needed for tests.'),
shortname='t').bind('os.linux.fullname',
'os.linux.shortname')
.to_set('os.linux.subname'))
assert PARAMS['test'].value == 'Calculate Linux Desktop -> CLD'
datavars.os.linux['fullname'].set('Gentoo Linux')
assert PARAMS['test'].value == 'Gentoo Linux -> CLD'
datavars.os.linux['shortname'].set('GL')
assert PARAMS['test'].value == 'Gentoo Linux -> GL'
# Переменные, указанные в to_set не меняются если используется
# дефолтное значение, рассчитанное с помощью переменных.
assert datavars.os.linux.subname == 'KDE'
PARAMS['test'].set('Arch Linux -> AL')
assert PARAMS['test'].value == 'Arch Linux -> AL'
# Теперь меняются.
assert datavars.os.linux.subname == 'Arch Linux -> AL'
datavars.os.linux['fullname'].set('Void Linux')
assert PARAMS['test'].value == 'Arch Linux -> AL'
def test_if_hash_value_is_in_the_set_variables_list__the_parameter_is_able_to_change_that_hash_s_value(self):
datavars = Datavars(variables_path=os.path.join(TESTFILES_PATH,
'variables'))
PARAMS = Parameters(datavars)
# Описание классов параметров.
class TestParameter(BaseParameter):
type = String()
def bind_method(self, fullname):
return fullname.value, True
# Создание параметров данных типов.
PARAMS.add(
TestParameter('test', 'Test',
Description(
short='Test parameter',
full='Test parameters are needed for tests.'),
shortname='t'
).bind('os.linux.fullname').to_set(
'os.linux.shortname',
'os.hashvar.value2'))
PARAMS['test'].set('CLD')
assert datavars.os.linux.shortname == 'CLD'
assert datavars.os.hashvar.get_hash() == {'value1': 'new1',
'value2': 'CLD'}
PARAMS['test'].set('CLDX')
assert datavars.os.linux.shortname == 'CLDX'
assert datavars.os.hashvar.get_hash() == {'value1': 'new1',
'value2': 'CLDX'}
def test_if_bind_method_is_set_for_parameter__the_method_can_return_as_second_value_of_the_return_tuple_disactivity_comment_witch_disactivates_the_parameter_even_if_parameters_values_is_set_by_user(self):
datavars = Datavars(variables_path=os.path.join(TESTFILES_PATH,
'variables'))
PARAMS = Parameters(datavars)
# Описание классов параметров.
class BoolTestParameter(BaseParameter):
type = Bool()
def bind_method(self):
return False, None
class StringTestParameter(BaseParameter):
type = String()
def bind_method(self, string, boolean):
disactivity_comment = None
if boolean.value:
disactivity_comment = "Disactivated by test bool parameter"
return string.value, disactivity_comment
# Создание параметров данных типов.
PARAMS.add(
BoolTestParameter('test-bool', 'Booleans',
Description(
short='Test bool parameter',
full=('Test bool parameter, that can'
' disactivate other parameter')),
shortname='b').to_set('os.linux.test_2'),
StringTestParameter('test-string', 'Strings',
Description(
short='Test string parameter',
full=('Test string parameter, that'
' can be disactivated')),
shortname='s').bind('os.linux.test_3',
'os.linux.test_2'))
assert PARAMS['test-bool'].value is False
assert PARAMS['test-string'].value == 'test string'
PARAMS['test-bool'].set(True)
assert PARAMS['test-string'].disactivity_comment ==\
"Disactivated by test bool parameter"
PARAMS['test-bool'].set(False)
PARAMS['test-string'].set("My own value")
assert PARAMS['test-string'].value == "My own value"
assert PARAMS['test-string'].disactivity_comment is None
PARAMS['test-bool'].set(True)
assert PARAMS['test-string'].value == "My own value"
assert PARAMS['test-string'].disactivity_comment ==\
"Disactivated by test bool parameter"
def test_Choice_type_is_set_for_parameter_and_bind_method_is_set_too__the_bind_method_can_define_available_values_for_the_choice_parameter__choice_availables_is_invalidatable_even_if_the_value_is_set_by_user__choice_type_checks_if_the_new_value_is_the_availables_list(self):
datavars = Datavars(variables_path=os.path.join(TESTFILES_PATH,
'variables'))
PARAMS = Parameters(datavars)
# Описание классов параметров.
class TestParameter(BaseParameter):
type = Choice()
def bind_method(self, choices_list):
choices_list = choices_list.value
for choice in choices_list:
self.choices.update({choice: f'Comment for {choice}'})
return choices_list[0], None
# Создание параметров данных типов.
PARAMS.add(
TestParameter('test', 'Test',
Description(
short='Test parameter',
full='Test parameters are needed for tests.'),
shortname='t').bind('os.linux.test_1'))
assert PARAMS['test'].value == 'choice_1'
PARAMS['test'].set(PARAMS['test'].check_value_type('choice_2'))
assert PARAMS['test'].value == 'choice_2'
with pytest.raises(ValidationError):
PARAMS['test'].set(PARAMS['test'].check_value_type('unavailable'))
def test_if_some_parameters_are_created_with_some_types_and_there_are_attempts_to_assign_some_values_which_type_is_not_correct_to_this_parameters__the_parameters_types_checks_this_values_and_raises_ValidationError_exception(self):
datavars = Datavars(variables_path=os.path.join(TESTFILES_PATH,
'variables'))
PARAMS = Parameters(datavars)
# Описание классов параметров.
class FirstTestParameter(BaseParameter):
type = Choice()
def bind_method(self, choices_list):
choices_list = choices_list.value
for choice in choices_list:
self.choices.update({choice: f'Comment for {choice}'})
return choices_list[0], None
class SecondTestParameter(BaseParameter):
type = String()
def bind_method(self):
return "default string", None
class ThirdTestParameter(BaseParameter):
type = List()
def bind_method(self):
return [1, 2, 3, 4], None
# Создание параметров данных типов.
PARAMS.add(
FirstTestParameter('test_1', 'Test',
Description(
short='Test choice',
full=('Test parameters are'
' needed for tests.'))
).bind('os.linux.test_1'),
SecondTestParameter('test_2', 'Test',
Description(short='Test choice',
full=('Test parameters are'
' needed for tests.'))),
ThirdTestParameter('test_3', 'Test',
Description(short='Test list',
full=('Test parameters are'
' needed for tests.'))))
with pytest.raises(ValidationError):
PARAMS.set_parameters({'test_1': 'unavailable'})
with pytest.raises(ValidationError):
PARAMS.set_parameters({'test_2': 123})
with pytest.raises(ValidationError):
PARAMS.set_parameters({'test_3': 'suspicious value'})
def test_if_some_parameters_is_created_with_the_validate_methods__the_validate_methods_are_used_for_validating_all_values_that_is_set_to_the_parameter(self):
datavars = Datavars(variables_path=os.path.join(TESTFILES_PATH,
'variables'))
PARAMS = Parameters(datavars)
# Описание классов параметров.
class FirstTestParameter(BaseParameter):
type = Choice()
def bind_method(self, choices_list):
choices_list = choices_list.value
for choice in choices_list:
self.choices.update({choice: f'Comment for {choice}'})
return choices_list[0], None
def validate(self, parameters, datavars, value):
if datavars.os.linux.test_2 and bool(int(value[-1]) % 2):
raise ValidationError('Choice must be with even number.')
elif not datavars.os.linux.test_2 and not bool(
int(value[-1]) % 2):
raise ValidationError('Choice must be with odd number.')
print(f'VALIDATED: {self._name}')
class SecondTestParameter(BaseParameter):
type = String()
def bind_method(self):
return "default string", None
def validate(self, parameters, datavars, value):
if (bool(int(parameters['test-1'].value[-1]) % 2) and
value != 'odd'):
raise ValidationError('Value must be "odd".')
elif (not bool(int(parameters['test-1'].value[-1]) % 2) and
value != 'even'):
raise ValidationError('Value must be "even".')
elif value not in {'odd', 'even'}:
raise ValidationError('Value must be "odd" or "value"')
print(f'VALIDATED: {self._name}')
class ThirdTestParameter(BaseParameter):
type = List()
def bind_method(self):
return ['/dev/sda1'], None
def validate(self, parameters, datavars, value):
prefix = datavars.os.linux.test_4
for device in value:
if not device.startswith(prefix):
raise ValidationError("Partitions must be from the"
" '{prefix}' device")
print(f'VALIDATED: {self._name}')
# Создание параметров данных типов.
PARAMS.add(
FirstTestParameter('test-1', 'Test',
Description(
short='Test choice',
full=('Test parameters are'
' needed for tests.'))
).bind('os.linux.test_1'),
SecondTestParameter('test-2', 'Test',
Description(short='Test choice',
full=('Test parameters are'
' needed for tests.'))),
ThirdTestParameter('test-3', 'Test',
Description(short='Test list',
full=('Test parameters are'
' needed for tests.'))))
set_values = OrderedDict()
set_values.update({'test-2': 'odd',
'test-1': 'choice_3',
'test-3': ['/dev/sda1', '/dev/sda2', '/dev/sda3']})
PARAMS.set_parameters(set_values)
assert PARAMS['test-1']._value == 'choice_3'
assert PARAMS['test-2']._value == 'odd'
assert PARAMS['test-3']._value == ['/dev/sda1',
'/dev/sda2',
'/dev/sda3']
with pytest.raises(ValidationError):
PARAMS.set_parameters({'test-3': ['/dev/sdb1', '/dev/sdb2']})
with pytest.raises(ValidationError):
PARAMS.set_parameters({'test-2': 'even'})
with pytest.raises(ValidationError):
PARAMS.set_parameters({'test-1': 'choice_5'})
def test_if_some_parameters_are_created_with_validation_methods_that_use_parameters_forming_cyclic_validation_process__the_parameters_throw_the_CyclicValidationError_exception(self):
datavars = Datavars(variables_path=os.path.join(TESTFILES_PATH,
'variables'))
PARAMS = Parameters(datavars)
# Описание классов параметров.
class FirstTestParameter(BaseParameter):
type = Choice()
def bind_method(self, choices_list):
choices_list = choices_list.value
for choice in choices_list:
self.choices.update({choice: f'Comment for {choice}'})
return choices_list[0], None
def validate(self, parameters, datavars, value):
if len(parameters['test-3'].value) < 5:
raise ValidationError('Too many devices.')
if datavars.os.linux.test_2 and bool(int(value[-1]) % 2):
raise ValidationError('Choice must be with even number.')
elif not datavars.os.linux.test_2 and not bool(
int(value[-1]) % 2):
raise ValidationError('Choice must be with odd number.')
print(f'VALIDATED: {self._name}')
class SecondTestParameter(BaseParameter):
type = String()
def bind_method(self):
return "default string", None
def validate(self, parameters, datavars, value):
if (bool(int(parameters['test-1'].value[-1]) % 2) and
value != 'odd'):
raise ValidationError('Value must be "odd".')
elif (not bool(int(parameters['test-1'].value[-1]) % 2) and
value != 'even'):
raise ValidationError('Value must be "even".')
elif value not in {'odd', 'even'}:
raise ValidationError('Value must be "odd" or "value"')
print(f'VALIDATED: {self._name}')
class ThirdTestParameter(BaseParameter):
type = List()
def bind_method(self):
return ['/dev/sda1'], None
def validate(self, parameters, datavars, value):
if parameters['test-2'].value == 'even':
raise ValidationError("Must be odd lol")
prefix = datavars.os.linux.test_4
for device in value:
if not device.startswith(prefix):
raise ValidationError("Partitions must be from the"
" '{prefix}' device")
print(f'VALIDATED: {self._name}')
# Создание параметров данных типов.
PARAMS.add(
FirstTestParameter('test-1', 'Test',
Description(
short='Test choice',
full=('Test parameters are'
' needed for tests.'))
).bind('os.linux.test_1'),
SecondTestParameter('test-2', 'Test',
Description(short='Test choice',
full=('Test parameters are'
' needed for tests.'))),
ThirdTestParameter('test-3', 'Test',
Description(short='Test list',
full=('Test parameters are'
' needed for tests.'))))
assert PARAMS['test-1']._value is None
PARAMS.order = ['test-1', 'test-2', 'test-3']
set_values = OrderedDict()
set_values.update({'test-2': 'odd',
'test-1': 'choice_3',
'test-3': ['/dev/sda1', '/dev/sda2', '/dev/sda3']})
with pytest.raises(CyclicValidationError):
PARAMS.set_parameters(set_values)
def test_if_two_parameters_is_created_with_the_bind_methods_and_one_of_them_can_be_disactivated_depending_on_the_variable_and_other_one_can_change_this_variable_s_value__the_second_parameter_can_disactivate_the_first_one_through_variable(self):
datavars = Datavars(variables_path=os.path.join(TESTFILES_PATH,
'variables'))
PARAMS = Parameters(datavars)
# Описание классов параметров.
class FirstTestParameter(BaseParameter):
type = Choice()
def bind_method(self, choices_list, flag_variable):
disactivity_comment = None
if flag_variable.value:
disactivity_comment = "Disactive because of flag"
choices_list = choices_list.value
for choice in choices_list:
self.choices.update({choice: f'Comment for {choice}'})
return choices_list[0], disactivity_comment
class SecondTestParameter(BaseParameter):
type = Bool()
def bind_method(self):
return True, None
# Создание параметров данных типов.
PARAMS.add(
FirstTestParameter('test-1', 'Test',
Description(
short='Test choice',
full=('Test parameters are'
' needed for tests.'))
).bind('os.linux.test_1',
'os.linux.test_2'),
SecondTestParameter('test-2', 'Test',
Description(short='Test bool',
full=('Test parameters are'
' needed for tests.')
)).to_set('os.linux.test_2'))
assert PARAMS['test-1'].disactivity_comment is None
PARAMS.set_parameters({'test-1': 'choice_2', 'test-2': True})
assert PARAMS['test-1'].disactivity_comment ==\
"Disactive because of flag"
assert PARAMS['test-1'].value == 'choice_2'
PARAMS.set_parameters({'test-2': False})
def test_if_there_is_an_attempt_to_add_in_the_parameters_container_new_parameter_but_the_container_already_has_parameter_with_the_same_fullname__the_parameters_container_throws_ParameterError_exception(self):
datavars = Datavars(variables_path=os.path.join(TESTFILES_PATH,
'variables'))
PARAMS = Parameters(datavars)
# Описание классов параметров.
class FirstTestParameter(BaseParameter):
type = String()
def bind_method(self):
return "default string", None
class SecondTestParameter(BaseParameter):
type = String()
def bind_method(self):
return "default string", None
# Создание параметров данных типов.
with pytest.raises(ParameterError):
PARAMS.add(
FirstTestParameter('test', 'Test',
Description(
short='Test string',
full=('Test parameters are'
' needed for tests.'))),
SecondTestParameter('test', 'Test',
Description(short='Test string',
full=('Test parameters are'
' needed for tests.'))))
def test_if_there_is_an_attempt_to_add_in_the_parameters_container_new_parameter_but_the_container_already_has_parameter_with_the_same_shortname__the_parameters_container_throws_ParameterError_exception(self):
datavars = Datavars(variables_path=os.path.join(TESTFILES_PATH,
'variables'))
PARAMS = Parameters(datavars)
# Описание классов параметров.
class FirstTestParameter(BaseParameter):
type = String()
def bind_method(self):
return "default string", None
class SecondTestParameter(BaseParameter):
type = String()
def bind_method(self):
return "default string", None
# Создание параметров данных типов.
with pytest.raises(ParameterError):
PARAMS.add(
FirstTestParameter('test-1', 'Test',
Description(
short='Test string',
full=('Test parameters are'
' needed for tests.')),
shortname='t'),
SecondTestParameter('test-2', 'Test',
Description(short='Test string',
full=('Test parameters are'
' needed for tests.')),
shortname='t'))
def test_if_some_parameters_are_created_with_different_argv_values__their_position_number_will_be_saved_in_the_parameters_container(self):
datavars = Datavars(variables_path=os.path.join(TESTFILES_PATH,
'variables'))
PARAMS = Parameters(datavars)
# Описание классов параметров.
class FirstTestParameter(BaseParameter):
type = String()
def bind_method(self):
return "default string", None
class SecondTestParameter(BaseParameter):
type = String()
def bind_method(self):
return "default string", None
class ThirdTestParameter(BaseParameter):
type = String()
def bind_method(self):
return "default string", None
# Создание параметров данных типов.
PARAMS.add(
FirstTestParameter('test-a', 'Test 1',
Description(
short='Test string',
full=('Test parameters are'
' needed for tests.')),
shortname='a', argv=0),
SecondTestParameter('test-b', 'Test 2',
Description(short='Test string',
full=('Test parameters are'
' needed for tests.')),
shortname='b', argv=3),
SecondTestParameter('test-c', 'Test 3',
Description(short='Test string',
full=('Test parameters are'
' needed for tests.')),
shortname='c', argv=1))
assert PARAMS._argvs == [PARAMS['test-a'], PARAMS['test-c'],
None, PARAMS['test-b']]
def test_if_there_is_an_attempt_to_add_in_the_parameters_container_new_parameter_but_the_container_already_has_parameter_with_the_same_argv_value__the_parameters_container_throws_ParameterError_exception(self):
datavars = Datavars(variables_path=os.path.join(TESTFILES_PATH,
'variables'))
PARAMS = Parameters(datavars)
# Описание классов параметров.
class FirstTestParameter(BaseParameter):
type = String()
def bind_method(self):
return "default string", None
class SecondTestParameter(BaseParameter):
type = String()
def bind_method(self):
return "default string", None
# Создание параметров данных типов.
with pytest.raises(ParameterError):
PARAMS.add(
FirstTestParameter('test-1', 'Test',
Description(
short='Test string',
full=('Test parameters are'
' needed for tests.')),
shortname='t', argv=0),
SecondTestParameter('test-2', 'Test',
Description(short='Test string',
full=('Test parameters are'
' needed for tests.')),
shortname='t', argv=0))
def test_if_parameter_is_created_with_the_bind_method__the_bind_method_can_get_access_to_the_current_parameter_value_during_the_value_calculation(self):
datavars = Datavars(variables_path=os.path.join(TESTFILES_PATH,
'variables'))
PARAMS = Parameters(datavars)
# Описание классов параметров.
class FirstTestParameter(BaseParameter):
type = String()
def bind_method(self, test_var, test_comment):
output = "/dev/sda"
test_var_value = test_var.value
if self.value is not None:
number = int(self.value[8:])
if test_var_value > number:
number += 1
elif number:
number -= 1
output = output + str(number)
else:
output = output + '0'
self._description.full = test_comment.value
return output, None
# Создание параметров данных типов.
PARAMS.add(FirstTestParameter('test', 'Test',
Description(short=('Test string'),
full=('Test parameters are'
' needed for tests.')),
shortname='t').bind('os.linux.test_5',
'os.linux.test_6'))
assert PARAMS['test'].value == '/dev/sda0'
datavars.os.linux['test_5'].set(6)
assert PARAMS['test'].value == '/dev/sda1'
datavars.os.linux['test_5'].set(4)
assert PARAMS['test'].value == '/dev/sda2'
datavars.os.linux['test_5'].set(2)
assert PARAMS['test'].value == '/dev/sda1'
assert PARAMS['test']._description.full == 'Comment'
datavars.os.linux['test_6'].set("New comment")
assert PARAMS['test']._description.full == 'New comment'
def test_if_parameter_is_created_with_table_type_and_bind_method_is_set_for_this_parameter__the_bind_method_can_be_used_for_setting_of_the_table_fields_and_its_types(self):
datavars = Datavars(variables_path=os.path.join(TESTFILES_PATH,
'variables'))
PARAMS = Parameters(datavars)
# Описание классов параметров.
class FirstTestParameter(BaseParameter):
type = Table()
def bind_method(self):
table = TableValue('dev', {'dev': String(),
'mount': String()})
table.set_comments('Device', 'Mount point')
mount_points = ['/', '/var/calculate', '/tmp']
for number in range(1, 4):
table.change(f'/dev/sdb{number}', mount_points[number - 1])
return table, None
# Создание параметров данных типов.
PARAMS.add(FirstTestParameter('test', 'Test',
Description(short=('Test table'),
full=('Test parameters are'
' needed for tests.')),
shortname='t'))
assert PARAMS['test'].value.get_for_var() ==\
[{'dev': '/dev/sdb1', 'mount': '/'},
{'dev': '/dev/sdb2', 'mount': '/var/calculate'},
{'dev': '/dev/sdb3', 'mount': '/tmp'}]
with pytest.raises(ParameterError):
PARAMS['test'].set(['/dev/sdb2', '/var', 'onemore'])
with pytest.raises(ParameterError):
PARAMS['test'].set(['/dev/sdb2'])
def test_if_parameter_is_created_with_table_type_and_types_of_its_fields_is_set__this_parameter_uses_this_types_for_invalidating_of_all_fields_values(self):
datavars = Datavars(variables_path=os.path.join(TESTFILES_PATH,
'variables'))
PARAMS = Parameters(datavars)
# Описание классов параметров.
class FirstTestParameter(BaseParameter):
type = Table()
def bind_method(self):
mounted_choices = Choice(choices=OrderedDict(
{'mounted': 'Mounted',
'umounted': 'Not mounted',
'auto': 'Autodetection'}))
table = TableValue('id', {'id': Integer(),
'dev': String(),
'mount': String(),
'status': mounted_choices})
table.set_comments('ID',
'Device',
'Mount point',
'Status')
mount_points = ['/', '/var/calculate', '/tmp']
states = ['mounted', 'umounted', 'auto']
for number in range(1, 4):
table.change(number,
f'/dev/sdb{number}',
mount_points[number - 1],
states[number - 1])
return table, None
# Создание параметров данных типов.
PARAMS.add(FirstTestParameter('test', 'Test',
Description(short=('Test table'),
full=('Test parameters are'
' needed for tests.')),
shortname='t'))
assert PARAMS['test'].value.get_for_var() ==\
[{'id': 1, 'dev': '/dev/sdb1',
'mount': '/', 'status': 'mounted'},
{'id': 2, 'dev': '/dev/sdb2',
'mount': '/var/calculate', 'status': 'umounted'},
{'id': 3, 'dev': '/dev/sdb3',
'mount': '/tmp', 'status': 'auto'}]
with pytest.raises(ValidationError):
PARAMS['test'].set(['woops', '/dev/sdb4', '/home', 'mounted'])
with pytest.raises(ValidationError):
PARAMS['test'].set([3, 4, '/home', 'mounted'])
with pytest.raises(ValidationError):
PARAMS['test'].set([3, '/dev/sdb4', False, 'mounted'])
with pytest.raises(ValidationError):
PARAMS['test'].set([3, '/dev/sdb4', '/home', 'custom'])
def test_if_parameter_is_created_with_table_type_and_expandable_flag_is_True__new_rows_can_be_added_to_the_created_table_and_existing_rows_can_be_modified(self):
datavars = Datavars(variables_path=os.path.join(TESTFILES_PATH,
'variables'))
PARAMS = Parameters(datavars)
# Описание классов параметров.
class FirstTestParameter(BaseParameter):
type = Table(expandable=True)
def bind_method(self):
table = TableValue('dev', {'dev': String(),
'mount': String()})
table.set_comments('Device', 'Mount point')
mount_points = ['/', '/var/calculate', '/tmp']
for number in range(1, 4):
table.change(f'/dev/sdb{number}', mount_points[number - 1])
return table, None
# Создание параметров данных типов.
PARAMS.add(FirstTestParameter('test', 'Test',
Description(short=('Test table'),
full=('Test parameters are'
' needed for tests.')),
shortname='t'))
assert PARAMS['test'].value.get_for_var() ==\
[{'dev': '/dev/sdb1', 'mount': '/'},
{'dev': '/dev/sdb2', 'mount': '/var/calculate'},
{'dev': '/dev/sdb3', 'mount': '/tmp'}]
PARAMS['test'].set(['/dev/sdb2', '/var'])
assert PARAMS['test'].value.get_for_var() ==\
[{'dev': '/dev/sdb1', 'mount': '/'},
{'dev': '/dev/sdb2', 'mount': '/var'},
{'dev': '/dev/sdb3', 'mount': '/tmp'}]
PARAMS['test'].set(['/dev/sdb4', '/home'])
assert PARAMS['test'].value.get_for_var() ==\
[{'dev': '/dev/sdb1', 'mount': '/'},
{'dev': '/dev/sdb2', 'mount': '/var'},
{'dev': '/dev/sdb3', 'mount': '/tmp'},
{'dev': '/dev/sdb4', 'mount': '/home'}]
def test_if_parameter_is_created_with_table_type_and_expandable_flag_is_False__existing_rows_can_be_modified_but_attempt_to_add_new_will_call_set_error_method_that_can_be_set_for_table(self):
datavars = Datavars(variables_path=os.path.join(TESTFILES_PATH,
'variables'))
PARAMS = Parameters(datavars)
# Описание классов параметров.
class FirstTestParameter(BaseParameter):
type = Table(expandable=False)
def bind_method(self):
table = TableValue('dev', {'dev': String(),
'mount': String()})
table.set_comments('Device', 'Mount point')
mount_points = ['/', '/var/calculate', '/tmp']
for number in range(1, 4):
table.change(f'/dev/sdb{number}', mount_points[number - 1])
return table, None
# Создание параметров данных типов.
PARAMS.add(FirstTestParameter('test', 'Test',
Description(short=('Test table'),
full=('Test parameters are'
' needed for tests.')),
shortname='t'))
assert PARAMS['test'].value.get_for_var() ==\
[{'dev': '/dev/sdb1', 'mount': '/'},
{'dev': '/dev/sdb2', 'mount': '/var/calculate'},
{'dev': '/dev/sdb3', 'mount': '/tmp'}]
PARAMS['test'].set(['/dev/sdb2', '/var'])
assert PARAMS['test'].value.get_for_var() ==\
[{'dev': '/dev/sdb1', 'mount': '/'},
{'dev': '/dev/sdb2', 'mount': '/var'},
{'dev': '/dev/sdb3', 'mount': '/tmp'}]
with pytest.raises(ParameterError,
match="Device '/dev/sdb4' is not found."):
PARAMS['test'].set(['/dev/sdb4', '/home'])
def set_error(value: str, field: str, available: list):
raise ParameterError(
f"No such {field.lower()} '{value}' in table. "
f"Available: {', '.join(available)}.")
PARAMS['test'].value.set_error = set_error
with pytest.raises(ParameterError,
match="No such device '/dev/sdb4' in table. "
"Available: /dev/sdb[123], /dev/sdb[123], "
"/dev/sdb[123]."):
PARAMS['test'].set(['/dev/sdb4', '/home'])
def test_if_parameter_is_created_with_table_type_and_to_set_method_is_used_to_add_variables_to_set_value__the_table_parameter_will_set_its_value_to_the_variable_from_set_list(self):
datavars = Datavars(variables_path=os.path.join(TESTFILES_PATH,
'variables'))
PARAMS = Parameters(datavars)
# Описание классов параметров.
class FirstTestParameter(BaseParameter):
type = Table(expandable=True)
def bind_method(self):
table = TableValue('dev', {'dev': String(),
'mount': String()})
table.set_comments('Device', 'Mount point')
mount_points = ['/', '/var/calculate', '/tmp']
for number in range(1, 4):
table.change(f'/dev/sdb{number}', mount_points[number - 1])
return table, None
# Создание параметров данных типов.
PARAMS.add(FirstTestParameter('test', 'Test',
Description(short=('Test table'),
full=('Test parameters are'
' needed for tests.')),
shortname='t').to_set('os.dev_table'))
assert PARAMS['test'].value.get_for_var() ==\
[{'dev': '/dev/sdb1', 'mount': '/'},
{'dev': '/dev/sdb2', 'mount': '/var/calculate'},
{'dev': '/dev/sdb3', 'mount': '/tmp'}]
PARAMS['test'].set(['/dev/sdb2', '/var'])
assert datavars.os.dev_table == [{'dev': '/dev/sdb1', 'mount': '/'},
{'dev': '/dev/sdb2', 'mount': '/var'},
{'dev': '/dev/sdb3', 'mount': '/tmp'}]
PARAMS['test'].set(['/dev/sdb4', '/home'])
assert datavars.os.dev_table == [{'dev': '/dev/sdb1', 'mount': '/'},
{'dev': '/dev/sdb2', 'mount': '/var'},
{'dev': '/dev/sdb3', 'mount': '/tmp'},
{'dev': '/dev/sdb4', 'mount': '/home'}
]
def test_if_parameter_is_created_with_table_type_and_fill_method_is_set__the_parameter_will_use_fill_method_to_fill_empty_fields_of_the_table(self):
datavars = Datavars(variables_path=os.path.join(TESTFILES_PATH,
'variables'))
PARAMS = Parameters(datavars)
# Описание классов параметров.
class FirstTestParameter(BaseParameter):
type = Table(expandable=True)
def bind_method(self):
mounted_choices = Choice(choices=OrderedDict(
{'mounted': 'Mounted',
'umounted': 'Not mounted',
'auto': 'Autodetection'}))
table = TableValue('dev', {'dev': String(),
'mount': String(),
'name': String(),
'status': mounted_choices})
table.set_comments('Device', 'Mount point', 'Name', 'Status')
def set_error(value: str, field: str, available: list):
raise ParameterError(
f"No such {field.lower()} '{value}' in table. "
f"Available: {', '.join(available)}.")
table.set_error = set_error
def fill(values):
for key, row in values.items():
for field, value in row.items():
if value is None:
if field == 'name':
value = f'Device {int(row["dev"][8:])}'
elif field == 'status':
value = 'auto'
row[field] = value
return values
table.fill = fill
mount_points = ['/', '/var/calculate', '/tmp']
states = ['mounted', 'umounted', 'auto']
names = ['Device 1', None, 'Device 3']
for number in range(1, 4):
table.change(f'/dev/sdb{number}',
mount_points[number - 1],
names[number - 1],
states[number - 1])
return table, None
# Создание параметров данных типов.
PARAMS.add(FirstTestParameter('test', 'Test',
Description(short=('Test table'),
full=('Test parameters are'
' needed for tests.')),
shortname='t').to_set('os.dev_table'))
assert PARAMS['test'].value.get_for_var() ==\
[{'dev': '/dev/sdb1', 'mount': '/',
'name': 'Device 1', 'status': 'mounted'},
{'dev': '/dev/sdb2', 'mount': '/var/calculate',
'name': 'Device 2', 'status': 'umounted'},
{'dev': '/dev/sdb3', 'mount': '/tmp',
'name': 'Device 3', 'status': 'auto'}]
PARAMS['test'].set(['/dev/sdb4', '/home', None, None])
assert PARAMS['test'].value.get_for_var() ==\
[{'dev': '/dev/sdb1', 'mount': '/',
'name': 'Device 1', 'status': 'mounted'},
{'dev': '/dev/sdb2', 'mount': '/var/calculate',
'name': 'Device 2', 'status': 'umounted'},
{'dev': '/dev/sdb3', 'mount': '/tmp',
'name': 'Device 3', 'status': 'auto'},
{'dev': '/dev/sdb4', 'mount': '/home',
'name': 'Device 4', 'status': 'auto'}]
def test_gui_wrapper(self):
pass
def test_for_removing_testfiles(self):
shutil.rmtree(os.path.join(TESTFILES_PATH, 'gentoo'))