Loading doc/generaterobotdata.py +7 −4 Original line number Diff line number Diff line Loading @@ -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() Loading Loading @@ -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() Loading Loading @@ -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, Loading @@ -240,7 +242,8 @@ class GenerateRobotData: 'teardown': test.teardown.name, 'template': test.template, 'content-type': content_type, 'body': body 'body': body, 'then': then } try: Loading doc/generatetestsuiteinfo.py +5 −5 Original line number Diff line number Diff line Loading @@ -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) doc/parserobotfile.py +88 −37 Original line number Diff line number Diff line Loading @@ -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) Loading @@ -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) Loading @@ -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] Loading @@ -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() Loading @@ -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 Loading
doc/generaterobotdata.py +7 −4 Original line number Diff line number Diff line Loading @@ -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() Loading Loading @@ -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() Loading Loading @@ -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, Loading @@ -240,7 +242,8 @@ class GenerateRobotData: 'teardown': test.teardown.name, 'template': test.template, 'content-type': content_type, 'body': body 'body': body, 'then': then } try: Loading
doc/generatetestsuiteinfo.py +5 −5 Original line number Diff line number Diff line Loading @@ -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)
doc/parserobotfile.py +88 −37 Original line number Diff line number Diff line Loading @@ -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) Loading @@ -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) Loading @@ -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] Loading @@ -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() Loading @@ -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