Java tutorial
/* * Copyright (C) 2016 FormKiQ Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.formkiq.core.service; import static org.easymock.EasyMock.capture; import static org.easymock.EasyMock.expect; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.util.Date; import java.util.UUID; import org.apache.commons.lang3.time.DateUtils; import org.easymock.Capture; import org.easymock.EasyMock; import org.easymock.EasyMockRunner; import org.easymock.EasyMockSupport; import org.easymock.Mock; import org.easymock.TestSubject; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.test.util.ReflectionTestUtils; import org.springframework.util.StringUtils; import com.formkiq.core.dao.UserDao; import com.formkiq.core.domain.User; import com.formkiq.core.domain.type.UserDTO; import com.formkiq.core.domain.type.UserListDTO; import com.formkiq.core.domain.type.UserRole; import com.formkiq.core.domain.type.UserStatus; import com.formkiq.core.util.DateService; /** * UserServiceImplTest. * */ @RunWith(EasyMockRunner.class) public class UserServiceImplTest extends EasyMockSupport { /** TestSubject. */ @TestSubject private UserServiceImpl service = new UserServiceImpl(); /** Mock. */ @Mock private DateService dateService; /** Mock. */ @Mock private FolderService folderService; /** SpringSecurityService. */ @Mock private SpringSecurityService securityService; /** SystemPropertyService. */ @Mock private SystemPropertyService systemPropertyService; /** Mock. */ @Mock private User user; /** Mock. */ @Mock private UserDao userDao; /** Capture<User>. */ private Capture<User> capture = EasyMock.<User>newCapture(); /** * Before. */ @Before public void before() { ReflectionTestUtils.setField(this.service, "passwordEncoder", new BCryptPasswordEncoder()); } /** * testCreateUser01(). */ @SuppressWarnings("boxing") @Test public void testCreateUser01() { // given String clientid = "acme"; String email = "email@formkiq.com"; String password = "pass"; UserStatus status = UserStatus.ACTIVE; UserRole role = UserRole.ROLE_USER; String loginToken = null; User u = new User(); // when expect(this.securityService.isAdmin()).andReturn(Boolean.FALSE); expect(this.systemPropertyService.isInviteOnly()).andReturn(false); expect(this.userDao.findUser(email)).andReturn(null); expect(this.userDao.saveUser(capture(this.capture))).andReturn(u); replayAll(); User result = this.service.createUser(clientid, email, password, status, role, loginToken); // then verifyAll(); assertNotNull(result); assertNotEquals(password, u.getPassword()); } /** * testCreateUser02(). * invalid email */ @SuppressWarnings("boxing") @Test public void testCreateUser02() { // given String clientid = "acme"; String email = "email"; String password = "pass"; UserStatus status = UserStatus.ACTIVE; UserRole role = UserRole.ROLE_USER; String loginToken = null; // when expect(this.securityService.isAdmin()).andReturn(Boolean.FALSE); expect(this.systemPropertyService.isInviteOnly()).andReturn(false); replayAll(); try { this.service.createUser(clientid, email, password, status, role, loginToken); } catch (PreconditionFailedException e) { // then verifyAll(); assertEquals("Invalid Email email", e.getMessage()); } } /** * testCreateUser03(). * missing password */ @SuppressWarnings("boxing") @Test public void testCreateUser03() { // given String clientid = "acme"; String email = "email@formkiq.com"; String password = null; UserStatus status = UserStatus.ACTIVE; UserRole role = UserRole.ROLE_USER; String loginToken = null; // when expect(this.securityService.isAdmin()).andReturn(Boolean.FALSE); expect(this.systemPropertyService.isInviteOnly()).andReturn(false); replayAll(); try { this.service.createUser(clientid, email, password, status, role, loginToken); } catch (PreconditionFailedException e) { // then verifyAll(); assertEquals("Password required", e.getMessage()); } } /** * testCreateUser04(). * missing status */ @SuppressWarnings("boxing") @Test public void testCreateUser04() { // given String clientid = "acme"; String email = "email@formkiq.com"; String password = "ASD"; UserStatus status = null; UserRole role = UserRole.ROLE_USER; String loginToken = null; // when expect(this.securityService.isAdmin()).andReturn(Boolean.FALSE); expect(this.systemPropertyService.isInviteOnly()).andReturn(false); replayAll(); try { this.service.createUser(clientid, email, password, status, role, loginToken); } catch (PreconditionFailedException e) { // then verifyAll(); assertEquals("UserStatus required", e.getMessage()); } } /** * testCreateUser05(). * missing role */ @SuppressWarnings("boxing") @Test public void testCreateUser05() { // given String clientid = "acme"; String email = "email@formkiq.com"; String password = "ASD"; UserStatus status = UserStatus.ACTIVE; UserRole role = null; String loginToken = null; // when expect(this.securityService.isAdmin()).andReturn(Boolean.FALSE); expect(this.systemPropertyService.isInviteOnly()).andReturn(false); replayAll(); try { this.service.createUser(clientid, email, password, status, role, loginToken); } catch (PreconditionFailedException e) { // then verifyAll(); assertEquals("UserRole required", e.getMessage()); } } /** * testCreateUser06(). * missing permissions */ @SuppressWarnings("boxing") @Test public void testCreateUser06() { // given User u = null; String clientid = "acme"; String email = "email@formkiq.com"; String password = "ASD"; UserStatus status = UserStatus.ACTIVE; UserRole role = UserRole.ROLE_ADMIN; String loginToken = null; // when expect(this.securityService.isAdmin()).andReturn(Boolean.FALSE); expect(this.userDao.findUser(email)).andReturn(u); expect(this.systemPropertyService.isInviteOnly()).andReturn(false); expect(this.userDao.saveUser(capture(this.capture))).andReturn(u); expect(this.folderService.saveFolder(u, null, email)).andReturn(null); replayAll(); try { this.service.createUser(clientid, email, password, status, role, loginToken); } catch (PreconditionFailedException e) { // then verifyAll(); assertEquals("UserPermission required", e.getMessage()); } } /** * testCreateUser07(). * email already registered */ @SuppressWarnings("boxing") @Test public void testCreateUser07() { // given User u = new User(); String clientid = "acme"; String email = "email@formkiq.com"; String password = "ASD"; UserStatus status = UserStatus.ACTIVE; UserRole role = UserRole.ROLE_ADMIN; String loginToken = null; // when expect(this.securityService.isAdmin()).andReturn(Boolean.FALSE); expect(this.systemPropertyService.isInviteOnly()).andReturn(false); expect(this.userDao.findUser(email)).andReturn(u); replayAll(); try { this.service.createUser(clientid, email, password, status, role, loginToken); } catch (PreconditionFailedException e) { // then verifyAll(); assertEquals("Email already registered", e.getMessage()); } } /** * testDeleteUser01(). * null */ @Test public void testDeleteUser01() { // given String email = null; // when replayAll(); try { this.service.deleteUser(email); fail(); } catch (Exception e) { // then verifyAll(); assertEquals("Invalid Email", e.getMessage()); } } /** * testDeleteUser02(). * user not found */ @Test public void testDeleteUser02() { // given User u = null; String email = "test"; // when expect(this.userDao.findUser(email)).andReturn(u); replayAll(); try { this.service.deleteUser(email); fail(); } catch (Exception e) { // then verifyAll(); assertEquals("Email test not found", e.getMessage()); } } /** * testDeleteUser03(). * only 1 user */ @SuppressWarnings("boxing") @Test public void testDeleteUser03() { // given final int usercount = 1; User u = new User(); u.setRole(UserRole.ROLE_ADMIN); String email = "test"; // when expect(this.userDao.findUser(email)).andReturn(u); expect(this.userDao.getAdminUserCount()).andReturn(usercount); replayAll(); try { this.service.deleteUser(email); fail(); } catch (Exception e) { // then verifyAll(); assertEquals("Cannot delete, only admin", e.getMessage()); } } /** * testDeleteUser04(). * more than 1 admin */ @SuppressWarnings("boxing") @Test public void testDeleteUser04() { // given final int usercount = 5; User u = new User(); u.setRole(UserRole.ROLE_ADMIN); String email = "test"; // when expect(this.userDao.findUser(email)).andReturn(u); expect(this.userDao.getAdminUserCount()).andReturn(usercount); this.userDao.deleteUser(u); replayAll(); this.service.deleteUser(email); // then verifyAll(); } /** * testDeleteUser05(). * delete normal user 1 admin */ @Test public void testDeleteUser05() { // given User u = new User(); u.setRole(UserRole.ROLE_USER); String email = "test"; // when expect(this.userDao.findUser(email)).andReturn(u); this.userDao.deleteUser(u); replayAll(); this.service.deleteUser(email); // then verifyAll(); } /** * testFindActiveUser01(). */ @Test public void testFindActiveUser01() { // given String email = "test@"; String pass = "pass"; UUID userid = UUID.randomUUID(); User u = new User(); u.setUserid(userid); u.setStatus(UserStatus.ACTIVE); String generatedSecuredPasswordHash = this.service.generatedSecuredPasswordHash(pass); u.setPassword(generatedSecuredPasswordHash); // when expect(this.userDao.findUser(email)).andReturn(u); replayAll(); UserDetails result = this.service.findActiveUser(email, pass); // then verifyAll(); assertEquals(result, u); } /** * testFindActiveUser02(). * * wrong password */ @Test(expected = AuthenticationFailureException.class) public void testFindActiveUser02() { // given String email = "test@"; String pass = "pass"; User u = new User(); u.setStatus(UserStatus.ACTIVE); String pwHash = this.service.generatedSecuredPasswordHash(pass + "1"); u.setPassword(pwHash); // when expect(this.userDao.findUser(email)).andReturn(u); replayAll(); try { this.service.findActiveUser(email, pass); } finally { // then verifyAll(); } } /** * testFindActiveUser03(). * * inactive user */ @Test(expected = AuthenticationFailureException.class) public void testFindActiveUser03() { // given String email = "test@"; String pass = "pass"; User u = new User(); u.setStatus(UserStatus.INVITE); // when expect(this.userDao.findUser(email)).andReturn(u); replayAll(); try { this.service.findActiveUser(email, pass); } finally { // then verifyAll(); } } /** * testFindActiveUser04(). * null user */ @Test(expected = AuthenticationFailureException.class) public void testFindActiveUser04() { // given String email = "test@"; String pass = "pass"; User u = null; // when expect(this.userDao.findUser(email)).andReturn(u); replayAll(); try { this.service.findActiveUser(email, pass); } finally { // then verifyAll(); } } /** * testFindActiveUser05(). * null email */ @Test(expected = AuthenticationFailureException.class) public void testFindActiveUser05() { // given String email = null; String pass = "pass"; // when replayAll(); try { this.service.findActiveUser(email, pass); } finally { // then verifyAll(); } } /** * testFindActiveUser06(). * null password */ @Test(expected = AuthenticationFailureException.class) public void testFindActiveUser06() { // given String email = "email"; String pass = null; // when replayAll(); UserDetails result = this.service.findActiveUser(email, pass); // then verifyAll(); assertNull(result); } /** * testFindUser01(). */ @Test public void testFindUser01() { // given String email = "test"; UserDTO u = new UserDTO(); u.setPassword("asdasd"); // when expect(this.userDao.findUserDTO(email)).andReturn(u); replayAll(); UserDTO result = this.service.findUser(email, false); // then verifyAll(); assertNotNull(result); assertNull(u.getPassword()); } /** * testFindUser02(). * null email */ @Test(expected = AuthenticationFailureException.class) public void testFindUser02() { // given String email = null; // when replayAll(); try { this.service.findUser(email, false); } finally { // then verifyAll(); } } /** * testFindUsers01(). */ @Test public void testFindUsers01() { // given String token = null; String text = null; UserListDTO dto = new UserListDTO(); // when expect(this.userDao.findUsers(null, null)).andReturn(dto); replayAll(); UserListDTO result = this.service.findUsers(token, text); // then verifyAll(); assertEquals(dto, result); } /** * testGenerateResetToken01(). */ @Test public void testGenerateResetToken01() { // given String email = "ASD"; Date date = new Date(); User u = new User(); u.setStatus(UserStatus.ACTIVE); // when expect(this.dateService.now()).andReturn(date); expect(this.userDao.findUser(email)).andReturn(u); expect(this.userDao.saveUser(u)).andReturn(u); replayAll(); this.service.generateResetToken(email); // then verifyAll(); assertFalse(StringUtils.isEmpty(u.getResetToken())); assertEquals(date, u.getResetInsertedDate()); } /** * testGenerateSecurityToken01(). */ @Test public void testGenerateSecurityToken01() { // given // when replayAll(); String result = this.service.generateSecurityToken(); // then verifyAll(); assertNotNull(result); assertFalse(result.contains("-")); } /** * testSaveUser01(). * Save new user */ @SuppressWarnings("boxing") @Test public void testSaveUser01() { // given String clientid = "acme"; String email = "test@formkiq.com"; String password = "sample"; UserRole role = UserRole.ROLE_ADMIN; UserStatus status = UserStatus.ACTIVE; String loginToken = null; // when expect(this.securityService.isAdmin()).andReturn(Boolean.FALSE); expect(this.systemPropertyService.isInviteOnly()).andReturn(false); expect(this.userDao.findUser(email)).andReturn(null).times(2); expect(this.userDao.saveUser(capture(this.capture))).andReturn(this.user); replayAll(); User result = this.service.saveUser(clientid, email, password, role, status, loginToken); // then verifyAll(); assertEquals(this.user, result); assertNull(this.capture.getValue().getUserid()); assertEquals(email, this.capture.getValue().getEmail()); assertEquals(status, this.capture.getValue().getStatus()); assertEquals(role, this.capture.getValue().getRole()); assertNotEquals(password, this.capture.getValue().getPassword()); } /** * testSaveUser02(). * update existing user */ @Test public void testSaveUser02() { // given String clientid = "acme"; String email = "test@formkiq.com"; String password = "sample"; UserRole role = UserRole.ROLE_ADMIN; UserStatus status = UserStatus.ACTIVE; UUID userid = UUID.randomUUID(); String loginToken = null; User u = new User(); u.setUserid(userid); u.setEmail(email); u.setStatus(UserStatus.DISABLE); u.setRole(UserRole.ROLE_USER); // when expect(this.userDao.findUser(email)).andReturn(u); expect(this.userDao.saveUser(capture(this.capture))).andReturn(u); replayAll(); User result = this.service.saveUser(clientid, email, password, role, status, loginToken); // then verifyAll(); assertEquals(result, this.capture.getValue()); assertEquals(userid, this.capture.getValue().getUserid()); assertEquals(email, this.capture.getValue().getEmail()); assertEquals(status, this.capture.getValue().getStatus()); assertEquals(role, this.capture.getValue().getRole()); assertNotEquals(password, this.capture.getValue().getPassword()); } /** * testSaveUser03(). * Add client to existing user */ @Test public void testSaveUser03() { // given String clientid = "acme"; String email = "test@formkiq.com"; String password = "sample"; UserRole role = UserRole.ROLE_ADMIN; UserStatus status = UserStatus.ACTIVE; String loginToken = null; User u = new User(); // when expect(this.userDao.findUser(email)).andReturn(u); expect(this.userDao.saveUser(capture(this.capture))).andReturn(u); replayAll(); User result = this.service.saveUser(clientid, email, password, role, status, loginToken); // then verifyAll(); assertEquals(result, this.capture.getValue()); assertNull(this.capture.getValue().getUserid()); } /** * testSaveUser01(). * Update User with Null Client && Null Password */ @Test public void testSaveUser04() { // given String clientid = "acme"; String email = "test@formkiq.com"; String password = null; UserRole role = UserRole.ROLE_ADMIN; UserStatus status = UserStatus.ACTIVE; String loginToken = null; User u = new User(); // when expect(this.userDao.findUser(email)).andReturn(u); expect(this.userDao.saveUser(capture(this.capture))).andReturn(u); replayAll(); User result = this.service.saveUser(clientid, email, password, role, status, loginToken); // then verifyAll(); assertEquals(result, this.capture.getValue()); assertNull(this.capture.getValue().getUserid()); assertEquals(role, this.capture.getValue().getRole()); assertEquals(status, this.capture.getValue().getStatus()); } /** * testUpdateLastLogin01(). */ @Test public void testUpdateLastLogin01() { // given String email = "test"; Date date = new Date(); // when this.userDao.updateLastLogin(email, date); replayAll(); this.service.updateLastLogin(email, date); // then verifyAll(); } /** * testUpdateLastUserAgent01(). * update user agent */ @Test public void testUpdateLastUserAgent01() { // given String email = "test"; String useragent = "agent"; // when expect(this.securityService.getUserDetails()).andReturn(this.user); expect(this.user.getLastUserAgent()).andReturn(null); this.userDao.updateLastUserAgent(email, useragent); replayAll(); this.service.updateLastUserAgent(email, useragent); // then verifyAll(); } /** * testUpdateLastUserAgent02(). * NULL user agent */ @Test public void testUpdateLastUserAgent02() { // given String email = "test"; String useragent = null; // when replayAll(); this.service.updateLastUserAgent(email, useragent); // then verifyAll(); } /** * testUpdateLastUserAgent03(). * duplicate user agent */ @Test public void testUpdateLastUserAgent03() { // given String email = "test"; String useragent = "agent"; // when expect(this.securityService.getUserDetails()).andReturn(this.user); expect(this.user.getLastUserAgent()).andReturn(useragent); replayAll(); this.service.updateLastUserAgent(email, useragent); // then verifyAll(); } /** * testUpdatePassword01(). */ @Test public void testUpdatePassword01() { // given String email = "me@formkiq.com"; Date now = new Date(); String newPassword = "new"; String resettoken = "old"; String resetTokenHash = this.service.generatedSecuredPasswordHash(resettoken); User u = new User(); u.setResetInsertedDate(now); u.setResetToken(resetTokenHash); u.setStatus(UserStatus.ACTIVE); // when expect(this.userDao.findUser(email)).andReturn(u); expect(this.dateService.now()).andReturn(now); expect(this.userDao.saveUser(u)).andReturn(u); replayAll(); this.service.updatePassword(email, resettoken, newPassword); // then verifyAll(); assertNotNull(u.getPassword()); assertNotEquals(newPassword, u.getPassword()); assertNotEquals(resettoken, u.getPassword()); assertNull(u.getResetInsertedDate()); assertTrue(StringUtils.isEmpty(u.getResetToken())); } /** * testUpdatePassword02(). * user no reset tokens */ @Test public void testUpdatePassword02() { // given String email = "me@formkiq.com"; User u = new User(); String newPassword = "new"; String resettoken = "old"; // when expect(this.userDao.findUser(email)).andReturn(u); replayAll(); try { this.service.updatePassword(email, resettoken, newPassword); fail(); } catch (Exception e) { // then verifyAll(); assertEquals("Invalid Old Password or Reset Token", e.getMessage()); } } /** * testUpdatePassword03(). * null reset token */ @Test public void testUpdatePassword03() { // given String email = "me@formkiq.com"; String newPassword = "new"; String resettoken = null; // when replayAll(); try { this.service.updatePassword(email, resettoken, newPassword); fail(); } catch (Exception e) { // then verifyAll(); } } /** * testUpdatePassword04(). * ResetToken is expired */ @Test public void testUpdatePassword04() { // given String email = "me@formkiq.com"; final int resetInsertDate = 25; Date now = new Date(); String newPassword = "new"; String resettoken = "old"; String resetToken = this.service.generatedSecuredPasswordHash(resettoken); // when expect(this.user.getResetToken()).andReturn(resetToken); expect(this.user.getResetInsertedDate()).andReturn(DateUtils.addHours(now, -resetInsertDate)); expect(this.userDao.findUser(email)).andReturn(this.user); expect(this.dateService.now()).andReturn(now); replayAll(); try { this.service.updatePassword(email, resettoken, newPassword); fail(); } catch (Exception e) { // then verifyAll(); assertEquals("Invalid Old Password or Reset Token", e.getMessage()); } } /** * testUpdatePassword05(). * user not found */ @Test public void testUpdatePassword05() { // given String email = "me@formkiq.com"; String newPassword = "new"; String resettoken = "old"; // when expect(this.userDao.findUser(email)).andReturn(null); replayAll(); try { this.service.updatePassword(email, resettoken, newPassword); fail(); } catch (Exception e) { // then verifyAll(); assertEquals("Invalid Old Password or Reset Token", e.getMessage()); } } }