def execute( self, git_selected_repos: List[str] ) -> Union[res.ResponseFailure, res.ResponseSuccess]: """Batch `git clone` command. Args: git_selected_repos: list of configured repo names. Returns: str: output. str: error output. """ if self.err_output: return res.ResponseFailure(res.ResponseTypes.SYSTEM_ERROR, self.err_output) output = "" cwd = pathlib.Path().absolute() for repo_name in git_selected_repos: folder_name = repo_name.split("/")[1] clone_path = self.github_service.get_repo_url(repo_name) output += f"{folder_name}: " popen = subprocess.Popen( # noqa: S603, S607 ["git", "clone", clone_path], stdout=subprocess.PIPE, stderr=subprocess.PIPE, cwd=cwd, ) _, error = popen.communicate() # check for errors if popen.returncode == 0: output += "clone successful.\n" else: error_str = error.decode("utf-8") output += f"{error_str}" return res.ResponseSuccess(output)
def generate_response( self, output: str ) -> Union[res.ResponseFailure, res.ResponseSuccess]: """Create appropriate response object.""" if self.error: return res.ResponseFailure(res.ResponseTypes.PARAMETERS_ERROR, output) return res.ResponseSuccess(output)
def test_response_failure_initialisation_with_exception() -> None: """It builds a ResponseFailure from exception.""" response = res.ResponseFailure( GENERIC_RESPONSE_TYPE, Exception("Just an error message") ) assert bool(response) is False assert response.type == GENERIC_RESPONSE_TYPE assert response.message == "Exception: Just an error message"
def test_response_failure_has_type_and_message() -> None: """It has failure type and message.""" response = res.ResponseFailure(GENERIC_RESPONSE_TYPE, GENERIC_RESPONSE_MESSAGE) assert response.type == GENERIC_RESPONSE_TYPE assert response.message == GENERIC_RESPONSE_MESSAGE assert response.value == { "type": GENERIC_RESPONSE_TYPE, "message": GENERIC_RESPONSE_MESSAGE, }
def execute( self, request: Union[il.IssueListValidRequest, il.IssueListInvalidRequest], github_repo: str, ) -> Union[res.ResponseSuccess, res.ResponseFailure]: """Return a list of matching issues.""" if isinstance(request, il.IssueListInvalidRequest): return res.build_response_from_invalid_request(request) try: issues = self.github_service.list_issues_from_repo( github_repo, request) return res.ResponseSuccess(issues) except Exception as exc: return res.ResponseFailure(res.ResponseTypes.SYSTEM_ERROR, exc)
def test_execute_for_all_repos_failed( mock_config_manager: MockerFixture, mock_github_service: MockerFixture, mock_gh_list_issue_use_case: MockerFixture, ) -> None: """It returns success.""" config_manager = mock_config_manager.return_value github_service = mock_github_service.return_value mock_gh_list_issue_use_case.return_value.execute.return_value = res.ResponseFailure( res.ResponseTypes.PARAMETERS_ERROR, "msg") response = ghci.GhCloseIssueUseCase(config_manager, github_service).execute(REQUEST_ISSUES) assert bool(response) is True assert f"{REPO}: no issues closed.\n{REPO2}: no issues closed.\n" == response.value
def test_config_init_connection_error( mock_prompt_inquirer_prompter: MockerFixture, mock_config_manager: MockerFixture, mock_config_init_use_case: MockerFixture, runner: CliRunner, ) -> None: """It executes with connection error first then succeeds.""" config_manager = mock_config_manager.return_value mock_config_init_use_case(config_manager).execute.side_effect = [ res.ResponseFailure(res.ResponseTypes.SYSTEM_ERROR, "message"), res.ResponseSuccess("success message"), ] result = runner.invoke(git_portfolio.__main__.configure, ["init"], prog_name="gitp") assert mock_config_init_use_case(config_manager).execute.call_count == 2 assert result.output == "Error: message\nsuccess message\n"
def test_execute_link_issue_failed_for_specific_repo( mock_config_manager: MockerFixture, mock_github_service: MockerFixture, mock_gh_list_issue_use_case: MockerFixture, domain_prs: List[pr.PullRequest], ) -> None: """It returns success.""" config_manager = mock_config_manager.return_value github_service = mock_github_service.return_value mock_gh_list_issue_use_case.return_value.execute.return_value = res.ResponseFailure( res.ResponseTypes.PARAMETERS_ERROR, "msg" ) request = domain_prs[1] response = ghcp.GhCreatePrUseCase(config_manager, github_service).execute( request, REQUEST_ISSUES, "staticdev/omg" ) assert bool(response) is True assert "success message\n" == response.value
def execute( self, git_selected_repos: List[str], command: str, args: Tuple[str] ) -> Union[res.ResponseFailure, res.ResponseSuccess]: """Batch `git` command. Args: git_selected_repos: list of configured repo names. command: git command eg. checkout, pull, push... args: command arguments. Returns: Union[res.ResponseFailure, res.ResponseSuccess]: final result. """ if self.err_output: return res.ResponseFailure(res.ResponseTypes.SYSTEM_ERROR, self.err_output) output = "" cwd = pathlib.Path().absolute() for repo_name in git_selected_repos: folder_name = repo_name.split("/")[1] output += f"{folder_name}: " try: popen = subprocess.Popen( # noqa: S603, S607 ["git", command, *args], stdout=subprocess.PIPE, stderr=subprocess.PIPE, cwd=os.path.join(cwd, folder_name), ) stdout, error = popen.communicate() if popen.returncode == 0: # case for command with no output on success such as `git add .` if not stdout: output += f"{command} successful.\n" else: stdout_str = stdout.decode("utf-8") output += f"{stdout_str}\n" else: error_str = error.decode("utf-8") output += f"{error_str}" except FileNotFoundError as fnf_error: output += f"{fnf_error.strerror}: {fnf_error.filename}\n" return res.ResponseSuccess(output)
def test_response_failure_is_false() -> None: """It has bool value of False.""" response = res.ResponseFailure(GENERIC_RESPONSE_TYPE, GENERIC_RESPONSE_MESSAGE) assert bool(response) is False
def _() -> res.ResponseFailure: return res.ResponseFailure(res.ResponseTypes.SYSTEM_ERROR, "some error msg")