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