def _post_new_testcase(self, name: str, folder: str, test_source_file_path: str = ''): """creates new testcase from self.testcase. :param test_source_file_path: additional logging parameters about testcase creation for csv self.logger :return nothing, but updates self.testcase""" self.logger.debug(f"Post testcase with params: {locals()}") key = None self._init_testcase() self.testcase['name'] = name self.testcase['folder'] = f"/{folder}" self.testcase['status'] = 'Approved' url = f'{self._baseurl}/testcase' if name == '': raise TM4JInvalidValue('Testcase name cannot be empty!') response: dict = self._do('post', url, payload=strip_none_values(self.testcase)) key = response['key'] csv_log_data = [key, name, test_source_file_path] csv_logger.info('#'.join(csv_log_data)) self.logger.info(f'Testcase {key} created successfully.') # now load full data of created testcase url = f'{self._baseurl}/testcase/{key}' self.testcase = self._do('get', url, '') self._get_tc_id() self.logger.info(f"Testcase posted successfully. {self.testcase}")
def get_datarow_ids(self, run_id: str) -> dict: """ Function to get list of parameterset ids (datarow ids) - in order to post DD executions :param run_id: testcase run id. :return: dict of row id of the last (current) executions """ url = f'{self._serviceurl}/testrun/{self._tr_internal_id}/testresults?fields=id,testResultStatusId,' \ f'testScriptResults(id,testResultStatusId,comment,index,sourceScriptType,parameterSetId),' \ f'traceLinks&itemId={run_id}' last_execution = self._do('get', url, '') if last_execution: result = dict() for item in last_execution[0]['testScriptResults']: parameterset_id = item.get('parameterSetId', None) # parameterSetId = row x in test data table, so it should exists if parameterset_id: step_ids_list = result.get(parameterset_id, None) if step_ids_list: step_ids_list.append(item['id']) else: result.update({parameterset_id: [item['id']]}) if len(result) == 0: raise TM4JObjectNotFound(f'No data table rows found for run_id {run_id}') return result else: raise TM4JInvalidValue(f'No last execution found for run_id {run_id}')
def find_testcase(self, name: str = None, key: str = None, folder: str = None, test_source_file_path: str = '', autocreate: bool = False) -> str: """Search method for test run or test cases. If no result found, new item is created. Found testcase is stored in self parameter. :param name: name of the item to search :param key: if specified, search by key only, name is ignored :param folder: if specified, search in folder; if no item found, it will be created in this folder. Folder should be specified in "parent folder" or "parent folder/child folder" format :param test_source_file_path: test source path for csv logger :param autocreate: option to override tests autocreation """ autocreate = autocreate or is_true(self.config['NOTFOUND']['createTestcase']) self.logger.debug(f"Find testcase with params: {locals()}") url_options = list() url_options.append(f'{self._baseurl}/testcase/search?version=1.0&maxResults=10&query=') if key: url_options.append(f' key = "{key}"') else: name = clear_name(name) if name == '': raise TM4JInvalidValue('Testcase name cannot be empty!') n_key, n_name = split_testcase_name_key(name, self.config['GENERAL']['testCaseKeyDelimiter']) # check if name starts with testCase key -- then find by key if n_key: self.find_testcase(n_name, n_key, folder, test_source_file_path) return self.testcase['key'] else: folder = choose(folder, folder, self.config['GENERAL']['tcFolder']) check_folder_name(folder) url_options.append(f' projectKey = "{self.project_key}" AND name = "{name}"') url_options.append(choose(folder, f" AND folder = \"/{folder}\"", '')) url = ''.join(url_options) payload = '' try: response = self._do('get', url, payload, False, True) self.testcase = response[0] self._get_tc_id() except IndexError: if autocreate and name: self.logger.info(f'Cannot find testcase {key} - {name}. Will create a new one') self._post_new_testcase(name, folder, test_source_file_path) else: msg = f'find_testcase: testcase {key} not found. '\ f'Name=\"{name}\" or autocreate={autocreate} do not allow creation' self.logger.exception(msg) raise TM4JObjectNotFound(msg) except TM4JFolderNotFound: self._create_folder('TEST_CASE', folder) self._post_new_testcase(name, folder, test_source_file_path) return self.testcase['key']
def _get_tr_id(self): """ Function to get internal testcase id and project id :return: """ key = self.testrun["key"] if key: url = f'{self._serviceurl}/testrun/{key}?fields=id,projectId' payload = '' response = self._do('get', url, payload, False, True) self.logger.debug(f'{key} - {response}') self._tr_internal_id = response['id'] return self._tr_internal_id else: raise TM4JInvalidValue('Testrun key not set, find testrun first')
def add_testcase_weblink(self, link_url: str, description: str): """ Add weblink to testcase traceability tab :param link_url: :param description: :return: """ if not self._tc_internal_id: raise TM4JInvalidValue('Testcase internal id not set, find testcase first') url = f'{self._serviceurl}/tracelink/bulk/create' payload = json.dumps([{"url": link_url, "urlDescription": description, "testCaseId": self._tc_internal_id, "typeId": 1}]) try: self._do('post', url, payload) except TM4JInvalidValue: pass
def _add_testcycle_jira_link(self, linked_issues: str): self.logger.debug(locals()) linked_issues_list = list( map(lambda x: x.strip(), linked_issues.split(','))) if len(linked_issues_list) == 0: raise TM4JInvalidValue('Jira issues list is empty') tr_id = self._get_tr_id() payload = list() for issue in linked_issues_list: if is_jira_issue(issue): payload.append({ 'testRunId': tr_id, 'issueId': self._get_jira_issue_id(issue), 'typeId': 2 }) url = f'{self._serviceurl}/tracelink/bulk/create' if payload: self._do('post', url, strip_none_values(payload))
def _check_error_response(response: Response): """function checks for Folder errors""" text = f'Status {response.status_code} for URL {response.url}. Details: "{response.text}. ' \ f'Request: {response.request.body}"' if response.status_code == 400: if bool(re.search(r".+not found for field folder.+", response.text)): raise TM4JFolderNotFound(f'{text}') if bool( re.search(r".+folder should start with a slash.+", response.text)): raise TM4JInvalidFolderName(f'{text}') if bool( re.search(r".+was not found for field environment on project+", response.text)): raise TM4JEnvironmentNotFound(f'{text}') if bool(re.search(r".+was not found for field+", response.text)): raise TM4JInvalidValue(f'{text}') elif response.status_code == 404: raise TM4JObjectNotFound(f'{text}') elif response.status_code == 500: raise TM4JException(f'{text}')