gitlab/api/groups/members/
remove.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/// Remove a user from a group.
13#[derive(Debug, Builder, Clone)]
14#[builder(setter(strip_option))]
15pub struct RemoveGroupMember<'a> {
16    /// The group to remove the user from.
17    #[builder(setter(into))]
18    group: NameOrId<'a>,
19    /// The user to remove from the group.
20    user: u64,
21    /// Skip deletion of direct membership to subgroups and projects.
22    #[builder(default)]
23    skip_subresources: Option<bool>,
24    /// Unassign from any issues or merge requests inside a given group.
25    #[builder(default)]
26    unassign_issuables: Option<bool>,
27}
28
29impl<'a> RemoveGroupMember<'a> {
30    /// Create a builder for the endpoint.
31    pub fn builder() -> RemoveGroupMemberBuilder<'a> {
32        RemoveGroupMemberBuilder::default()
33    }
34}
35
36impl Endpoint for RemoveGroupMember<'_> {
37    fn method(&self) -> Method {
38        Method::DELETE
39    }
40
41    fn endpoint(&self) -> Cow<'static, str> {
42        format!("groups/{}/members/{}", self.group, self.user).into()
43    }
44
45    fn body(&self) -> Result<Option<(&'static str, Vec<u8>)>, BodyError> {
46        let mut params = FormParams::default();
47
48        params
49            .push_opt("skip_subresources", self.skip_subresources)
50            .push_opt("unassign_issuables", self.unassign_issuables);
51
52        params.into_body()
53    }
54}
55
56#[cfg(test)]
57mod tests {
58    use http::Method;
59
60    use crate::api::groups::members::{RemoveGroupMember, RemoveGroupMemberBuilderError};
61    use crate::api::{self, Query};
62    use crate::test::client::{ExpectedUrl, SingleTestClient};
63
64    #[test]
65    fn all_parameters_are_needed() {
66        let err = RemoveGroupMember::builder().build().unwrap_err();
67        crate::test::assert_missing_field!(err, RemoveGroupMemberBuilderError, "group");
68    }
69
70    #[test]
71    fn group_is_necessary() {
72        let err = RemoveGroupMember::builder().user(1).build().unwrap_err();
73        crate::test::assert_missing_field!(err, RemoveGroupMemberBuilderError, "group");
74    }
75
76    #[test]
77    fn user_is_necessary() {
78        let err = RemoveGroupMember::builder().group(1).build().unwrap_err();
79        crate::test::assert_missing_field!(err, RemoveGroupMemberBuilderError, "user");
80    }
81
82    #[test]
83    fn sufficient_parameters() {
84        RemoveGroupMember::builder()
85            .group("group")
86            .user(1)
87            .build()
88            .unwrap();
89    }
90
91    #[test]
92    fn endpoint() {
93        let endpoint = ExpectedUrl::builder()
94            .method(Method::DELETE)
95            .endpoint("groups/group%2Fsubgroup/members/1")
96            .content_type("application/x-www-form-urlencoded")
97            .build()
98            .unwrap();
99        let client = SingleTestClient::new_raw(endpoint, "");
100
101        let endpoint = RemoveGroupMember::builder()
102            .group("group/subgroup")
103            .user(1)
104            .build()
105            .unwrap();
106        api::ignore(endpoint).query(&client).unwrap();
107    }
108
109    #[test]
110    fn endpoint_skip_subresources() {
111        let endpoint = ExpectedUrl::builder()
112            .method(Method::DELETE)
113            .endpoint("groups/group%2Fsubgroup/members/1")
114            .content_type("application/x-www-form-urlencoded")
115            .body_str("skip_subresources=true")
116            .build()
117            .unwrap();
118        let client = SingleTestClient::new_raw(endpoint, "");
119
120        let endpoint = RemoveGroupMember::builder()
121            .group("group/subgroup")
122            .user(1)
123            .skip_subresources(true)
124            .build()
125            .unwrap();
126        api::ignore(endpoint).query(&client).unwrap();
127    }
128
129    #[test]
130    fn endpoint_unassign_issuables() {
131        let endpoint = ExpectedUrl::builder()
132            .method(Method::DELETE)
133            .endpoint("groups/group%2Fsubgroup/members/1")
134            .content_type("application/x-www-form-urlencoded")
135            .body_str("unassign_issuables=true")
136            .build()
137            .unwrap();
138        let client = SingleTestClient::new_raw(endpoint, "");
139
140        let endpoint = RemoveGroupMember::builder()
141            .group("group/subgroup")
142            .user(1)
143            .unassign_issuables(true)
144            .build()
145            .unwrap();
146        api::ignore(endpoint).query(&client).unwrap();
147    }
148}