From fbc0ecbf345c37c4cc442828bfa22fc1ebae0022 Mon Sep 17 00:00:00 2001 From: "John L. Villalovos" Date: Wed, 5 Oct 2022 07:43:14 -0700 Subject: [PATCH] fix(cli): handle list response for json/yaml output Handle the case with the CLI where a list response is returned from GitLab and json/yaml output is requested. Add a functional CLI test to validate it works. Closes: #2287 --- gitlab/v4/cli.py | 8 ++-- tests/functional/cli/test_cli_repository.py | 44 +++++++++++++++++++++ 2 files changed, 48 insertions(+), 4 deletions(-) diff --git a/gitlab/v4/cli.py b/gitlab/v4/cli.py index a4f4e2ca1..1a6ea39db 100644 --- a/gitlab/v4/cli.py +++ b/gitlab/v4/cli.py @@ -387,9 +387,9 @@ def extend_parser(parser: argparse.ArgumentParser) -> argparse.ArgumentParser: def get_dict( - obj: Union[str, gitlab.base.RESTObject], fields: List[str] + obj: Union[str, Dict[str, Any], gitlab.base.RESTObject], fields: List[str] ) -> Union[str, Dict[str, Any]]: - if isinstance(obj, str): + if not isinstance(obj, gitlab.base.RESTObject): return obj if fields: @@ -406,7 +406,7 @@ def display(d: Union[str, Dict[str, Any]], **_kwargs: Any) -> None: @staticmethod def display_list( - data: List[Union[str, gitlab.base.RESTObject]], + data: List[Union[str, Dict[str, Any], gitlab.base.RESTObject]], fields: List[str], **_kwargs: Any, ) -> None: @@ -431,7 +431,7 @@ def display(d: Union[str, Dict[str, Any]], **_kwargs: Any) -> None: @staticmethod def display_list( - data: List[Union[str, gitlab.base.RESTObject]], + data: List[Union[str, Dict[str, Any], gitlab.base.RESTObject]], fields: List[str], **_kwargs: Any, ) -> None: diff --git a/tests/functional/cli/test_cli_repository.py b/tests/functional/cli/test_cli_repository.py index 7f521b4a2..90adc5e48 100644 --- a/tests/functional/cli/test_cli_repository.py +++ b/tests/functional/cli/test_cli_repository.py @@ -1,3 +1,7 @@ +import json +import time + + def test_project_create_file(gitlab_cli, project): file_path = "README" branch = "main" @@ -45,6 +49,46 @@ def test_list_all_commits(gitlab_cli, project): assert len(ret_all.stdout) > len(ret.stdout) +def test_commit_merge_requests(gitlab_cli, project, merge_request, wait_for_sidekiq): + """This tests the `project-commit merge-requests` command and also tests + that we can print the result using the `json` formatter""" + # create and then merge a merge-request + mr = merge_request(source_branch="test_commit_merge_requests") + merge_result = mr.merge(should_remove_source_branch=True) + wait_for_sidekiq(timeout=60) + # Wait until it is merged + mr_iid = mr.iid + for _ in range(60): + mr = project.mergerequests.get(mr_iid) + if mr.merged_at is not None: + break + time.sleep(0.5) + assert mr.merged_at is not None + time.sleep(0.5) + wait_for_sidekiq(timeout=60) + + commit_sha = merge_result["sha"] + cmd = [ + "-o", + "json", + "project-commit", + "merge-requests", + "--project-id", + project.id, + "--id", + commit_sha, + ] + ret = gitlab_cli(cmd) + assert ret.success + + json_list = json.loads(ret.stdout) + assert isinstance(json_list, list) + assert len(json_list) == 1 + mr_dict = json_list[0] + assert mr_dict["id"] == mr.id + assert mr_dict["iid"] == mr.iid + + def test_revert_commit(gitlab_cli, project): commit = project.commits.list()[0]