/** * This file is part of lavagna. * * lavagna is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * lavagna is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with lavagna. If not, see <http://www.gnu.org/licenses/>. */ package io.lavagna.service; import io.lavagna.config.PersistenceAndServiceConfig; import io.lavagna.model.*; import io.lavagna.service.PermissionService.RoleAndPermissions; import io.lavagna.service.config.TestServiceConfig; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DuplicateKeyException; import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.transaction.annotation.Transactional; import java.util.*; import static org.junit.Assert.*; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = { TestServiceConfig.class, PersistenceAndServiceConfig.class }) @Transactional public class PermissionServiceTest { private static final Role ROLE = new Role("TEST-ROLE"); private static final Role ROLE_2 = new Role("TEST-ROLE-2"); @Autowired private PermissionService permissionService; @Autowired private ProjectService projectService; @Autowired private UserRepository userRepository; private User user1; private User user2; private Project project; private Project project2; private Set<Integer> usersId; private List<User> users; @Before public void prepareUsers() { Helper.createUser(userRepository, "test", "TEST-USER-1"); Helper.createUser(userRepository, "test", "TEST-USER-2"); user1 = userRepository.findUserByName("test", "TEST-USER-1"); user2 = userRepository.findUserByName("test", "TEST-USER-2"); usersId = new HashSet<>(Arrays.asList(user1.getId(), user2.getId())); users = Arrays.asList(user1, user2); projectService.create("test-project-test", "TEST-PRJ", "desc"); project = projectService.findByShortName("TEST-PRJ"); projectService.create("test-project-test-2", "TEST-PR2", "desc"); project2 = projectService.findByShortName("TEST-PR2"); } @Test public void testCreateRole() { Map<String, RoleAndPermissions> l1 = permissionService.findAllRolesAndRelatedPermission(); assertTrue(!l1.containsKey(ROLE.getName())); permissionService.createRole(ROLE); Map<String, RoleAndPermissions> l2 = permissionService.findAllRolesAndRelatedPermission(); assertTrue(l2.containsKey(ROLE.getName())); } @Test public void findByName() { permissionService.createRole(new Role("TEST-DERP-DERP")); assertNotNull(permissionService.findRoleByName("TEST-DERP-DERP")); } @Test(expected = EmptyResultDataAccessException.class) public void findByNameNotFound() { permissionService.findRoleByName("TEST-DERP-DERP"); } @Test public void findByNameInProject() { permissionService.createRoleInProjectId(new Role("TEST-DERP-DERP"), project.getId()); assertNotNull(permissionService.findRoleInProjectByName(project.getId(), "TEST-DERP-DERP")); } @Test(expected = EmptyResultDataAccessException.class) public void findByNameNotFoundInProject() { permissionService.findRoleInProjectByName(project.getId(), "TEST-DERP-DERP"); } @Test public void testCreateRoleForProject() { Map<String, RoleAndPermissions> l1 = permissionService.findAllRolesAndRelatedPermissionInProjectId(project .getId()); assertTrue(!l1.containsKey(ROLE.getName())); permissionService.createRoleInProjectId(ROLE, project.getId()); Map<String, RoleAndPermissions> l2 = permissionService.findAllRolesAndRelatedPermissionInProjectId(project .getId()); assertTrue(l2.containsKey(ROLE.getName())); } @Test(expected = DuplicateKeyException.class) public void testCreateDuplicateRole() { permissionService.createRole(ROLE); permissionService.createRole(ROLE); } @Test(expected = DuplicateKeyException.class) public void testCreateDuplicateRoleForProject() { permissionService.createRoleInProjectId(ROLE, project.getId()); permissionService.createRoleInProjectId(ROLE, project.getId()); } @Test public void testDeleteRole() { permissionService.createRole(ROLE); Map<String, RoleAndPermissions> l1 = permissionService.findAllRolesAndRelatedPermission(); assertTrue(l1.containsKey(ROLE.getName())); permissionService.deleteRole(ROLE); Map<String, RoleAndPermissions> l2 = permissionService.findAllRolesAndRelatedPermission(); assertTrue(!l2.containsKey(ROLE.getName())); } @Test public void testDeleteRoleInProject() { permissionService.createRoleInProjectId(ROLE, project.getId()); Map<String, RoleAndPermissions> l1 = permissionService.findAllRolesAndRelatedPermissionInProjectId(project .getId()); assertTrue(l1.containsKey(ROLE.getName())); permissionService.deleteRoleInProjectId(ROLE, project.getId()); Map<String, RoleAndPermissions> l2 = permissionService.findAllRolesAndRelatedPermissionInProjectId(project .getId()); assertTrue(!l2.containsKey(ROLE.getName())); } @Test public void testDeleteNotExistingRole() { assertEquals(0, permissionService.deleteRole(ROLE)); } @Test public void testDeleteNotExistingRoleInProject() { assertEquals(0, permissionService.deleteRoleInProjectId(ROLE, project.getId())); } @Test public void testAddPermissionsToRole() { Role role = ROLE; permissionService.createRole(role); assertTrue(permissionsForRole(permissionService.findAllRolesAndRelatedPermission(), ROLE).isEmpty()); Set<Permission> perms = EnumSet .of(Permission.ADMINISTRATION, Permission.PROJECT_ADMINISTRATION, Permission.CREATE_COLUMN); permissionService.updatePermissionsToRole(role, perms); assertEquals(perms, permissionsForRole(permissionService.findAllRolesAndRelatedPermission(), ROLE)); Set<Permission> permsUpdated = EnumSet.of(Permission.RENAME_COLUMN); permissionService.updatePermissionsToRole(role, permsUpdated); assertEquals(permsUpdated, permissionsForRole(permissionService.findAllRolesAndRelatedPermission(), ROLE)); } @Test public void testAddPermissionsToRoleInProject() { Role role = ROLE; permissionService.createRoleInProjectId(role, project.getId()); assertTrue(permissionsForRole(permissionService.findAllRolesAndRelatedPermissionInProjectId(project.getId()), ROLE).isEmpty()); Set<Permission> perms = EnumSet.of(Permission.PROJECT_ADMINISTRATION, Permission.CREATE_COLUMN); permissionService.updatePermissionsToRoleInProjectId(role, perms, project.getId()); assertEquals( perms, permissionsForRole(permissionService.findAllRolesAndRelatedPermissionInProjectId(project.getId()), ROLE)); Set<Permission> permsUpdated = EnumSet.of(Permission.RENAME_COLUMN); permissionService.updatePermissionsToRoleInProjectId(role, permsUpdated, project.getId()); assertEquals( permsUpdated, permissionsForRole(permissionService.findAllRolesAndRelatedPermissionInProjectId(project.getId()), ROLE)); } @Test public void testAddRoleToUser() { assertTrue(permissionService.findBaseRoleAndPermissionByUserId(user1.getId()).isEmpty()); assertTrue(permissionService.findBaseRoleAndPermissionByUserId(user2.getId()).isEmpty()); permissionService.createRole(ROLE); permissionService.assignRoleToUsers(ROLE, usersId); assertEquals(1, permissionService.findBaseRoleAndPermissionByUserId(user1.getId()).size()); assertEquals(1, permissionService.findBaseRoleAndPermissionByUserId(user2.getId()).size()); } @Test public void testFindUserRolesByProjectOnGlobal() { permissionService.createRole(ROLE); PermissionService.ProjectRoleFullHolder roles = permissionService.findUserRolesByProject(user1.getId()); assertEquals(0, roles.getGlobalRoles().size()); permissionService.assignRoleToUsers(ROLE, usersId); roles = permissionService.findUserRolesByProject(user1.getId()); assertEquals(1, roles.getGlobalRoles().size()); } @Test public void testFindUserRolesByProjectOnProject() { permissionService.createRoleInProjectId(ROLE, project.getId()); PermissionService.ProjectRoleFullHolder roles = permissionService.findUserRolesByProject(user1.getId()); assertEquals(0, roles.getRolesByProject().size()); permissionService.assignRoleToUsersInProjectId(ROLE, usersId, project.getId()); roles = permissionService.findUserRolesByProject(user1.getId()); assertEquals(1, roles.getRolesByProject().size()); assertEquals(1, roles.getRolesByProject().get(project.getName()).size()); } @Test public void testAddRoleToUserInProject() { assertTrue( permissionService.findRoleAndPermissionByUserIdInProjectId(user1.getId(), project.getId()).isEmpty()); assertTrue( permissionService.findRoleAndPermissionByUserIdInProjectId(user2.getId(), project.getId()).isEmpty()); permissionService.createRoleInProjectId(ROLE, project.getId()); permissionService.assignRoleToUsersInProjectId(ROLE, usersId, project.getId()); assertEquals(1, permissionService.findRoleAndPermissionByUserIdInProjectId(user1.getId(), project.getId()) .size()); assertEquals(1, permissionService.findRoleAndPermissionByUserIdInProjectId(user2.getId(), project.getId()) .size()); } @Test(expected = DuplicateKeyException.class) public void testAddDuplicateRoleToUser() { permissionService.createRole(ROLE); permissionService.assignRoleToUsers(ROLE, usersId); permissionService.assignRoleToUsers(ROLE, usersId); } @Test(expected = DuplicateKeyException.class) public void testAddDuplicateRoleToUserInProject() { permissionService.createRoleInProjectId(ROLE, project.getId()); permissionService.assignRoleToUsersInProjectId(ROLE, usersId, project.getId()); permissionService.assignRoleToUsersInProjectId(ROLE, usersId, project.getId()); } @Test public void testRemoveRoleToUser() { permissionService.createRole(ROLE); permissionService.assignRoleToUsers(ROLE, usersId); assertEquals(1, permissionService.findBaseRoleAndPermissionByUserId(user1.getId()).size()); assertEquals(1, permissionService.findBaseRoleAndPermissionByUserId(user2.getId()).size()); permissionService.removeRoleToUsers(ROLE, usersId); assertTrue(permissionService.findBaseRoleAndPermissionByUserId(user1.getId()).isEmpty()); assertTrue(permissionService.findBaseRoleAndPermissionByUserId(user2.getId()).isEmpty()); } @Test public void testRemoveRoleToUserInProject() { permissionService.createRoleInProjectId(ROLE, project.getId()); permissionService.assignRoleToUsersInProjectId(ROLE, usersId, project.getId()); assertEquals(1, permissionService.findRoleAndPermissionByUserIdInProjectId(user1.getId(), project.getId()) .size()); assertEquals(1, permissionService.findRoleAndPermissionByUserIdInProjectId(user2.getId(), project.getId()) .size()); permissionService.removeRoleToUsersInProjectId(ROLE, usersId, project.getId()); assertTrue( permissionService.findRoleAndPermissionByUserIdInProjectId(user1.getId(), project.getId()).isEmpty()); assertTrue( permissionService.findRoleAndPermissionByUserIdInProjectId(user2.getId(), project.getId()).isEmpty()); } @Test public void testFindBasePermissionByUsername() { assertTrue(permissionService.findBasePermissionByUserId(user1.getId()).isEmpty()); permissionService.createRole(ROLE); permissionService.assignRoleToUsers(ROLE, usersId); Set<Permission> perms = EnumSet .of(Permission.ADMINISTRATION, Permission.PROJECT_ADMINISTRATION, Permission.CREATE_COLUMN); permissionService.updatePermissionsToRole(ROLE, perms); assertEquals(perms, permissionService.findBasePermissionByUserId(user1.getId())); } @Test public void testFindPermissionByUsernameInProject() { assertTrue(permissionService.findPermissionByUsernameInProjectId(user1.getId(), project.getId()).isEmpty()); permissionService.createRoleInProjectId(ROLE, project.getId()); permissionService.assignRoleToUsersInProjectId(ROLE, usersId, project.getId()); Set<Permission> perms = EnumSet.of(Permission.PROJECT_ADMINISTRATION, Permission.CREATE_COLUMN); permissionService.updatePermissionsToRoleInProjectId(ROLE, perms, project.getId()); assertEquals(perms, permissionService.findPermissionByUsernameInProjectId(user1.getId(), project.getId())); } @Test public void testFindUsersByRole() { permissionService.createRole(ROLE); assertTrue(permissionService.findUserByRole(ROLE).isEmpty()); permissionService.assignRoleToUsers(ROLE, usersId); assertEquals(users, permissionService.findUserByRole(ROLE)); } @Test public void testFindUsersByRoleInProject() { permissionService.createRoleInProjectId(ROLE, project.getId()); permissionService.createRoleInProjectId(ROLE_2, project.getId()); assertTrue(permissionService.findUserByRoleAndProjectId(ROLE, project.getId()).isEmpty()); permissionService.assignRoleToUsersInProjectId(ROLE, usersId, project.getId()); permissionService.assignRoleToUsersInProjectId(ROLE_2, usersId, project.getId()); assertEquals(users, permissionService.findUserByRoleAndProjectId(ROLE, project.getId())); } @Test public void testPermissionsGroupedByProjectIdForUsername() { assertTrue(permissionService.findPermissionsGroupedByProjectForUserId(user1.getId()).getPermissionsByProject() .isEmpty()); permissionService.createRoleInProjectId(ROLE, project.getId()); permissionService.assignRoleToUsersInProjectId(ROLE, usersId, project.getId()); permissionService.createRoleInProjectId(ROLE, project2.getId()); permissionService.assignRoleToUsersInProjectId(ROLE, usersId, project2.getId()); assertTrue(permissionService.findPermissionsGroupedByProjectForUserId(user1.getId()).getPermissionsByProject() .isEmpty()); Set<Permission> permsProject1 = EnumSet.of(Permission.PROJECT_ADMINISTRATION, Permission.CREATE_COLUMN); permissionService.updatePermissionsToRoleInProjectId(ROLE, permsProject1, project.getId()); assertEquals(1, permissionService.findPermissionsGroupedByProjectForUserId(user1.getId()) .getPermissionsByProject().size()); assertEquals(permsProject1, permissionService.findPermissionsGroupedByProjectForUserId(user1.getId()) .getPermissionsByProject().get(project.getShortName())); Set<Permission> permsProject2 = EnumSet.of(Permission.READ); permissionService.updatePermissionsToRoleInProjectId(ROLE, permsProject2, project2.getId()); assertEquals(2, permissionService.findPermissionsGroupedByProjectForUserId(user1.getId()) .getPermissionsByProject().size()); assertEquals(permsProject2, permissionService.findPermissionsGroupedByProjectForUserId(user1.getId()) .getPermissionsByProject().get(project2.getShortName())); } private static Set<Permission> permissionsForRole(Map<String, RoleAndPermissions> l, Role role) { Set<Permission> perms = new HashSet<>(); if (l.containsKey(role.getName())) { for (RoleAndPermission rap : l.get(role.getName()).getRoleAndPermissions()) { perms.add(rap.getPermission()); } } return perms; } }