You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by bd...@apache.org on 2023/01/24 23:55:12 UTC

[directory-scimple] branch more-patch-tests created (now d14e338f)

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

bdemers pushed a change to branch more-patch-tests
in repository https://gitbox.apache.org/repos/asf/directory-scimple.git


      at d14e338f Add test cases for patch replace/remove with filter

This branch includes the following new commits:

     new d14e338f Add test cases for patch replace/remove with filter

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[directory-scimple] 01/01: Add test cases for patch replace/remove with filter

Posted by bd...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

bdemers pushed a commit to branch more-patch-tests
in repository https://gitbox.apache.org/repos/asf/directory-scimple.git

commit d14e338f5f117191aba3d81cefa0f05878594fd6
Author: Brian Demers <bd...@apache.org>
AuthorDate: Tue Jan 24 18:55:05 2023 -0500

    Add test cases for patch replace/remove with filter
---
 .../scim/core/repository/PatchHandlerImpl.java     |  49 +++++++--
 .../scim/core/repository/PatchHandlerTest.java     | 116 +++++++++++++++++++++
 2 files changed, 155 insertions(+), 10 deletions(-)

diff --git a/scim-core/src/main/java/org/apache/directory/scim/core/repository/PatchHandlerImpl.java b/scim-core/src/main/java/org/apache/directory/scim/core/repository/PatchHandlerImpl.java
index eb1a4089..f52c8b88 100644
--- a/scim-core/src/main/java/org/apache/directory/scim/core/repository/PatchHandlerImpl.java
+++ b/scim-core/src/main/java/org/apache/directory/scim/core/repository/PatchHandlerImpl.java
@@ -44,6 +44,7 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
+import java.util.function.Predicate;
 import java.util.stream.Collectors;
 
 @SuppressWarnings("unchecked")
@@ -206,17 +207,45 @@ public class PatchHandlerImpl implements PatchHandler {
     }
     // apply expression filter
     Collection<Object> items = (Collection<Object>) attributeObject;
