gitlab/api/projects/merge_requests/
approve.rs1use derive_builder::Builder;
8
9use crate::api::common::NameOrId;
10use crate::api::endpoint_prelude::*;
11
12#[derive(Debug, Builder, Clone)]
14#[builder(setter(strip_option))]
15pub struct ApproveMergeRequest<'a> {
16 #[builder(setter(into))]
18 project: NameOrId<'a>,
19 merge_request: u64,
21
22 #[builder(setter(into), default)]
25 sha: Option<Cow<'a, str>>,
26 #[builder(setter(into), default)]
30 approval_password: Option<Cow<'a, str>>,
31}
32
33impl<'a> ApproveMergeRequest<'a> {
34 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}