gitlab/api/groups/members/
edit.rs1use chrono::NaiveDate;
8use derive_builder::Builder;
9
10use crate::api::common::{AccessLevel, NameOrId};
11use crate::api::endpoint_prelude::*;
12
13#[derive(Debug, Builder, Clone)]
15#[builder(setter(strip_option))]
16pub struct EditGroupMember<'a> {
17 #[builder(setter(into))]
19 group: NameOrId<'a>,
20 user: u64,
22 access_level: AccessLevel,
24
25 #[builder(default)]
27 expires_at: Option<NaiveDate>,
28 #[builder(default)]
30 member_role_id: Option<u64>,
31}
32
33impl<'a> EditGroupMember<'a> {
34 pub fn builder() -> EditGroupMemberBuilder<'a> {
36 EditGroupMemberBuilder::default()
37 }
38}
39
40impl Endpoint for EditGroupMember<'_> {
41 fn method(&self) -> Method {
42 Method::PUT
43 }
44
45 fn endpoint(&self) -> Cow<'static, str> {
46 format!("groups/{}/members/{}", self.group, self.user).into()
47 }
48
49 fn body(&self) -> Result<Option<(&'static str, Vec<u8>)>, BodyError> {
50 let mut params = FormParams::default();
51
52 params
53 .push("user_id", self.user)
54 .push("access_level", self.access_level.as_u64())
55 .push_opt("expires_at", self.expires_at)
56 .push_opt("member_role_id", self.member_role_id);
57
58 params.into_body()
59 }
60}
61
62#[cfg(test)]
63mod tests {
64 use chrono::NaiveDate;
65 use http::Method;
66
67 use crate::api::common::AccessLevel;
68 use crate::api::groups::members::{EditGroupMember, EditGroupMemberBuilderError};
69 use crate::api::{self, Query};
70 use crate::test::client::{ExpectedUrl, SingleTestClient};
71
72 #[test]
73 fn all_parameters_are_needed() {
74 let err = EditGroupMember::builder().build().unwrap_err();
75 crate::test::assert_missing_field!(err, EditGroupMemberBuilderError, "group");
76 }
77
78 #[test]
79 fn group_is_necessary() {
80 let err = EditGroupMember::builder()
81 .user(1)
82 .access_level(AccessLevel::Developer)
83 .build()
84 .unwrap_err();
85 crate::test::assert_missing_field!(err, EditGroupMemberBuilderError, "group");
86 }
87
88 #[test]
89 fn user_is_necessary() {
90 let err = EditGroupMember::builder()
91 .group(1)
92 .access_level(AccessLevel::Developer)
93 .build()
94 .unwrap_err();
95 crate::test::assert_missing_field!(err, EditGroupMemberBuilderError, "user");
96 }
97
98 #[test]
99 fn access_level_is_necessary() {
100 let err = EditGroupMember::builder()
101 .group(1)
102 .user(1)
103 .build()
104 .unwrap_err();
105 crate::test::assert_missing_field!(err, EditGroupMemberBuilderError, "access_level");
106 }
107
108 #[test]
109 fn sufficient_parameters() {
110 EditGroupMember::builder()
111 .group("group")
112 .user(1)
113 .access_level(AccessLevel::Developer)
114 .build()
115 .unwrap();
116 }
117
118 #[test]
119 fn endpoint() {
120 let endpoint = ExpectedUrl::builder()
121 .method(Method::PUT)
122 .endpoint("groups/group%2Fsubgroup/members/1")
123 .content_type("application/x-www-form-urlencoded")
124 .body_str(concat!("user_id=1", "&access_level=30"))
125 .build()
126 .unwrap();
127 let client = SingleTestClient::new_raw(endpoint, "");
128
129 let endpoint = EditGroupMember::builder()
130 .group("group/subgroup")
131 .user(1)
132 .access_level(AccessLevel::Developer)
133 .build()
134 .unwrap();
135 api::ignore(endpoint).query(&client).unwrap();
136 }
137
138 #[test]
139 fn endpoint_expires_at() {
140 let endpoint = ExpectedUrl::builder()
141 .method(Method::PUT)
142 .endpoint("groups/group%2Fsubgroup/members/1")
143 .content_type("application/x-www-form-urlencoded")
144 .body_str(concat!(
145 "user_id=1",
146 "&access_level=30",
147 "&expires_at=2020-01-01",
148 ))
149 .build()
150 .unwrap();
151 let client = SingleTestClient::new_raw(endpoint, "");
152
153 let endpoint = EditGroupMember::builder()
154 .group("group/subgroup")
155 .user(1)
156 .access_level(AccessLevel::Developer)
157 .expires_at(NaiveDate::from_ymd_opt(2020, 1, 1).unwrap())
158 .build()
159 .unwrap();
160 api::ignore(endpoint).query(&client).unwrap();
161 }
162
163 #[test]
164 fn endpoint_member_role_id() {
165 let endpoint = ExpectedUrl::builder()
166 .method(Method::PUT)
167 .endpoint("groups/group%2Fsubgroup/members/1")
168 .content_type("application/x-www-form-urlencoded")
169 .body_str(concat!(
170 "user_id=1",
171 "&access_level=30",
172 "&member_role_id=1",
173 ))
174 .build()
175 .unwrap();
176 let client = SingleTestClient::new_raw(endpoint, "");
177
178 let endpoint = EditGroupMember::builder()
179 .group("group/subgroup")
180 .user(1)
181 .access_level(AccessLevel::Developer)
182 .member_role_id(1)
183 .build()
184 .unwrap();
185 api::ignore(endpoint).query(&client).unwrap();
186 }
187}