From ce348043b01be99b41e8b6118cad4907e678262a Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Fri, 6 Jan 2023 12:53:24 -0600 Subject: [PATCH] api/issues: add `related_merge_requests` endpoint --- CHANGELOG.md | 7 ++ src/api/README.md | 2 +- .../projects/issues/related_merge_requests.rs | 99 +++++++++++++++++++ 3 files changed, 107 insertions(+), 1 deletion(-) create mode 100644 src/api/projects/issues/related_merge_requests.rs diff --git a/CHANGELOG.md b/CHANGELOG.md index 78cb1e2f..042915c9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# v0.1602.2 (unreleased) + +## Additions + + * Support `/project/:project/issues/:issue_iid/related_merge_requests` + endpoint. + # v0.1602.1 ## Breaking changes diff --git a/src/api/README.md b/src/api/README.md index f7ba1f6b..d88fbe50 100644 --- a/src/api/README.md +++ b/src/api/README.md @@ -56,6 +56,7 @@ These API endpoints have been implemented. * `GET /projects/:project/issues/:issue/notes` `projects/issues/notes/notes.rs` * `POST /projects/:project/issues/:issue/notes` `projects/issues/notes/create.rs` * `PUT /projects/:project/issues/:issue/notes/:note` `projects/issues/notes/edit.rs` + * `GET /projects/:project/issues/:issue/related_merge_requests` `projects/issues/related_merge_requests.rs` * `GET /projects/:project/issues/:issue/resource_label_events` `projects/issues/resource_label_events.rs` * `GET /projects/:project/jobs` `projects/jobs/jobs.rs` * `GET /projects/:project/jobs/:job` `projects/jobs/job.rs` @@ -320,7 +321,6 @@ instead of having to search the page for missing endpoints. * `DELETE /projects/:project/issues/:issue/metric_images/:metric_image` https://gitlab.kitware.com/help/api/issues.md#delete-metric-image * `POST /projects/:project/issues/:issue/move` https://gitlab.kitware.com/help/api/issues.md#move-an-issue * `GET /projects/:project/issues/:issue/participants` https://gitlab.kitware.com/help/api/issues.md#participants-on-issues - * `GET /projects/:project/issues/:issue/related_merge_requests` https://gitlab.kitware.com/help/api/issues.md#list-merge-requests-related-to-issue * `PUT /projects/:project/issues/:issue/reorder` https://gitlab.kitware.com/help/api/issues.md#reorder-an-issue Arguably this should be a `POST` endpoint * `POST /projects/:project/issues/:issue/reset_spent_time` https://gitlab.kitware.com/help/api/issues.md#reset-spent-time-for-an-issue diff --git a/src/api/projects/issues/related_merge_requests.rs b/src/api/projects/issues/related_merge_requests.rs new file mode 100644 index 00000000..565446aa --- /dev/null +++ b/src/api/projects/issues/related_merge_requests.rs @@ -0,0 +1,99 @@ +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +use derive_builder::Builder; + +use crate::api::common::NameOrId; +use crate::api::endpoint_prelude::*; + +/// Query for merge requests related to an issue +#[derive(Debug, Builder, Clone)] +pub struct RelatedMergeRequests<'a> { + /// The project to of the merge request. + #[builder(setter(into))] + project: NameOrId<'a>, + /// The ID of the issue + issue: u64, +} + +impl<'a> RelatedMergeRequests<'a> { + /// Create a builder for the endpoint. + pub fn builder() -> RelatedMergeRequestsBuilder<'a> { + RelatedMergeRequestsBuilder::default() + } +} + +impl<'a> Endpoint for RelatedMergeRequests<'a> { + fn method(&self) -> Method { + Method::GET + } + + fn endpoint(&self) -> Cow<'static, str> { + format!( + "projects/{}/issues/{}/related_merge_requests", + self.project, self.issue, + ) + .into() + } +} + +impl<'a> Pageable for RelatedMergeRequests<'a> {} + +#[cfg(test)] +mod tests { + use crate::api::projects::issues::{RelatedMergeRequests, RelatedMergeRequestsBuilderError}; + use crate::api::{self, Query}; + use crate::test::client::{ExpectedUrl, SingleTestClient}; + + #[test] + fn project_and_issue_are_needed() { + let err = RelatedMergeRequests::builder().build().unwrap_err(); + crate::test::assert_missing_field!(err, RelatedMergeRequestsBuilderError, "project"); + } + + #[test] + fn project_is_needed() { + let err = RelatedMergeRequests::builder() + .issue(1) + .build() + .unwrap_err(); + crate::test::assert_missing_field!(err, RelatedMergeRequestsBuilderError, "project"); + } + + #[test] + fn issue_is_needed() { + let err = RelatedMergeRequests::builder() + .project(1) + .build() + .unwrap_err(); + crate::test::assert_missing_field!(err, RelatedMergeRequestsBuilderError, "issue"); + } + + #[test] + fn project_and_issue_are_sufficient() { + RelatedMergeRequests::builder() + .project(1) + .issue(1) + .build() + .unwrap(); + } + + #[test] + fn endpoint() { + let endpoint = ExpectedUrl::builder() + .endpoint("projects/simple%2Fproject/issues/1/related_merge_requests") + .build() + .unwrap(); + let client = SingleTestClient::new_raw(endpoint, ""); + + let endpoint = RelatedMergeRequests::builder() + .project("simple/project") + .issue(1) + .build() + .unwrap(); + api::ignore(endpoint).query(&client).unwrap(); + } +} -- GitLab