@@ -971,6 +971,73 @@ public void searchForGroupsShouldOnlyReturnMatchingElementsOrIntermediatePaths()
971971 }
972972 }
973973
974+ /**
975+ * Provide an option to include subgroup in group search admin API
976+ * @link https://github.com/keycloak/keycloak/issues/9435
977+ */
978+ @ Test
979+ public void searchForGroupsFilterSubGroup () {
980+
981+ /*
982+ * /g1/g1.1-gugu
983+ * /g1/g1.2-test1234
984+ * /g2-test1234
985+ * /g3/g3.1-test1234/g3.1.1
986+ */
987+ String needle = "test1234" ;
988+ GroupRepresentation g1 = GroupBuilder .create ().name ("g1" ).build ();
989+ GroupRepresentation g1_1 = GroupBuilder .create ().name ("g1.1-bubu" ).build ();
990+ GroupRepresentation g1_2 = GroupBuilder .create ().name ("g1.2-" + needle ).build ();
991+ GroupRepresentation g2 = GroupBuilder .create ().name ("g2-" + needle ).build ();
992+ GroupRepresentation g3 = GroupBuilder .create ().name ("g3" ).build ();
993+ GroupRepresentation g3_1 = GroupBuilder .create ().name ("g3.1-" + needle ).build ();
994+ GroupRepresentation g3_1_1 = GroupBuilder .create ().name ("g3.1.1" ).build ();
995+
996+ String realmName = AuthRealm .TEST ;
997+ RealmResource realm = adminClient .realms ().realm (realmName );
998+
999+ createGroup (realm , g1 );
1000+ createGroup (realm , g2 );
1001+ createGroup (realm , g3 );
1002+ addSubGroup (realm , g1 , g1_1 );
1003+ addSubGroup (realm , g1 , g1_2 );
1004+ addSubGroup (realm , g3 , g3_1 );
1005+ addSubGroup (realm , g3_1 , g3_1_1 );
1006+
1007+ try {
1008+ // we search for "test1234" and expect only /g1/g1.2-test1234, /g2-test1234 and /g3/g3.1-test1234 as a result
1009+ List <GroupRepresentation > result = realm .groups ().groups (needle , 0 , 100 , true , true );
1010+
1011+ assertEquals (3 , result .size ());
1012+ assertEquals ("g1" , result .get (0 ).getName ());
1013+ assertEquals (1 , result .get (0 ).getSubGroups ().size ());
1014+ assertEquals ("g1.2-" + needle , result .get (0 ).getSubGroups ().get (0 ).getName ());
1015+ assertEquals ("g2-" + needle , result .get (1 ).getName ());
1016+ assertEquals ("g3" , result .get (2 ).getName ());
1017+ assertEquals (1 , result .get (2 ).getSubGroups ().size ());
1018+ assertEquals ("g3.1-" + needle , result .get (2 ).getSubGroups ().get (0 ).getName ());
1019+
1020+ // we search for "test1234" and expect all groups
1021+ result = realm .groups ().groups (needle , 0 , 100 , true , false );
1022+ assertEquals (3 , result .size ());
1023+ assertEquals (2 , result .get (0 ).getSubGroups ().size ());
1024+ assertEquals (1 , result .get (2 ).getSubGroups ().get (0 ).getSubGroups ().size ());
1025+
1026+ } finally {
1027+ if (g1 .getId () != null ) {
1028+ realm .groups ().group (g1 .getId ()).remove ();
1029+ }
1030+
1031+ if (g2 .getId () != null ) {
1032+ realm .groups ().group (g2 .getId ()).remove ();
1033+ }
1034+
1035+ if (g3 .getId () != null ) {
1036+ realm .groups ().group (g3 .getId ()).remove ();
1037+ }
1038+ }
1039+ }
1040+
9741041 /**
9751042 * Verifies that the role assigned to a user's group is correctly handled by Keycloak Admin endpoint.
9761043 * @link https://issues.jboss.org/browse/KEYCLOAK-2964
0 commit comments