gitlab/api/projects/issues/notes/
notes.rs1use derive_builder::Builder;
8
9use crate::api::common::{NameOrId, SortOrder};
10use crate::api::endpoint_prelude::*;
11use crate::api::helpers::NoteOrderBy;
12
13#[derive(Debug, Builder, Clone)]
15#[builder(setter(strip_option))]
16pub struct IssueNotes<'a> {
17 #[builder(setter(into))]
19 project: NameOrId<'a>,
20 issue: u64,
22
23 #[builder(default)]
25 order_by: Option<NoteOrderBy>,
26 #[builder(default)]
28 sort: Option<SortOrder>,
29}
30
31impl<'a> IssueNotes<'a> {
32 pub fn builder() -> IssueNotesBuilder<'a> {
34 IssueNotesBuilder::default()
35 }
36}
37
38impl Endpoint for IssueNotes<'_> {
39 fn method(&self) -> Method {
40 Method::GET
41 }
42
43 fn endpoint(&self) -> Cow<'static, str> {
44 format!("projects/{}/issues/{}/notes", self.project, self.issue).into()
45 }
46
47 fn parameters(&self) -> QueryParams<'_> {
48 let mut params = QueryParams::default();
49
50 params
51 .push_opt("order_by", self.order_by)
52 .push_opt("sort", self.sort);
53
54 params
55 }
56}
57
58impl Pageable for IssueNotes<'_> {}
59
60#[cfg(test)]
61mod tests {
62 use crate::api::common::SortOrder;
63 use crate::api::projects::issues::notes::{IssueNotes, IssueNotesBuilderError, NoteOrderBy};
64 use crate::api::{self, Query};
65 use crate::test::client::{ExpectedUrl, SingleTestClient};
66
67 #[test]
68 fn project_and_issue_are_necessary() {
69 let err = IssueNotes::builder().build().unwrap_err();
70 crate::test::assert_missing_field!(err, IssueNotesBuilderError, "project");
71 }
72
73 #[test]
74 fn project_is_necessary() {
75 let err = IssueNotes::builder().issue(1).build().unwrap_err();
76 crate::test::assert_missing_field!(err, IssueNotesBuilderError, "project");
77 }
78
79 #[test]
80 fn issue_is_necessary() {
81 let err = IssueNotes::builder().project(1).build().unwrap_err();
82 crate::test::assert_missing_field!(err, IssueNotesBuilderError, "issue");
83 }
84
85 #[test]
86 fn project_and_issue_are_sufficient() {
87 IssueNotes::builder().project(1).issue(1).build().unwrap();
88 }
89
90 #[test]
91 fn endpoint() {
92 let endpoint = ExpectedUrl::builder()
93 .endpoint("projects/simple%2Fproject/issues/1/notes")
94 .build()
95 .unwrap();
96 let client = SingleTestClient::new_raw(endpoint, "");
97
98 let endpoint = IssueNotes::builder()
99 .project("simple/project")
100 .issue(1)
101 .build()
102 .unwrap();
103 api::ignore(endpoint).query(&client).unwrap();
104 }
105
106 #[test]
107 fn endpoint_order_by() {
108 let endpoint = ExpectedUrl::builder()
109 .endpoint("projects/simple%2Fproject/issues/1/notes")
110 .add_query_params(&[("order_by", "created_at")])
111 .build()
112 .unwrap();
113 let client = SingleTestClient::new_raw(endpoint, "");
114
115 let endpoint = IssueNotes::builder()
116 .project("simple/project")
117 .issue(1)
118 .order_by(NoteOrderBy::CreatedAt)
119 .build()
120 .unwrap();
121 api::ignore(endpoint).query(&client).unwrap();
122 }
123
124 #[test]
125 fn endpoint_sort() {
126 let endpoint = ExpectedUrl::builder()
127 .endpoint("projects/simple%2Fproject/issues/1/notes")
128 .add_query_params(&[("sort", "desc")])
129 .build()
130 .unwrap();
131 let client = SingleTestClient::new_raw(endpoint, "");
132
133 let endpoint = IssueNotes::builder()
134 .project("simple/project")
135 .issue(1)
136 .sort(SortOrder::Descending)
137 .build()
138 .unwrap();
139 api::ignore(endpoint).query(&client).unwrap();
140 }
141}