Skip to main content

gitlab/api/projects/merge_requests/
approve.rs

1// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
2// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
3// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
4// option. This file may not be copied, modified, or distributed
5// except according to those s.
6
7use derive_builder::Builder;
8
9use crate::api::common::NameOrId;
10use crate::api::endpoint_prelude::*;
11
12/// Approve a merge request.
13#[derive(Debug, Builder, Clone)]
14#[builder(setter(strip_option))]
15pub struct ApproveMergeRequest<'a> {
16    /// The project with the merge request.
17    #[builder(setter(into))]
18    project: NameOrId<'a>,
19    /// The ID of the merge request.
20    merge_request: u64,
21
22    /// Git commit SHA to approve. If set, this must match the head of the branch being approved or
23    /// the approval will fail.
24    #[builder(setter(into), default)]
25    sha: Option<Cow<'a, str>>,
26    /// Approver's password (required if `Require user password to approve` is enabled in project
27    /// settings). Note: no special encryption is applied to this field. TLS/HTTPS for
28    /// on-the-wire encryption is assumed.
29    #[builder(setter(into), default)]
30    approval_password: Option<Cow<'a, str>>,
31}
32
33impl<'a> ApproveMergeRequest<'a> {
34    /// Create a builder for the endpoint.
35    pub fn builder() -> ApproveMergeRequestBuilder<'a> {
36        ApproveMergeRequestBuilder::default()
37    }
38}
39
40impl Endpoint for ApproveMergeRequest<'_> {
41    fn method(&self) -> Method {
42        Method::POST
43    }
44
45    fn endpoint(&self) -> Cow<'static, str> {
46        format!(
47            "projects/{}/merge_requests/{}/approve",
48            self.project, self.merge_request,
49        )
50        .into()
51    }
52
53    fn body(&self) -> Result<Option<(&'static str, Vec<u8>)>, BodyError> {
54        let mut params = FormParams::default();
55
56        params
57            .push_opt("sha", self.sha.as_ref())
58            .push_opt("approval_password", self.approval_password.as_ref());
59
60        params.into_body()
61    }
62}
63
64#[cfg(test)]
65mod tests {
66    use http::Method;
67
68    use crate::api::projects::merge_requests::{
69        ApproveMergeRequest, ApproveMergeRequestBuilderError,
70    };
71    use crate::api::{self, Query};
72    use crate::test::client::{ExpectedUrl, SingleTestClient};
73
74    #[test]
75    fn project_and_merge_request_are_needed() {
76        let err = ApproveMergeRequest::builder().build().unwrap_err();
77        crate::test::assert_missing_field!(err, ApproveMergeRequestBuilderError, "project");
78    }
79
80    #[test]
81    fn project_is_needed() {
82        let err = ApproveMergeRequest::builder()
83            .merge_request(1)
84            .build()
85            .unwrap_err();
86        crate::test::assert_missing_field!(err, ApproveMergeRequestBuilderError, "project");
87    }
88
89    #[test]
90    fn merge_request_is_needed() {
91        let err = ApproveMergeRequest::builder()
92            .project(1)
93            .build()
94            .unwrap_err();
95        crate::test::assert_missing_field!(err, ApproveMergeRequestBuilderError, "merge_request");
96    }
97
98    #[test]
99    fn project_and_merge_request_are_sufficient() {
100        ApproveMergeRequest::builder()
101            .project(1)
102            .merge_request(1)
103            .build()
104            .unwrap();
105    }
106
107    #[test]
108    fn endpoint() {
109        let endpoint = ExpectedUrl::builder()
110            .method(Method::POST)
111            .endpoint("projects/simple%2Fproject/merge_requests/1/approve")
112            .content_type("application/x-www-form-urlencoded")
113            .body_str("")
114            .build()
115            .unwrap();
116        let client = SingleTestClient::new_raw(endpoint, "");
117
118        let endpoint = ApproveMergeRequest::builder()
119            .project("simple/project")
120            .merge_request(1)
121            .build()
122            .unwrap();
123        api::ignore(endpoint).query(&client).unwrap();
124    }
125
126    #[test]
127    fn endpoint_approval_password() {
128        let endpoint = ExpectedUrl::builder()
129            .method(Method::POST)
130            .endpoint("projects/simple%2Fproject/merge_requests/1/approve")
131            .content_type("application/x-www-form-urlencoded")
132            .body_str("approval_password=blahblahblah")
133            .build()
134            .unwrap();
135        let client = SingleTestClient::new_raw(endpoint, "");
136
137        let endpoint = ApproveMergeRequest::builder()
138            .project("simple/project")
139            .merge_request(1)
140            .approval_password("blahblahblah")
141            .build()
142            .unwrap();
143        api::ignore(endpoint).query(&client).unwrap();
144    }
145
146    #[test]
147    fn endpoint_sha() {
148        let endpoint = ExpectedUrl::builder()
149            .method(Method::POST)
150            .endpoint("projects/simple%2Fproject/merge_requests/1/approve")
151            .content_type("application/x-www-form-urlencoded")
152            .body_str("sha=blahblahblah")
153            .build()
154            .unwrap();
155        let client = SingleTestClient::new_raw(endpoint, "");
156
157        let endpoint = ApproveMergeRequest::builder()
158            .project("simple/project")
159            .merge_request(1)
160            .sha("blahblahblah")
161            .build()
162            .unwrap();
163        api::ignore(endpoint).query(&client).unwrap();
164    }
165}