This is an automated email from the ASF dual-hosted git repository.

ilgrosso pushed a commit to branch 3_0_X
in repository https://gitbox.apache.org/repos/asf/syncope.git


The following commit(s) were added to refs/heads/3_0_X by this push:
     new b67cfff546 [SYNCOPE-1806] Fixing all dynamic memberships refresh: 
Realms, Groups and Roles
b67cfff546 is described below

commit b67cfff546ffdf3233460789e3343410161d77b3
Author: Francesco Chicchiriccò <[email protected]>
AuthorDate: Wed Mar 6 12:10:55 2024 +0100

    [SYNCOPE-1806] Fixing all dynamic memberships refresh: Realms, Groups and 
Roles
---
 .../core/persistence/jpa/dao/JPADynRealmDAO.java   |   9 +-
 .../core/persistence/jpa/dao/JPAGroupDAO.java      |  39 +++----
 .../core/persistence/jpa/dao/JPARoleDAO.java       |  10 +-
 .../core/persistence/jpa/outer/DynRealmTest.java   |  71 ++++++++++++
 .../apache/syncope/fit/core/DynRealmITCase.java    | 121 ++++++++++-----------
 .../org/apache/syncope/fit/core/GroupITCase.java   |  25 +++--
 .../org/apache/syncope/fit/core/RoleITCase.java    |  41 ++++---
 7 files changed, 198 insertions(+), 118 deletions(-)

diff --git 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPADynRealmDAO.java
 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPADynRealmDAO.java
index 45af5ff936..55860cd5eb 100644
--- 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPADynRealmDAO.java
+++ 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPADynRealmDAO.java
@@ -172,10 +172,11 @@ public class JPADynRealmDAO extends AbstractDAO<DynRealm> 
implements DynRealmDAO
             boolean matches = anyMatchDAO.matches(
                     any, SearchCondConverter.convert(searchCondVisitor, 
memb.getFIQLCond()));
 
