From 80ba5ecaeeb22b52c7f269a068f07f929777f497 Mon Sep 17 00:00:00 2001
From: Sonia Zorba <sonia.zorba@inaf.it>
Date: Mon, 24 May 2021 12:45:20 +0200
Subject: [PATCH] Search endpoint: returned parent group if child doesn't exist
 but user is member of parent

---
 .../controller/JWTWebServiceController.java   |  7 +--
 .../JWTWebServiceControllerTest.java          | 55 +++++++++++++++++++
 2 files changed, 58 insertions(+), 4 deletions(-)

diff --git a/gms/src/main/java/it/inaf/ia2/gms/controller/JWTWebServiceController.java b/gms/src/main/java/it/inaf/ia2/gms/controller/JWTWebServiceController.java
index 09ef965..da3a84c 100644
--- a/gms/src/main/java/it/inaf/ia2/gms/controller/JWTWebServiceController.java
+++ b/gms/src/main/java/it/inaf/ia2/gms/controller/JWTWebServiceController.java
@@ -118,6 +118,7 @@ public class JWTWebServiceController {
         String groupNamesString = getGroupFromRequest(request, "/ws/jwt/search/", "/vo/search/");
 
         List<String> groupNames = groupNameService.extractGroupNames(groupNamesString);
+        List<String> existingGroupNames = new ArrayList<>();
 
         GroupEntity group = null;
 
@@ -127,19 +128,17 @@ public class JWTWebServiceController {
             if (optionalGroup.isPresent()) {
                 GroupEntity groupEntity = optionalGroup.get();
                 parentPath = groupEntity.getPath();
+                existingGroupNames.add(groupName);
                 boolean isMember = membershipManager.isCurrentUserMemberOf(groupEntity.getId());
                 if (isMember) {
                     group = groupEntity;
                 }
-            } else {
-                group = null;
-                break;
             }
         }
 
         if (group != null) {
             try ( PrintWriter pw = new PrintWriter(response.getOutputStream())) {
-                pw.println(groupNameService.getCompleteName(groupNames));
+                pw.println(groupNameService.getCompleteName(existingGroupNames));
             }
         }
         // else: empty response (as defined by GMS standard)
diff --git a/gms/src/test/java/it/inaf/ia2/gms/controller/JWTWebServiceControllerTest.java b/gms/src/test/java/it/inaf/ia2/gms/controller/JWTWebServiceControllerTest.java
index ca81d28..3039885 100644
--- a/gms/src/test/java/it/inaf/ia2/gms/controller/JWTWebServiceControllerTest.java
+++ b/gms/src/test/java/it/inaf/ia2/gms/controller/JWTWebServiceControllerTest.java
@@ -131,6 +131,61 @@ public class JWTWebServiceControllerTest {
                 .andExpect(content().string(""));
     }
 
+    @Test
+    public void testIsMemberOfParentButChildDoesntExist() throws Exception {
+
+        GroupEntity group1 = new GroupEntity();
+        group1.setId("1");
+        group1.setPath("1");
+        group1.setName("LBT");
+
+        GroupEntity group2 = new GroupEntity();
+        group2.setId("2");
+        group2.setPath("1.2");
+        group2.setName("OTHERS");
+
+        when(groupsDAO.findGroupByParentAndName(eq(""), eq("LBT")))
+                .thenReturn(Optional.of(group1));
+        when(groupsDAO.findGroupByParentAndName(eq("1"), eq("OTHERS")))
+                .thenReturn(Optional.of(group2));
+
+        when(membershipManager.isCurrentUserMemberOf(eq(group2.getId()))).thenReturn(true);
+
+        String group = "LBT.OTHERS.UNKNOWN";
+
+        mockMvc.perform(get("/vo/search/" + group).principal(principal))
+                .andExpect(status().isOk())
+                .andExpect(content().string("LBT.OTHERS\n"));
+    }
+
+    @Test
+    public void testIsMemberOfSuperParentButChildDoesntExist() throws Exception {
+
+        GroupEntity group1 = new GroupEntity();
+        group1.setId("1");
+        group1.setPath("1");
+        group1.setName("LBT");
+
+        GroupEntity group2 = new GroupEntity();
+        group2.setId("2");
+        group2.setPath("1.2");
+        group2.setName("OTHERS");
+
+        when(groupsDAO.findGroupByParentAndName(eq(""), eq("LBT")))
+                .thenReturn(Optional.of(group1));
+        when(groupsDAO.findGroupByParentAndName(eq("1"), eq("OTHERS")))
+                .thenReturn(Optional.of(group2));
+
+        when(membershipManager.isCurrentUserMemberOf(eq(group1.getId()))).thenReturn(true);
+        when(membershipManager.isCurrentUserMemberOf(eq(group2.getId()))).thenReturn(true);
+
+        String group = "LBT.OTHERS.UNKNOWN";
+
+        mockMvc.perform(get("/vo/search/" + group).principal(principal))
+                .andExpect(status().isOk())
+                .andExpect(content().string("LBT.OTHERS\n"));
+    }
+
     @Test
     public void testCreateGroup() throws Exception {
 
-- 
GitLab