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.
195 lines
7.9 KiB
195 lines
7.9 KiB
import os
|
|
import shutil
|
|
import pytest
|
|
from calculate.commands.commands import Command
|
|
from calculate.scripts.scripts import Script, Task
|
|
from calculate.variables.loader import Datavars
|
|
from calculate.variables.parameters import Parameters, BaseParameter, Integer,\
|
|
String, ValidationError,\
|
|
Description
|
|
from calculate.utils.io_module import IOModule
|
|
|
|
|
|
TESTFILES_PATH = os.path.join(os.getcwd(), 'tests/commands/testfiles')
|
|
|
|
|
|
@pytest.mark.commands
|
|
class TestCommands:
|
|
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_commands_first(self):
|
|
datavars = Datavars(variables_path=os.path.join(TESTFILES_PATH,
|
|
'variables'))
|
|
|
|
# Скрипт выполняемый командой.
|
|
def action(output: IOModule, arg1: str) -> str:
|
|
return f'os.calculate = {arg1}'
|
|
|
|
# Для обеспечения многопоточности вероятно придется делать так.
|
|
def test_script():
|
|
return Script('test_script'
|
|
).tasks(Task(id='task',
|
|
name="Task",
|
|
action=action,
|
|
args=["os.calculate"])
|
|
)
|
|
|
|
# Параметры данной команды.
|
|
test_parameters = Parameters().initialize(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)}")
|
|
|
|
test_parameters.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.')))
|
|
|
|
command = Command(command_id='test',
|
|
category='Test Category',
|
|
title='Test',
|
|
script=test_script(),
|
|
parameters=test_parameters,
|
|
namespace='os',
|
|
rights=['group'])
|
|
command.initialize(datavars, IOModule())
|
|
command.script.run()
|
|
|
|
assert datavars.scripts.test_script.task.result ==\
|
|
'os.calculate = test1 test2'
|
|
|
|
def test_commands_with_setvar(self):
|
|
datavars = Datavars(variables_path=os.path.join(TESTFILES_PATH,
|
|
'variables'))
|
|
|
|
# Скрипт выполняемый командой.
|
|
def action(output: IOModule, arg1: str) -> str:
|
|
return f'os.calculate = {arg1}'
|
|
|
|
# Для обеспечения многопоточности вероятно придется делать так.
|
|
def test_script():
|
|
return Script('test_script'
|
|
).tasks(Task(id='task',
|
|
name="Task",
|
|
action=action,
|
|
args=["os.calculate"])
|
|
)
|
|
|
|
# Параметры данной команды.
|
|
test_parameters = Parameters().initialize(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)}")
|
|
|
|
test_parameters.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.')))
|
|
|
|
command = Command(command_id='test',
|
|
category='Test Category',
|
|
title='Test',
|
|
script=test_script(),
|
|
parameters=test_parameters,
|
|
namespace='os',
|
|
gui=True,
|
|
icon=['icon_1', 'icon_2'],
|
|
setvars={'os.hashvar_0': {'value1': 'new_1',
|
|
'value2': 'new_2'},
|
|
'.linux.test_5': 1349},
|
|
rights=['install'])
|
|
|
|
command.initialize(datavars, IOModule())
|
|
command.script.run()
|
|
|
|
assert datavars.os.hashvar_0.get_hash() == {'value1': 'new_1',
|
|
'value2': 'new_2'}
|
|
assert datavars.os.linux.test_5 == 1349
|
|
assert datavars.os.calculate == 'new_1 new_2'
|
|
assert datavars.scripts.test_script.task.result ==\
|
|
'os.calculate = new_1 new_2'
|
|
|
|
def test_for_removing_testfiles(self):
|
|
shutil.rmtree(os.path.join(TESTFILES_PATH, 'gentoo'))
|