From 9f9b7530983d1b5ad526bb1ccdde635814bb0386 Mon Sep 17 00:00:00 2001
From: Sonia Zorba <sonia.zorba@inaf.it>
Date: Thu, 8 Aug 2019 17:11:59 +0200
Subject: [PATCH] Fixed tests and database setup

---
 README.md                                     | 13 ++--
 database/Dockerfile                           |  3 +-
 database/user.sql                             |  4 ++
 gms-ui/src/components/GroupsPanel.vue         |  2 +-
 gms-ui/src/components/Main.vue                |  8 +--
 gms/pom.xml                                   |  8 +--
 .../inaf/ia2/gms/persistence/GroupsDAO.java   |  4 ++
 .../inaf/ia2/gms/service/GroupsService.java   |  4 +-
 .../inaf/ia2/gms/service/PermissionUtils.java | 15 ++--
 gms/src/main/resources/application.properties |  5 +-
 .../it/inaf/ia2/gms/DataSourceConfig.java     | 37 ++++++++++
 .../it/inaf/ia2/gms/GmsApplicationTests.java  | 15 ----
 .../gms/controller/GroupsControllerTest.java  |  2 +-
 .../it/inaf/ia2/gms/model/PermissionTest.java | 40 +++++++++++
 .../ia2/gms/persistence/GroupsDAOTest.java    | 14 ++--
 .../NestedGroupsIntegrationTest.java          | 34 ++++++---
 .../gms/persistence/PermissionsDAOTest.java   |  7 +-
 .../ia2/gms/service/PermissionUtilsTest.java  | 69 +++++++++++++++++++
 .../PermissionsServiceIntegrationTest.java    | 18 ++---
 19 files changed, 225 insertions(+), 77 deletions(-)
 create mode 100644 database/user.sql
 create mode 100644 gms/src/test/java/it/inaf/ia2/gms/DataSourceConfig.java
 delete mode 100644 gms/src/test/java/it/inaf/ia2/gms/GmsApplicationTests.java
 create mode 100644 gms/src/test/java/it/inaf/ia2/gms/model/PermissionTest.java
 create mode 100644 gms/src/test/java/it/inaf/ia2/gms/service/PermissionUtilsTest.java

diff --git a/README.md b/README.md
index 8513c3f..4d923ce 100644
--- a/README.md
+++ b/README.md
@@ -1,10 +1,11 @@
 # IA2 GMS
 
-## MySQL setup
+## Database Docker image
 
-```
-create database gms;
-create user gms@localhost identified by 'gms';
-grant all privileges on gms.* to gms@localhost;
+To build the image run **from current directory**:
 
-```
+    docker build -f database/Dockerfile --tag gms-db .
+
+To start the image and use the database:
+
+    docker run -d -p 5432:5432 -i -t gms-db:latest
diff --git a/database/Dockerfile b/database/Dockerfile
index d174c9d..bb94ba2 100644
--- a/database/Dockerfile
+++ b/database/Dockerfile
@@ -1,2 +1,3 @@
 FROM library/postgres:11
-COPY ../gms/src/main/resources/sql/init.sql /docker-entrypoint-initdb.d/ 
+COPY gms/src/main/resources/sql/init.sql /docker-entrypoint-initdb.d/
+COPY database/user.sql /docker-entrypoint-initdb.d/
diff --git a/database/user.sql b/database/user.sql
new file mode 100644
index 0000000..29be85f
--- /dev/null
+++ b/database/user.sql
@@ -0,0 +1,4 @@
+CREATE ROLE gms WITH LOGIN PASSWORD 'gms';
+GRANT USAGE ON SCHEMA public TO gms;
+GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO gms;
+GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO gms;
\ No newline at end of file
diff --git a/gms-ui/src/components/GroupsPanel.vue b/gms-ui/src/components/GroupsPanel.vue
index ad0ee16..3ddfc6a 100644
--- a/gms-ui/src/components/GroupsPanel.vue
+++ b/gms-ui/src/components/GroupsPanel.vue
@@ -9,7 +9,7 @@
       <b-list-group v-for="group in model.groupsPanel.items">
         <b-list-group-item href="#" v-on:click="openGroup(group)">
           <span class="float-left">{{group.groupName}}</span>