-    return items.stream().map(item -> {
-      Map<String, Object> resourceAsMap = objectAsMap(item);
-      if (FilterExpressions.inMemory(valuePathExpression.getAttributeExpression(), baseSchema).test(item)) {
-        String subAttributeName = valuePathExpression.getAttributePath().getSubAttributeName();
-        resourceAsMap.put(subAttributeName, patchOperation.getValue());
-        return resourceAsMap;
-      } else {
-        // filter does not apply
-        return item;
+    String subAttributeName = valuePathExpression.getAttributePath().getSubAttributeName();
+    Predicate<Object> filterPredicate = FilterExpressions.inMemory(valuePathExpression.getAttributeExpression(), baseSchema);
+
+    switch (patchOperation.getOperation()) {
+      case ADD:
+      case REPLACE:
+        return items.stream().map(item -> {
+            if (filterPredicate.test(item)) {
+              if (subAttributeName != null) {
+                Map<String, Object> resourceAsMap = objectAsMap(item);
+                resourceAsMap.put(subAttributeName, patchOperation.getValue());
+                return resourceAsMap;
+              } else {
+                return patchOperation.getValue();
+              }
+            } else {
+              return item;
+            }
+          })
+          .collect(Collectors.toList());
+      case REMOVE:
+        // if sub-attribute is null remove the item from the list
+        if (subAttributeName != null) {
+          return items.stream().map(item -> {
+            Map<String, Object> resourceAsMap = objectAsMap(item);
+            if (filterPredicate.test(item)) {
+              resourceAsMap.remove(subAttributeName);
+            }
+            return resourceAsMap;
+          })
+          .collect(Collectors.toList());
+        } else {
+          return items.stream()
+            // filter out any items that match
+            .filter(item -> !filterPredicate.test(item))
+            .collect(Collectors.toList());
+        }
       }
-    }).collect(Collectors.toList());
+      return items;
   }
   private PatchOperationPath tryGetOperationPath(String key) {
     try {
diff --git a/scim-core/src/test/java/org/apache/directory/scim/core/repository/PatchHandlerTest.java b/scim-core/src/test/java/org/apache/directory/scim/core/repository/PatchHandlerTest.java
index 705716fa..824a39aa 100644
--- a/scim-core/src/test/java/org/apache/directory/scim/core/repository/PatchHandlerTest.java
+++ b/scim-core/src/test/java/org/apache/directory/scim/core/repository/PatchHandlerTest.java
@@ -26,6 +26,7 @@ import org.apache.directory.scim.spec.patch.PatchOperation;
 import org.apache.directory.scim.spec.patch.PatchOperation.Type;
 import org.apache.directory.scim.spec.patch.PatchOperationPath;
 import org.apache.directory.scim.spec.phonenumber.PhoneNumberParseException;
+import org.apache.directory.scim.spec.resources.Address;
 import org.apache.directory.scim.spec.resources.Name;
 import org.apache.directory.scim.spec.resources.PhoneNumber;
 import org.apache.directory.scim.spec.resources.ScimUser;
@@ -122,6 +123,121 @@ public class PatchHandlerTest {
     assertThat(updatedUser.getAddresses().get(0).getPostalCode()).isEqualTo(postalCode);
   }
 
+  @Test
+  public void applyRemoveItemWithFilter() {
+    this.user.setAddresses(List.of(
+      new Address()
+        .setType("work")
+        .setStreetAddress("101 Main Street")
+        .setRegion("Springfield")
+        .setPostalCode("01234"),
+      new Address()
+        .setType("home")
+        .setStreetAddress("202 Maple Street")
+        .setRegion("Otherton")
+        .setPostalCode("43210")
+    ));
+
+    PatchOperation op = patchOperation(Type.REMOVE, "addresses[type eq \"work\"]", null);
+    ScimUser updatedUser = patchHandler.apply(this.user, List.of(op));
+    assertThat(updatedUser.getAddresses().size()).isEqualTo(1);
+    assertThat(updatedUser.getAddresses().get(0).getType()).isEqualTo("home");
+    assertThat(updatedUser.getAddresses().get(0).getPostalCode()).isEqualTo("43210");
+  }
+
+  @Test
+  public void applyRemoveAttributeWithFilter() {
+    Address workAddress = new Address()
+      .setType("work")
+      .setStreetAddress("101 Main Street")
+      .setRegion("Springfield")
+      .setPostalCode("01234");
+
+    Address homeAddress = new Address()
+      .setType("home")
+      .setStreetAddress("202 Maple Street")
+      .setRegion("Otherton")
+      .setPostalCode("43210");
+
+    Address updatedWorkAddress = new Address()
+      .setType("work")
+      .setStreetAddress("101 Main Street")
+      .setRegion("Springfield");
+
+    this.user.setAddresses(List.of(workAddress, homeAddress));
+
+    PatchOperation op = patchOperation(Type.REMOVE, "addresses[type eq \"work\"].postalCode", null);
+    ScimUser updatedUser = patchHandler.apply(this.user, List.of(op));
+    assertThat(updatedUser.getAddresses().size()).isEqualTo(2);
+    assertThat(updatedUser.getAddresses().get(0)).isEqualTo(updatedWorkAddress);
+  }
+
+  @Test
+  public void applyReplaceItemWithFilter() {
+    Address workAddress = new Address()
+      .setType("work")
+      .setStreetAddress("101 Main Street")
+      .setRegion("Springfield")
+      .setPostalCode("01234");
+
+    Address homeAddress = new Address()
+      .setType("home")
+      .setStreetAddress("202 Maple Street")
+      .setRegion("Othertown")
+      .setPostalCode("43210");
+
+    Address otherAddress = new Address()
+      .setType("other")
+      .setStreetAddress("303 Loop Road")
+      .setRegion("Thirdtown")
+      .setPostalCode("11223")
+      .setPrimary(true);
+
+    Map<String, Object> newAddress = Map.of(
+      "type", otherAddress.getType(),
+      "streetAddress", otherAddress.getStreetAddress(),
+      "region", otherAddress.getRegion(),
+      "postalCode", otherAddress.getPostalCode(),
+      "primary", otherAddress.getPrimary()
+    );
+
+    this.user.setAddresses(List.of(workAddress, homeAddress));
+    PatchOperation op = patchOperation(Type.REPLACE, "addresses[type eq \"work\"]", newAddress);
+    ScimUser updatedUser = patchHandler.apply(this.user, List.of(op));
+    assertThat(updatedUser.getAddresses().size()).isEqualTo(2);
+    assertThat(updatedUser.getAddresses().get(0)).isEqualTo(otherAddress);
+    assertThat(updatedUser.getAddresses().get(1)).isEqualTo(homeAddress);
+  }
+
+  @Test
+  public void applyReplaceItemAttributeWithFilter() {
+    Address workAddress = new Address()
+      .setType("work")
+      .setStreetAddress("101 Main Street")
+      .setRegion("Springfield")
+      .setPostalCode("01234");
+
+    Address homeAddress = new Address()
+      .setType("home")
+      .setStreetAddress("202 Maple Street")
+      .setRegion("Othertown")
+      .setPostalCode("43210");
+
+    Address updatedHome = new Address()
+      .setType("home")
+      .setStreetAddress("202 Maple Street")
+      .setRegion("Othertown")
+      .setPostalCode("43210")
+      .setPrimary(true);
+
+    this.user.setAddresses(List.of(workAddress, homeAddress));
+    PatchOperation op = patchOperation(Type.REPLACE, "addresses[type eq \"home\"].primary", true);
+    ScimUser updatedUser = patchHandler.apply(this.user, List.of(op));
+    assertThat(updatedUser.getAddresses().size()).isEqualTo(2);
+    assertThat(updatedUser.getAddresses().get(0)).isEqualTo(workAddress);
+    assertThat(updatedUser.getAddresses().get(1)).isEqualTo(updatedHome);
+  }
+
   @Test
   public void applyReplaceEnterpriseExtension() {
     String employeeNumberUrn = "urn:ietf:params:scim:schemas:extension:enterprise:2.0:User:employeeNumber";