-            Query find = entityManager().createNativeQuery(
-                    "SELECT dynRealm_id FROM " + DYNMEMB_TABLE + " WHERE 
any_id=?");
-            find.setParameter(1, any.getKey());
-            boolean existing = !find.getResultList().isEmpty();
+            Query query = entityManager().createNativeQuery(
+                    "SELECT COUNT(dynRealm_id) FROM " + DYNMEMB_TABLE + " 
WHERE any_id=? AND dynRealm_id=?");
+            query.setParameter(1, any.getKey());
+            query.setParameter(2, dynRealm.getKey());
+            boolean existing = ((Number) query.getSingleResult()).longValue() 
> 0;
 
             if (matches && !existing) {
                 Query insert = entityManager().
diff --git 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAGroupDAO.java
 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAGroupDAO.java
index 8e2c6c6ea7..ca834be3e7 100644
--- 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAGroupDAO.java
+++ 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAGroupDAO.java
@@ -315,7 +315,8 @@ public class JPAGroupDAO extends AbstractAnyDAO<Group> 
implements GroupDAO {
                         AnyTypeKind.USER);
 
                 matching.forEach(user -> {
-                    Query insert = entityManager().createNativeQuery("INSERT 
INTO " + UDYNMEMB_TABLE + " VALUES(?, ?)");
+                    Query insert = entityManager().createNativeQuery(
+                            "INSERT INTO " + UDYNMEMB_TABLE + " VALUES(?, ?)");
                     insert.setParameter(1, user.getKey());
                     insert.setParameter(2, merged.getKey());
                     insert.executeUpdate();
@@ -440,7 +441,7 @@ public class JPAGroupDAO extends AbstractAnyDAO<Group> 
implements GroupDAO {
     @SuppressWarnings("unchecked")
     public List<String> findAMembers(final String groupKey) {
         Query query = entityManager().createNativeQuery(
-                "SELECT anyObject_id FROM " + JPAAMembership.TABLE + " WHERE 
group_id=?");
+                "SELECT DISTINCT anyObject_id FROM " + JPAAMembership.TABLE + 
" WHERE group_id=?");
         query.setParameter(1, groupKey);
 
         List<String> result = new ArrayList<>();
@@ -456,7 +457,7 @@ public class JPAGroupDAO extends AbstractAnyDAO<Group> 
implements GroupDAO {
     @SuppressWarnings("unchecked")
     public List<String> findUMembers(final String groupKey) {
         Query query = entityManager().createNativeQuery(
-                "SELECT user_id FROM " + JPAUMembership.TABLE + " WHERE 
group_id=?");
+                "SELECT DISTINCT user_id FROM " + JPAUMembership.TABLE + " 
WHERE group_id=?");
         query.setParameter(1, groupKey);
 
         List<String> result = new ArrayList<>();
@@ -474,7 +475,7 @@ public class JPAGroupDAO extends AbstractAnyDAO<Group> 
implements GroupDAO {
 
         group.getADynMemberships().forEach(memb -> {
             Query query = entityManager().createNativeQuery(
-                    "SELECT any_id FROM " + ADYNMEMB_TABLE + " WHERE 
group_id=? AND anyType_id=?");
+                    "SELECT DISTINCT any_id FROM " + ADYNMEMB_TABLE + " WHERE 
group_id=? AND anyType_id=?");
             query.setParameter(1, group.getKey());
             query.setParameter(2, memb.getAnyType().getKey());
 
@@ -491,7 +492,7 @@ public class JPAGroupDAO extends AbstractAnyDAO<Group> 
implements GroupDAO {
     @Override
     public int countAMembers(final String groupKey) {
         Query query = entityManager().createNativeQuery(
-                "SELECT COUNT(anyObject_id) FROM " + JPAAMembership.TABLE + " 
WHERE group_id=?");
+                "SELECT COUNT(DISTINCT anyObject_id) FROM " + 
JPAAMembership.TABLE + " WHERE group_id=?");
         query.setParameter(1, groupKey);
 
         return ((Number) query.getSingleResult()).intValue();
@@ -500,7 +501,7 @@ public class JPAGroupDAO extends AbstractAnyDAO<Group> 
implements GroupDAO {
     @Override
     public int countUMembers(final String groupKey) {
         Query query = entityManager().createNativeQuery(
-                "SELECT COUNT(user_id) FROM " + JPAUMembership.TABLE + " WHERE 
group_id=?");
+                "SELECT COUNT(DISTINCT user_id) FROM " + JPAUMembership.TABLE 
+ " WHERE group_id=?");
         query.setParameter(1, groupKey);
 
         return ((Number) query.getSingleResult()).intValue();
@@ -509,7 +510,7 @@ public class JPAGroupDAO extends AbstractAnyDAO<Group> 
implements GroupDAO {
     @Override
     public int countADynMembers(final Group group) {
         Query query = entityManager().createNativeQuery(
-                "SELECT COUNT(any_id) FROM " + ADYNMEMB_TABLE + " WHERE 
group_id=?");
+                "SELECT COUNT(DISTINCT any_id) FROM " + ADYNMEMB_TABLE + " 
WHERE group_id=?");
         query.setParameter(1, group.getKey());
 
         return ((Number) query.getSingleResult()).intValue();
@@ -522,7 +523,7 @@ public class JPAGroupDAO extends AbstractAnyDAO<Group> 
implements GroupDAO {
         }
 
         Query query = entityManager().createNativeQuery(
-                "SELECT COUNT(any_id) FROM " + UDYNMEMB_TABLE + " WHERE 
group_id=?");
+                "SELECT COUNT(DISTINCT any_id) FROM " + UDYNMEMB_TABLE + " 
WHERE group_id=?");
         query.setParameter(1, group.getKey());
 
         return ((Number) query.getSingleResult()).intValue();
@@ -554,11 +555,11 @@ public class JPAGroupDAO extends AbstractAnyDAO<Group> 
implements GroupDAO {
                 after.add(memb.getGroup().getKey());
             }
 
-            Query find = entityManager().createNativeQuery(
-                    "SELECT any_id FROM " + ADYNMEMB_TABLE + " WHERE 
group_id=? AND any_id=?");
-            find.setParameter(1, memb.getGroup().getKey());
-            find.setParameter(2, anyObject.getKey());
-            boolean existing = !find.getResultList().isEmpty();
+            Query query = entityManager().createNativeQuery(
+                    "SELECT COUNT(group_id) FROM " + ADYNMEMB_TABLE + " WHERE 
group_id=? AND any_id=?");
+            query.setParameter(1, memb.getGroup().getKey());
+            query.setParameter(2, anyObject.getKey());
+            boolean existing = ((Number) query.getSingleResult()).longValue() 
> 0;
             if (existing) {
                 before.add(memb.getGroup().getKey());
             }
@@ -612,7 +613,7 @@ public class JPAGroupDAO extends AbstractAnyDAO<Group> 
implements GroupDAO {
         }
 
         Query query = entityManager().createNativeQuery(
-                "SELECT any_id FROM " + UDYNMEMB_TABLE + " WHERE group_id=?");
+                "SELECT DISTINCT any_id FROM " + UDYNMEMB_TABLE + " WHERE 
group_id=?");
         query.setParameter(1, group.getKey());
 
         List<String> result = new ArrayList<>();
@@ -649,11 +650,11 @@ public class JPAGroupDAO extends AbstractAnyDAO<Group> 
implements GroupDAO {
                 after.add(memb.getGroup().getKey());
             }
 
-            Query find = entityManager().createNativeQuery(
-                    "SELECT any_id FROM " + UDYNMEMB_TABLE + " WHERE 
group_id=? AND any_id=?");
-            find.setParameter(1, memb.getGroup().getKey());
-            find.setParameter(2, user.getKey());
-            boolean existing = !find.getResultList().isEmpty();
+            Query query = entityManager().createNativeQuery(
+                    "SELECT COUNT(group_id) FROM " + UDYNMEMB_TABLE + " WHERE 
group_id=? AND any_id=?");
+            query.setParameter(1, memb.getGroup().getKey());
+            query.setParameter(2, user.getKey());
+            boolean existing = ((Number) query.getSingleResult()).longValue() 
> 0;
             if (existing) {
                 before.add(memb.getGroup().getKey());
             }
diff --git 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPARoleDAO.java
 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPARoleDAO.java
index db34a8ab26..d6b49fbcc8 100644
--- 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPARoleDAO.java
+++ 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPARoleDAO.java
@@ -172,7 +172,8 @@ public class JPARoleDAO extends AbstractDAO<Role> 
implements RoleDAO {
             return List.of();
         }
 
-        Query query = entityManager().createNativeQuery("SELECT any_id FROM " 
+ DYNMEMB_TABLE + " WHERE role_id=?");
+        Query query = entityManager().createNativeQuery(
+                "SELECT DISTINCT any_id FROM " + DYNMEMB_TABLE + " WHERE 
role_id=?");
         query.setParameter(1, role.getKey());
 
         List<String> result = new ArrayList<>();
@@ -202,9 +203,10 @@ public class JPARoleDAO extends AbstractDAO<Role> 
implements RoleDAO {
                     user, SearchCondConverter.convert(searchCondVisitor, 
role.getDynMembership().getFIQLCond()));
 
             Query find = entityManager().createNativeQuery(
-                    "SELECT any_id FROM " + DYNMEMB_TABLE + " WHERE 
role_id=?");
-            find.setParameter(1, role.getKey());
-            boolean existing = !find.getResultList().isEmpty();
+                    "SELECT COUNT(role_id) FROM " + DYNMEMB_TABLE + " WHERE 
any_id=? AND role_id=?");
+            find.setParameter(1, user.getKey());
+            find.setParameter(2, role.getKey());
+            boolean existing = ((Number) find.getSingleResult()).longValue() > 
0;
 
             if (matches && !existing) {
                 Query insert = entityManager().createNativeQuery(
diff --git 
a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/DynRealmTest.java
 
b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/DynRealmTest.java
index 63e7b17efe..dbb2993ad3 100644
--- 
a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/DynRealmTest.java
+++ 
b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/DynRealmTest.java
@@ -18,6 +18,7 @@
  */
 package org.apache.syncope.core.persistence.jpa.outer;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertTrue;
@@ -25,10 +26,12 @@ import static org.junit.jupiter.api.Assertions.fail;
 
 import java.util.List;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
+import 
org.apache.syncope.core.persistence.api.attrvalue.validation.PlainAttrValidationManager;
 import org.apache.syncope.core.persistence.api.dao.AnyMatchDAO;
 import org.apache.syncope.core.persistence.api.dao.AnySearchDAO;
 import org.apache.syncope.core.persistence.api.dao.AnyTypeDAO;
 import org.apache.syncope.core.persistence.api.dao.DynRealmDAO;
+import org.apache.syncope.core.persistence.api.dao.PlainSchemaDAO;
 import org.apache.syncope.core.persistence.api.dao.UserDAO;
 import org.apache.syncope.core.persistence.api.dao.search.DynRealmCond;
 import org.apache.syncope.core.persistence.api.dao.search.SearchCond;
@@ -58,6 +61,12 @@ public class DynRealmTest extends AbstractTest {
     @Autowired
     private UserDAO userDAO;
 
+    @Autowired
+    private PlainSchemaDAO plainSchemaDAO;
+
+    @Autowired
+    private PlainAttrValidationManager plainAttrValidationManager;
+
     @Test
     public void misc() {
         DynRealm dynRealm = entityFactory.newEntity(DynRealm.class);
@@ -96,4 +105,66 @@ public class DynRealmTest extends AbstractTest {
 
         
assertTrue(userDAO.findDynRealms(user.getKey()).contains(actual.getKey()));
     }
+
+    @Test
+    public void issueSYNCOPE1806() {
+        // 1. create two dyn realms with same condition
+        DynRealm realm1 = entityFactory.newEntity(DynRealm.class);
+        realm1.setKey("realm1");
+
+        DynRealmMembership memb1 = 
entityFactory.newEntity(DynRealmMembership.class);
+        memb1.setDynRealm(realm1);
+        memb1.setAnyType(anyTypeDAO.findUser());
+        memb1.setFIQLCond("cool==true");
+
+        realm1.add(memb1);
+        memb1.setDynRealm(realm1);
+
+        realm1 = dynRealmDAO.saveAndRefreshDynMemberships(realm1);
+
+        DynRealm realm2 = entityFactory.newEntity(DynRealm.class);
+        realm2.setKey("realm2");
+
+        DynRealmMembership memb2 = 
entityFactory.newEntity(DynRealmMembership.class);
+        memb2.setDynRealm(realm2);
+        memb2.setAnyType(anyTypeDAO.findUser());
+        memb2.setFIQLCond("cool==true");
+
+        realm2.add(memb2);
+        memb2.setDynRealm(realm2);
+
+        realm2 = dynRealmDAO.saveAndRefreshDynMemberships(realm2);
+
+        entityManager().flush();
+
+        // 2. verify that dynamic members are the same
+        DynRealmCond dynRealmCond1 = new DynRealmCond();
+        dynRealmCond1.setDynRealm(realm1.getKey());
+        List<User> matching1 = 
searchDAO.search(SearchCond.getLeaf(dynRealmCond1), AnyTypeKind.USER);
+
+        DynRealmCond dynRealmCond2 = new DynRealmCond();
+        dynRealmCond2.setDynRealm(realm2.getKey());
+        List<User> matching2 = 
searchDAO.search(SearchCond.getLeaf(dynRealmCond2), AnyTypeKind.USER);
+
+        assertEquals(matching1, matching2);
+        assertEquals(1, matching1.size());
+        assertTrue(matching1.stream().anyMatch(u -> 
"c9b2dec2-00a7-4855-97c0-d854842b4b24".equals(u.getKey())));
+
+        // 3. update an user to let them become part of both dyn realms        
+        anyUtilsFactory.getInstance(AnyTypeKind.USER).addAttr(
+                plainAttrValidationManager,
+                "823074dc-d280-436d-a7dd-07399fae48ec",
+                plainSchemaDAO.find("cool"),
+                "true");
+
+        entityManager().flush();
+
+        // 4. verify that dynamic members are still the same
+        matching1 = searchDAO.search(SearchCond.getLeaf(dynRealmCond1), 
AnyTypeKind.USER);
+        matching2 = searchDAO.search(SearchCond.getLeaf(dynRealmCond2), 
AnyTypeKind.USER);
+        assertEquals(matching1, matching2);
+        assertEquals(2, matching1.size());
+        assertTrue(matching1.stream().anyMatch(u -> 
"c9b2dec2-00a7-4855-97c0-d854842b4b24".equals(u.getKey())));
+        assertTrue(matching1.stream().anyMatch(u -> 
"823074dc-d280-436d-a7dd-07399fae48ec".equals(u.getKey())));
+    }
 }
diff --git 
a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/DynRealmITCase.java
 
b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/DynRealmITCase.java
index 75f1e0d67f..f31ca23ad1 100644
--- 
a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/DynRealmITCase.java
+++ 
b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/DynRealmITCase.java
@@ -31,8 +31,8 @@ import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 import org.apache.commons.io.IOUtils;
 import org.apache.syncope.client.lib.SyncopeClient;
+import org.apache.syncope.common.lib.Attr;
 import org.apache.syncope.common.lib.SyncopeClientException;
-import org.apache.syncope.common.lib.SyncopeConstants;
 import org.apache.syncope.common.lib.request.AttrPatch;
 import org.apache.syncope.common.lib.request.GroupCR;
 import org.apache.syncope.common.lib.request.GroupUR;
@@ -244,74 +244,63 @@ public class DynRealmITCase extends AbstractITCase {
     }
 
     @Test
-    public void issueSYNCOPE1480() throws Exception {
-        String ctype = getUUIDString();
-
-        DynRealmTO dynRealm = null;
+    public void issueSYNCOPE1806() {
+        DynRealmTO realm1 = null;
+        DynRealmTO realm2 = null;
         try {
-            // 1. create new dyn realm matching a very specific attribute value
-            dynRealm = new DynRealmTO();
-            dynRealm.setKey("name" + getUUIDString());
-            dynRealm.getDynMembershipConds().put(AnyTypeKind.USER.name(), 
"ctype==" + ctype);
-            DYN_REALM_SERVICE.create(dynRealm);
-
-            Response response = DYN_REALM_SERVICE.create(dynRealm);
-            dynRealm = getObject(response.getLocation(), 
DynRealmService.class, DynRealmTO.class);
-            assertNotNull(dynRealm);
-
-            // 2. no dyn realm members
-            PagedResult<UserTO> matching = USER_SERVICE.search(new 
AnyQuery.Builder().realm("/").fiql(
-                    
SyncopeClient.getUserSearchConditionBuilder().inDynRealms(dynRealm.getKey()).query()).build());
-            assertEquals(0, matching.getSize());
-
-            // 3. create user with that attribute value
-            UserCR userCR = 
UserITCase.getUniqueSample("[email protected]");
-            userCR.getPlainAttr("ctype").get().getValues().set(0, ctype);
-            UserTO user = createUser(userCR).getEntity();
-            assertNotNull(user.getKey());
-
-            // 4a. check that Elasticsearch index was updated correctly
-            if (IS_EXT_SEARCH_ENABLED) {
-                try {
-                    Thread.sleep(2000);
-                } catch (InterruptedException ex) {
-                    // ignore
-                }
-
-                ArrayNode dynRealms = 
fetchDynRealmsFromElasticsearch(user.getKey());
-                assertEquals(1, dynRealms.size());
-                assertEquals(dynRealm.getKey(), dynRealms.get(0).asText());
-            }
-
-            // 4b. now there is 1 realm member
-            matching = USER_SERVICE.search(new 
AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM).fiql(
-                    
SyncopeClient.getUserSearchConditionBuilder().inDynRealms(dynRealm.getKey()).query()).build());
-            assertEquals(1, matching.getSize());
-
-            // 5. change dyn realm condition
-            dynRealm.getDynMembershipConds().put(AnyTypeKind.USER.name(), 
"ctype==ANY");
-            DYN_REALM_SERVICE.update(dynRealm);
-
-            // 6a. check that Elasticsearch index was updated correctly
-            if (IS_EXT_SEARCH_ENABLED) {
-                try {
-                    Thread.sleep(2000);
-                } catch (InterruptedException ex) {
-                    // ignore
-                }
-
-                ArrayNode dynRealms = 
fetchDynRealmsFromElasticsearch(user.getKey());
-                assertTrue(dynRealms.isEmpty());
-            }
-
-            // 6b. no more dyn realm members
-            matching = USER_SERVICE.search(new 
AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM).fiql(
-                    
SyncopeClient.getUserSearchConditionBuilder().inDynRealms(dynRealm.getKey()).query()).build());
-            assertEquals(0, matching.getSize());
+            // 1. create two dyn realms with same condition
+            realm1 = new DynRealmTO();
+            realm1.setKey("realm1");
+            realm1.getDynMembershipConds().put(AnyTypeKind.USER.name(), 
"cool==true");
+            realm1 = getObject(DYN_REALM_SERVICE.create(realm1).getLocation(), 
DynRealmService.class, DynRealmTO.class);
+            assertNotNull(realm1);
+
+            realm2 = new DynRealmTO();
+            realm2.setKey("realm2");
+            realm2.getDynMembershipConds().put(AnyTypeKind.USER.name(), 
"cool==true");
+            realm2 = getObject(DYN_REALM_SERVICE.create(realm2).getLocation(), 
DynRealmService.class, DynRealmTO.class);
+            assertNotNull(realm2);
+
+            // 2. verify that dynamic members are the same
+            PagedResult<UserTO> matching1 = USER_SERVICE.search(new 
AnyQuery.Builder().realm("/").fiql(
+                    
SyncopeClient.getUserSearchConditionBuilder().inDynRealms(realm1.getKey()).query()).build());
+            PagedResult<UserTO> matching2 = USER_SERVICE.search(new 
AnyQuery.Builder().realm("/").fiql(
+                    
SyncopeClient.getUserSearchConditionBuilder().inDynRealms(realm2.getKey()).query()).build());
+
+            assertEquals(matching1, matching2);
+            assertEquals(1, matching1.getResult().size());
+            assertTrue(matching1.getResult().stream().
+                    anyMatch(u -> 
"c9b2dec2-00a7-4855-97c0-d854842b4b24".equals(u.getKey())));
+
+            // 3. update an user to let them become part of both dyn realms
+            UserUR userUR = new UserUR();
+            userUR.setKey("823074dc-d280-436d-a7dd-07399fae48ec");
+            userUR.getPlainAttrs().add(new AttrPatch.Builder(new 
Attr.Builder("cool").value("true").build()).build());
+            updateUser(userUR);
+
+            // 4. verify that dynamic members are still the same
+            matching1 = USER_SERVICE.search(new 
AnyQuery.Builder().realm("/").fiql(
+                    
SyncopeClient.getUserSearchConditionBuilder().inDynRealms(realm1.getKey()).query()).build());
+            matching2 = USER_SERVICE.search(new 
AnyQuery.Builder().realm("/").fiql(
+                    
SyncopeClient.getUserSearchConditionBuilder().inDynRealms(realm2.getKey()).query()).build());
+            assertEquals(matching1, matching2);
+            assertEquals(2, matching1.getResult().size());
+            assertTrue(matching1.getResult().stream().
+                    anyMatch(u -> 
"c9b2dec2-00a7-4855-97c0-d854842b4b24".equals(u.getKey())));
+            assertTrue(matching1.getResult().stream().
+                    anyMatch(u -> 
"823074dc-d280-436d-a7dd-07399fae48ec".equals(u.getKey())));
         } finally {
-            if (dynRealm != null) {
-                DYN_REALM_SERVICE.delete(dynRealm.getKey());
+            if (realm1 != null) {
+                DYN_REALM_SERVICE.delete(realm1.getKey());
             }
+            if (realm2 != null) {
+                DYN_REALM_SERVICE.delete(realm2.getKey());
+            }
+            UserUR userUR = new UserUR();
+            userUR.setKey("823074dc-d280-436d-a7dd-07399fae48ec");
+            userUR.getPlainAttrs().add(new AttrPatch.Builder(new 
Attr.Builder("cool").build()).
+                    operation(PatchOperation.DELETE).build());
+            updateUser(userUR);
         }
     }
 }
diff --git 
a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/GroupITCase.java 
b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/GroupITCase.java
index ebc53e1475..fbb958c4d9 100644
--- 
a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/GroupITCase.java
+++ 
b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/GroupITCase.java
@@ -679,17 +679,26 @@ public class GroupITCase extends AbstractITCase {
 
         GroupCR groupCR = getBasicSample("uDynMembership");
         groupCR.setUDynMembershipCond("cool==true");
-        GroupTO group = createGroup(groupCR).getEntity();
-        assertNotNull(group);
+        GroupTO group = null;
+        try {
+            group = createGroup(groupCR).getEntity();
+            assertNotNull(group);
+            String groupKey = group.getKey();
 
-        List<MembershipTO> memberships = 
USER_SERVICE.read("c9b2dec2-00a7-4855-97c0-d854842b4b24").getDynMemberships();
-        assertTrue(memberships.stream().anyMatch(m -> 
m.getGroupKey().equals(group.getKey())));
-        assertEquals(1, 
GROUP_SERVICE.read(group.getKey()).getDynamicUserMembershipCount());
+            List<MembershipTO> memberships =
+                    
USER_SERVICE.read("c9b2dec2-00a7-4855-97c0-d854842b4b24").getDynMemberships();
+            assertTrue(memberships.stream().anyMatch(m -> 
m.getGroupKey().equals(groupKey)));
+            assertEquals(1, 
GROUP_SERVICE.read(group.getKey()).getDynamicUserMembershipCount());
 
-        GROUP_SERVICE.update(new 
GroupUR.Builder(group.getKey()).udynMembershipCond("cool==false").build());
+            GROUP_SERVICE.update(new 
GroupUR.Builder(group.getKey()).udynMembershipCond("cool==false").build());
 
-        
assertTrue(USER_SERVICE.read("c9b2dec2-00a7-4855-97c0-d854842b4b24").getDynMemberships().isEmpty());
-        assertEquals(0, 
GROUP_SERVICE.read(group.getKey()).getDynamicUserMembershipCount());
+            
assertTrue(USER_SERVICE.read("c9b2dec2-00a7-4855-97c0-d854842b4b24").getDynMemberships().isEmpty());
+            assertEquals(0, 
GROUP_SERVICE.read(group.getKey()).getDynamicUserMembershipCount());
+        } finally {
+            if (group != null) {
+                GROUP_SERVICE.delete(group.getKey());
+            }
+        }
     }
 
     @Test
diff --git 
a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/RoleITCase.java 
b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/RoleITCase.java
index bfa30eb202..15b403087a 100644
--- 
a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/RoleITCase.java
+++ 
b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/RoleITCase.java
@@ -138,23 +138,30 @@ public class RoleITCase extends AbstractITCase {
         assertTrue(bellini.getDynRoles().isEmpty());
         assertTrue(bellini.getPrivileges().isEmpty());
 
-        RoleTO role = getSampleRoleTO("dynMembership");
-        role.getPrivileges().add("getMighty");
-        role.setDynMembershipCond("cool==true");
-        Response response = ROLE_SERVICE.create(role);
-        role = getObject(response.getLocation(), RoleService.class, 
RoleTO.class);
-        assertNotNull(role);
-
-        bellini = USER_SERVICE.read("bellini");
-        assertTrue(bellini.getDynRoles().contains(role.getKey()));
-        assertTrue(bellini.getPrivileges().contains("getMighty"));
-
-        role.setDynMembershipCond("cool==false");
-        ROLE_SERVICE.update(role);
-
-        bellini = USER_SERVICE.read("bellini");
-        assertTrue(bellini.getDynMemberships().isEmpty());
-        assertTrue(bellini.getPrivileges().isEmpty());
+        RoleTO role = null;
+        try {
+            role = getSampleRoleTO("dynMembership");
+            role.getPrivileges().add("getMighty");
+            role.setDynMembershipCond("cool==true");
+            Response response = ROLE_SERVICE.create(role);
+            role = getObject(response.getLocation(), RoleService.class, 
RoleTO.class);
+            assertNotNull(role);
+
+            bellini = USER_SERVICE.read("bellini");
+            assertTrue(bellini.getDynRoles().contains(role.getKey()));
+            assertTrue(bellini.getPrivileges().contains("getMighty"));
+
+            role.setDynMembershipCond("cool==false");
+            ROLE_SERVICE.update(role);
+
+            bellini = USER_SERVICE.read("bellini");
+            assertTrue(bellini.getDynMemberships().isEmpty());
+            assertTrue(bellini.getPrivileges().isEmpty());
+        } finally {
+            if (role != null) {
+                ROLE_SERVICE.delete(role.getKey());
+            }
+        }
     }
 
     @Test

Reply via email to