diff --git a/gms-ui/src/api/server/index.js b/gms-ui/src/api/server/index.js index 1c9b15ceaa9c961317d759f48ea4819737fccb57..9b7deed748cf355d746af8d876b7362c594d8af6 100644 --- a/gms-ui/src/api/server/index.js +++ b/gms-ui/src/api/server/index.js @@ -1,9 +1,9 @@ const BASE_API_URL = process.env.VUE_APP_API_BASE_URL; -function apiRequest(url, data) { +function apiRequest(url, options) { loading(true); return new Promise((resolve, reject) => { - fetch(url, data) + fetch(url, options) .then(response => { loading(false); if([200, 201, 204, 400].includes(response.status)) { // valid status codes diff --git a/gms/src/main/java/it/inaf/ia2/gms/persistence/PermissionsDAO.java b/gms/src/main/java/it/inaf/ia2/gms/persistence/PermissionsDAO.java index 2aee489cfd7ecda2c7c09abeba7a384e72587230..07c277471e8a84df939ab1eaa0ffda650597e565 100644 --- a/gms/src/main/java/it/inaf/ia2/gms/persistence/PermissionsDAO.java +++ b/gms/src/main/java/it/inaf/ia2/gms/persistence/PermissionsDAO.java @@ -88,22 +88,21 @@ public class PermissionsDAO { }); } - public Optional<PermissionEntity> findPermissionEntity(String groupId, String userId, Permission permission) { + public Optional<PermissionEntity> findPermissionEntity(String groupId, String userId) { - String sql = "SELECT group_path FROM gms_permission WHERE group_id = ? AND user_id = ? AND permission = ?"; + String sql = "SELECT group_path, permission FROM gms_permission WHERE group_id = ? AND user_id = ?"; return jdbcTemplate.query(conn -> { PreparedStatement ps = conn.prepareStatement(sql); ps.setString(1, groupId); ps.setString(2, userId); - ps.setObject(3, permission.toString(), Types.OTHER); return ps; }, resultSet -> { if (resultSet.next()) { PermissionEntity permissionEntity = new PermissionEntity(); permissionEntity.setGroupId(groupId); permissionEntity.setUserId(userId); - permissionEntity.setPermission(permission); + permissionEntity.setPermission(Permission.valueOf(resultSet.getString("permission"))); permissionEntity.setGroupPath(resultSet.getString("group_path")); return Optional.of(permissionEntity); } diff --git a/gms/src/main/java/it/inaf/ia2/gms/service/PermissionsService.java b/gms/src/main/java/it/inaf/ia2/gms/service/PermissionsService.java index 667e3fe4517393968a2f7307746b87c5757e3bdd..80ef491cbbc8ed45b5bca009100795c0c083a043 100644 --- a/gms/src/main/java/it/inaf/ia2/gms/service/PermissionsService.java +++ b/gms/src/main/java/it/inaf/ia2/gms/service/PermissionsService.java @@ -66,19 +66,28 @@ public class PermissionsService { public PermissionEntity addPermission(GroupEntity group, String userId, Permission permission) { - PermissionEntity permissionEntity = new PermissionEntity(); - permissionEntity.setGroupId(group.getId()); - permissionEntity.setUserId(userId); - permissionEntity.setPermission(permission); - permissionEntity.setGroupPath(group.getPath()); + Optional<PermissionEntity> existingPermissionEntity = permissionsDAO.findPermissionEntity(group.getId(), userId); + + PermissionEntity permissionEntity; + if (existingPermissionEntity.isPresent()) { + permissionEntity = existingPermissionEntity.get(); + Permission resultingPermission = Permission.addPermission(permissionEntity.getPermission(), permission); + if (resultingPermission == permissionEntity.getPermission()) { + return permissionEntity; + } else { + permissionEntity.setPermission(resultingPermission); + } + } else { + permissionEntity = new PermissionEntity(); + permissionEntity.setGroupId(group.getId()); + permissionEntity.setUserId(userId); + permissionEntity.setPermission(permission); + permissionEntity.setGroupPath(group.getPath()); + } return permissionsDAO.createOrUpdatePermission(permissionEntity); } - public Optional<PermissionEntity> findPermissionEntity(String groupId, String userId, Permission permission) { - return permissionsDAO.findPermissionEntity(groupId, userId, permission); - } - public void movePermissions(String fromUserId, String toUserId) { permissionsDAO.movePermissions(fromUserId, toUserId); } 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 f1acf43729643b34d029933b7a969ff1edf8a7d7..fddb3bc919a6cf394dedfb8c5148bc2dde1a66dd 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 @@ -1,13 +1,8 @@ package it.inaf.ia2.gms.controller; -import it.inaf.ia2.gms.authn.SessionData; -import it.inaf.ia2.gms.model.GroupNode; import it.inaf.ia2.gms.model.Permission; +import it.inaf.ia2.gms.model.response.GroupsTabResponse; import it.inaf.ia2.gms.model.response.PaginatedData; -import it.inaf.ia2.gms.persistence.model.GroupEntity; -import it.inaf.ia2.gms.service.GroupsService; -import it.inaf.ia2.gms.service.GroupsTreeBuilder; -import it.inaf.ia2.gms.service.PermissionsService; import java.util.ArrayList; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; @@ -15,11 +10,9 @@ import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.eq; import org.mockito.InjectMocks; import org.mockito.Mock; import static org.mockito.Mockito.when; -import org.mockito.Spy; import org.mockito.junit.MockitoJUnitRunner; import org.springframework.test.web.servlet.MockMvc; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @@ -31,19 +24,6 @@ import org.springframework.test.web.servlet.setup.MockMvcBuilders; public class GroupsControllerTest { @Mock - private SessionData session; - - @Mock - private GroupsService groupsService; - - @Mock - private PermissionsService permissionsService; - - @Mock - private GroupsTreeBuilder groupsTreeBuilder; - - @Spy - @InjectMocks private GroupsTabResponseBuilder groupsTabResponseBuilder; @InjectMocks @@ -59,20 +39,12 @@ public class GroupsControllerTest { @Test public void testGetGroups() throws Exception { - when(session.getUserId()).thenReturn("admin_id"); - - GroupEntity root = new GroupEntity(); - root.setId("ROOT"); - root.setName("ROOT"); - root.setPath(""); - - when(groupsService.getGroupById(eq("ROOT"))).thenReturn(root); - - when(permissionsService.getUserPermissionForGroup(eq(root), eq("admin_id"))) - .thenReturn(Permission.ADMIN); + GroupsTabResponse response = new GroupsTabResponse(); + response.setBreadcrumbs(new ArrayList<>()); + response.setGroupsPanel(new PaginatedData<>(new ArrayList<>(), 1, 10)); + response.setPermission(Permission.ADMIN); - PaginatedData<GroupNode> groupsPanel = new PaginatedData<>(new ArrayList<>(), 1, 10); - when(groupsTreeBuilder.listSubGroups(eq("ROOT"), eq("admin_id"), any())).thenReturn(groupsPanel); + when(groupsTabResponseBuilder.getGroupsTab(any())).thenReturn(response); mockMvc.perform(get("/groups?groupId=ROOT&paginatorPageSize=20&paginatorPage=1")) .andExpect(status().isOk()) diff --git a/gms/src/test/java/it/inaf/ia2/gms/controller/GroupsTabResponseBuilderTest.java b/gms/src/test/java/it/inaf/ia2/gms/controller/GroupsTabResponseBuilderTest.java new file mode 100644 index 0000000000000000000000000000000000000000..baef55e7bea64ba63d5a0d8be5450b649d2b5393 --- /dev/null +++ b/gms/src/test/java/it/inaf/ia2/gms/controller/GroupsTabResponseBuilderTest.java @@ -0,0 +1,72 @@ +package it.inaf.ia2.gms.controller; + +import it.inaf.ia2.gms.authn.SessionData; +import it.inaf.ia2.gms.model.GroupNode; +import it.inaf.ia2.gms.model.Permission; +import it.inaf.ia2.gms.model.request.TabRequest; +import it.inaf.ia2.gms.model.response.GroupsTabResponse; +import it.inaf.ia2.gms.model.response.PaginatedData; +import it.inaf.ia2.gms.persistence.model.GroupEntity; +import it.inaf.ia2.gms.service.GroupsService; +import it.inaf.ia2.gms.service.GroupsTreeBuilder; +import it.inaf.ia2.gms.service.PermissionsService; +import java.util.ArrayList; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import org.junit.Test; +import org.junit.runner.RunWith; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import static org.mockito.Mockito.when; +import org.mockito.junit.MockitoJUnitRunner; + +@RunWith(MockitoJUnitRunner.class) +public class GroupsTabResponseBuilderTest { + + @Mock + private SessionData session; + + @Mock + private GroupsService groupsService; + + @Mock + private PermissionsService permissionsService; + + @Mock + private GroupsTreeBuilder groupsTreeBuilder; + + @InjectMocks + private GroupsTabResponseBuilder groupsTabResponseBuilder; + + @Test + public void testGetGroupsTab() { + + when(session.getUserId()).thenReturn("admin_id"); + + GroupEntity root = new GroupEntity(); + root.setId("ROOT"); + root.setName("ROOT"); + root.setPath(""); + + when(groupsService.getGroupById(eq("ROOT"))).thenReturn(root); + + when(permissionsService.getUserPermissionForGroup(eq(root), eq("admin_id"))) + .thenReturn(Permission.ADMIN); + + PaginatedData<GroupNode> groupsPanel = new PaginatedData<>(new ArrayList<>(), 1, 10); + when(groupsTreeBuilder.listSubGroups(eq("ROOT"), eq("admin_id"), any())).thenReturn(groupsPanel); + + TabRequest request = new TabRequest(); + request.setGroupId("ROOT"); + request.setPaginatorPage(1); + request.setPaginatorPageSize(10); + + GroupsTabResponse response = groupsTabResponseBuilder.getGroupsTab(request); + + assertNotNull(response.getBreadcrumbs()); + assertNotNull(response.getGroupsPanel()); + assertEquals(Permission.ADMIN, response.getPermission()); + } +} diff --git a/gms/src/test/java/it/inaf/ia2/gms/service/PermissionsServiceTest.java b/gms/src/test/java/it/inaf/ia2/gms/service/PermissionsServiceTest.java new file mode 100644 index 0000000000000000000000000000000000000000..36e7010213dd62596304e8cdb1af100b2d5c4699 --- /dev/null +++ b/gms/src/test/java/it/inaf/ia2/gms/service/PermissionsServiceTest.java @@ -0,0 +1,91 @@ +package it.inaf.ia2.gms.service; + +import it.inaf.ia2.gms.model.Permission; +import it.inaf.ia2.gms.persistence.PermissionsDAO; +import it.inaf.ia2.gms.persistence.model.GroupEntity; +import it.inaf.ia2.gms.persistence.model.PermissionEntity; +import java.util.Optional; +import static org.junit.Assert.assertEquals; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; +import org.mockito.junit.MockitoJUnitRunner; + +@RunWith(MockitoJUnitRunner.class) +public class PermissionsServiceTest { + + @Mock + private PermissionsDAO permissionsDAO; + + @InjectMocks + private PermissionsService permissionsService; + + @Test + public void testAddPermissionOverrideOldOne() { + + GroupEntity root = new GroupEntity(); + root.setId("ROOT"); + + PermissionEntity existingEntity = new PermissionEntity(); + existingEntity.setGroupId("ROOT"); + existingEntity.setPermission(Permission.VIEW_MEMBERS); + + when(permissionsDAO.findPermissionEntity(eq("ROOT"), eq("user_id"))) + .thenReturn(Optional.of(existingEntity)); + + when(permissionsDAO.createOrUpdatePermission(any())).thenAnswer(invocation -> invocation.getArgument(0)); + + PermissionEntity result = permissionsService.addPermission(root, "user_id", Permission.ADMIN); + + ArgumentCaptor<PermissionEntity> entityCaptor = ArgumentCaptor.forClass(PermissionEntity.class); + verify(permissionsDAO, times(1)).createOrUpdatePermission(entityCaptor.capture()); + assertEquals(Permission.ADMIN, entityCaptor.getValue().getPermission()); + assertEquals(Permission.ADMIN, result.getPermission()); + } + + @Test + public void testAddPermissionNotOverrideOldOne() { + + GroupEntity root = new GroupEntity(); + root.setId("ROOT"); + + PermissionEntity existingEntity = new PermissionEntity(); + existingEntity.setGroupId("ROOT"); + existingEntity.setPermission(Permission.MANAGE_MEMBERS); + + when(permissionsDAO.findPermissionEntity(eq("ROOT"), eq("user_id"))) + .thenReturn(Optional.of(existingEntity)); + + PermissionEntity result = permissionsService.addPermission(root, "user_id", Permission.VIEW_MEMBERS); + + verify(permissionsDAO, never()).createOrUpdatePermission(any()); + assertEquals(Permission.MANAGE_MEMBERS, result.getPermission()); + } + + @Test + public void testAddSamePermissionReturnExisting() { + + GroupEntity root = new GroupEntity(); + root.setId("ROOT"); + + PermissionEntity existingEntity = new PermissionEntity(); + existingEntity.setGroupId("ROOT"); + existingEntity.setPermission(Permission.VIEW_MEMBERS); + + when(permissionsDAO.findPermissionEntity(eq("ROOT"), eq("user_id"))) + .thenReturn(Optional.of(existingEntity)); + + PermissionEntity result = permissionsService.addPermission(root, "user_id", Permission.VIEW_MEMBERS); + + verify(permissionsDAO, never()).createOrUpdatePermission(any()); + assertEquals(Permission.VIEW_MEMBERS, result.getPermission()); + } +}