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:13 UTC

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

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";