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