gitlab/api/users/
create.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::endpoint_prelude::*;
10use crate::api::users::ExternalProvider;
11
12/// Password settings for a new user.
13#[derive(Debug, Clone, PartialEq, Eq)]
14#[non_exhaustive]
15pub enum NewUserPassword<'a> {
16    /// A literal password.
17    Password(Cow<'a, str>),
18    /// Send a password reset email to the user.
19    Reset,
20    /// Set a random initial password.
21    Random,
22    /// Set a random initial password and send a reset email.
23    ResetRandom,
24}
25
26impl<'a, T> From<T> for NewUserPassword<'a>
27where
28    T: Into<Cow<'a, str>>,
29{
30    fn from(password: T) -> Self {
31        Self::Password(password.into())
32    }
33}
34
35impl NewUserPassword<'_> {
36    fn add_query<'b>(&'b self, params: &mut FormParams<'b>) {
37        match self {
38            Self::Password(password) => params.push("password", password),
39            Self::Reset => params.push("reset_password", true),
40            Self::Random => params.push("force_random_password", true),
41            Self::ResetRandom => {
42                params
43                    .push("reset_password", true)
44                    .push("force_random_password", true)
45            },
46        };
47    }
48}
49
50/// Create a new user on an instance.
51#[derive(Debug, Builder, Clone)]
52#[builder(setter(strip_option))]
53pub struct CreateUser<'a> {
54    /// The email of the user.
55    #[builder(setter(into))]
56    email: Cow<'a, str>,
57    /// The name of the user.
58    #[builder(setter(into))]
59    name: Cow<'a, str>,
60    /// The username of the user.
61    #[builder(setter(into))]
62    username: Cow<'a, str>,
63    /// The password of the user.
64    #[builder(setter(into))]
65    password: NewUserPassword<'a>,
66
67    /// Skip confirmation for newly created user
68    #[builder(default)]
69    skip_confirmation: Option<bool>,
70
71    /// Whether the user is an administrator or not.
72    #[builder(default)]
73    admin: Option<bool>,
74    /// Whether the user is an auditor or not.
75    #[builder(default)]
76    auditor: Option<bool>,
77
78    /// Whether the user is provided by an external entity or not.
79    #[builder(default)]
80    external: Option<bool>,
81    /// The ID of the group for SAML.
82    #[builder(default)]
83    group_id_for_saml: Option<u64>,
84    /// Administrator notes for the user.
85    #[builder(setter(into), default)]
86    note: Option<Cow<'a, str>>,
87
88    /// Set the external provider identity for the user.
89    #[builder(default)]
90    external_provider: Option<ExternalProvider<'a>>,
91
92    /// The ID of the color scheme to use for the user.
93    #[builder(default)]
94    color_scheme_id: Option<u64>,
95    /// Whether the user's profile is set to private or not.
96    #[builder(default)]
97    private_profile: Option<bool>,
98    /// The ID of the theme to use for the user.
99    #[builder(default)]
100    theme_id: Option<u64>,
101    /// Whether the user prefers viewing diffs file-by-file or not.
102    #[builder(default)]
103    view_diffs_file_by_file: Option<bool>,
104
105    /// Whether the user can create groups or not.
106    #[builder(default)]
107    can_create_group: Option<bool>,
108    /// Extra minutes on shared runners for the user.
109    #[builder(default)]
110    extra_shared_runners_minutes_limit: Option<u64>,
111    /// The number of projects the user may create.
112    #[builder(default)]
113    projects_limit: Option<u64>,
114    /// The limit shared runners usage (in minutes) for the user.
115    #[builder(default)]
116    shared_runners_minutes_limit: Option<u64>,
117
118    // TODO: Figure out how to actually use this.
119    // avatar: ???,
120    /// Biographical information about the user.
121    #[builder(setter(into), default)]
122    bio: Option<Cow<'a, str>>,
123    /// The user's commit email address.
124    #[builder(setter(into), default)]
125    commit_email: Option<Cow<'a, str>>,
126    /// The user's LinkedIn URL.
127    #[builder(setter(into), default)]
128    linkedin: Option<Cow<'a, str>>,
129    /// The user's location.
130    #[builder(setter(into), default)]
131    location: Option<Cow<'a, str>>,
132    /// The user's organization.
133    #[builder(setter(into), default)]
134    organization: Option<Cow<'a, str>>,
135    /// The user's pronouns.
136    #[builder(setter(into), default)]
137    pronouns: Option<Cow<'a, str>>,
138    /// The user's public email address.
139    #[builder(setter(into), default)]
140    public_email: Option<Cow<'a, str>>,
141    /// The user's Skype ID.
142    #[builder(setter(into), default)]
143    skype: Option<Cow<'a, str>>,
144    /// The user's Twitter ID.
145    #[builder(setter(into), default)]
146    twitter: Option<Cow<'a, str>>,
147    /// The user's Discord ID.
148    #[builder(setter(into), default)]
149    discord: Option<Cow<'a, str>>,
150    /// The user's website URL.
151    #[builder(setter(into), default)]
152    website_url: Option<Cow<'a, str>>,
153}
154
155impl<'a> CreateUser<'a> {
156    /// Create a builder for the endpoint.
157    pub fn builder() -> CreateUserBuilder<'a> {
158        CreateUserBuilder::default()
159    }
160}
161
162impl Endpoint for CreateUser<'_> {
163    fn method(&self) -> Method {
164        Method::POST
165    }
166
167    fn endpoint(&self) -> Cow<'static, str> {
168        "users".into()
169    }
170
171    fn body(&self) -> Result<Option<(&'static str, Vec<u8>)>, BodyError> {
172        let mut params = FormParams::default();
173
174        params
175            .push("email", self.email.as_ref())
176            .push("name", self.name.as_ref())
177            .push("username", self.username.as_ref())
178            .push_opt("skip_confirmation", self.skip_confirmation)
179            .push_opt("admin", self.admin)
180            .push_opt("auditor", self.auditor)
181            .push_opt("external", self.external)
182            .push_opt("group_id_for_saml", self.group_id_for_saml)
183            .push_opt("note", self.note.as_ref())
184            .push_opt("color_scheme_id", self.color_scheme_id)
185            .push_opt("private_profile", self.private_profile)
186            .push_opt("theme_id", self.theme_id)
187            .push_opt("view_diffs_file_by_file", self.view_diffs_file_by_file)
188            .push_opt("can_create_group", self.can_create_group)
189            .push_opt(
190                "extra_shared_runners_minutes_limit",
191                self.extra_shared_runners_minutes_limit,
192            )
193            .push_opt("projects_limit", self.projects_limit)
194            .push_opt(
195                "shared_runners_minutes_limit",
196                self.shared_runners_minutes_limit,
197            )
198            .push_opt("bio", self.bio.as_ref())
199            .push_opt("commit_email", self.commit_email.as_ref())
200            .push_opt("linkedin", self.linkedin.as_ref())
201            .push_opt("location", self.location.as_ref())
202            .push_opt("organization", self.organization.as_ref())
203            .push_opt("pronouns", self.pronouns.as_ref())
204            .push_opt("public_email", self.public_email.as_ref())
205            .push_opt("skype", self.skype.as_ref())
206            .push_opt("twitter", self.twitter.as_ref())
207            .push_opt("discord", self.discord.as_ref())
208            .push_opt("website_url", self.website_url.as_ref());
209
210        self.password.add_query(&mut params);
211
212        if let Some(external_provider) = self.external_provider.as_ref() {
213            external_provider.add_form_params(&mut params);
214        }
215
216        params.into_body()
217    }
218}
219
220#[cfg(test)]
221mod tests {
222    use crate::api::users::{
223        CreateUser, CreateUserBuilderError, ExternalProvider, NewUserPassword,
224    };
225    use http::Method;
226
227    use crate::api::{self, Query};
228    use crate::test::client::{ExpectedUrl, SingleTestClient};
229
230    #[test]
231    fn email_is_necessary() {
232        let err = CreateUser::builder()
233            .name("name")
234            .username("username")
235            .password(NewUserPassword::Reset)
236            .build()
237            .unwrap_err();
238        crate::test::assert_missing_field!(err, CreateUserBuilderError, "email");
239    }
240
241    #[test]
242    fn name_is_necessary() {
243        let err = CreateUser::builder()
244            .email("email@example.com")
245            .username("username")
246            .password(NewUserPassword::Reset)
247            .build()
248            .unwrap_err();
249        crate::test::assert_missing_field!(err, CreateUserBuilderError, "name");
250    }
251
252    #[test]
253    fn username_is_necessary() {
254        let err = CreateUser::builder()
255            .name("name")
256            .email("email@example.com")
257            .password(NewUserPassword::Reset)
258            .build()
259            .unwrap_err();
260        crate::test::assert_missing_field!(err, CreateUserBuilderError, "username");
261    }
262
263    #[test]
264    fn password_is_necessary() {
265        let err = CreateUser::builder()
266            .email("email@example.com")
267            .name("name")
268            .username("username")
269            .build()
270            .unwrap_err();
271        crate::test::assert_missing_field!(err, CreateUserBuilderError, "password");
272    }
273
274    #[test]
275    fn sufficient_parameters() {
276        CreateUser::builder()
277            .email("email@example.com")
278            .name("name")
279            .username("username")
280            .password(NewUserPassword::Reset)
281            .build()
282            .unwrap();
283    }
284
285    #[test]
286    fn endpoint() {
287        let endpoint = ExpectedUrl::builder()
288            .method(Method::POST)
289            .endpoint("users")
290            .content_type("application/x-www-form-urlencoded")
291            .body_str(concat!(
292                "email=user%40example.com",
293                "&name=name",
294                "&username=username",
295                "&password=test-password",
296            ))
297            .build()
298            .unwrap();
299        let client = SingleTestClient::new_raw(endpoint, "");
300
301        let endpoint = CreateUser::builder()
302            .name("name")
303            .email("user@example.com")
304            .username("username")
305            .password("test-password")
306            .build()
307            .unwrap();
308        api::ignore(endpoint).query(&client).unwrap();
309    }
310
311    #[test]
312    fn endpoint_password_reset() {
313        let endpoint = ExpectedUrl::builder()
314            .method(Method::POST)
315            .endpoint("users")
316            .content_type("application/x-www-form-urlencoded")
317            .body_str(concat!(
318                "email=user%40example.com",
319                "&name=name",
320                "&username=username",
321                "&reset_password=true",
322            ))
323            .build()
324            .unwrap();
325        let client = SingleTestClient::new_raw(endpoint, "");
326
327        let endpoint = CreateUser::builder()
328            .name("name")
329            .email("user@example.com")
330            .username("username")
331            .password(NewUserPassword::Reset)
332            .build()
333            .unwrap();
334        api::ignore(endpoint).query(&client).unwrap();
335    }
336
337    #[test]
338    fn endpoint_password_random() {
339        let endpoint = ExpectedUrl::builder()
340            .method(Method::POST)
341            .endpoint("users")
342            .content_type("application/x-www-form-urlencoded")
343            .body_str(concat!(
344                "email=user%40example.com",
345                "&name=name",
346                "&username=username",
347                "&force_random_password=true",
348            ))
349            .build()
350            .unwrap();
351        let client = SingleTestClient::new_raw(endpoint, "");
352
353        let endpoint = CreateUser::builder()
354            .name("name")
355            .email("user@example.com")
356            .username("username")
357            .password(NewUserPassword::Random)
358            .build()
359            .unwrap();
360        api::ignore(endpoint).query(&client).unwrap();
361    }
362
363    #[test]
364    fn endpoint_password_reset_random() {
365        let endpoint = ExpectedUrl::builder()
366            .method(Method::POST)
367            .endpoint("users")
368            .content_type("application/x-www-form-urlencoded")
369            .body_str(concat!(
370                "email=user%40example.com",
371                "&name=name",
372                "&username=username",
373                "&reset_password=true",
374                "&force_random_password=true",
375            ))
376            .build()
377            .unwrap();
378        let client = SingleTestClient::new_raw(endpoint, "");
379
380        let endpoint = CreateUser::builder()
381            .name("name")
382            .email("user@example.com")
383            .username("username")
384            .password(NewUserPassword::ResetRandom)
385            .build()
386            .unwrap();
387        api::ignore(endpoint).query(&client).unwrap();
388    }
389
390    #[test]
391    fn endpoint_skip_confirmation() {
392        let endpoint = ExpectedUrl::builder()
393            .method(Method::POST)
394            .endpoint("users")
395            .content_type("application/x-www-form-urlencoded")
396            .body_str(concat!(
397                "email=user%40example.com",
398                "&name=name",
399                "&username=username",
400                "&skip_confirmation=true",
401                "&reset_password=true",
402            ))
403            .build()
404            .unwrap();
405        let client = SingleTestClient::new_raw(endpoint, "");
406
407        let endpoint = CreateUser::builder()
408            .name("name")
409            .email("user@example.com")
410            .username("username")
411            .password(NewUserPassword::Reset)
412            .skip_confirmation(true)
413            .build()
414            .unwrap();
415        api::ignore(endpoint).query(&client).unwrap();
416    }
417
418    #[test]
419    fn endpoint_admin() {
420        let endpoint = ExpectedUrl::builder()
421            .method(Method::POST)
422            .endpoint("users")
423            .content_type("application/x-www-form-urlencoded")
424            .body_str(concat!(
425                "email=user%40example.com",
426                "&name=name",
427                "&username=username",
428                "&admin=true",
429                "&reset_password=true",
430            ))
431            .build()
432            .unwrap();
433        let client = SingleTestClient::new_raw(endpoint, "");
434
435        let endpoint = CreateUser::builder()
436            .name("name")
437            .email("user@example.com")
438            .username("username")
439            .password(NewUserPassword::Reset)
440            .admin(true)
441            .build()
442            .unwrap();
443        api::ignore(endpoint).query(&client).unwrap();
444    }
445
446    #[test]
447    fn endpoint_auditor() {
448        let endpoint = ExpectedUrl::builder()
449            .method(Method::POST)
450            .endpoint("users")
451            .content_type("application/x-www-form-urlencoded")
452            .body_str(concat!(
453                "email=user%40example.com",
454                "&name=name",
455                "&username=username",
456                "&auditor=true",
457                "&reset_password=true",
458            ))
459            .build()
460            .unwrap();
461        let client = SingleTestClient::new_raw(endpoint, "");
462
463        let endpoint = CreateUser::builder()
464            .name("name")
465            .email("user@example.com")
466            .username("username")
467            .password(NewUserPassword::Reset)
468            .auditor(true)
469            .build()
470            .unwrap();
471        api::ignore(endpoint).query(&client).unwrap();
472    }
473
474    #[test]
475    fn endpoint_external() {
476        let endpoint = ExpectedUrl::builder()
477            .method(Method::POST)
478            .endpoint("users")
479            .content_type("application/x-www-form-urlencoded")
480            .body_str(concat!(
481                "email=user%40example.com",
482                "&name=name",
483                "&username=username",
484                "&external=true",
485                "&reset_password=true",
486            ))
487            .build()
488            .unwrap();
489        let client = SingleTestClient::new_raw(endpoint, "");
490
491        let endpoint = CreateUser::builder()
492            .name("name")
493            .email("user@example.com")
494            .username("username")
495            .password(NewUserPassword::Reset)
496            .external(true)
497            .build()
498            .unwrap();
499        api::ignore(endpoint).query(&client).unwrap();
500    }
501
502    #[test]
503    fn endpoint_group_id_for_saml() {
504        let endpoint = ExpectedUrl::builder()
505            .method(Method::POST)
506            .endpoint("users")
507            .content_type("application/x-www-form-urlencoded")
508            .body_str(concat!(
509                "email=user%40example.com",
510                "&name=name",
511                "&username=username",
512                "&group_id_for_saml=1",
513                "&reset_password=true",
514            ))
515            .build()
516            .unwrap();
517        let client = SingleTestClient::new_raw(endpoint, "");
518
519        let endpoint = CreateUser::builder()
520            .name("name")
521            .email("user@example.com")
522            .username("username")
523            .password(NewUserPassword::Reset)
524            .group_id_for_saml(1)
525            .build()
526            .unwrap();
527        api::ignore(endpoint).query(&client).unwrap();
528    }
529
530    #[test]
531    fn endpoint_note() {
532        let endpoint = ExpectedUrl::builder()
533            .method(Method::POST)
534            .endpoint("users")
535            .content_type("application/x-www-form-urlencoded")
536            .body_str(concat!(
537                "email=user%40example.com",
538                "&name=name",
539                "&username=username",
540                "&note=admin+notes",
541                "&reset_password=true",
542            ))
543            .build()
544            .unwrap();
545        let client = SingleTestClient::new_raw(endpoint, "");
546
547        let endpoint = CreateUser::builder()
548            .name("name")
549            .email("user@example.com")
550            .username("username")
551            .password(NewUserPassword::Reset)
552            .note("admin notes")
553            .build()
554            .unwrap();
555        api::ignore(endpoint).query(&client).unwrap();
556    }
557
558    #[test]
559    fn endpoint_external_provider() {
560        let endpoint = ExpectedUrl::builder()
561            .method(Method::POST)
562            .endpoint("users")
563            .content_type("application/x-www-form-urlencoded")
564            .body_str(concat!(
565                "email=user%40example.com",
566                "&name=name",
567                "&username=username",
568                "&reset_password=true",
569                "&extern_uid=foobar",
570                "&provider=magic",
571            ))
572            .build()
573            .unwrap();
574        let client = SingleTestClient::new_raw(endpoint, "");
575
576        let endpoint = CreateUser::builder()
577            .name("name")
578            .email("user@example.com")
579            .username("username")
580            .password(NewUserPassword::Reset)
581            .external_provider(
582                ExternalProvider::builder()
583                    .uid("foobar")
584                    .name("magic")
585                    .build()
586                    .unwrap(),
587            )
588            .build()
589            .unwrap();
590        api::ignore(endpoint).query(&client).unwrap();
591    }
592
593    #[test]
594    fn endpoint_color_scheme_id() {
595        let endpoint = ExpectedUrl::builder()
596            .method(Method::POST)
597            .endpoint("users")
598            .content_type("application/x-www-form-urlencoded")
599            .body_str(concat!(
600                "email=user%40example.com",
601                "&name=name",
602                "&username=username",
603                "&color_scheme_id=1",
604                "&reset_password=true",
605            ))
606            .build()
607            .unwrap();
608        let client = SingleTestClient::new_raw(endpoint, "");
609
610        let endpoint = CreateUser::builder()
611            .name("name")
612            .email("user@example.com")
613            .username("username")
614            .password(NewUserPassword::Reset)
615            .color_scheme_id(1)
616            .build()
617            .unwrap();
618        api::ignore(endpoint).query(&client).unwrap();
619    }
620
621    #[test]
622    fn endpoint_private_profile() {
623        let endpoint = ExpectedUrl::builder()
624            .method(Method::POST)
625            .endpoint("users")
626            .content_type("application/x-www-form-urlencoded")
627            .body_str(concat!(
628                "email=user%40example.com",
629                "&name=name",
630                "&username=username",
631                "&private_profile=true",
632                "&reset_password=true",
633            ))
634            .build()
635            .unwrap();
636        let client = SingleTestClient::new_raw(endpoint, "");
637
638        let endpoint = CreateUser::builder()
639            .name("name")
640            .email("user@example.com")
641            .username("username")
642            .password(NewUserPassword::Reset)
643            .private_profile(true)
644            .build()
645            .unwrap();
646        api::ignore(endpoint).query(&client).unwrap();
647    }
648
649    #[test]
650    fn endpoint_theme_id() {
651        let endpoint = ExpectedUrl::builder()
652            .method(Method::POST)
653            .endpoint("users")
654            .content_type("application/x-www-form-urlencoded")
655            .body_str(concat!(
656                "email=user%40example.com",
657                "&name=name",
658                "&username=username",
659                "&theme_id=1",
660                "&reset_password=true",
661            ))
662            .build()
663            .unwrap();
664        let client = SingleTestClient::new_raw(endpoint, "");
665
666        let endpoint = CreateUser::builder()
667            .name("name")
668            .email("user@example.com")
669            .username("username")
670            .password(NewUserPassword::Reset)
671            .theme_id(1)
672            .build()
673            .unwrap();
674        api::ignore(endpoint).query(&client).unwrap();
675    }
676
677    #[test]
678    fn endpoint_view_diffs_file_by_file() {
679        let endpoint = ExpectedUrl::builder()
680            .method(Method::POST)
681            .endpoint("users")
682            .content_type("application/x-www-form-urlencoded")
683            .body_str(concat!(
684                "email=user%40example.com",
685                "&name=name",
686                "&username=username",
687                "&view_diffs_file_by_file=true",
688                "&reset_password=true",
689            ))
690            .build()
691            .unwrap();
692        let client = SingleTestClient::new_raw(endpoint, "");
693
694        let endpoint = CreateUser::builder()
695            .name("name")
696            .email("user@example.com")
697            .username("username")
698            .password(NewUserPassword::Reset)
699            .view_diffs_file_by_file(true)
700            .build()
701            .unwrap();
702        api::ignore(endpoint).query(&client).unwrap();
703    }
704
705    #[test]
706    fn endpoint_can_create_group() {
707        let endpoint = ExpectedUrl::builder()
708            .method(Method::POST)
709            .endpoint("users")
710            .content_type("application/x-www-form-urlencoded")
711            .body_str(concat!(
712                "email=user%40example.com",
713                "&name=name",
714                "&username=username",
715                "&can_create_group=true",
716                "&reset_password=true",
717            ))
718            .build()
719            .unwrap();
720        let client = SingleTestClient::new_raw(endpoint, "");
721
722        let endpoint = CreateUser::builder()
723            .name("name")
724            .email("user@example.com")
725            .username("username")
726            .password(NewUserPassword::Reset)
727            .can_create_group(true)
728            .build()
729            .unwrap();
730        api::ignore(endpoint).query(&client).unwrap();
731    }
732
733    #[test]
734    fn endpoint_extra_shared_runners_minutes_limit() {
735        let endpoint = ExpectedUrl::builder()
736            .method(Method::POST)
737            .endpoint("users")
738            .content_type("application/x-www-form-urlencoded")
739            .body_str(concat!(
740                "email=user%40example.com",
741                "&name=name",
742                "&username=username",
743                "&extra_shared_runners_minutes_limit=10",
744                "&reset_password=true",
745            ))
746            .build()
747            .unwrap();
748        let client = SingleTestClient::new_raw(endpoint, "");
749
750        let endpoint = CreateUser::builder()
751            .name("name")
752            .email("user@example.com")
753            .username("username")
754            .password(NewUserPassword::Reset)
755            .extra_shared_runners_minutes_limit(10)
756            .build()
757            .unwrap();
758        api::ignore(endpoint).query(&client).unwrap();
759    }
760
761    #[test]
762    fn endpoint_projects_limit() {
763        let endpoint = ExpectedUrl::builder()
764            .method(Method::POST)
765            .endpoint("users")
766            .content_type("application/x-www-form-urlencoded")
767            .body_str(concat!(
768                "email=user%40example.com",
769                "&name=name",
770                "&username=username",
771                "&projects_limit=100",
772                "&reset_password=true",
773            ))
774            .build()
775            .unwrap();
776        let client = SingleTestClient::new_raw(endpoint, "");
777
778        let endpoint = CreateUser::builder()
779            .name("name")
780            .email("user@example.com")
781            .username("username")
782            .password(NewUserPassword::Reset)
783            .projects_limit(100)
784            .build()
785            .unwrap();
786        api::ignore(endpoint).query(&client).unwrap();
787    }
788
789    #[test]
790    fn endpoint_shared_runners_minutes_limit() {
791        let endpoint = ExpectedUrl::builder()
792            .method(Method::POST)
793            .endpoint("users")
794            .content_type("application/x-www-form-urlencoded")
795            .body_str(concat!(
796                "email=user%40example.com",
797                "&name=name",
798                "&username=username",
799                "&shared_runners_minutes_limit=1000",
800                "&reset_password=true",
801            ))
802            .build()
803            .unwrap();
804        let client = SingleTestClient::new_raw(endpoint, "");
805
806        let endpoint = CreateUser::builder()
807            .name("name")
808            .email("user@example.com")
809            .username("username")
810            .password(NewUserPassword::Reset)
811            .shared_runners_minutes_limit(1000)
812            .build()
813            .unwrap();
814        api::ignore(endpoint).query(&client).unwrap();
815    }
816
817    #[test]
818    fn endpoint_bio() {
819        let endpoint = ExpectedUrl::builder()
820            .method(Method::POST)
821            .endpoint("users")
822            .content_type("application/x-www-form-urlencoded")
823            .body_str(concat!(
824                "email=user%40example.com",
825                "&name=name",
826                "&username=username",
827                "&bio=bio",
828                "&reset_password=true",
829            ))
830            .build()
831            .unwrap();
832        let client = SingleTestClient::new_raw(endpoint, "");
833
834        let endpoint = CreateUser::builder()
835            .name("name")
836            .email("user@example.com")
837            .username("username")
838            .password(NewUserPassword::Reset)
839            .bio("bio")
840            .build()
841            .unwrap();
842        api::ignore(endpoint).query(&client).unwrap();
843    }
844
845    #[test]
846    fn endpoint_commit_email() {
847        let endpoint = ExpectedUrl::builder()
848            .method(Method::POST)
849            .endpoint("users")
850            .content_type("application/x-www-form-urlencoded")
851            .body_str(concat!(
852                "email=user%40example.com",
853                "&name=name",
854                "&username=username",
855                "&commit_email=commit%40example.com",
856                "&reset_password=true",
857            ))
858            .build()
859            .unwrap();
860        let client = SingleTestClient::new_raw(endpoint, "");
861
862        let endpoint = CreateUser::builder()
863            .name("name")
864            .email("user@example.com")
865            .username("username")
866            .password(NewUserPassword::Reset)
867            .commit_email("commit@example.com")
868            .build()
869            .unwrap();
870        api::ignore(endpoint).query(&client).unwrap();
871    }
872
873    #[test]
874    fn endpoint_linkedin() {
875        let endpoint = ExpectedUrl::builder()
876            .method(Method::POST)
877            .endpoint("users")
878            .content_type("application/x-www-form-urlencoded")
879            .body_str(concat!(
880                "email=user%40example.com",
881                "&name=name",
882                "&username=username",
883                "&linkedin=linkedin_url",
884                "&reset_password=true",
885            ))
886            .build()
887            .unwrap();
888        let client = SingleTestClient::new_raw(endpoint, "");
889
890        let endpoint = CreateUser::builder()
891            .name("name")
892            .email("user@example.com")
893            .username("username")
894            .password(NewUserPassword::Reset)
895            .linkedin("linkedin_url")
896            .build()
897            .unwrap();
898        api::ignore(endpoint).query(&client).unwrap();
899    }
900
901    #[test]
902    fn endpoint_location() {
903        let endpoint = ExpectedUrl::builder()
904            .method(Method::POST)
905            .endpoint("users")
906            .content_type("application/x-www-form-urlencoded")
907            .body_str(concat!(
908                "email=user%40example.com",
909                "&name=name",
910                "&username=username",
911                "&location=home",
912                "&reset_password=true",
913            ))
914            .build()
915            .unwrap();
916        let client = SingleTestClient::new_raw(endpoint, "");
917
918        let endpoint = CreateUser::builder()
919            .name("name")
920            .email("user@example.com")
921            .username("username")
922            .password(NewUserPassword::Reset)
923            .location("home")
924            .build()
925            .unwrap();
926        api::ignore(endpoint).query(&client).unwrap();
927    }
928
929    #[test]
930    fn endpoint_organization() {
931        let endpoint = ExpectedUrl::builder()
932            .method(Method::POST)
933            .endpoint("users")
934            .content_type("application/x-www-form-urlencoded")
935            .body_str(concat!(
936                "email=user%40example.com",
937                "&name=name",
938                "&username=username",
939                "&organization=mywork",
940                "&reset_password=true",
941            ))
942            .build()
943            .unwrap();
944        let client = SingleTestClient::new_raw(endpoint, "");
945
946        let endpoint = CreateUser::builder()
947            .name("name")
948            .email("user@example.com")
949            .username("username")
950            .password(NewUserPassword::Reset)
951            .organization("mywork")
952            .build()
953            .unwrap();
954        api::ignore(endpoint).query(&client).unwrap();
955    }
956
957    #[test]
958    fn endpoint_pronouns() {
959        let endpoint = ExpectedUrl::builder()
960            .method(Method::POST)
961            .endpoint("users")
962            .content_type("application/x-www-form-urlencoded")
963            .body_str(concat!(
964                "email=user%40example.com",
965                "&name=name",
966                "&username=username",
967                "&pronouns=robot",
968                "&reset_password=true",
969            ))
970            .build()
971            .unwrap();
972        let client = SingleTestClient::new_raw(endpoint, "");
973
974        let endpoint = CreateUser::builder()
975            .name("name")
976            .email("user@example.com")
977            .username("username")
978            .password(NewUserPassword::Reset)
979            .pronouns("robot")
980            .build()
981            .unwrap();
982        api::ignore(endpoint).query(&client).unwrap();
983    }
984
985    #[test]
986    fn endpoint_public_email() {
987        let endpoint = ExpectedUrl::builder()
988            .method(Method::POST)
989            .endpoint("users")
990            .content_type("application/x-www-form-urlencoded")
991            .body_str(concat!(
992                "email=user%40example.com",
993                "&name=name",
994                "&username=username",
995                "&public_email=public%40example.com",
996                "&reset_password=true",
997            ))
998            .build()
999            .unwrap();
1000        let client = SingleTestClient::new_raw(endpoint, "");
1001
1002        let endpoint = CreateUser::builder()
1003            .name("name")
1004            .email("user@example.com")
1005            .username("username")
1006            .password(NewUserPassword::Reset)
1007            .public_email("public@example.com")
1008            .build()
1009            .unwrap();
1010        api::ignore(endpoint).query(&client).unwrap();
1011    }
1012
1013    #[test]
1014    fn endpoint_skype() {
1015        let endpoint = ExpectedUrl::builder()
1016            .method(Method::POST)
1017            .endpoint("users")
1018            .content_type("application/x-www-form-urlencoded")
1019            .body_str(concat!(
1020                "email=user%40example.com",
1021                "&name=name",
1022                "&username=username",
1023                "&skype=skype_url",
1024                "&reset_password=true",
1025            ))
1026            .build()
1027            .unwrap();
1028        let client = SingleTestClient::new_raw(endpoint, "");
1029
1030        let endpoint = CreateUser::builder()
1031            .name("name")
1032            .email("user@example.com")
1033            .username("username")
1034            .password(NewUserPassword::Reset)
1035            .skype("skype_url")
1036            .build()
1037            .unwrap();
1038        api::ignore(endpoint).query(&client).unwrap();
1039    }
1040
1041    #[test]
1042    fn endpoint_twitter() {
1043        let endpoint = ExpectedUrl::builder()
1044            .method(Method::POST)
1045            .endpoint("users")
1046            .content_type("application/x-www-form-urlencoded")
1047            .body_str(concat!(
1048                "email=user%40example.com",
1049                "&name=name",
1050                "&username=username",
1051                "&twitter=twitter_handle",
1052                "&reset_password=true",
1053            ))
1054            .build()
1055            .unwrap();
1056        let client = SingleTestClient::new_raw(endpoint, "");
1057
1058        let endpoint = CreateUser::builder()
1059            .name("name")
1060            .email("user@example.com")
1061            .username("username")
1062            .password(NewUserPassword::Reset)
1063            .twitter("twitter_handle")
1064            .build()
1065            .unwrap();
1066        api::ignore(endpoint).query(&client).unwrap();
1067    }
1068
1069    #[test]
1070    fn endpoint_discord() {
1071        let endpoint = ExpectedUrl::builder()
1072            .method(Method::POST)
1073            .endpoint("users")
1074            .content_type("application/x-www-form-urlencoded")
1075            .body_str(concat!(
1076                "email=user%40example.com",
1077                "&name=name",
1078                "&username=username",
1079                "&discord=discord_username",
1080                "&reset_password=true",
1081            ))
1082            .build()
1083            .unwrap();
1084        let client = SingleTestClient::new_raw(endpoint, "");
1085
1086        let endpoint = CreateUser::builder()
1087            .name("name")
1088            .email("user@example.com")
1089            .username("username")
1090            .password(NewUserPassword::Reset)
1091            .discord("discord_username")
1092            .build()
1093            .unwrap();
1094        api::ignore(endpoint).query(&client).unwrap();
1095    }
1096
1097    #[test]
1098    fn endpoint_website_url() {
1099        let endpoint = ExpectedUrl::builder()
1100            .method(Method::POST)
1101            .endpoint("users")
1102            .content_type("application/x-www-form-urlencoded")
1103            .body_str(concat!(
1104                "email=user%40example.com",
1105                "&name=name",
1106                "&username=username",
1107                "&website_url=homepage",
1108                "&reset_password=true",
1109            ))
1110            .build()
1111            .unwrap();
1112        let client = SingleTestClient::new_raw(endpoint, "");
1113
1114        let endpoint = CreateUser::builder()
1115            .name("name")
1116            .email("user@example.com")
1117            .username("username")
1118            .password(NewUserPassword::Reset)
1119            .website_url("homepage")
1120            .build()
1121            .unwrap();
1122        api::ignore(endpoint).query(&client).unwrap();
1123    }
1124}