From 86d8f052e39f114e192c534917837dc5e08cee45 Mon Sep 17 00:00:00 2001 From: debugtalk Date: Mon, 20 Apr 2020 15:44:26 +0800 Subject: [PATCH] fix parser: check if reference variable itself check if reference variable not in variables_mapping --- httprunner/v3/parser.py | 20 +++++++++++++++++++- httprunner/v3/parser_test.py | 30 ++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 httprunner/v3/parser_test.py diff --git a/httprunner/v3/parser.py b/httprunner/v3/parser.py index 9e1b2ad3..f6ff3a58 100644 --- a/httprunner/v3/parser.py +++ b/httprunner/v3/parser.py @@ -173,7 +173,25 @@ def parse_variables_mapping(variables_mapping: Dict[Text, Any]) -> Dict[Text, An continue var_value = variables_mapping[var_name] - # variables = extract_variables(var_value) + variables = extract_variables(var_value) + + # check if reference variable itself + if var_name in variables: + # e.g. + # variables_mapping = {"token": "abc$token"} + # variables_mapping = {"key": ["$key", 2]} + raise exceptions.VariableNotFound(var_name) + + # check if reference variable not in variables_mapping + not_defined_variables = [ + v_name + for v_name in variables + if v_name not in variables_mapping + ] + if not_defined_variables: + # e.g. {"varA": "123$varB", "varB": "456$varC"} + # e.g. {"varC": "${sum_two($a, $b)}"} + raise VariableNotFound(not_defined_variables) try: parsed_value = parse_content(var_value, parsed_variables) diff --git a/httprunner/v3/parser_test.py b/httprunner/v3/parser_test.py new file mode 100644 index 00000000..f4a02068 --- /dev/null +++ b/httprunner/v3/parser_test.py @@ -0,0 +1,30 @@ +import unittest + +from httprunner.v3.parser import parse_variables_mapping +from httprunner.v3.exceptions import VariableNotFound + + +class TestParserBasic(unittest.TestCase): + + def test_parse_variables_mapping(self): + variables = { + "varA": "$varB", + "varB": "$varC", + "varC": "123", + "a": 1, + "b": 2 + } + parsed_variables = parse_variables_mapping(variables) + print(parsed_variables) + self.assertEqual(parsed_variables["varA"], "123") + self.assertEqual(parsed_variables["varB"], "123") + + def test_parse_variables_mapping_exception(self): + variables = { + "varA": "$varB", + "varB": "$varC", + "a": 1, + "b": 2 + } + with self.assertRaises(VariableNotFound): + parse_variables_mapping(variables)