Example #1
0
 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}")
Example #2
0
 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}')
Example #3
0
 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']
Example #4
0
 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')
Example #5
0
 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
Example #6
0
 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))
Example #7
0
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}')