Commit 56c7bc43 authored by lopezaguilar's avatar lopezaguilar
Browse files

Finish the generation of then in case of Test Cases definition

parent 4051be3a
Loading
Loading
Loading
Loading
+7 −4
Original line number Diff line number Diff line
@@ -9,6 +9,8 @@ class GenerateRobotData:
    def __init__(self, robot_file: str, execdir: str):
        self.robot = ParseRobotFile(filename=robot_file, execdir=execdir)
        self.apiutil = ParseApiUtilsFile(filename=self.robot.resource_file)
        self.robot.set_apiutils(self.apiutil)

        self.suite = TestSuiteBuilder().build(robot_file)
        self.test_cases = list()
        self.test_suite = dict()
@@ -109,8 +111,8 @@ class GenerateRobotData:
        self.test_cases[index]['http_verb'] = verb
        self.test_cases[index]['endpoint'] = self.get_header_value(key=url)

        expected_status_code = self.robot.get_expected_status_code(keyword='Check Response Status Code')
        self.test_cases[index]['expected_status_code'] = expected_status_code
        #expected_status_code = self.robot.get_expected_status_code(keyword='Check Response Status Code')
        #self.test_cases[index]['expected_status_code'] = expected_status_code

    def check_header_parameters(self, params: list, test: str):
        value = str()
@@ -229,7 +231,7 @@ class GenerateRobotData:
            body = ''

        # Generate Checks for Test Data
        list_checks = self.robot.get_checks(test_name=test.name, apiutils=self.apiutil)
        then = self.robot.get_checks(test_name=test.name, apiutils=self.apiutil)

        test_case = {
            'name': test.name,
@@ -240,7 +242,8 @@ class GenerateRobotData:
            'teardown': test.teardown.name,
            'template': test.template,
            'content-type': content_type,
            'body': body
            'body': body,
            'then': then
        }

        try:
+5 −5
Original line number Diff line number Diff line
@@ -8,8 +8,8 @@ if __name__ == "__main__":
    info = data.get_info()
    pprint(info)

    data = GenerateRobotData(robot_file='../TP/NGSI-LD/ContextInformation/Provision/Entities/CreateEntity/001_01.robot',
                             execdir='/home/fla/Documents/workspace/bdd/ngsi-ld-test-suite')
    data.parse_robot()
    info = data.get_info()
    pprint(info)
    #data = GenerateRobotData(robot_file='../TP/NGSI-LD/ContextInformation/Provision/Entities/CreateEntity/001_01.robot',
    #                         execdir='/home/fla/Documents/workspace/bdd/ngsi-ld-test-suite')
    #data.parse_robot()
    #info = data.get_info()
    #pprint(info)
+88 −37
Original line number Diff line number Diff line
@@ -14,11 +14,15 @@ class ParseRobotFile:
        self.variables = dict()
        self.execdir = execdir
        self.resource_file = str()
        self.apiutils = None

        self.get_variables_data()
        self.get_apiutils_path()
        self.get_test_cases()

    def set_apiutils(self, apiutils):
        self.apiutils = apiutils

    def get_variables_data(self):
        string = self.get_substring(initial_string='*** Variables ***\n', final_string='*** ', include=False)

@@ -32,18 +36,18 @@ class ParseRobotFile:
            else:
                print("Error, the variable is not following the format ${thing} = <value>")

    def get_expected_status_code(self, keyword: str):
        #     Check Response Status Code    ${expected_status_code}    ${response.status_code}
        #     Check Response Body Containing ProblemDetails Element Containing Type Element set to
        #     ...    ${response.json()}
        #     ...    ${ERROR_TYPE_LD_CONTEXT_NOT_AVAILABLE}
        string = self.get_substring(initial_string=keyword, final_string='\n', include=True)
        expected_status_code = string.split('    ')[1]

        if expected_status_code.isdigit():
            return expected_status_code
        else:
            return self.variables[expected_status_code]
    # def get_expected_status_code(self, keyword: str):
    #     #     Check Response Status Code    ${expected_status_code}    ${response.status_code}
    #     #     Check Response Body Containing ProblemDetails Element Containing Type Element set to
    #     #     ...    ${response.json()}
    #     #     ...    ${ERROR_TYPE_LD_CONTEXT_NOT_AVAILABLE}
    #     string = self.get_substring(initial_string=keyword, final_string='\n', include=True)
    #     expected_status_code = string.split('    ')[1]
    #
    #     if expected_status_code.isdigit():
    #         return expected_status_code
    #     else:
    #         return self.variables[expected_status_code]

    def get_apiutils_path(self):
        string = self.get_substring(initial_string='Resource', final_string='*** Variables ***', include=True)
