gitlab/api/projects/merge_requests/notes/awards/
create.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 terms.
6
7use derive_builder::Builder;
8
9use crate::api::common::NameOrId;
10use crate::api::endpoint_prelude::*;
11
12/// Create a new award on a note on a merge request on a project.
13#[derive(Debug, Builder, Clone)]
14pub struct CreateMergeRequestNoteAward<'a> {
15    /// The project the merge request belongs to.
16    #[builder(setter(into))]
17    project: NameOrId<'a>,
18    /// The merge request to add the note to.
19    merge_request: u64,
20    /// The ID of the note.
21    note: u64,
22    /// The award to give to the note (without colons).
23    #[builder(setter(into))]
24    name: Cow<'a, str>,
25}
26
27impl<'a> CreateMergeRequestNoteAward<'a> {
28    /// Create a builder for the endpoint.
29    pub fn builder() -> CreateMergeRequestNoteAwardBuilder<'a> {
30        CreateMergeRequestNoteAwardBuilder::default()
31    }
32}
33
34impl Endpoint for CreateMergeRequestNoteAward<'_> {
35    fn method(&self) -> Method {
36        Method::POST
37    }
38
39    fn endpoint(&self) -> Cow<'static, str> {
40        format!(
41            "projects/{}/merge_requests/{}/notes/{}/award_emoji",
42            self.project, self.merge_request, self.note,
43        )
44        .into()
45    }
46
47    fn body(&self) -> Result<Option<(&'static str, Vec<u8>)>, BodyError> {
48        let mut params = FormParams::default();
49
50        params.push("name", self.name.as_ref());
51
52        params.into_body()
53    }
54}
55
56#[cfg(test)]
57mod tests {
58    use http::Method;
59
60    use crate::api::projects::merge_requests::notes::awards::{
61        CreateMergeRequestNoteAward, CreateMergeRequestNoteAwardBuilderError,
62    };
63    use crate::api::{self, Query};
64    use crate::test::client::{ExpectedUrl, SingleTestClient};
65
66    #[test]
67    fn project_merge_request_note_and_name_are_necessary() {
68        let err = CreateMergeRequestNoteAward::builder().build().unwrap_err();
69        crate::test::assert_missing_field!(err, CreateMergeRequestNoteAwardBuilderError, "project");
70    }
71
72    #[test]
73    fn project_is_necessary() {
74        let err = CreateMergeRequestNoteAward::builder()
75            .merge_request(1)
76            .note(1)
77            .name("award")
78            .build()
79            .unwrap_err();
80        crate::test::assert_missing_field!(err, CreateMergeRequestNoteAwardBuilderError, "project");
81    }
82
83    #[test]
84    fn merge_request_is_necessary() {
85        let err = CreateMergeRequestNoteAward::builder()
86            .project(1)
87            .note(1)
88            .name("award")
89            .build()
90            .unwrap_err();
91        crate::test::assert_missing_field!(
92            err,
93            CreateMergeRequestNoteAwardBuilderError,
94            "merge_request",
95        );
96    }
97
98    #[test]
99    fn note_is_necessary() {
100        let err = CreateMergeRequestNoteAward::builder()
101            .project(1)
102            .merge_request(1)
103            .name("award")
104            .build()
105            .unwrap_err();
106        crate::test::assert_missing_field!(err, CreateMergeRequestNoteAwardBuilderError, "note");
107    }
108
109    #[test]
110    fn name_is_necessary() {
111        let err = CreateMergeRequestNoteAward::builder()
112            .project(1)
113            .merge_request(1)
114            .note(1)
115            .build()
116            .unwrap_err();
117        crate::test::assert_missing_field!(err, CreateMergeRequestNoteAwardBuilderError, "name");
118    }
119
120    #[test]
121    fn project_merge_request_note_and_name_are_sufficient() {
122        CreateMergeRequestNoteAward::builder()
123            .project(1)
124            .merge_request(1)
125            .note(1)
126            .name("award")
127            .build()
128            .unwrap();
129    }
130
131    #[test]
132    fn endpoint() {
133        let endpoint = ExpectedUrl::builder()
134            .method(Method::POST)
135            .endpoint("projects/simple%2Fproject/merge_requests/1/notes/1/award_emoji")
136            .content_type("application/x-www-form-urlencoded")
137            .body_str("name=emoji")
138            .build()
139            .unwrap();
140        let client = SingleTestClient::new_raw(endpoint, "");
141
142        let endpoint = CreateMergeRequestNoteAward::builder()
143            .project("simple/project")
144            .merge_request(1)
145            .note(1)
146            .name("emoji")
147            .build()
148            .unwrap();
149        api::ignore(endpoint).query(&client).unwrap();
150    }
151}