package com.ctrip.framework.apollo.portal.spi.defaultImpl; import com.ctrip.framework.apollo.portal.service.RolePermissionService; import com.google.common.collect.FluentIterable; import com.google.common.collect.Sets; import com.ctrip.framework.apollo.common.entity.BaseEntity; import com.ctrip.framework.apollo.portal.AbstractIntegrationTest; import com.ctrip.framework.apollo.portal.entity.po.Permission; import com.ctrip.framework.apollo.portal.entity.po.Role; import com.ctrip.framework.apollo.portal.entity.po.RolePermission; import com.ctrip.framework.apollo.portal.entity.bo.UserInfo; import com.ctrip.framework.apollo.portal.entity.po.UserRole; import com.ctrip.framework.apollo.portal.repository.PermissionRepository; import com.ctrip.framework.apollo.portal.repository.RolePermissionRepository; import com.ctrip.framework.apollo.portal.repository.RoleRepository; import com.ctrip.framework.apollo.portal.repository.UserRoleRepository; import org.junit.Before; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.jdbc.Sql; import java.util.List; import java.util.Set; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; /** * @author Jason Song(song_s@ctrip.com) */ public class RolePermissionServiceTest extends AbstractIntegrationTest { @Autowired private RolePermissionService rolePermissionService; @Autowired private RoleRepository roleRepository; @Autowired private RolePermissionRepository rolePermissionRepository; @Autowired private UserRoleRepository userRoleRepository; @Autowired private PermissionRepository permissionRepository; private String someCreatedBy; private String someLastModifiedBy; @Before public void setUp() throws Exception { someCreatedBy = "someCreatedBy"; someLastModifiedBy = "someLastModifiedBy"; } @Test @Sql(scripts = "/sql/cleanup.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) public void testCreatePermission() throws Exception { String someTargetId = "someTargetId"; String somePermissionType = "somePermissionType"; Permission somePermission = assemblePermission(somePermissionType, someTargetId); Permission created = rolePermissionService.createPermission(somePermission); Permission createdFromDB = permissionRepository.findOne(created.getId()); assertEquals(somePermissionType, createdFromDB.getPermissionType()); assertEquals(someTargetId, createdFromDB.getTargetId()); } @Test(expected = IllegalStateException.class) @Sql(scripts = "/sql/permission/insert-test-permissions.sql", executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD) @Sql(scripts = "/sql/cleanup.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) public void testCreatePermissionWithPermissionExisted() throws Exception { String someTargetId = "someTargetId"; String somePermissionType = "somePermissionType"; Permission somePermission = assemblePermission(somePermissionType, someTargetId); rolePermissionService.createPermission(somePermission); } @Test @Sql(scripts = "/sql/cleanup.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) public void testCreatePermissions() throws Exception { String someTargetId = "someTargetId"; String anotherTargetId = "anotherTargetId"; String somePermissionType = "somePermissionType"; String anotherPermissionType = "anotherPermissionType"; Permission somePermission = assemblePermission(somePermissionType, someTargetId); Permission anotherPermission = assemblePermission(anotherPermissionType, anotherTargetId); Set<Permission> created = rolePermissionService.createPermissions(Sets.newHashSet(somePermission, anotherPermission)); Set<Long> permissionIds = FluentIterable.from(created).transform(BaseEntity::getId) .toSet(); Iterable<Permission> permissionsFromDB = permissionRepository.findAll(permissionIds); Set<String> targetIds = Sets.newHashSet(); Set<String> permissionTypes = Sets.newHashSet(); for (Permission permission : permissionsFromDB) { targetIds.add(permission.getTargetId()); permissionTypes.add(permission.getPermissionType()); } assertEquals(2, targetIds.size()); assertEquals(2, permissionTypes.size()); assertTrue(targetIds.containsAll(Sets.newHashSet(someTargetId, anotherTargetId))); assertTrue( permissionTypes.containsAll(Sets.newHashSet(somePermissionType, anotherPermissionType))); } @Test(expected = IllegalStateException.class) @Sql(scripts = "/sql/permission/insert-test-permissions.sql", executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD) @Sql(scripts = "/sql/cleanup.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) public void testCreatePermissionsWithPermissionsExisted() throws Exception { String someTargetId = "someTargetId"; String anotherTargetId = "anotherTargetId"; String somePermissionType = "somePermissionType"; String anotherPermissionType = "anotherPermissionType"; Permission somePermission = assemblePermission(somePermissionType, someTargetId); Permission anotherPermission = assemblePermission(anotherPermissionType, anotherTargetId); rolePermissionService.createPermissions(Sets.newHashSet(somePermission, anotherPermission)); } @Test @Sql(scripts = "/sql/permission/insert-test-permissions.sql", executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD) @Sql(scripts = "/sql/cleanup.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) public void testCreateRoleWithPermissions() throws Exception { String someRoleName = "someRoleName"; Role role = assembleRole(someRoleName); Set<Long> permissionIds = Sets.newHashSet(990L, 991L); Role created = rolePermissionService.createRoleWithPermissions(role, permissionIds); Role createdFromDB = roleRepository.findOne(created.getId()); List<RolePermission> rolePermissions = rolePermissionRepository.findByRoleIdIn(Sets.newHashSet(createdFromDB.getId())); Set<Long> rolePermissionIds = FluentIterable.from(rolePermissions) .transform(RolePermission::getPermissionId).toSet(); assertEquals(someRoleName, createdFromDB.getRoleName()); assertEquals(2, rolePermissionIds.size()); assertTrue(rolePermissionIds.containsAll(permissionIds)); } @Test(expected = IllegalStateException.class) @Sql(scripts = "/sql/permission/insert-test-roles.sql", executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD) @Sql(scripts = "/sql/cleanup.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) public void testCreateRoleWithPermissionsWithRoleExisted() throws Exception { String someRoleName = "someRoleName"; Role role = assembleRole(someRoleName); rolePermissionService.createRoleWithPermissions(role, null); } @Test @Sql(scripts = "/sql/permission/insert-test-roles.sql", executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD) @Sql(scripts = "/sql/cleanup.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) public void testAssignRoleToUsers() throws Exception { String someRoleName = "someRoleName"; String someUser = "someUser"; String anotherUser = "anotherUser"; String operator = "operator"; Set<String> users = Sets.newHashSet(someUser, anotherUser); rolePermissionService .assignRoleToUsers(someRoleName, users, operator); List<UserRole> userRoles = userRoleRepository.findByRoleId(990); Set<String> usersWithRole = Sets.newHashSet(); for (UserRole userRole : userRoles) { assertEquals(operator, userRole.getDataChangeCreatedBy()); assertEquals(operator, userRole.getDataChangeLastModifiedBy()); usersWithRole.add(userRole.getUserId()); } assertEquals(2, usersWithRole.size()); assertTrue(usersWithRole.containsAll(users)); } @Test(expected = IllegalStateException.class) @Sql(scripts = "/sql/cleanup.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) public void testAssignRoleToUsersWithRoleNotExists() throws Exception { String someRoleName = "someRoleName"; String someUser = "someUser"; String operator = "operator"; Set<String> users = Sets.newHashSet(someUser); rolePermissionService .assignRoleToUsers(someRoleName, users, operator); } @Test @Sql(scripts = "/sql/permission/insert-test-roles.sql", executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD) @Sql(scripts = "/sql/permission/insert-test-userroles.sql", executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD) @Sql(scripts = "/sql/cleanup.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) public void testAssignRoleToUsersWithUserRolesExisted() throws Exception { String someRoleName = "someRoleName"; String someUser = "someUser"; String anotherUser = "anotherUser"; String operator = "operator"; Set<String> users = Sets.newHashSet(someUser, anotherUser); rolePermissionService .assignRoleToUsers(someRoleName, users, operator); List<UserRole> userRoles = userRoleRepository.findByRoleId(990); Set<String> usersWithRole = Sets.newHashSet(); for (UserRole userRole : userRoles) { assertEquals("someOperator", userRole.getDataChangeCreatedBy()); assertEquals("someOperator", userRole.getDataChangeLastModifiedBy()); usersWithRole.add(userRole.getUserId()); } assertEquals(2, usersWithRole.size()); assertTrue(usersWithRole.containsAll(users)); } @Test @Sql(scripts = "/sql/permission/insert-test-roles.sql", executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD) @Sql(scripts = "/sql/permission/insert-test-userroles.sql", executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD) @Sql(scripts = "/sql/cleanup.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) public void testRemoveRoleFromUsers() throws Exception { String someRoleName = "someRoleName"; String someUser = "someUser"; String anotherUser = "anotherUser"; String operator = "operator"; Set<String> users = Sets.newHashSet(someUser, anotherUser); List<UserRole> userRoles = userRoleRepository.findByRoleId(990); assertFalse(userRoles.isEmpty()); rolePermissionService.removeRoleFromUsers(someRoleName, users, operator); List<UserRole> userRolesAfterRemoval = userRoleRepository.findByRoleId(990); assertTrue(userRolesAfterRemoval.isEmpty()); } @Test(expected = IllegalStateException.class) @Sql(scripts = "/sql/permission/insert-test-userroles.sql", executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD) @Sql(scripts = "/sql/cleanup.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) public void testRemoveRoleFromUsersWithRoleNotExisted() throws Exception { String someRoleName = "someRoleName"; String someUser = "someUser"; String operator = "operator"; Set<String> users = Sets.newHashSet(someUser); rolePermissionService.removeRoleFromUsers(someRoleName, users, operator); } @Test @Sql(scripts = "/sql/permission/insert-test-roles.sql", executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD) @Sql(scripts = "/sql/permission/insert-test-userroles.sql", executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD) @Sql(scripts = "/sql/cleanup.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) public void testQueryUsersWithRole() throws Exception { String someRoleName = "someRoleName"; Set<UserInfo> users = rolePermissionService.queryUsersWithRole(someRoleName); Set<String> userIds = FluentIterable.from(users).transform(UserInfo::getUserId).toSet(); assertTrue(userIds.containsAll(Sets.newHashSet("someUser", "anotherUser"))); } @Test @Sql(scripts = "/sql/permission/insert-test-roles.sql", executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD) @Sql(scripts = "/sql/permission/insert-test-permissions.sql", executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD) @Sql(scripts = "/sql/permission/insert-test-userroles.sql", executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD) @Sql(scripts = "/sql/permission/insert-test-rolepermissions.sql", executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD) @Sql(scripts = "/sql/cleanup.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) public void testUserHasPermission() throws Exception { String someTargetId = "someTargetId"; String anotherTargetId = "anotherTargetId"; String somePermissionType = "somePermissionType"; String anotherPermissionType = "anotherPermissionType"; String someUser = "someUser"; String anotherUser = "anotherUser"; String someUserWithNoPermission = "someUserWithNoPermission"; assertTrue(rolePermissionService.userHasPermission(someUser, somePermissionType, someTargetId)); assertTrue(rolePermissionService.userHasPermission(someUser, anotherPermissionType, anotherTargetId)); assertTrue(rolePermissionService.userHasPermission(anotherUser, somePermissionType, someTargetId)); assertTrue(rolePermissionService.userHasPermission(anotherUser, anotherPermissionType, anotherTargetId)); assertFalse(rolePermissionService.userHasPermission(someUserWithNoPermission, somePermissionType, someTargetId)); assertFalse(rolePermissionService.userHasPermission(someUserWithNoPermission, anotherPermissionType, anotherTargetId)); } private Role assembleRole(String roleName) { Role role = new Role(); role.setRoleName(roleName); role.setDataChangeCreatedBy(someCreatedBy); role.setDataChangeLastModifiedBy(someLastModifiedBy); return role; } private Permission assemblePermission(String permissionType, String targetId) { Permission permission = new Permission(); permission.setPermissionType(permissionType); permission.setTargetId(targetId); permission.setDataChangeCreatedBy(someCreatedBy); permission.setDataChangeLastModifiedBy(someCreatedBy); return permission; } }