Skip to main content

gitlab/api/projects/labels/
label.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/// Query for a label within a project.
13#[derive(Debug, Builder, Clone)]
14#[builder(setter(strip_option))]
15pub struct Label<'a> {
16    /// The project to query for the label.
17    #[builder(setter(into))]
18    project: NameOrId<'a>,
19    /// The ID or title of the label.
20    #[builder(setter(into))]
21    label: NameOrId<'a>,
22
23    /// Include ancestor groups.
24    ///
25    /// Defaults to `true`.
26    #[builder(default)]
27    include_ancestor_groups: Option<bool>,
28}
29
30impl<'a> Label<'a> {
31    /// Create a builder for the endpoint.
32    pub fn builder() -> LabelBuilder<'a> {
33        LabelBuilder::default()
34    }
35}
36
37impl Endpoint for Label<'_> {
38    fn method(&self) -> Method {
39        Method::GET
40    }
41
42    fn endpoint(&self) -> Cow<'static, str> {
43        format!("projects/{}/labels/{}", self.project, self.label).into()
44    }
45
46    fn parameters(&self) -> QueryParams<'_> {
47        let mut params = QueryParams::default();
48
49        params.push_opt("include_ancestor_groups", self.include_ancestor_groups);
50
51        params
52    }
53}
54
55#[cfg(test)]
56mod tests {
57    use crate::api::projects::labels::{Label, LabelBuilderError};
58    use crate::api::{self, Query};
59    use crate::test::client::{ExpectedUrl, SingleTestClient};
60
61    #[test]
62    fn project_and_label_are_needed() {
63        let err = Label::builder().build().unwrap_err();
64        crate::test::assert_missing_field!(err, LabelBuilderError, "project");
65    }
66
67    #[test]
68    fn project_is_needed() {
69        let err = Label::builder().label(1).build().unwrap_err();
70        crate::test::assert_missing_field!(err, LabelBuilderError, "project");
71    }
72
73    #[test]
74    fn label_is_needed() {
75        let err = Label::builder().project(1).build().unwrap_err();
76        crate::test::assert_missing_field!(err, LabelBuilderError, "label");
77    }
78
79    #[test]
80    fn project_and_label_are_sufficient() {
81        Label::builder().project(1).label(1).build().unwrap();
82    }
83
84    #[test]
85    fn label_by_id() {
86        Label::builder().project(1).label(1).build().unwrap();
87    }
88
89    #[test]
90    fn label_by_name() {
91        Label::builder()
92            .project(1)
93            .label("label_name")
94            .build()
95            .unwrap();
96    }
97
98    #[test]
99    fn endpoint() {
100        let endpoint = ExpectedUrl::builder()
101            .endpoint("projects/simple%2Fproject/labels/1")
102            .build()
103            .unwrap();
104        let client = SingleTestClient::new_raw(endpoint, "");
105
106        let endpoint = Label::builder()
107            .project("simple/project")
108            .label(1)
109            .build()
110            .unwrap();
111        api::ignore(endpoint).query(&client).unwrap();
112    }
113
114    #[test]
115    fn endpoint_include_ancestor_groups() {
116        let endpoint = ExpectedUrl::builder()
117            .endpoint("projects/simple%2Fproject/labels/1")
118            .add_query_params(&[("include_ancestor_groups", "true")])
119            .build()
120            .unwrap();
121        let client = SingleTestClient::new_raw(endpoint, "");
122
123        let endpoint = Label::builder()
124            .project("simple/project")
125            .label(1)
126            .include_ancestor_groups(true)
127            .build()
128            .unwrap();
129        api::ignore(endpoint).query(&client).unwrap();
130    }
131
132    #[test]
133    fn endpoint_escapes_label_name() {
134        let endpoint = ExpectedUrl::builder()
135            .endpoint("projects/simple%2Fproject/labels/simple%2Flabel")
136            .build()
137            .unwrap();
138        let client = SingleTestClient::new_raw(endpoint, "");
139
140        let endpoint = Label::builder()
141            .project("simple/project")
142            .label("simple/label")
143            .build()
144            .unwrap();
145        api::ignore(endpoint).query(&client).unwrap();
146    }
147}