@@ -70,7 +74,7 @@ class ParseRobotFile:
        else:
            string = self.file_contents[index_start+len(initial_string):]

        if final_string is not '':
        if final_string != '':
            index_end = string.find(final_string)
            string = string[:index_end]

@@ -96,7 +100,6 @@ class ParseRobotFile:
            self.test_cases[self.test_case_names[i]] = string[indexes[i]:indexes[i+1]]

        self.test_cases[self.test_case_names[-1]] = string[indexes[-1]:]
        print()

    def get_checks(self, test_name, apiutils):
        data = Checks()
@@ -108,37 +111,85 @@ class ParseRobotFile:
        param = dict()
        lines_starting_with_check = re.findall(r'^\s*Check.*', test_content, re.MULTILINE)
        for line in lines_starting_with_check:
            check, param = self.get_data_check(content=test_content, checks=data, line=line.strip())
            check, param = self.get_data_check(test_case=test_content, checks=data, line=line.strip())
            result = data.get_checks(checks=check, **param)
            checks.append(check)
            checks.append(result)

        result = self.generate_then_content(content=checks)

        return result

    def generate_then_content(self, content):
        if len(content) > 1:
            checks = " and\n        ".join(content)
            checks = f"then {{\n    the SUT sends a valid Response containing:\n        {checks}\n}}"
        elif len(content) == 1:
            checks = f"then {{\n    the SUT sends a valid Response containing:\n        {content[0]}\n}}"
        else:
            raise Exception("ERROR, It is expected at least 1 Check operation in the Test Case")

        return checks

    def get_data_check(self, content, checks, line):
    def get_data_check(self, test_case, checks, line):
        content = line.split("    ")
        aux = len(content)
        position_params = checks.args[content[0]]

        try:
            position_params = checks.args[content[0]]
            if aux == 1:
                # We are in multiline classification of the Check, need to extract the parameter for the next lines
            self.find_attributes_next_line(content=content, name=content[0])
                params = self.find_attributes_next_line(test_case=test_case, name=content[0],
                                                        position_params=position_params)
                return content[0], params
            elif aux > 1:
                # We are in one line definiton
                params = self.find_attributes_same_line(params=position_params, content=content)
                return content[0], params
            else:
                raise Exception("ERROR, line should contain data")
        except KeyError:
            # The Check operation does not require parameters
            return content[0], dict()

    def find_attributes_same_line(self, params, content):
        result = dict()

        for i in range(0, len(params['position'])):
            param_key = params['params'][i]
            param_position = params['position'][i]
            # param_value = self.variables[content[param_position]]
            param_value = self.get_param_value(position=content[param_position])
            result[param_key] = param_value

        return result

    def find_attributes_next_line(self, test_case, name, position_params):
        index_start = test_case.find(name)

        aux = test_case[index_start+len(name)+1:].split('\n')

        params = list()
        for a in range(0, len(aux)):
            param = aux[a]
            if param.startswith("    ..."):
                params.append(param.split('    ')[-1])
            else:
                break

        param = dict()
        for i in range(0, len(position_params['position'])):
            param_key = position_params['params'][i]
            param_position = position_params['position'][i]
                param_value = self.variables[content[param_position]]
            # param_value = self.variables[params[param_position]-1]
            param_value = self.get_param_value(position=params[param_position-1])
            param[param_key] = param_value

                return content[0], param
        else:
            raise Exception("ERROR, line should contain data")

    def find_attributes_next_line(self, content, name):
        index_start = content.find(name)

        aux = content[index_start+len(name)+1:]

        return param

    def get_param_value(self, position):
        try:
            result = self.variables[position]
        except KeyError:
            result = self.apiutils.variables[position]

        return result
 No newline at end of file