1use derive_builder::Builder;
8
9use crate::api::endpoint_prelude::*;
10use crate::api::users::ExternalProvider;
11
12#[derive(Debug, Clone, PartialEq, Eq)]
14#[non_exhaustive]
15pub enum NewUserPassword<'a> {
16 Password(Cow<'a, str>),
18 Reset,
20 Random,
22 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#[derive(Debug, Builder, Clone)]
52#[builder(setter(strip_option))]
53pub struct CreateUser<'a> {
54 #[builder(setter(into))]
56 email: Cow<'a, str>,
57 #[builder(setter(into))]
59 name: Cow<'a, str>,
60 #[builder(setter(into))]
62 username: Cow<'a, str>,
63 #[builder(setter(into))]
65 password: NewUserPassword<'a>,
66
67 #[builder(default)]
69 skip_confirmation: Option<bool>,
70
71 #[builder(default)]
73 admin: Option<bool>,
74 #[builder(default)]
76 auditor: Option<bool>,
77
78 #[builder(default)]
80 external: Option<bool>,
81 #[builder(default)]
83 group_id_for_saml: Option<u64>,
84 #[builder(setter(into), default)]
86 note: Option<Cow<'a, str>>,
87
88 #[builder(default)]
90 external_provider: Option<ExternalProvider<'a>>,
91
92 #[builder(default)]
94 color_scheme_id: Option<u64>,
95 #[builder(default)]
97 private_profile: Option<bool>,
98 #[builder(default)]
100 theme_id: Option<u64>,
101 #[builder(default)]
103 view_diffs_file_by_file: Option<bool>,
104
105 #[builder(default)]
107 can_create_group: Option<bool>,
108 #[builder(default)]
110 extra_shared_runners_minutes_limit: Option<u64>,
111 #[builder(default)]
113 projects_limit: Option<u64>,
114 #[builder(default)]
116 shared_runners_minutes_limit: Option<u64>,
117
118 #[builder(setter(into), default)]
122 bio: Option<Cow<'a, str>>,
123 #[builder(setter(into), default)]
125 commit_email: Option<Cow<'a, str>>,
126 #[builder(setter(into), default)]
128 linkedin: Option<Cow<'a, str>>,
129 #[builder(setter(into), default)]
131 location: Option<Cow<'a, str>>,
132 #[builder(setter(into), default)]
134 organization: Option<Cow<'a, str>>,
135 #[builder(setter(into), default)]
137 pronouns: Option<Cow<'a, str>>,
138 #[builder(setter(into), default)]
140 public_email: Option<Cow<'a, str>>,
141 #[builder(setter(into), default)]
143 skype: Option<Cow<'a, str>>,
144 #[builder(setter(into), default)]
146 twitter: Option<Cow<'a, str>>,
147 #[builder(setter(into), default)]
149 discord: Option<Cow<'a, str>>,
150 #[builder(setter(into), default)]
152 website_url: Option<Cow<'a, str>>,
153}
154
155impl<'a> CreateUser<'a> {
156 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 "¬e=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}