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/12/16 06:24:58 UTC

(directory-scimple) 01/03: Handle Azure style Group member remove operations

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

bdemers pushed a commit to branch handle-azure-group-member-removes
in repository https://gitbox.apache.org/repos/asf/directory-scimple.git

commit 2219b69a7ead4be83947a4b4e19f2bc5de9c256b
Author: Kyle Thorpe <kj...@gmail.com>
AuthorDate: Tue Dec 12 14:36:10 2023 +0000

    Handle Azure style Group member remove operations
---
 .../scim/core/repository/PatchHandlerTest.java     | 55 ++++++++++++++++++++++
 1 file changed, 55 insertions(+)

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 9dcafeea..a145b8cc 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
@@ -31,7 +31,9 @@ import org.apache.directory.scim.spec.resources.Address;
 import org.apache.directory.scim.spec.resources.Email;
 import org.apache.directory.scim.spec.resources.Name;
 import org.apache.directory.scim.spec.resources.PhoneNumber;
+import org.apache.directory.scim.spec.resources.ScimGroup;
 import org.apache.directory.scim.spec.resources.ScimUser;
+import org.apache.directory.scim.spec.schema.ResourceReference;
 import org.junit.jupiter.api.Test;
 
 import static org.apache.directory.scim.spec.patch.PatchOperation.Type.*;
@@ -465,6 +467,39 @@ public class PatchHandlerTest {
     ));
   }
 
+  @Test
+  public void addItemToCollection() throws FilterParseException {
+    PatchOperation op = new PatchOperation();
+    op.setOperation(ADD);
+    op.setPath(PatchOperationPath.fromString("members"));
+    op.setValue(List.of(
+      Map.of(
+        "value", "9876",
+        "display", "testUser2",
+        "type", "User")
+    ));
+
+    ScimGroup updatedGroup = patchHandler.apply(group(), List.of(op));
+    assertThat(updatedGroup.getMembers().size()).isEqualTo(3);
+  }
+
+  /**
+   * This test covers Azure-style remove member operations, where a value is
+   * specified in the operation body, rather than in the path.
+   * For example: { "op": "remove", "path": "members", "value": [ { "value": "1234" } ] }
+   */
+  @Test
+  public void removeItemFromCollection() throws FilterParseException {
+    PatchOperation op = new PatchOperation();
+    op.setOperation(REMOVE);
+    op.setPath(PatchOperationPath.fromString("members"));
+    op.setValue(List.of(Map.of("value", "1234")));
+
+    ScimGroup updatedGroup = patchHandler.apply(group(), List.of(op));
+    assertThat(updatedGroup.getMembers()).isNotNull();
+    assertThat(updatedGroup.getMembers().size()).isEqualTo(1);
+  }
+
   @Test
   public void addAttribute() throws FilterParseException {
     PatchOperation op = new PatchOperation();
@@ -629,4 +664,24 @@ public class PatchHandlerTest {
       throw new IllegalStateException("Invalid phone number", e);
     }
   }
+
+  private static ScimGroup group() {
+    ResourceReference member1 = userRef("1234");
+    ResourceReference member2 = userRef("5678");
+
+    return new ScimGroup()
+      .setDisplayName("Test Group")
+      .setExternalId("test-group-external-id")
+      .setMembers(List.of(member1, member2));
+  }
+
+  private static ResourceReference userRef(String id) {
+    ResourceReference member = new ResourceReference();
+    member.setType(ResourceReference.ReferenceType.USER);
+    member.setValue(id);
+    member.setRef("https://example.com/Users/" + id);
+    member.setDisplay("Test User" + id);
+
+    return member;
+  }
 }