diff --git a/testit-adapter-nose/src/testit_adapter_nose/utils.py b/testit-adapter-nose/src/testit_adapter_nose/utils.py index ee05a13c..35b80c1c 100644 --- a/testit-adapter-nose/src/testit_adapter_nose/utils.py +++ b/testit-adapter-nose/src/testit_adapter_nose/utils.py @@ -365,11 +365,15 @@ def get_parameter(key_for_parameter, all_parameters): parameter_key = key_for_parameter.replace("[" + id_keys_in_parameter[0] + "]", "") id_key_in_parameter = id_keys_in_parameter[0].strip("\'\"") - if id_key_in_parameter.isdigit() and int(id_key_in_parameter) in range(len(all_parameters[parameter_key])): - return all_parameters[parameter_key][int(id_key_in_parameter)] + nested = all_parameters.get(parameter_key) - if id_key_in_parameter.isalnum() and id_key_in_parameter in all_parameters[parameter_key].keys(): - return all_parameters[parameter_key][id_key_in_parameter] + if id_key_in_parameter.isdigit() and isinstance(nested, (list, tuple)): + index = int(id_key_in_parameter) + if index in range(len(nested)): + return nested[index] + + if isinstance(nested, dict) and id_key_in_parameter in nested: + return nested[id_key_in_parameter] logging.error(f"Not key: {key_for_parameter} in run parameters or other keys problem") diff --git a/testit-adapter-pytest/src/testit_adapter_pytest/utils.py b/testit-adapter-pytest/src/testit_adapter_pytest/utils.py index 3157ae77..a3716fb4 100644 --- a/testit-adapter-pytest/src/testit_adapter_pytest/utils.py +++ b/testit-adapter-pytest/src/testit_adapter_pytest/utils.py @@ -294,15 +294,26 @@ def get_parameter(key_for_parameter, all_parameters): parameter_key = key_for_parameter.replace("[" + id_keys_in_parameter[0] + "]", "") id_key_in_parameter = id_keys_in_parameter[0].strip("\'\"") - if id_key_in_parameter.isdigit() and int(id_key_in_parameter) in range(len(all_parameters[parameter_key])): - return all_parameters[parameter_key][int(id_key_in_parameter)] + nested = all_parameters.get(parameter_key) - if id_key_in_parameter.isalnum() and id_key_in_parameter in all_parameters[parameter_key].keys(): - return all_parameters[parameter_key][id_key_in_parameter] + if id_key_in_parameter.isdigit() and isinstance(nested, (list, tuple)): + index = int(id_key_in_parameter) + if index in range(len(nested)): + return nested[index] + + if isinstance(nested, dict) and id_key_in_parameter in nested: + return nested[id_key_in_parameter] logging.error(f"Not key: {key_for_parameter} in run parameters or other keys problem") +def __expand_dict_parameters(params): + for value in tuple(params.values()): + if isinstance(value, dict): + for dict_key, dict_value in value.items(): + params.setdefault(dict_key, dict_value) + + def get_all_parameters(item): params = {} @@ -311,6 +322,7 @@ def get_all_parameters(item): if hasattr(item, 'callspec'): params.update(item.callspec.params) + __expand_dict_parameters(params) return params diff --git a/testit-adapter-pytest/tests/test_utils.py b/testit-adapter-pytest/tests/test_utils.py new file mode 100644 index 00000000..e23fbc89 --- /dev/null +++ b/testit-adapter-pytest/tests/test_utils.py @@ -0,0 +1,55 @@ +import pytest + +from testit_adapter_pytest.utils import ( + collect_parameters_in_string_attribute, + get_all_parameters, + get_parameter, +) + + +class _FakeItem: + def __init__(self, callspec_params=None, test_properties=None): + if callspec_params is not None: + self.callspec = type('CallSpec', (), {'params': callspec_params})() + if test_properties is not None: + self.test_properties = test_properties + + +def test_expand_dict_keys_from_fixture_params(): + item = _FakeItem(callspec_params={ + 'users_prepare_fixture_all_active_param': { + 'user_type': 'viewer', + 'nnumber': 3, + }, + }) + params = get_all_parameters(item) + + assert params['user_type'] == 'viewer' + assert params['users_prepare_fixture_all_active_param']['user_type'] == 'viewer' + + +def test_placeholder_user_type_from_fixture_dict_param(): + item = _FakeItem(callspec_params={ + 'users_prepare_fixture_all_active_param': {'user_type': 'consultant'}, + }) + result = collect_parameters_in_string_attribute( + 'Получение Информации о (positive) [{user_type}]', + get_all_parameters(item), + ) + + assert result == 'Получение Информации о (positive) [consultant]' + + +def test_bracket_syntax_with_underscore_key(): + params = {'fixture_param': {'user_type': 'admin'}} + assert get_parameter('fixture_param[user_type]', params) == 'admin' + + +def test_top_level_param_not_overwritten_by_dict_expand(): + item = _FakeItem(callspec_params={ + 'user_type': 'from_parametrize', + 'fixture_param': {'user_type': 'from_dict'}, + }) + params = get_all_parameters(item) + + assert params['user_type'] == 'from_parametrize'