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/commands/test_commands.py

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'))