-          <span v-if="group.permissions.includes('ADMIN')" class="float-right">
+          <span v-if="group.permission === 'ADMIN'" class="float-right">
             <a href="#" v-on:click.stop="openRenameGroupModal(group)" title="Rename">
               <font-awesome-icon icon="edit"></font-awesome-icon>
             </a>
diff --git a/gms-ui/src/components/Main.vue b/gms-ui/src/components/Main.vue
index f7b8791..36a15b2 100644
--- a/gms-ui/src/components/Main.vue
+++ b/gms-ui/src/components/Main.vue
@@ -40,10 +40,10 @@ export default {
   },
   computed: mapState({
     model: state => state.model,
-    showAddMemberBtn: state => state.model.permissions.includes('ADMIN') && state.input.selectedTab === 'members',
-    showAddCollaboratorBtn: state => state.model.permissions.includes('MANAGE_MEMBERS') && state.input.selectedTab === 'members',
-    showAddGroupBtn: state => state.model.permissions.includes('ADMIN') && state.input.selectedTab === 'groups',
-    showAddPermissionBtn: state => state.model.permissions.includes('ADMIN') && state.input.selectedTab === 'permissions'
+    showAddMemberBtn: state => state.model.permission === 'ADMIN' && state.input.selectedTab === 'members',
+    showAddCollaboratorBtn: state => state.model.permission === 'MANAGE_MEMBERS' && state.input.selectedTab === 'members',
+    showAddGroupBtn: state => state.model.permission === 'ADMIN' && state.input.selectedTab === 'groups',
+    showAddPermissionBtn: state => state.model.permission === 'ADMIN' && state.input.selectedTab === 'permissions'
   }),
   methods: {
     tabChanged: function(tabIndex) {
diff --git a/gms/pom.xml b/gms/pom.xml
index f55c143..184d64b 100644
--- a/gms/pom.xml
+++ b/gms/pom.xml
@@ -39,7 +39,6 @@
         <dependency>
             <groupId>org.postgresql</groupId>
             <artifactId>postgresql</artifactId>
-            <version>42.2.6</version>
             <scope>runtime</scope>
         </dependency>
         <dependency>
@@ -58,10 +57,11 @@
             <artifactId>spring-security-test</artifactId>
             <scope>test</scope>
         </dependency>
+        <!-- Embedded PostgreSQL: -->
         <dependency>
-            <groupId>io.zonky.test</groupId>
-            <artifactId>embedded-database-spring-test</artifactId>
-            <version>1.5.0</version>
+            <groupId>com.opentable.components</groupId>
+            <artifactId>otj-pg-embedded</artifactId>
+            <version>0.13.1</version>
             <scope>test</scope>
         </dependency>
     </dependencies>
diff --git a/gms/src/main/java/it/inaf/ia2/gms/persistence/GroupsDAO.java b/gms/src/main/java/it/inaf/ia2/gms/persistence/GroupsDAO.java
index 5a38bca..88f8509 100644
--- a/gms/src/main/java/it/inaf/ia2/gms/persistence/GroupsDAO.java
+++ b/gms/src/main/java/it/inaf/ia2/gms/persistence/GroupsDAO.java
@@ -132,6 +132,10 @@ public class GroupsDAO {
 
     public Map<String, Boolean> getHasChildrenMap(Set<String> groupIds) {
 
+        if (groupIds.isEmpty()) {
+            return new HashMap<>();
+        }
+
         String sql = "SELECT g.id, COUNT(s.*) > 0 AS has_children \n"
                 + "FROM gms_group g\n"
                 + "LEFT JOIN gms_group s ON s.path <@ g.path AND s.path <> g.path\n"
diff --git a/gms/src/main/java/it/inaf/ia2/gms/service/GroupsService.java b/gms/src/main/java/it/inaf/ia2/gms/service/GroupsService.java
index 15ad515..e37a4b6 100644
--- a/gms/src/main/java/it/inaf/ia2/gms/service/GroupsService.java
+++ b/gms/src/main/java/it/inaf/ia2/gms/service/GroupsService.java
@@ -10,7 +10,6 @@ import it.inaf.ia2.gms.persistence.GroupsDAO;
 import it.inaf.ia2.gms.persistence.model.GroupEntity;
 import java.util.List;
 import java.util.UUID;
-import org.springframework.transaction.annotation.Transactional;
 
 @Service
 public class GroupsService {
@@ -38,7 +37,6 @@ public class GroupsService {
         }
     }
 
-    @Transactional
     public GroupEntity addGroup(String parentId, String groupName, String userId) {
 
         GroupEntity parent = getGroupById(parentId);
@@ -52,7 +50,7 @@ public class GroupsService {
             throw new BadRequestException("There is already a group named " + groupName);
         }
 
-        String newGroupId = UUID.randomUUID().toString();
+        String newGroupId = UUID.randomUUID().toString().replaceAll("-", "");
 
         String path = parent.getPath();
         if (!path.isEmpty()) {
diff --git a/gms/src/main/java/it/inaf/ia2/gms/service/PermissionUtils.java b/gms/src/main/java/it/inaf/ia2/gms/service/PermissionUtils.java
index a4d877a..ffb5817 100644
--- a/gms/src/main/java/it/inaf/ia2/gms/service/PermissionUtils.java
+++ b/gms/src/main/java/it/inaf/ia2/gms/service/PermissionUtils.java
@@ -18,15 +18,12 @@ public class PermissionUtils {
             boolean permissionInChildGroup = permission.getGroupPath().startsWith(group.getPath());
             boolean permissionInParentGroup = group.getPath().startsWith(permission.getGroupPath());
 
-            if (directPermission || permissionInChildGroup || permissionInParentGroup) {
-
-                if (permissionInChildGroup) {
-                    // Traversal only
-                    groupPermission = Permission.addPermission(groupPermission, Permission.TRAVERSE);
-                } else {
-                    // Direct permission or permission inherited from parent
-                    groupPermission = Permission.addPermission(groupPermission, permission.getPermission());
-                }
+            if (directPermission || permissionInParentGroup) {
+                // Direct permission or permission inherited from parent
+                groupPermission = Permission.addPermission(groupPermission, permission.getPermission());
+            } else if (permissionInChildGroup) {
+                // Traversal only
+                groupPermission = Permission.addPermission(groupPermission, Permission.TRAVERSE);
             }
 
             if (groupPermission == Permission.ADMIN) {
diff --git a/gms/src/main/resources/application.properties b/gms/src/main/resources/application.properties
index c92e337..94200da 100644
--- a/gms/src/main/resources/application.properties
+++ b/gms/src/main/resources/application.properties
@@ -11,12 +11,9 @@ security.oauth2.resource.jwk.key-set-uri=http://localhost/rap-ia2/auth/oidc/jwks
 logging.level.org.springframework.security=DEBUG
 logging.level.org.springframework.jdbc=TRACE
 
-spring.jpa.hibernate.ddl-auto=update
-spring.jpa.database-platform=org.hibernate.dialect.MariaDBDialect
-spring.datasource.url=jdbc:mysql://localhost:3306/gms?useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
+spring.datasource.url=jdbc:postgresql://localhost:5432/postgres
 spring.datasource.username=gms
 spring.datasource.password=gms
-#spring.jpa.open-in-view=false
 
 rap.ws-url=http://localhost/rap-ia2/ws
 
diff --git a/gms/src/test/java/it/inaf/ia2/gms/DataSourceConfig.java b/gms/src/test/java/it/inaf/ia2/gms/DataSourceConfig.java
new file mode 100644
index 0000000..8fb202b
--- /dev/null
+++ b/gms/src/test/java/it/inaf/ia2/gms/DataSourceConfig.java
@@ -0,0 +1,37 @@
+package it.inaf.ia2.gms;
+
+import com.opentable.db.postgres.embedded.EmbeddedPostgres;
+import java.sql.Connection;
+import javax.sql.DataSource;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Primary;
+import org.springframework.context.annotation.Scope;
+import org.springframework.core.io.ClassPathResource;
+import org.springframework.jdbc.datasource.init.ScriptUtils;
+
+@Configuration
+public class DataSourceConfig {
+
+    /**
+     * Using the prototype scope we are generating a different database in each
+     * test.
+     */
+    @Bean
+    @Scope("prototype")
+    @Primary
+    public DataSource dataSource() throws Exception {
+        DataSource embeddedPostgresDS = EmbeddedPostgres.builder()
+                .start().getPostgresDatabase();
+
+        initDatabase(embeddedPostgresDS);
+
+        return embeddedPostgresDS;
+    }
+
+    private void initDatabase(DataSource dataSource) throws Exception {
+        try (Connection conn = dataSource.getConnection()) {
+            ScriptUtils.executeSqlScript(conn, new ClassPathResource("/sql/init.sql"));
+        }
+    }
+}
diff --git a/gms/src/test/java/it/inaf/ia2/gms/GmsApplicationTests.java b/gms/src/test/java/it/inaf/ia2/gms/GmsApplicationTests.java
deleted file mode 100644
index a0242fa..0000000
--- a/gms/src/test/java/it/inaf/ia2/gms/GmsApplicationTests.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package it.inaf.ia2.gms;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.test.context.junit4.SpringRunner;
-
-@RunWith(SpringRunner.class)
-@SpringBootTest
-public class GmsApplicationTests {
-
-    @Test
-    public void contextLoads() {
-    }
-}
diff --git a/gms/src/test/java/it/inaf/ia2/gms/controller/GroupsControllerTest.java b/gms/src/test/java/it/inaf/ia2/gms/controller/GroupsControllerTest.java
index 8a1ac93..5ab680e 100644
--- a/gms/src/test/java/it/inaf/ia2/gms/controller/GroupsControllerTest.java
+++ b/gms/src/test/java/it/inaf/ia2/gms/controller/GroupsControllerTest.java
@@ -49,7 +49,7 @@ public class GroupsControllerTest {
         when(groupsModelService.getGroupsModel(any(), any()))
                 .thenReturn(response);
 
-        mockMvc.perform(get("/groups?groupId=ROOT&tab=groups&paginatorPageSize=20&paginatorPage=1"))
+        mockMvc.perform(get("/groups?groupId=ROOT&tab=groups&paginatorPageSize=20&paginatorPage=1&page=main"))
                 .andExpect(status().isOk());
 
         ArgumentCaptor<GroupsModelRequest> requestCaptor = ArgumentCaptor.forClass(GroupsModelRequest.class);
diff --git a/gms/src/test/java/it/inaf/ia2/gms/model/PermissionTest.java b/gms/src/test/java/it/inaf/ia2/gms/model/PermissionTest.java
new file mode 100644
index 0000000..136befa
--- /dev/null
+++ b/gms/src/test/java/it/inaf/ia2/gms/model/PermissionTest.java
@@ -0,0 +1,40 @@
+package it.inaf.ia2.gms.model;
+
+import static org.junit.Assert.assertEquals;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+@RunWith(JUnit4.class)
+public class PermissionTest {
+
+    @Test
+    public void addPermissionTest() {
+
+        // Old = null
+        assertEquals(Permission.ADMIN, Permission.addPermission(null, Permission.ADMIN));
+        assertEquals(Permission.MANAGE_MEMBERS, Permission.addPermission(null, Permission.MANAGE_MEMBERS));
+        assertEquals(Permission.VIEW_MEMBERS, Permission.addPermission(null, Permission.VIEW_MEMBERS));
+        assertEquals(Permission.TRAVERSE, Permission.addPermission(null, Permission.TRAVERSE));
+
+        // Old = ADMIN -> never change
+        assertEquals(Permission.ADMIN, Permission.addPermission(Permission.ADMIN, Permission.VIEW_MEMBERS));
+        assertEquals(Permission.ADMIN, Permission.addPermission(Permission.ADMIN, Permission.MANAGE_MEMBERS));
+        assertEquals(Permission.ADMIN, Permission.addPermission(Permission.ADMIN, Permission.TRAVERSE));
+
+        // Old = MANAGE_MEMBERS
+        assertEquals(Permission.ADMIN, Permission.addPermission(Permission.MANAGE_MEMBERS, Permission.ADMIN));
+        assertEquals(Permission.MANAGE_MEMBERS, Permission.addPermission(Permission.MANAGE_MEMBERS, Permission.VIEW_MEMBERS));
+        assertEquals(Permission.MANAGE_MEMBERS, Permission.addPermission(Permission.MANAGE_MEMBERS, Permission.TRAVERSE));
+
+        // Old = VIEW_MEMBERS
+        assertEquals(Permission.ADMIN, Permission.addPermission(Permission.VIEW_MEMBERS, Permission.ADMIN));
+        assertEquals(Permission.MANAGE_MEMBERS, Permission.addPermission(Permission.VIEW_MEMBERS, Permission.MANAGE_MEMBERS));
+        assertEquals(Permission.VIEW_MEMBERS, Permission.addPermission(Permission.VIEW_MEMBERS, Permission.TRAVERSE));
+
+        // Old = TRAVERSE
+        assertEquals(Permission.ADMIN, Permission.addPermission(Permission.TRAVERSE, Permission.ADMIN));
+        assertEquals(Permission.MANAGE_MEMBERS, Permission.addPermission(Permission.TRAVERSE, Permission.MANAGE_MEMBERS));
+        assertEquals(Permission.VIEW_MEMBERS, Permission.addPermission(Permission.TRAVERSE, Permission.VIEW_MEMBERS));
+    }
+}
diff --git a/gms/src/test/java/it/inaf/ia2/gms/persistence/GroupsDAOTest.java b/gms/src/test/java/it/inaf/ia2/gms/persistence/GroupsDAOTest.java
index 643cef6..9d5ad1a 100644
--- a/gms/src/test/java/it/inaf/ia2/gms/persistence/GroupsDAOTest.java
+++ b/gms/src/test/java/it/inaf/ia2/gms/persistence/GroupsDAOTest.java
@@ -1,7 +1,6 @@
 package it.inaf.ia2.gms.persistence;
 
-import com.google.common.collect.ImmutableSet;
-import io.zonky.test.db.AutoConfigureEmbeddedDatabase;
+import it.inaf.ia2.gms.DataSourceConfig;
 import it.inaf.ia2.gms.model.GroupBreadcrumb;
 import it.inaf.ia2.gms.persistence.model.GroupEntity;
 import java.util.List;
@@ -15,12 +14,13 @@ import static org.junit.Assert.assertTrue;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.mockito.internal.util.collections.Sets;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.test.context.jdbc.Sql;
+import org.springframework.test.context.ContextConfiguration;
 import org.springframework.test.context.junit4.SpringRunner;
 
 @RunWith(SpringRunner.class)
-@AutoConfigureEmbeddedDatabase(beanName = "dataSource")
+@ContextConfiguration(classes = DataSourceConfig.class)
 public class GroupsDAOTest {
 
     @Autowired
@@ -34,7 +34,7 @@ public class GroupsDAOTest {
     }
 
     @Test
-    @Sql("/sql/init.sql")
+    //@Sql("/sql/init.sql")
     public void testAll() {
 
         // Create groups
@@ -89,11 +89,11 @@ public class GroupsDAOTest {
         assertEquals("INAF", groups.get(0).getName());
 
         // Children map
-        Map<String, Boolean> childrenMap = dao.getHasChildrenMap(ImmutableSet.of(root.getId()));
+        Map<String, Boolean> childrenMap = dao.getHasChildrenMap(Sets.newSet(root.getId()));
         assertEquals(1, childrenMap.size());
         assertTrue(childrenMap.get(root.getId()));
 
-        childrenMap = dao.getHasChildrenMap(ImmutableSet.of(lbt.getId(), tng.getId()));
+        childrenMap = dao.getHasChildrenMap(Sets.newSet(lbt.getId(), tng.getId()));
         assertEquals(2, childrenMap.size());
         assertTrue(childrenMap.get(lbt.getId()));
         assertFalse(childrenMap.get(tng.getId()));
diff --git a/gms/src/test/java/it/inaf/ia2/gms/persistence/NestedGroupsIntegrationTest.java b/gms/src/test/java/it/inaf/ia2/gms/persistence/NestedGroupsIntegrationTest.java
index 2c546b0..398cd3d 100644
--- a/gms/src/test/java/it/inaf/ia2/gms/persistence/NestedGroupsIntegrationTest.java
+++ b/gms/src/test/java/it/inaf/ia2/gms/persistence/NestedGroupsIntegrationTest.java
@@ -1,38 +1,43 @@
 package it.inaf.ia2.gms.persistence;
 
-import io.zonky.test.db.AutoConfigureEmbeddedDatabase;
+import it.inaf.ia2.gms.DataSourceConfig;
 import it.inaf.ia2.gms.service.GroupsService;
 import it.inaf.ia2.gms.model.GroupNode;
 import it.inaf.ia2.gms.model.PaginatedModelRequest;
 import it.inaf.ia2.gms.model.Permission;
 import it.inaf.ia2.gms.persistence.model.GroupEntity;
 import it.inaf.ia2.gms.persistence.model.PermissionEntity;
+import it.inaf.ia2.gms.rap.RapClient;
 import it.inaf.ia2.gms.service.GroupsTreeBuilder;
+import it.inaf.ia2.gms.service.PermissionsService;
 import java.util.List;
+import javax.sql.DataSource;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import static org.mockito.Mockito.mock;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ContextConfiguration;
 import org.springframework.test.context.junit4.SpringRunner;
 
 @RunWith(SpringRunner.class)
-@AutoConfigureEmbeddedDatabase(beanName = "dataSource")
+@ContextConfiguration(classes = DataSourceConfig.class)
 public class NestedGroupsIntegrationTest {
 
     @Autowired
-    private PermissionsDAO permissionsDAO;
-
-    @Autowired
-    private GroupsService groupsService;
-
-    @Autowired
-    private GroupsTreeBuilder groupsTreeBuilder;
+    private DataSource dataSource;
 
     @Test
     public void testNestedGroupRetrieval() {
 
+        GroupsDAO groupsDAO = new GroupsDAO(dataSource);
+        PermissionsDAO permissionsDAO = new PermissionsDAO(dataSource);
+        PermissionsService permissionsService = new PermissionsService(permissionsDAO, mock(RapClient.class));
+        GroupsService groupsService = new GroupsService(groupsDAO, permissionsService);
+        GroupsTreeBuilder groupsTreeBuilder = new GroupsTreeBuilder(groupsDAO, permissionsDAO);
+
         String userId = "USER_ID";
 
         // Test super admin
@@ -100,14 +105,23 @@ public class NestedGroupsIntegrationTest {
         p1Permission.setUserId(userId);
         p1Permission.setGroupId(lbtInafProgram1.getId());
         p1Permission.setPermission(Permission.MANAGE_MEMBERS);
+        p1Permission.setGroupPath(lbtInafProgram1.getPath());
         permissionsDAO.createPermission(p1Permission);
 
         PermissionEntity lbtPermission = new PermissionEntity();
         lbtPermission.setUserId(userId);
         lbtPermission.setGroupId(lbtInaf.getId());
         lbtPermission.setPermission(Permission.VIEW_MEMBERS);
+        lbtPermission.setGroupPath(lbtInaf.getPath());
         permissionsDAO.createPermission(lbtPermission);
 
+        PermissionEntity radioPermission = new PermissionEntity();
+        radioPermission.setUserId(userId);
+        radioPermission.setGroupId(radio.getId());
+        radioPermission.setPermission(Permission.VIEW_MEMBERS);
+        radioPermission.setGroupPath(radio.getPath());
+        permissionsDAO.createPermission(radioPermission);
+
         // Check level 0 (ROOT)
         groupNodes = groupsTreeBuilder.listSubGroups(root.getId(), userId, request).getItems();
         assertEquals(2, groupNodes.size());
@@ -117,7 +131,7 @@ public class NestedGroupsIntegrationTest {
         assertTrue(lbtGN.isHasChildren());
         radioGN = groupNodes.get(1);
         assertEquals("Radio", radioGN.getGroupName());
-        assertEquals(Permission.TRAVERSE, radioGN.getPermission());
+        assertEquals(Permission.VIEW_MEMBERS, radioGN.getPermission());
         assertFalse(radioGN.isHasChildren());
 
         // Check level 1
diff --git a/gms/src/test/java/it/inaf/ia2/gms/persistence/PermissionsDAOTest.java b/gms/src/test/java/it/inaf/ia2/gms/persistence/PermissionsDAOTest.java
index e2bb67d..6f411d8 100644
--- a/gms/src/test/java/it/inaf/ia2/gms/persistence/PermissionsDAOTest.java
+++ b/gms/src/test/java/it/inaf/ia2/gms/persistence/PermissionsDAOTest.java
@@ -1,6 +1,6 @@
 package it.inaf.ia2.gms.persistence;
 
-import io.zonky.test.db.AutoConfigureEmbeddedDatabase;
+import it.inaf.ia2.gms.DataSourceConfig;
 import it.inaf.ia2.gms.model.Permission;
 import it.inaf.ia2.gms.persistence.model.PermissionEntity;
 import it.inaf.ia2.gms.persistence.model.GroupEntity;
@@ -12,11 +12,11 @@ import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.test.context.jdbc.Sql;
+import org.springframework.test.context.ContextConfiguration;
 import org.springframework.test.context.junit4.SpringRunner;
 
 @RunWith(SpringRunner.class)
-@AutoConfigureEmbeddedDatabase(beanName = "dataSource")
+@ContextConfiguration(classes = DataSourceConfig.class)
 public class PermissionsDAOTest {
 
     @Autowired
@@ -32,7 +32,6 @@ public class PermissionsDAOTest {
     }
 
     @Test
-    @Sql("/sql/init.sql")
     public void testAll() {
 
         GroupEntity root = new GroupEntity();
diff --git a/gms/src/test/java/it/inaf/ia2/gms/service/PermissionUtilsTest.java b/gms/src/test/java/it/inaf/ia2/gms/service/PermissionUtilsTest.java
new file mode 100644
index 0000000..9a6d0f3
--- /dev/null
+++ b/gms/src/test/java/it/inaf/ia2/gms/service/PermissionUtilsTest.java
@@ -0,0 +1,69 @@
+package it.inaf.ia2.gms.service;
+
+import it.inaf.ia2.gms.model.Permission;
+import it.inaf.ia2.gms.persistence.model.GroupEntity;
+import it.inaf.ia2.gms.persistence.model.PermissionEntity;
+import java.util.Collections;
+import java.util.List;
+import static org.junit.Assert.assertEquals;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+@RunWith(JUnit4.class)
+public class PermissionUtilsTest {
+
+    @Test
+    public void testDirectPermission() {
+
+        GroupEntity group = new GroupEntity();
+        group.setId("id");
+        group.setName("name");
+        group.setPath("path");
+
+        PermissionEntity permission = new PermissionEntity();
+        permission.setGroupId("id");
+        permission.setGroupPath("path");
+        permission.setPermission(Permission.MANAGE_MEMBERS);
+
+        List<PermissionEntity> permissions = Collections.singletonList(permission);
+
+        assertEquals(Permission.MANAGE_MEMBERS, PermissionUtils.getGroupPermission(group, permissions).get());
+    }
+
+    @Test
+    public void testPermissionInheritedFromParent() {
+
+        GroupEntity group = new GroupEntity();
+        group.setId("id_LBT_INAF");
+        group.setName("INAF");
+        group.setPath("LBT:INAF");
+
+        PermissionEntity permission = new PermissionEntity();
+        permission.setGroupId("id_LBT");
+        permission.setGroupPath("LBT");
+        permission.setPermission(Permission.ADMIN);
+
+        List<PermissionEntity> permissions = Collections.singletonList(permission);
+
+        assertEquals(Permission.ADMIN, PermissionUtils.getGroupPermission(group, permissions).get());
+    }
+
+    @Test
+    public void testTraversalIfPermissionInChild() {
+
+        GroupEntity group = new GroupEntity();
+        group.setId("id_LBT");
+        group.setName("name");
+        group.setPath("LBT");
+
+        PermissionEntity permission = new PermissionEntity();
+        permission.setGroupId("id_LBT_INAF_P1");
+        permission.setGroupPath("LBT:INAF:P1");
+        permission.setPermission(Permission.VIEW_MEMBERS);
+
+        List<PermissionEntity> permissions = Collections.singletonList(permission);
+
+        assertEquals(Permission.TRAVERSE, PermissionUtils.getGroupPermission(group, permissions).get());
+    }
+}
diff --git a/gms/src/test/java/it/inaf/ia2/gms/service/PermissionsServiceIntegrationTest.java b/gms/src/test/java/it/inaf/ia2/gms/service/PermissionsServiceIntegrationTest.java
index 1273d72..fc04b4e 100644
--- a/gms/src/test/java/it/inaf/ia2/gms/service/PermissionsServiceIntegrationTest.java
+++ b/gms/src/test/java/it/inaf/ia2/gms/service/PermissionsServiceIntegrationTest.java
@@ -1,6 +1,6 @@
 package it.inaf.ia2.gms.service;
 
-import io.zonky.test.db.AutoConfigureEmbeddedDatabase;
+import it.inaf.ia2.gms.DataSourceConfig;
 import it.inaf.ia2.gms.model.Permission;
 import it.inaf.ia2.gms.model.RapUser;
 import it.inaf.ia2.gms.model.UserPermission;
@@ -11,6 +11,7 @@ import it.inaf.ia2.gms.persistence.model.PermissionEntity;
 import it.inaf.ia2.gms.rap.RapClient;
 import java.util.Collections;
 import java.util.List;
+import javax.sql.DataSource;
 import static org.junit.Assert.assertEquals;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -18,26 +19,27 @@ import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.when;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.mock.mockito.MockBean;
+import org.springframework.test.context.ContextConfiguration;
 import org.springframework.test.context.junit4.SpringRunner;
 
 @RunWith(SpringRunner.class)
-@AutoConfigureEmbeddedDatabase(beanName = "dataSource")
+@ContextConfiguration(classes = DataSourceConfig.class)
 public class PermissionsServiceIntegrationTest {
 
     private static final String USER_ID = "USER_ID";
 
-    @Autowired
-    private GroupsDAO groupsDAO;
-
-    @Autowired
-    private PermissionsDAO permissionsDAO;
-
     @MockBean
     private RapClient rapClient;
 
+    @Autowired
+    private DataSource dataSource;
+
     @Test
     public void permissionsRetrievalTest() {
 
+        GroupsDAO groupsDAO = new GroupsDAO(dataSource);
+        PermissionsDAO permissionsDAO = new PermissionsDAO(dataSource);
+
         // Mock RAP client
         RapUser rapUser = new RapUser();
         rapUser.setId(USER_ID);
-- 
GitLab