1pub fn core_user_schema() -> &'static str {
11 r#"{
12 "id": "urn:ietf:params:scim:schemas:core:2.0:User",
13 "name": "User",
14 "description": "User Account",
15 "attributes": [
16 {
17 "name": "id",
18 "type": "string",
19 "multiValued": false,
20 "required": false,
21 "caseExact": true,
22 "mutability": "readOnly",
23 "returned": "always",
24 "uniqueness": "server"
25 },
26 {
27 "name": "userName",
28 "type": "string",
29 "multiValued": false,
30 "required": true,
31 "caseExact": false,
32 "mutability": "readWrite",
33 "returned": "default",
34 "uniqueness": "server"
35 },
36 {
37 "name": "externalId",
38 "type": "string",
39 "multiValued": false,
40 "required": false,
41 "caseExact": true,
42 "mutability": "readWrite",
43 "returned": "default",
44 "uniqueness": "none"
45 },
46 {
47 "name": "displayName",
48 "type": "string",
49 "multiValued": false,
50 "required": false,
51 "caseExact": false,
52 "mutability": "readWrite",
53 "returned": "default",
54 "uniqueness": "none"
55 },
56 {
57 "name": "nickName",
58 "type": "string",
59 "multiValued": false,
60 "required": false,
61 "caseExact": false,
62 "mutability": "readWrite",
63 "returned": "default",
64 "uniqueness": "none"
65 },
66 {
67 "name": "profileUrl",
68 "type": "reference",
69 "multiValued": false,
70 "required": false,
71 "caseExact": false,
72 "mutability": "readWrite",
73 "returned": "default",
74 "uniqueness": "none"
75 },
76 {
77 "name": "title",
78 "type": "string",
79 "multiValued": false,
80 "required": false,
81 "caseExact": false,
82 "mutability": "readWrite",
83 "returned": "default",
84 "uniqueness": "none"
85 },
86 {
87 "name": "userType",
88 "type": "string",
89 "multiValued": false,
90 "required": false,
91 "caseExact": false,
92 "mutability": "readWrite",
93 "returned": "default",
94 "uniqueness": "none"
95 },
96 {
97 "name": "preferredLanguage",
98 "type": "string",
99 "multiValued": false,
100 "required": false,
101 "caseExact": false,
102 "mutability": "readWrite",
103 "returned": "default",
104 "uniqueness": "none"
105 },
106 {
107 "name": "locale",
108 "type": "string",
109 "multiValued": false,
110 "required": false,
111 "caseExact": false,
112 "mutability": "readWrite",
113 "returned": "default",
114 "uniqueness": "none"
115 },
116 {
117 "name": "timezone",
118 "type": "string",
119 "multiValued": false,
120 "required": false,
121 "caseExact": false,
122 "mutability": "readWrite",
123 "returned": "default",
124 "uniqueness": "none"
125 },
126 {
127 "name": "name",
128 "type": "complex",
129 "multiValued": false,
130 "required": false,
131 "caseExact": false,
132 "mutability": "readWrite",
133 "returned": "default",
134 "uniqueness": "none",
135 "subAttributes": [
136 {
137 "name": "formatted",
138 "type": "string",
139 "multiValued": false,
140 "required": false,
141 "caseExact": false,
142 "mutability": "readWrite",
143 "returned": "default",
144 "uniqueness": "none"
145 },
146 {
147 "name": "familyName",
148 "type": "string",
149 "multiValued": false,
150 "required": false,
151 "caseExact": false,
152 "mutability": "readWrite",
153 "returned": "default",
154 "uniqueness": "none"
155 },
156 {
157 "name": "givenName",
158 "type": "string",
159 "multiValued": false,
160 "required": false,
161 "caseExact": false,
162 "mutability": "readWrite",
163 "returned": "default",
164 "uniqueness": "none"
165 },
166 {
167 "name": "middleName",
168 "type": "string",
169 "multiValued": false,
170 "required": false,
171 "caseExact": false,
172 "mutability": "readWrite",
173 "returned": "default",
174 "uniqueness": "none"
175 },
176 {
177 "name": "honorificPrefix",
178 "type": "string",
179 "multiValued": false,
180 "required": false,
181 "caseExact": false,
182 "mutability": "readWrite",
183 "returned": "default",
184 "uniqueness": "none"
185 },
186 {
187 "name": "honorificSuffix",
188 "type": "string",
189 "multiValued": false,
190 "required": false,
191 "caseExact": false,
192 "mutability": "readWrite",
193 "returned": "default",
194 "uniqueness": "none"
195 }
196 ]
197 },
198 {
199 "name": "emails",
200 "type": "complex",
201 "multiValued": true,
202 "required": false,
203 "caseExact": false,
204 "mutability": "readWrite",
205 "returned": "default",
206 "uniqueness": "none",
207 "subAttributes": [
208 {
209 "name": "value",
210 "type": "string",
211 "multiValued": false,
212 "required": true,
213 "caseExact": false,
214 "mutability": "readWrite",
215 "returned": "default",
216 "uniqueness": "none"
217 },
218 {
219 "name": "type",
220 "type": "string",
221 "multiValued": false,
222 "required": false,
223 "caseExact": false,
224 "mutability": "readWrite",
225 "returned": "default",
226 "uniqueness": "none",
227 "canonicalValues": ["work", "home", "other"]
228 },
229 {
230 "name": "primary",
231 "type": "boolean",
232 "multiValued": false,
233 "required": false,
234 "caseExact": false,
235 "mutability": "readWrite",
236 "returned": "default",
237 "uniqueness": "none"
238 },
239 {
240 "name": "display",
241 "type": "string",
242 "multiValued": false,
243 "required": false,
244 "caseExact": false,
245 "mutability": "readWrite",
246 "returned": "default",
247 "uniqueness": "none"
248 }
249 ]
250 },
251 {
252 "name": "phoneNumbers",
253 "type": "complex",
254 "multiValued": true,
255 "required": false,
256 "caseExact": false,
257 "mutability": "readWrite",
258 "returned": "default",
259 "uniqueness": "none",
260 "subAttributes": [
261 {
262 "name": "value",
263 "type": "string",
264 "multiValued": false,
265 "required": true,
266 "caseExact": false,
267 "mutability": "readWrite",
268 "returned": "default",
269 "uniqueness": "none"
270 },
271 {
272 "name": "type",
273 "type": "string",
274 "multiValued": false,
275 "required": false,
276 "caseExact": false,
277 "mutability": "readWrite",
278 "returned": "default",
279 "uniqueness": "none",
280 "canonicalValues": ["work", "home", "mobile", "fax", "pager", "other"]
281 },
282 {
283 "name": "primary",
284 "type": "boolean",
285 "multiValued": false,
286 "required": false,
287 "caseExact": false,
288 "mutability": "readWrite",
289 "returned": "default",
290 "uniqueness": "none"
291 },
292 {
293 "name": "display",
294 "type": "string",
295 "multiValued": false,
296 "required": false,
297 "caseExact": false,
298 "mutability": "readWrite",
299 "returned": "default",
300 "uniqueness": "none"
301 }
302 ]
303 },
304 {
305 "name": "addresses",
306 "type": "complex",
307 "multiValued": true,
308 "required": false,
309 "caseExact": false,
310 "mutability": "readWrite",
311 "returned": "default",
312 "uniqueness": "none",
313 "subAttributes": [
314 {
315 "name": "formatted",
316 "type": "string",
317 "multiValued": false,
318 "required": false,
319 "caseExact": false,
320 "mutability": "readWrite",
321 "returned": "default",
322 "uniqueness": "none"
323 },
324 {
325 "name": "streetAddress",
326 "type": "string",
327 "multiValued": false,
328 "required": false,
329 "caseExact": false,
330 "mutability": "readWrite",
331 "returned": "default",
332 "uniqueness": "none"
333 },
334 {
335 "name": "locality",
336 "type": "string",
337 "multiValued": false,
338 "required": false,
339 "caseExact": false,
340 "mutability": "readWrite",
341 "returned": "default",
342 "uniqueness": "none"
343 },
344 {
345 "name": "region",
346 "type": "string",
347 "multiValued": false,
348 "required": false,
349 "caseExact": false,
350 "mutability": "readWrite",
351 "returned": "default",
352 "uniqueness": "none"
353 },
354 {
355 "name": "postalCode",
356 "type": "string",
357 "multiValued": false,
358 "required": false,
359 "caseExact": false,
360 "mutability": "readWrite",
361 "returned": "default",
362 "uniqueness": "none"
363 },
364 {
365 "name": "country",
366 "type": "string",
367 "multiValued": false,
368 "required": false,
369 "caseExact": false,
370 "mutability": "readWrite",
371 "returned": "default",
372 "uniqueness": "none"
373 },
374 {
375 "name": "type",
376 "type": "string",
377 "multiValued": false,
378 "required": false,
379 "caseExact": false,
380 "mutability": "readWrite",
381 "returned": "default",
382 "uniqueness": "none",
383 "canonicalValues": ["work", "home", "other"]
384 },
385 {
386 "name": "primary",
387 "type": "boolean",
388 "multiValued": false,
389 "required": false,
390 "caseExact": false,
391 "mutability": "readWrite",
392 "returned": "default",
393 "uniqueness": "none"
394 }
395 ]
396 },
397 {
398 "name": "active",
399 "type": "boolean",
400 "multiValued": false,
401 "required": false,
402 "caseExact": false,
403 "mutability": "readWrite",
404 "returned": "default",
405 "uniqueness": "none"
406 },
407 {
408 "name": "meta",
409 "type": "complex",
410 "multiValued": false,
411 "required": false,
412 "caseExact": false,
413 "mutability": "readOnly",
414 "returned": "default",
415 "uniqueness": "none",
416 "subAttributes": [
417 {
418 "name": "resourceType",
419 "type": "string",
420 "multiValued": false,
421 "required": false,
422 "caseExact": true,
423 "mutability": "readOnly",
424 "returned": "default",
425 "uniqueness": "none"
426 },
427 {
428 "name": "created",
429 "type": "dateTime",
430 "multiValued": false,
431 "required": false,
432 "caseExact": false,
433 "mutability": "readOnly",
434 "returned": "default",
435 "uniqueness": "none"
436 },
437 {
438 "name": "lastModified",
439 "type": "dateTime",
440 "multiValued": false,
441 "required": false,
442 "caseExact": false,
443 "mutability": "readOnly",
444 "returned": "default",
445 "uniqueness": "none"
446 },
447 {
448 "name": "location",
449 "type": "reference",
450 "multiValued": false,
451 "required": false,
452 "caseExact": false,
453 "mutability": "readOnly",
454 "returned": "default",
455 "uniqueness": "none"
456 },
457 {
458 "name": "version",
459 "type": "string",
460 "multiValued": false,
461 "required": false,
462 "caseExact": true,
463 "mutability": "readOnly",
464 "returned": "default",
465 "uniqueness": "none"
466 }
467 ]
468 },
469 {
470 "name": "groups",
471 "type": "complex",
472 "multiValued": true,
473 "required": false,
474 "caseExact": false,
475 "mutability": "readOnly",
476 "returned": "default",
477 "uniqueness": "none",
478 "subAttributes": [
479 {
480 "name": "value",
481 "type": "string",
482 "multiValued": false,
483 "required": true,
484 "caseExact": true,
485 "mutability": "readOnly",
486 "returned": "default",
487 "uniqueness": "none"
488 },
489 {
490 "name": "$ref",
491 "type": "reference",
492 "multiValued": false,
493 "required": false,
494 "caseExact": true,
495 "mutability": "readOnly",
496 "returned": "default",
497 "uniqueness": "none",
498 "referenceTypes": ["Group"]
499 },
500 {
501 "name": "display",
502 "type": "string",
503 "multiValued": false,
504 "required": false,
505 "caseExact": false,
506 "mutability": "readOnly",
507 "returned": "default",
508 "uniqueness": "none"
509 },
510 {
511 "name": "type",
512 "type": "string",
513 "multiValued": false,
514 "required": false,
515 "caseExact": false,
516 "mutability": "readOnly",
517 "returned": "default",
518 "uniqueness": "none",
519 "canonicalValues": ["direct", "indirect"]
520 }
521 ]
522 }
523 ]
524}"#
525}
526
527pub fn core_group_schema() -> &'static str {
531 r#"{
532 "id": "urn:ietf:params:scim:schemas:core:2.0:Group",
533 "name": "Group",
534 "description": "Group",
535 "attributes": [
536 {
537 "name": "id",
538 "type": "string",
539 "multiValued": false,
540 "description": "Unique identifier for the SCIM resource as defined by the Service Provider.",
541 "required": false,
542 "caseExact": true,
543 "mutability": "readOnly",
544 "returned": "always",
545 "uniqueness": "server"
546 },
547 {
548 "name": "externalId",
549 "type": "string",
550 "multiValued": false,
551 "description": "A String that is an identifier for the resource as defined by the provisioning client.",
552 "required": false,
553 "caseExact": false,
554 "mutability": "readWrite",
555 "returned": "default",
556 "uniqueness": "none"
557 },
558 {
559 "name": "meta",
560 "type": "complex",
561 "multiValued": false,
562 "description": "A complex attribute that contains resource metadata.",
563 "required": false,
564 "caseExact": false,
565 "mutability": "readOnly",
566 "returned": "default",
567 "uniqueness": "none",
568 "subAttributes": [
569 {
570 "name": "resourceType",
571 "type": "string",
572 "multiValued": false,
573 "description": "The name of the resource type of the resource.",
574 "required": false,
575 "caseExact": false,
576 "mutability": "readOnly",
577 "returned": "default",
578 "uniqueness": "none"
579 },
580 {
581 "name": "created",
582 "type": "dateTime",
583 "multiValued": false,
584 "description": "The DateTime the Resource was added to the Service Provider.",
585 "required": false,
586 "caseExact": false,
587 "mutability": "readOnly",
588 "returned": "default",
589 "uniqueness": "none"
590 },
591 {
592 "name": "lastModified",
593 "type": "dateTime",
594 "multiValued": false,
595 "description": "The most recent DateTime that the details of this resource were updated at the Service Provider.",
596 "required": false,
597 "caseExact": false,
598 "mutability": "readOnly",
599 "returned": "default",
600 "uniqueness": "none"
601 },
602 {
603 "name": "location",
604 "type": "string",
605 "multiValued": false,
606 "description": "The URI of the resource being returned.",
607 "required": false,
608 "caseExact": false,
609 "mutability": "readOnly",
610 "returned": "default",
611 "uniqueness": "none"
612 },
613 {
614 "name": "version",
615 "type": "string",
616 "multiValued": false,
617 "description": "The version of the resource being returned.",
618 "required": false,
619 "caseExact": false,
620 "mutability": "readOnly",
621 "returned": "default",
622 "uniqueness": "none"
623 }
624 ]
625 },
626 {
627 "name": "displayName",
628 "type": "string",
629 "multiValued": false,
630 "description": "A human-readable name for the Group. REQUIRED.",
631 "required": false,
632 "caseExact": false,
633 "mutability": "readWrite",
634 "returned": "default",
635 "uniqueness": "none"
636 },
637 {
638 "name": "members",
639 "type": "complex",
640 "multiValued": true,
641 "description": "A list of members of the Group.",
642 "required": false,
643 "caseExact": false,
644 "uniqueness": "none",
645 "subAttributes": [
646 {
647 "name": "value",
648 "type": "string",
649 "multiValued": false,
650 "description": "Identifier of the member of this Group.",
651 "required": false,
652 "caseExact": false,
653 "mutability": "immutable",
654 "returned": "default",
655 "uniqueness": "none"
656 },
657 {
658 "name": "$ref",
659 "type": "reference",
660 "referenceTypes": ["User", "Group"],
661 "multiValued": false,
662 "description": "The URI corresponding to a SCIM resource that is a member of this Group.",
663 "required": false,
664 "caseExact": false,
665 "mutability": "immutable",
666 "returned": "default",
667 "uniqueness": "none"
668 },
669 {
670 "name": "type",
671 "type": "string",
672 "multiValued": false,
673 "description": "A label indicating the type of resource, e.g., 'User' or 'Group'.",
674 "required": false,
675 "caseExact": false,
676 "canonicalValues": ["User", "Group"],
677 "mutability": "immutable",
678 "returned": "default",
679 "uniqueness": "none"
680 },
681 {
682 "name": "display",
683 "type": "string",
684 "multiValued": false,
685 "description": "A human-readable name, primarily used for display purposes. READ-ONLY.",
686 "required": false,
687 "caseExact": false,
688 "mutability": "readOnly",
689 "returned": "default",
690 "uniqueness": "none"
691 }
692 ],
693 "mutability": "readWrite",
694 "returned": "default"
695 }
696 ]
697}"#
698}
699
700pub fn service_provider_config_schema() -> &'static str {
704 r#"{
705 "id": "urn:ietf:params:scim:schemas:core:2.0:ServiceProviderConfig",
706 "name": "ServiceProviderConfig",
707 "description": "Schema for representing the service provider's configuration",
708 "attributes": [
709 {
710 "name": "documentationUri",
711 "type": "reference",
712 "multiValued": false,
713 "required": false,
714 "caseExact": false,
715 "mutability": "readOnly",
716 "returned": "default",
717 "uniqueness": "none"
718 },
719 {
720 "name": "patch",
721 "type": "complex",
722 "multiValued": false,
723 "required": true,
724 "caseExact": false,
725 "mutability": "readOnly",
726 "returned": "default",
727 "uniqueness": "none",
728 "subAttributes": [
729 {
730 "name": "supported",
731 "type": "boolean",
732 "multiValued": false,
733 "required": true,
734 "caseExact": false,
735 "mutability": "readOnly",
736 "returned": "default",
737 "uniqueness": "none"
738 }
739 ]
740 },
741 {
742 "name": "bulk",
743 "type": "complex",
744 "multiValued": false,
745 "required": true,
746 "caseExact": false,
747 "mutability": "readOnly",
748 "returned": "default",
749 "uniqueness": "none",
750 "subAttributes": [
751 {
752 "name": "supported",
753 "type": "boolean",
754 "multiValued": false,
755 "required": true,
756 "caseExact": false,
757 "mutability": "readOnly",
758 "returned": "default",
759 "uniqueness": "none"
760 },
761 {
762 "name": "maxOperations",
763 "type": "integer",
764 "multiValued": false,
765 "required": true,
766 "caseExact": false,
767 "mutability": "readOnly",
768 "returned": "default",
769 "uniqueness": "none"
770 },
771 {
772 "name": "maxPayloadSize",
773 "type": "integer",
774 "multiValued": false,
775 "required": true,
776 "caseExact": false,
777 "mutability": "readOnly",
778 "returned": "default",
779 "uniqueness": "none"
780 }
781 ]
782 },
783 {
784 "name": "filter",
785 "type": "complex",
786 "multiValued": false,
787 "required": true,
788 "caseExact": false,
789 "mutability": "readOnly",
790 "returned": "default",
791 "uniqueness": "none",
792 "subAttributes": [
793 {
794 "name": "supported",
795 "type": "boolean",
796 "multiValued": false,
797 "required": true,
798 "caseExact": false,
799 "mutability": "readOnly",
800 "returned": "default",
801 "uniqueness": "none"
802 },
803 {
804 "name": "maxResults",
805 "type": "integer",
806 "multiValued": false,
807 "required": true,
808 "caseExact": false,
809 "mutability": "readOnly",
810 "returned": "default",
811 "uniqueness": "none"
812 }
813 ]
814 },
815 {
816 "name": "changePassword",
817 "type": "complex",
818 "multiValued": false,
819 "required": true,
820 "caseExact": false,
821 "mutability": "readOnly",
822 "returned": "default",
823 "uniqueness": "none",
824 "subAttributes": [
825 {
826 "name": "supported",
827 "type": "boolean",
828 "multiValued": false,
829 "required": true,
830 "caseExact": false,
831 "mutability": "readOnly",
832 "returned": "default",
833 "uniqueness": "none"
834 }
835 ]
836 },
837 {
838 "name": "sort",
839 "type": "complex",
840 "multiValued": false,
841 "required": true,
842 "caseExact": false,
843 "mutability": "readOnly",
844 "returned": "default",
845 "uniqueness": "none",
846 "subAttributes": [
847 {
848 "name": "supported",
849 "type": "boolean",
850 "multiValued": false,
851 "required": true,
852 "caseExact": false,
853 "mutability": "readOnly",
854 "returned": "default",
855 "uniqueness": "none"
856 }
857 ]
858 },
859 {
860 "name": "etag",
861 "type": "complex",
862 "multiValued": false,
863 "required": true,
864 "caseExact": false,
865 "mutability": "readOnly",
866 "returned": "default",
867 "uniqueness": "none",
868 "subAttributes": [
869 {
870 "name": "supported",
871 "type": "boolean",
872 "multiValued": false,
873 "required": true,
874 "caseExact": false,
875 "mutability": "readOnly",
876 "returned": "default",
877 "uniqueness": "none"
878 }
879 ]
880 },
881 {
882 "name": "authenticationSchemes",
883 "type": "complex",
884 "multiValued": true,
885 "required": true,
886 "caseExact": false,
887 "mutability": "readOnly",
888 "returned": "default",
889 "uniqueness": "none",
890 "subAttributes": [
891 {
892 "name": "name",
893 "type": "string",
894 "multiValued": false,
895 "required": true,
896 "caseExact": false,
897 "mutability": "readOnly",
898 "returned": "default",
899 "uniqueness": "none"
900 },
901 {
902 "name": "description",
903 "type": "string",
904 "multiValued": false,
905 "required": true,
906 "caseExact": false,
907 "mutability": "readOnly",
908 "returned": "default",
909 "uniqueness": "none"
910 },
911 {
912 "name": "specUri",
913 "type": "reference",
914 "multiValued": false,
915 "required": false,
916 "caseExact": false,
917 "mutability": "readOnly",
918 "returned": "default",
919 "uniqueness": "none"
920 },
921 {
922 "name": "documentationUri",
923 "type": "reference",
924 "multiValued": false,
925 "required": false,
926 "caseExact": false,
927 "mutability": "readOnly",
928 "returned": "default",
929 "uniqueness": "none"
930 },
931 {
932 "name": "type",
933 "type": "string",
934 "multiValued": false,
935 "required": true,
936 "caseExact": false,
937 "mutability": "readOnly",
938 "returned": "default",
939 "uniqueness": "none",
940 "canonicalValues": ["oauth", "oauth2", "oauthbearertoken", "httpbasic", "httpdigest"]
941 },
942 {
943 "name": "primary",
944 "type": "boolean",
945 "multiValued": false,
946 "required": false,
947 "caseExact": false,
948 "mutability": "readOnly",
949 "returned": "default",
950 "uniqueness": "none"
951 }
952 ]
953 }
954 ]
955}"#
956}
957
958#[cfg(test)]
959mod tests {
960 use super::*;
961 use serde_json::Value;
962
963 #[test]
964 fn test_core_user_schema_parses() {
965 let schema_json = core_user_schema();
966 let parsed: Result<Value, _> = serde_json::from_str(schema_json);
967 assert!(parsed.is_ok(), "User schema should parse as valid JSON");
968
969 let schema = parsed.unwrap();
970 assert_eq!(schema["id"], "urn:ietf:params:scim:schemas:core:2.0:User");
971 assert_eq!(schema["name"], "User");
972 }
973
974 #[test]
975 fn test_core_group_schema_parses() {
976 let schema_json = core_group_schema();
977 let parsed: Result<Value, _> = serde_json::from_str(schema_json);
978 assert!(parsed.is_ok(), "Group schema should parse as valid JSON");
979
980 let schema = parsed.unwrap();
981 assert_eq!(schema["id"], "urn:ietf:params:scim:schemas:core:2.0:Group");
982 assert_eq!(schema["name"], "Group");
983 }
984
985 #[test]
986 fn test_service_provider_config_schema_parses() {
987 let schema_json = service_provider_config_schema();
988 let parsed: Result<Value, _> = serde_json::from_str(schema_json);
989 assert!(
990 parsed.is_ok(),
991 "ServiceProviderConfig schema should parse as valid JSON"
992 );
993
994 let schema = parsed.unwrap();
995 assert_eq!(
996 schema["id"],
997 "urn:ietf:params:scim:schemas:core:2.0:ServiceProviderConfig"
998 );
999 assert_eq!(schema["name"], "ServiceProviderConfig");
1000 }
1001}