Skip to content

Commit

Permalink
feat(api): add reviewer_details manager for mergrequest to get review…
Browse files Browse the repository at this point in the history
…ers of merge request

Those changes implements 'GET /projects/:id/merge_requests/:merge_request_iid/reviewers' gitlab API call.
Naming for call is not reviewers because reviewers atribute already presen in merge request response
  • Loading branch information
Kęstutis Miknevičius authored and nejch committed Jan 12, 2024
1 parent cbc13a6 commit adbd90c
Show file tree
Hide file tree
Showing 5 changed files with 85 additions and 1 deletion.
4 changes: 4 additions & 0 deletions docs/gl_objects/merge_requests.rst
Expand Up @@ -94,6 +94,10 @@ Get a single MR::

mr = project.mergerequests.get(mr_iid)

Get MR reviewer details::
mr = project.mergerequests.get(mr_iid)
reviewers = mr.reviewer_details.list()

Create a MR::

mr = project.mergerequests.create({'source_branch': 'cool_feature',
Expand Down
1 change: 1 addition & 0 deletions gitlab/v4/objects/__init__.py
Expand Up @@ -56,6 +56,7 @@
from .releases import *
from .repositories import *
from .resource_groups import *
from .reviewers import *
from .runners import *
from .secure_files import *
from .settings import *
Expand Down
2 changes: 2 additions & 0 deletions gitlab/v4/objects/merge_requests.py
Expand Up @@ -42,6 +42,7 @@
)
from .notes import ProjectMergeRequestNoteManager # noqa: F401
from .pipelines import ProjectMergeRequestPipelineManager # noqa: F401
from .reviewers import ProjectMergeRequestReviewerDetailManager

__all__ = [
"MergeRequest",
Expand Down Expand Up @@ -164,6 +165,7 @@ class ProjectMergeRequest(
resourcelabelevents: ProjectMergeRequestResourceLabelEventManager
resourcemilestoneevents: ProjectMergeRequestResourceMilestoneEventManager
resourcestateevents: ProjectMergeRequestResourceStateEventManager
reviewer_details: ProjectMergeRequestReviewerDetailManager

@cli.register_custom_action("ProjectMergeRequest")
@exc.on_http_error(exc.GitlabMROnBuildSuccessError)
Expand Down
17 changes: 17 additions & 0 deletions gitlab/v4/objects/reviewers.py
@@ -0,0 +1,17 @@
from gitlab.base import RESTManager, RESTObject
from gitlab.mixins import ListMixin

__all__ = [
"ProjectMergeRequestReviewerDetail",
"ProjectMergeRequestReviewerDetailManager",
]


class ProjectMergeRequestReviewerDetail(RESTObject):
pass


class ProjectMergeRequestReviewerDetailManager(ListMixin, RESTManager):
_path = "/projects/{project_id}/merge_requests/{mr_iid}/reviewers"
_obj_cls = ProjectMergeRequestReviewerDetail
_from_parent_attrs = {"project_id": "project_id", "mr_iid": "iid"}
62 changes: 61 additions & 1 deletion tests/unit/objects/test_merge_requests.py
Expand Up @@ -8,7 +8,11 @@
import pytest
import responses

from gitlab.v4.objects import ProjectDeploymentMergeRequest, ProjectMergeRequest
from gitlab.v4.objects import (
ProjectDeploymentMergeRequest,
ProjectMergeRequest,
ProjectMergeRequestReviewerDetail,
)

mr_content = {
"id": 1,
Expand All @@ -25,8 +29,33 @@
"avatar_url": "https://gitlab.example.com/uploads/-/system/user/avatar/87854/avatar.png",
"web_url": "https://gitlab.com/DouweM",
},
"reviewers": [
{
"id": 2,
"name": "Sam Bauch",
"username": "kenyatta_oconnell",
"state": "active",
"avatar_url": "https://www.gravatar.com/avatar/956c92487c6f6f7616b536927e22c9a0?s=80&d=identicon",
"web_url": "http://gitlab.example.com//kenyatta_oconnell",
}
],
}

reviewers_content = [
{
"user": {
"id": 2,
"name": "Sam Bauch",
"username": "kenyatta_oconnell",
"state": "active",
"avatar_url": "https://www.gravatar.com/avatar/956c92487c6f6f7616b536927e22c9a0?s=80&d=identicon",
"web_url": "http://gitlab.example.com//kenyatta_oconnell",
},
"state": "unreviewed",
"created_at": "2022-07-27T17:03:27.684Z",
}
]


@pytest.fixture
def resp_list_merge_requests():
Expand All @@ -43,6 +72,26 @@ def resp_list_merge_requests():
yield rsps


@pytest.fixture
def resp_get_merge_request_reviewers():
with responses.RequestsMock() as rsps:
rsps.add(
method=responses.GET,
url="http://localhost/api/v4/projects/1/merge_requests/1",
json=mr_content,
content_type="application/json",
status=200,
)
rsps.add(
method=responses.GET,
url="http://localhost/api/v4/projects/3/merge_requests/1/reviewers",
json=reviewers_content,
content_type="application/json",
status=200,
)
yield rsps


def test_list_project_merge_requests(project, resp_list_merge_requests):
mrs = project.mergerequests.list()
assert isinstance(mrs[0], ProjectMergeRequest)
Expand All @@ -54,3 +103,14 @@ def test_list_deployment_merge_requests(project, resp_list_merge_requests):
mrs = deployment.mergerequests.list()
assert isinstance(mrs[0], ProjectDeploymentMergeRequest)
assert mrs[0].iid == mr_content["iid"]


def test_get_merge_request_reviewers(project, resp_get_merge_request_reviewers):
mr = project.mergerequests.get(1)
reviewers_details = mr.reviewer_details.list()
assert isinstance(mr, ProjectMergeRequest)
assert isinstance(reviewers_details, list)
assert isinstance(reviewers_details[0], ProjectMergeRequestReviewerDetail)
assert mr.reviewers[0]["name"] == reviewers_details[0].user["name"]
assert reviewers_details[0].state == "unreviewed"
assert reviewers_details[0].created_at == "2022-07-27T17:03:27.684Z"

0 comments on commit adbd90c

Please sign in to comment.