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 1926165c4c [SYNCOPE-1806] Fixing tests
1926165c4c is described below

commit 1926165c4c034daacfe11494c071d683eb6af443
Author: Francesco Chicchiriccò <[email protected]>
AuthorDate: Wed Mar 6 13:33:09 2024 +0100

    [SYNCOPE-1806] Fixing tests
---
 .../apache/syncope/fit/core/DynRealmITCase.java    | 137 +++++++++++++++++----
 1 file changed, 112 insertions(+), 25 deletions(-)

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 f31ca23ad1..71b26b2ca8 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
@@ -25,14 +25,20 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.junit.jupiter.api.Assertions.fail;
 
 import com.fasterxml.jackson.databind.node.ArrayNode;
-import java.nio.charset.StandardCharsets;
+import java.net.URI;
+import java.net.http.HttpClient;
+import java.net.http.HttpRequest;
+import java.net.http.HttpRequest.BodyPublishers;
+import java.net.http.HttpResponse;
+import java.net.http.HttpResponse.BodyHandlers;
 import javax.ws.rs.core.GenericType;
+import javax.ws.rs.core.HttpHeaders;
 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;
@@ -54,16 +60,31 @@ import 
org.apache.syncope.common.rest.api.service.DynRealmService;
 import org.apache.syncope.common.rest.api.service.GroupService;
 import org.apache.syncope.common.rest.api.service.UserService;
 import org.apache.syncope.fit.AbstractITCase;
-import org.eclipse.jetty.client.HttpClient;
-import org.eclipse.jetty.client.api.ContentResponse;
-import org.eclipse.jetty.client.util.InputStreamContentProvider;
-import org.eclipse.jetty.http.HttpHeader;
-import org.eclipse.jetty.http.HttpMethod;
-import org.eclipse.jetty.http.HttpStatus;
 import org.junit.jupiter.api.Test;
 
 public class DynRealmITCase extends AbstractITCase {
 
+    private static ArrayNode fetchDynRealmsFromElasticsearch(final String 
userKey) throws Exception {
+        String body =
+                '{'
+                + "    \"query\": {"
+                + "        \"match\": {\"_id\": \"" + userKey + "\"}"
+                + "    }"
+                + '}';
+
+        HttpClient client = HttpClient.newHttpClient();
+        HttpResponse<String> response = client.send(
+                
HttpRequest.newBuilder(URI.create("http://localhost:9200/master_user/_search";)).
+                        header(HttpHeaders.CONTENT_TYPE, 
MediaType.APPLICATION_JSON).
+                        method("GET", BodyPublishers.ofString(body)).
+                        build(),
+                BodyHandlers.ofString());
+        assertEquals(Response.Status.OK.getStatusCode(), 
response.statusCode());
+
+        return (ArrayNode) JSON_MAPPER.readTree(response.body()).
+                get("hits").get("hits").get(0).get("_source").get("dynRealms");
+    }
+
     @Test
     public void misc() {
         DynRealmTO dynRealm = null;
@@ -222,25 +243,75 @@ public class DynRealmITCase extends AbstractITCase {
         }
     }
 
-    private static ArrayNode fetchDynRealmsFromElasticsearch(final String 
userKey) throws Exception {
-        String body =
-                '{'
-                + "    \"query\": {"
-                + "        \"match\": {\"_id\": \"" + userKey + "\"}"
-                + "    }"
-                + '}';
+    @Test
+    public void issueSYNCOPE1480() throws Exception {
+        String ctype = getUUIDString();
+
+        DynRealmTO dynRealm = 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);
 
-        HttpClient httpClient = new HttpClient();
-        httpClient.start();
-        ContentResponse response = 
httpClient.newRequest("http://localhost:9200/master_user/_search";).
-                method(HttpMethod.GET).
-                header(HttpHeader.CONTENT_TYPE, MediaType.APPLICATION_JSON).
-                content(new 
InputStreamContentProvider(IOUtils.toInputStream(body, 
StandardCharsets.UTF_8))).
-                send();
-        assertEquals(HttpStatus.OK_200, response.getStatus());
+            Response response = DYN_REALM_SERVICE.create(dynRealm);
+            dynRealm = getObject(response.getLocation(), 
DynRealmService.class, DynRealmTO.class);
+            assertNotNull(dynRealm);
 
-        return (ArrayNode) JSON_MAPPER.readTree(response.getContent()).
-                get("hits").get("hits").get(0).get("_source").get("dynRealms");
+            // 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());
+        } finally {
+            if (dynRealm != null) {
+                DYN_REALM_SERVICE.delete(dynRealm.getKey());
+            }
+        }
     }
 
     @Test
@@ -262,6 +333,14 @@ public class DynRealmITCase extends AbstractITCase {
             assertNotNull(realm2);
 
             // 2. verify that dynamic members are the same
+            if (IS_EXT_SEARCH_ENABLED) {
+                try {
+                    Thread.sleep(2000);
+                } catch (InterruptedException ex) {
+                    // ignore
+                }
+            }
+
             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(
@@ -279,6 +358,14 @@ public class DynRealmITCase extends AbstractITCase {
             updateUser(userUR);
 
             // 4. verify that dynamic members are still the same
+            if (IS_EXT_SEARCH_ENABLED) {
+                try {
+                    Thread.sleep(2000);
+                } catch (InterruptedException ex) {
+                    // ignore
+                }
+            }
+
             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(

Reply via email to