package com.devicehive.service;
/*
* #%L
* DeviceHive Java Server Common business logic
* %%
* Copyright (C) 2016 DataArt
* %%
* 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.
* #L%
*/
import com.devicehive.base.AbstractResourceTest;
import com.devicehive.base.RequestDispatcherProxy;
import com.devicehive.model.rpc.ListUserRequest;
import com.devicehive.model.rpc.ListUserResponse;
import com.devicehive.service.configuration.ConfigurationService;
import com.devicehive.configuration.Constants;
import com.devicehive.configuration.Messages;
import com.devicehive.dao.UserDao;
import com.devicehive.exceptions.ActionNotAllowedException;
import com.devicehive.exceptions.IllegalParametersException;
import com.devicehive.model.enums.UserRole;
import com.devicehive.model.enums.UserStatus;
import com.devicehive.model.updates.DeviceClassUpdate;
import com.devicehive.model.updates.DeviceUpdate;
import com.devicehive.model.updates.UserUpdate;
import com.devicehive.shim.api.Request;
import com.devicehive.shim.api.Response;
import com.devicehive.shim.api.server.RequestHandler;
import com.devicehive.vo.NetworkVO;
import com.devicehive.vo.UserVO;
import com.devicehive.vo.UserWithNetworkVO;
import org.apache.commons.lang3.RandomStringUtils;
import org.hamcrest.CustomTypeSafeMatcher;
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.AccessDeniedException;
import org.springframework.test.annotation.DirtiesContext;
import java.sql.Timestamp;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import static java.util.UUID.randomUUID;
import static org.hamcrest.Matchers.*;
import static org.junit.Assert.*;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.mockito.Matchers.any;
public class UserServiceTest extends AbstractResourceTest {
@Autowired
private UserService userService;
@Autowired
private NetworkService networkService;
@Autowired
private UserDao userDao;
@Autowired
private ConfigurationService configurationService;
@Autowired
private DeviceService deviceService;
@Autowired
private RequestDispatcherProxy requestDispatcherProxy;
@Mock
private RequestHandler requestHandler;
private ArgumentCaptor<Request> argument = ArgumentCaptor.forClass(Request.class);
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
requestDispatcherProxy.setRequestHandler(requestHandler);
}
@After
public void tearDown() {
Mockito.reset(requestHandler);
}
@Rule
public ExpectedException expectedException = ExpectedException.none();
@Test
public void should_throw_NoSuchElementException_if_user_is_null_when_assign_network() throws Exception {
NetworkVO network = new NetworkVO();
String networkName = RandomStringUtils.randomAlphabetic(10);
network.setName(networkName);
NetworkVO created = networkService.create(network);
assertThat(created, notNullValue());
assertThat(created.getId(), notNullValue());
expectedException.expect(NoSuchElementException.class);
expectedException.expectMessage(Messages.USER_NOT_FOUND);
userService.assignNetwork(-1L, created.getId());
}
@Test
public void should_throw_NoSuchElementException_if_network_is_null_when_assign_network() throws Exception {
UserVO user = new UserVO();
user.setLogin(RandomStringUtils.randomAlphabetic(10));
user = userService.createUser(user, "123");
assertThat(user, notNullValue());
assertThat(user.getId(), notNullValue());
expectedException.expect(NoSuchElementException.class);
expectedException.expectMessage(String.format(Messages.NETWORK_NOT_FOUND, -1));
userService.assignNetwork(user.getId(), -1L);
}
@Test
public void should_assign_network_to_user() throws Exception {
UserVO user = new UserVO();
user.setLogin(RandomStringUtils.randomAlphabetic(10));
user = userService.createUser(user, "123");
assertThat(user, notNullValue());
assertThat(user.getId(), notNullValue());
NetworkVO network = new NetworkVO();
network.setName(RandomStringUtils.randomAlphabetic(10));
NetworkVO first = networkService.create(network);
assertThat(first, notNullValue());
assertThat(first.getId(), notNullValue());
userService.assignNetwork(user.getId(), first.getId());
UserWithNetworkVO user1 = userService.findUserWithNetworks(user.getId());
assertThat(user1.getNetworks(), notNullValue());
assertThat(user1.getNetworks(), hasSize(1));
assertThat(user1.getNetworks(), hasItem(new CustomTypeSafeMatcher<NetworkVO>("expect network") {
@Override
protected boolean matchesSafely(NetworkVO item) {
return first.getId().equals(item.getId()) && first.getName().equals(item.getName());
}
}));
network = new NetworkVO();
network.setName(RandomStringUtils.randomAlphabetic(10));
NetworkVO second = networkService.create(network);
assertThat(second, notNullValue());
assertThat(second.getId(), notNullValue());
userService.assignNetwork(user.getId(), second.getId());
user1 = userService.findUserWithNetworks(user.getId());
assertThat(user1.getNetworks(), notNullValue());
assertThat(user1.getNetworks(), hasSize(2));
assertThat(user1.getNetworks(),
hasItems(
new CustomTypeSafeMatcher<NetworkVO>("expect network") {
@Override
protected boolean matchesSafely(NetworkVO item) {
return first.getId().equals(item.getId()) && first.getName().equals(item.getName());
}
},
new CustomTypeSafeMatcher<NetworkVO>("expect network") {
@Override
protected boolean matchesSafely(NetworkVO item) {
return second.getId().equals(item.getId()) && second.getName().equals(item.getName());
}
}
));
}
@Test
public void should_unassign_network_from_user() throws Exception {
UserVO user = new UserVO();
user.setLogin(RandomStringUtils.randomAlphabetic(10));
user = userService.createUser(user, "123");
assertThat(user, notNullValue());
assertThat(user.getId(), notNullValue());
NetworkVO network = new NetworkVO();
network.setName(RandomStringUtils.randomAlphabetic(10));
NetworkVO first = networkService.create(network);
assertThat(first, notNullValue());
assertThat(first.getId(), notNullValue());
userService.assignNetwork(user.getId(), first.getId());
UserWithNetworkVO user1 = userService.findUserWithNetworks(user.getId());
assertThat(user1.getNetworks(), notNullValue());
assertThat(user1.getNetworks(), hasSize(1));
network = new NetworkVO();
network.setName(RandomStringUtils.randomAlphabetic(10));
NetworkVO second = networkService.create(network);
assertThat(second, notNullValue());
assertThat(second.getId(), notNullValue());
userService.assignNetwork(user.getId(), second.getId());
user1 = userService.findUserWithNetworks(user.getId());
assertThat(user1.getNetworks(), notNullValue());
assertThat(user1.getNetworks(), hasSize(2));
userService.unassignNetwork(user.getId(), first.getId());
user1 = userService.findUserWithNetworks(user.getId());
assertThat(user1.getNetworks(), hasSize(1));
assertThat(user1.getNetworks(), hasItem(new CustomTypeSafeMatcher<NetworkVO>("expect network") {
@Override
protected boolean matchesSafely(NetworkVO item) {
return second.getId().equals(item.getId()) && second.getName().equals(item.getName());
}
}));
userService.unassignNetwork(user.getId(), second.getId());
user1 = userService.findUserWithNetworks(user.getId());
assertThat(user1.getNetworks(), is(empty()));
}
@Test
public void should_throw_NoSuchElementException_if_user_is_null_when_unassign_network() throws Exception {
NetworkVO network = new NetworkVO();
network.setName(RandomStringUtils.randomAlphabetic(10));
NetworkVO created = networkService.create(network);
assertThat(created, notNullValue());
assertThat(created.getId(), notNullValue());
expectedException.expect(NoSuchElementException.class);
expectedException.expectMessage(Messages.USER_NOT_FOUND);
userService.unassignNetwork(-1, created.getId());
}
@Test
public void should_do_nothing_if_network_is_null_when_unassign_user_from_network() throws Exception {
UserVO user = new UserVO();
user.setLogin(RandomStringUtils.randomAlphabetic(10));
user = userService.createUser(user, "123");
assertThat(user, notNullValue());
assertThat(user.getId(), notNullValue());
userService.unassignNetwork(user.getId(), -1);
}
@Test
public void should_return_null_if_user_does_not_exist_when_authenticate() throws Exception {
UserVO user = userService.authenticate(RandomStringUtils.randomAlphabetic(10), RandomStringUtils.randomAlphabetic(10));
assertThat(user, nullValue());
}
@Test
public void should_authenticate_user_successfully() throws Exception {
UserVO user = new UserVO();
user.setLogin(RandomStringUtils.randomAlphabetic(10));
user.setStatus(UserStatus.ACTIVE);
user = userService.createUser(user, "123");
assertThat(user, notNullValue());
assertThat(user.getId(), notNullValue());
assertThat(user.getLogin(), notNullValue());
assertThat(user.getPasswordHash(), notNullValue());
assertThat(user.getPasswordSalt(), notNullValue());
assertThat(user.getStatus(), equalTo(UserStatus.ACTIVE));
UserVO authenticated = userService.authenticate(user.getLogin(), "123");
assertThat(authenticated, notNullValue());
assertThat(authenticated.getLoginAttempts(), equalTo(0));
assertThat(authenticated.getLastLogin(), notNullValue());
}
@Test
public void should_increase_login_attempts_if_user_failed_to_login() throws Exception {
UserVO newUser = new UserVO();
newUser.setLogin(RandomStringUtils.randomAlphabetic(10));
newUser.setStatus(UserStatus.ACTIVE);
UserVO user = userService.createUser(newUser, "123");
assertThat(user, notNullValue());
assertThat(user.getId(), notNullValue());
assertThat(user.getLogin(), notNullValue());
assertThat(user.getPasswordHash(), notNullValue());
assertThat(user.getPasswordSalt(), notNullValue());
assertThat(user.getStatus(), equalTo(UserStatus.ACTIVE));
IntStream.range(1, 5).forEach(attempt -> {
try {
userService.authenticate(user.getLogin(), "wrong_password");
fail("should throw login exception");
} catch (ActionNotAllowedException e) {
assertThat(e.getMessage(), equalTo(String.format(Messages.INCORRECT_CREDENTIALS, user.getLogin())));
}
UserVO updatedUser = userDao.find(user.getId());
assertThat(updatedUser, notNullValue());
assertThat(updatedUser.getLoginAttempts(), equalTo(attempt));
assertThat(updatedUser.getStatus(), equalTo(UserStatus.ACTIVE));
assertThat(updatedUser.getLastLogin(), nullValue());
});
}
@Test
public void should_lock_user_if_max_login_attempts_reached() throws Exception {
UserVO newUser = new UserVO();
newUser.setLogin(RandomStringUtils.randomAlphabetic(10));
newUser.setStatus(UserStatus.ACTIVE);
UserVO user = userService.createUser(newUser, "123");
assertThat(user, notNullValue());
assertThat(user.getId(), notNullValue());
assertThat(user.getLogin(), notNullValue());
assertThat(user.getPasswordHash(), notNullValue());
assertThat(user.getPasswordSalt(), notNullValue());
assertThat(user.getStatus(), equalTo(UserStatus.ACTIVE));
configurationService.save(Constants.MAX_LOGIN_ATTEMPTS, 5);
IntStream.range(1, 5).forEach(attempt -> {
try {
userService.authenticate(user.getLogin(), "wrong_password");
fail("should throw login exception");
} catch (ActionNotAllowedException e) {
assertThat(e.getMessage(), equalTo(String.format(Messages.INCORRECT_CREDENTIALS, user.getLogin())));
}
UserVO updatedUser = userDao.find(user.getId());
assertThat(updatedUser, notNullValue());
assertThat(updatedUser.getLoginAttempts(), equalTo(attempt));
assertThat(updatedUser.getStatus(), equalTo(UserStatus.ACTIVE));
assertThat(updatedUser.getLastLogin(), nullValue());
});
try {
userService.authenticate(user.getLogin(), "wrong_password");
fail("should throw login exception");
} catch (ActionNotAllowedException e) {
assertThat(e.getMessage(), equalTo(String.format(Messages.INCORRECT_CREDENTIALS, user.getLogin())));
}
UserVO updatedUser = userDao.find(user.getId());
assertThat(updatedUser, notNullValue());
assertThat(updatedUser.getLoginAttempts(), equalTo(0));
assertThat(updatedUser.getStatus(), equalTo(UserStatus.LOCKED_OUT));
assertThat(updatedUser.getLastLogin(), nullValue());
}
@Test
public void should_authenticate_user_after_not_successful_authentication() throws Exception {
UserVO user = new UserVO();
user.setLogin(RandomStringUtils.randomAlphabetic(10));
user.setStatus(UserStatus.ACTIVE);
user = userService.createUser(user, "123");
assertThat(user, notNullValue());
assertThat(user.getId(), notNullValue());
assertThat(user.getLogin(), notNullValue());
assertThat(user.getPasswordHash(), notNullValue());
assertThat(user.getPasswordSalt(), notNullValue());
assertThat(user.getStatus(), equalTo(UserStatus.ACTIVE));
UserVO authenticated = userService.authenticate(user.getLogin(), "123");
assertThat(authenticated, notNullValue());
assertThat(authenticated.getLoginAttempts(), equalTo(0));
assertThat(authenticated.getLastLogin(), notNullValue());
try {
userService.authenticate(user.getLogin(), "1234");
fail("should throw login exception");
} catch (ActionNotAllowedException e) {
assertThat(e.getMessage(), equalTo(String.format(Messages.INCORRECT_CREDENTIALS, user.getLogin())));
}
UserVO updatedUser = userDao.find(user.getId());
assertThat(updatedUser, notNullValue());
assertThat(updatedUser.getLoginAttempts(), equalTo(1));
assertThat(updatedUser.getStatus(), equalTo(UserStatus.ACTIVE));
assertThat(updatedUser.getLastLogin(), notNullValue());
authenticated = userService.authenticate(user.getLogin(), "123");
assertThat(authenticated, notNullValue());
assertThat(authenticated.getLoginAttempts(), equalTo(0));
assertThat(authenticated.getLastLogin(), notNullValue());
}
@Test
public void should_not_modify_last_login_within_login_timeout() throws Exception {
UserVO user = new UserVO();
user.setLogin(RandomStringUtils.randomAlphabetic(10));
user.setStatus(UserStatus.ACTIVE);
user = userService.createUser(user, "123");
assertThat(user, notNullValue());
assertThat(user.getId(), notNullValue());
assertThat(user.getLogin(), notNullValue());
assertThat(user.getPasswordHash(), notNullValue());
assertThat(user.getPasswordSalt(), notNullValue());
assertThat(user.getStatus(), equalTo(UserStatus.ACTIVE));
configurationService.save(Constants.LAST_LOGIN_TIMEOUT, 20000); //login timeout 20 sec
UserVO authenticated1 = userService.authenticate(user.getLogin(), "123");
TimeUnit.SECONDS.sleep(1);
UserVO authenticated2 = userService.authenticate(user.getLogin(), "123");
assertThat(authenticated1.getId(), equalTo(authenticated2.getId()));
assertThat(authenticated1.getLogin(), equalTo(authenticated2.getLogin()));
assertThat(authenticated1.getLastLogin(), equalTo(authenticated2.getLastLogin()));
assertThat(authenticated1.getLoginAttempts(), equalTo(authenticated2.getLoginAttempts()));
}
@Test
public void should_modify_last_login_if_login_timeout_is_reached() throws Exception {
UserVO user = new UserVO();
user.setLogin(RandomStringUtils.randomAlphabetic(10));
user.setStatus(UserStatus.ACTIVE);
user = userService.createUser(user, "123");
assertThat(user, notNullValue());
assertThat(user.getId(), notNullValue());
assertThat(user.getLogin(), notNullValue());
assertThat(user.getPasswordHash(), notNullValue());
assertThat(user.getPasswordSalt(), notNullValue());
assertThat(user.getStatus(), equalTo(UserStatus.ACTIVE));
configurationService.save(Constants.LAST_LOGIN_TIMEOUT, 0);
UserVO authenticated1 = userService.authenticate(user.getLogin(), "123");
TimeUnit.SECONDS.sleep(1);
UserVO authenticated2 = userService.authenticate(user.getLogin(), "123");
assertThat(authenticated1.getId(), equalTo(authenticated2.getId()));
assertThat(authenticated1.getLogin(), equalTo(authenticated2.getLogin()));
assertThat(authenticated1.getLastLogin(), not(equalTo(authenticated2.getLastLogin())));
assertTrue(authenticated1.getLastLogin().before(authenticated2.getLastLogin()));
assertThat(authenticated1.getLoginAttempts(), equalTo(authenticated2.getLoginAttempts()));
}
@Test
public void should_throw_AccessDeniedException_if_user_does_not_exists_when_findUser_called() throws Exception {
expectedException.expect(AccessDeniedException.class);
expectedException.expectMessage(Messages.USER_NOT_FOUND);
try {
userService.findUser(String.valueOf(System.currentTimeMillis()), String.valueOf(System.currentTimeMillis()));
} catch (Exception e) {
e.printStackTrace();
throw e;
}
}
@Test
public void should_throw_AccessDeniedException_if_user_is_disabled_when_findUser_called() throws Exception {
UserVO user = new UserVO();
user.setLogin(RandomStringUtils.randomAlphabetic(10));
user.setStatus(UserStatus.DISABLED);
user = userService.createUser(user, "123");
expectedException.expect(AccessDeniedException.class);
expectedException.expectMessage(Messages.USER_NOT_ACTIVE);
userService.findUser(user.getLogin(), "123");
}
@Test
public void should_throw_AccessDeniedException_if_password_is_wrong_when_funcUser_called() throws Exception {
UserVO user = new UserVO();
user.setLogin(RandomStringUtils.randomAlphabetic(10));
user.setStatus(UserStatus.ACTIVE);
user = userService.createUser(user, "123");
assertThat(user, notNullValue());
assertThat(user.getId(), notNullValue());
assertThat(user.getLogin(), notNullValue());
assertThat(user.getPasswordHash(), notNullValue());
assertThat(user.getPasswordSalt(), notNullValue());
assertThat(user.getStatus(), equalTo(UserStatus.ACTIVE));
try {
userService.findUser(user.getLogin(), "wrong_password");
fail("should throw AccessDeniedException exception");
} catch (AccessDeniedException e) {
assertThat(e.getMessage(), equalTo(String.format(Messages.INCORRECT_CREDENTIALS, user.getLogin())));
}
UserVO updatedUser = userDao.find(user.getId());
assertThat(updatedUser, notNullValue());
assertThat(updatedUser.getLoginAttempts(), equalTo(1));
assertThat(updatedUser.getStatus(), equalTo(UserStatus.ACTIVE));
assertThat(updatedUser.getLastLogin(), nullValue());
user = userService.findUser(user.getLogin(), "123");
assertThat(user, notNullValue());
assertThat(user.getLoginAttempts(), equalTo(0));
assertThat(user.getLastLogin(), notNullValue());
}
@Test
public void should_update_login_statistic_on_successful_login_when_findUser_called() throws Exception {
UserVO user = new UserVO();
user.setLogin(RandomStringUtils.randomAlphabetic(10));
user.setStatus(UserStatus.ACTIVE);
user = userService.createUser(user, "123");
assertThat(user, notNullValue());
assertThat(user.getId(), notNullValue());
assertThat(user.getLogin(), notNullValue());
assertThat(user.getPasswordHash(), notNullValue());
assertThat(user.getPasswordSalt(), notNullValue());
assertThat(user.getStatus(), equalTo(UserStatus.ACTIVE));
user = userService.findUser(user.getLogin(), "123");
assertThat(user, notNullValue());
assertThat(user.getLoginAttempts(), equalTo(0));
assertThat(user.getLastLogin(), notNullValue());
}
@Test
public void should_lock_user_if_max_login_attempts_reached_when_findUser_called() throws Exception {
UserVO newUser = new UserVO();
newUser.setLogin(RandomStringUtils.randomAlphabetic(10));
newUser.setStatus(UserStatus.ACTIVE);
UserVO user = userService.createUser(newUser, "123");
assertThat(user, notNullValue());
assertThat(user.getId(), notNullValue());
assertThat(user.getLogin(), notNullValue());
assertThat(user.getPasswordHash(), notNullValue());
assertThat(user.getPasswordSalt(), notNullValue());
assertThat(user.getStatus(), equalTo(UserStatus.ACTIVE));
configurationService.save(Constants.MAX_LOGIN_ATTEMPTS, 5);
IntStream.range(1, 5).forEach(attempt -> {
try {
userService.findUser(user.getLogin(), "wrong_password");
fail("should throw login exception");
} catch (AccessDeniedException e) {
assertThat(e.getMessage(), equalTo(String.format(Messages.INCORRECT_CREDENTIALS, user.getLogin())));
}
UserVO updatedUser = userDao.find(user.getId());
assertThat(updatedUser, notNullValue());
assertThat(updatedUser.getLoginAttempts(), equalTo(attempt));
assertThat(updatedUser.getStatus(), equalTo(UserStatus.ACTIVE));
assertThat(updatedUser.getLastLogin(), nullValue());
});
try {
userService.findUser(user.getLogin(), "wrong_password");
fail("should throw login exception");
} catch (AccessDeniedException e) {
assertThat(e.getMessage(), equalTo(String.format(Messages.INCORRECT_CREDENTIALS, user.getLogin())));
}
UserVO updatedUser = userDao.find(user.getId());
assertThat(updatedUser, notNullValue());
assertThat(updatedUser.getLoginAttempts(), equalTo(0));
assertThat(updatedUser.getStatus(), equalTo(UserStatus.LOCKED_OUT));
assertThat(updatedUser.getLastLogin(), nullValue());
}
@Test
public void should_modify_last_login_if_login_timeout_is_reached_when_findUser_called() throws Exception {
UserVO user = new UserVO();
user.setLogin(RandomStringUtils.randomAlphabetic(10));
user.setStatus(UserStatus.ACTIVE);
user = userService.createUser(user, "123");
assertThat(user, notNullValue());
assertThat(user.getId(), notNullValue());
assertThat(user.getLogin(), notNullValue());
assertThat(user.getPasswordHash(), notNullValue());
assertThat(user.getPasswordSalt(), notNullValue());
assertThat(user.getStatus(), equalTo(UserStatus.ACTIVE));
configurationService.save(Constants.LAST_LOGIN_TIMEOUT, 0);
UserVO authenticated1 = userService.findUser(user.getLogin(), "123");
TimeUnit.SECONDS.sleep(1);
UserVO authenticated2 = userService.findUser(user.getLogin(), "123");
assertThat(authenticated1.getId(), equalTo(authenticated2.getId()));
assertThat(authenticated1.getLogin(), equalTo(authenticated2.getLogin()));
assertThat(authenticated1.getLastLogin(), not(equalTo(authenticated2.getLastLogin())));
assertTrue(authenticated1.getLastLogin().before(authenticated2.getLastLogin()));
assertThat(authenticated1.getLoginAttempts(), equalTo(authenticated2.getLoginAttempts()));
}
@Test
public void should_return_user_by_id() throws Exception {
UserVO user = new UserVO();
user.setLogin(RandomStringUtils.randomAlphabetic(10));
user.setStatus(UserStatus.ACTIVE);
user = userService.createUser(user, "123");
assertThat(user, notNullValue());
assertThat(user.getId(), notNullValue());
user = userService.findById(user.getId());
assertThat(user, notNullValue());
assertThat(user.getId(), notNullValue());
assertThat(user.getLogin(), notNullValue());
assertThat(user.getPasswordHash(), notNullValue());
assertThat(user.getPasswordSalt(), notNullValue());
assertThat(user.getStatus(), equalTo(UserStatus.ACTIVE));
}
@Test
public void should_return_user_with_networks() throws Exception {
UserVO user = new UserVO();
user.setLogin(RandomStringUtils.randomAlphabetic(10));
user.setStatus(UserStatus.ACTIVE);
user = userService.createUser(user, "123");
assertThat(user, notNullValue());
assertThat(user.getId(), notNullValue());
for (int i = 0; i < 10; i++) {
NetworkVO network = new NetworkVO();
network.setName(RandomStringUtils.randomAlphabetic(10));
network = networkService.create(network);
userService.assignNetwork(user.getId(), network.getId());
}
UserWithNetworkVO userWithNetworks = userService.findUserWithNetworks(user.getId());
assertThat(userWithNetworks, notNullValue());
assertThat(userWithNetworks.getNetworks(), notNullValue());
assertThat(userWithNetworks.getNetworks(), not(empty()));
assertThat(userWithNetworks.getNetworks(), hasSize(10));
}
@Test
public void should_return_user_without_networks() throws Exception {
UserVO user = new UserVO();
user.setLogin(RandomStringUtils.randomAlphabetic(10));
user.setStatus(UserStatus.ACTIVE);
user = userService.createUser(user, "123");
assertThat(user, notNullValue());
assertThat(user.getId(), notNullValue());
user = userService.findUserWithNetworks(user.getId());
assertThat(user, notNullValue());
}
@Test
public void should_create_user() throws Exception {
UserVO user = new UserVO();
user.setLogin(RandomStringUtils.randomAlphabetic(10));
user.setStatus(UserStatus.ACTIVE);
String googleLogin = RandomStringUtils.randomAlphabetic(10);
user.setGoogleLogin(googleLogin);
String facebookLogin = RandomStringUtils.randomAlphabetic(10);
user.setFacebookLogin(facebookLogin);
String githubLogin = RandomStringUtils.randomAlphabetic(10);
user.setGithubLogin(githubLogin);
user = userService.createUser(user, "123");
assertThat(user, notNullValue());
assertThat(user.getId(), notNullValue());
assertThat(user.getLogin(), notNullValue());
assertThat(user.getPasswordHash(), notNullValue());
assertThat(user.getPasswordSalt(), notNullValue());
assertThat(user.getStatus(), equalTo(UserStatus.ACTIVE));
assertThat(user.getGoogleLogin(), equalTo(googleLogin));
assertThat(user.getFacebookLogin(), equalTo(facebookLogin));
assertThat(user.getGithubLogin(), equalTo(githubLogin));
assertThat(user.getLoginAttempts(), equalTo(0));
}
@Test
public void should_throw_IllegalParametersException_if_id_provided_for_create() throws Exception {
UserVO user = new UserVO();
user.setId(-1L);
user.setLogin(RandomStringUtils.randomAlphabetic(10));
user.setStatus(UserStatus.ACTIVE);
expectedException.expect(IllegalParametersException.class);
expectedException.expectMessage(Messages.ID_NOT_ALLOWED);
userService.createUser(user, "123");
}
@Test
public void should_throw_ActionNotAllowedException_if_login_exists() throws Exception {
String login = RandomStringUtils.randomAlphabetic(10);
UserVO user = new UserVO();
user.setLogin(login);
user.setStatus(UserStatus.ACTIVE);
userService.createUser(user, RandomStringUtils.randomAlphabetic(10));
expectedException.expect(ActionNotAllowedException.class);
expectedException.expectMessage(Messages.DUPLICATE_LOGIN);
user = new UserVO();
user.setLogin(login);
user.setStatus(UserStatus.ACTIVE);
userService.createUser(user, RandomStringUtils.randomAlphabetic(10));
}
@Test
public void should_create_user_without_password() throws Exception {
UserVO user = new UserVO();
user.setLogin(RandomStringUtils.randomAlphabetic(10));
user.setStatus(UserStatus.ACTIVE);
user = userService.createUser(user, null);
assertThat(user, notNullValue());
assertThat(user.getId(), notNullValue());
assertThat(user.getPasswordHash(), nullValue());
assertThat(user.getPasswordSalt(), nullValue());
}
@Test
public void should_throw_ActionNotAllowedException_if_any_identity_login_already_exists() throws Exception {
String google = RandomStringUtils.randomAlphabetic(10);
UserVO user = new UserVO();
user.setLogin(RandomStringUtils.randomAlphabetic(10));
user.setStatus(UserStatus.ACTIVE);
user.setGoogleLogin(google);
userService.createUser(user, RandomStringUtils.randomAlphabetic(10));
try {
user = new UserVO();
user.setLogin(RandomStringUtils.randomAlphabetic(10));
user.setStatus(UserStatus.ACTIVE);
user.setGoogleLogin(google);
userService.createUser(user, RandomStringUtils.randomAlphabetic(10));
fail("should throw ActionNotAllowedException");
} catch (ActionNotAllowedException e) {
assertThat(e.getMessage(), equalTo(Messages.DUPLICATE_IDENTITY_LOGIN));
}
String facebook = RandomStringUtils.randomAlphabetic(10);
user = new UserVO();
user.setLogin(RandomStringUtils.randomAlphabetic(10));
user.setStatus(UserStatus.ACTIVE);
user.setFacebookLogin(facebook);
userService.createUser(user, RandomStringUtils.randomAlphabetic(10));
try {
user = new UserVO();
user.setLogin(RandomStringUtils.randomAlphabetic(10));
user.setStatus(UserStatus.ACTIVE);
user.setFacebookLogin(facebook);
userService.createUser(user, RandomStringUtils.randomAlphabetic(10));
fail("should throw ActionNotAllowedException");
} catch (ActionNotAllowedException e) {
assertThat(e.getMessage(), equalTo(Messages.DUPLICATE_IDENTITY_LOGIN));
}
String github = RandomStringUtils.randomAlphabetic(10);
user = new UserVO();
user.setLogin(RandomStringUtils.randomAlphabetic(10));
user.setStatus(UserStatus.ACTIVE);
user.setGithubLogin(github);
userService.createUser(user, RandomStringUtils.randomAlphabetic(10));
try {
user = new UserVO();
user.setLogin(RandomStringUtils.randomAlphabetic(10));
user.setStatus(UserStatus.ACTIVE);
user.setGithubLogin(github);
userService.createUser(user, RandomStringUtils.randomAlphabetic(10));
fail("should throw ActionNotAllowedException");
} catch (ActionNotAllowedException e) {
assertThat(e.getMessage(), equalTo(Messages.DUPLICATE_IDENTITY_LOGIN));
}
}
@Test
public void should_delete_user() throws Exception {
UserVO user = new UserVO();
user.setLogin(RandomStringUtils.randomAlphabetic(10));
user.setStatus(UserStatus.ACTIVE);
user = userService.createUser(user, "123");
assertThat(user, notNullValue());
assertThat(user.getId(), notNullValue());
assertTrue(userService.deleteUser(user.getId()));
user = userService.findById(user.getId());
assertThat(user, nullValue());
}
@Test
public void should_return_true_if_user_has_access_to_device() throws Exception {
UserVO user = new UserVO();
user.setLogin(RandomStringUtils.randomAlphabetic(10));
user.setStatus(UserStatus.ACTIVE);
user.setRole(UserRole.CLIENT);
user = userService.createUser(user, "123");
NetworkVO network = new NetworkVO();
network.setName(RandomStringUtils.randomAlphabetic(10));
network = networkService.create(network);
userService.assignNetwork(user.getId(), network.getId());
DeviceClassUpdate dc = new DeviceClassUpdate();
dc.setName(Optional.ofNullable(randomUUID().toString()));
DeviceUpdate device = new DeviceUpdate();
device.setName(Optional.ofNullable(randomUUID().toString()));
device.setGuid(Optional.ofNullable(randomUUID().toString()));
device.setDeviceClass(Optional.ofNullable(dc));
device.setNetwork(Optional.ofNullable(network));
deviceService.deviceSave(device, Collections.emptySet());
assertTrue(userService.hasAccessToDevice(user, device.getGuid().orElse(null)));
}
@Test
public void should_return_false_if_user_does_not_have_access_to_device() throws Exception {
UserVO user = new UserVO();
user.setLogin(RandomStringUtils.randomAlphabetic(10));
user.setStatus(UserStatus.ACTIVE);
user.setRole(UserRole.CLIENT);
user = userService.createUser(user, "123");
NetworkVO network = new NetworkVO();
network.setName(RandomStringUtils.randomAlphabetic(10));
network = networkService.create(network);
DeviceClassUpdate dc = new DeviceClassUpdate();
dc.setName(Optional.ofNullable(randomUUID().toString()));
DeviceUpdate device = new DeviceUpdate();
device.setName(Optional.ofNullable(randomUUID().toString()));
device.setGuid(Optional.ofNullable(randomUUID().toString()));
device.setDeviceClass(Optional.ofNullable(dc));
device.setNetwork(Optional.ofNullable(network));
deviceService.deviceSave(device, Collections.emptySet());
assertFalse(userService.hasAccessToDevice(user, device.getGuid().orElse(null)));
}
@Test
public void should_return_true_if_user_is_admin_when_request_access_to_device() throws Exception {
UserVO user = new UserVO();
user.setLogin(RandomStringUtils.randomAlphabetic(10));
user.setStatus(UserStatus.ACTIVE);
user.setRole(UserRole.ADMIN);
user = userService.createUser(user, "123");
NetworkVO network = new NetworkVO();
network.setName(RandomStringUtils.randomAlphabetic(10));
network = networkService.create(network);
DeviceClassUpdate dc = new DeviceClassUpdate();
dc.setName(Optional.ofNullable(randomUUID().toString()));
DeviceUpdate device = new DeviceUpdate();
device.setName(Optional.ofNullable(randomUUID().toString()));
device.setGuid(Optional.ofNullable(randomUUID().toString()));
device.setDeviceClass(Optional.ofNullable(dc));
device.setNetwork(Optional.ofNullable(network));
deviceService.deviceSave(device, Collections.emptySet());
assertTrue(userService.hasAccessToDevice(user, device.getGuid().orElse(null)));
}
@Test
public void should_return_true_if_user_is_admin_when_request_access_to_network() throws Exception {
UserVO user = new UserVO();
user.setLogin(RandomStringUtils.randomAlphabetic(10));
user.setStatus(UserStatus.ACTIVE);
user.setRole(UserRole.ADMIN);
user = userService.createUser(user, "123");
NetworkVO network = new NetworkVO();
network.setName(RandomStringUtils.randomAlphabetic(10));
network = networkService.create(network);
assertTrue(userService.hasAccessToNetwork(user, network));
}
@Test
public void should_return_true_if_user_has_access_to_network() throws Exception {
UserVO user = new UserVO();
user.setLogin(RandomStringUtils.randomAlphabetic(10));
user.setStatus(UserStatus.ACTIVE);
user.setRole(UserRole.CLIENT);
user = userService.createUser(user, "123");
NetworkVO network = new NetworkVO();
network.setName(RandomStringUtils.randomAlphabetic(10));
network = networkService.create(network);
userService.assignNetwork(user.getId(), network.getId());
assertTrue(userService.hasAccessToNetwork(user, network));
}
@Test
public void should_return_false_if_user_does_not_have_access_to_network() throws Exception {
UserVO user = new UserVO();
user.setLogin(RandomStringUtils.randomAlphabetic(10));
user.setStatus(UserStatus.ACTIVE);
user.setRole(UserRole.CLIENT);
user = userService.createUser(user, "123");
NetworkVO network = new NetworkVO();
network.setName(RandomStringUtils.randomAlphabetic(10));
network = networkService.create(network);
assertFalse(userService.hasAccessToNetwork(user, network));
}
@Test
public void should_return_user_by_google_login() throws Exception {
String google = RandomStringUtils.randomAlphabetic(10);
UserVO user = userService.findGoogleUser(google);
assertThat(user, nullValue());
user = new UserVO();
user.setLogin(RandomStringUtils.randomAlphabetic(10));
user.setStatus(UserStatus.ACTIVE);
user.setRole(UserRole.CLIENT);
user.setGoogleLogin(google);
userService.createUser(user, "123");
user = userService.findGoogleUser(google);
assertThat(user, notNullValue());
assertThat(user.getGoogleLogin(), equalTo(google));
}
@Test
public void should_return_user_by_facebook_login() throws Exception {
String facebook = RandomStringUtils.randomAlphabetic(10);
UserVO user = userService.findFacebookUser(facebook);
assertThat(user, nullValue());
user = new UserVO();
user.setLogin(RandomStringUtils.randomAlphabetic(10));
user.setStatus(UserStatus.ACTIVE);
user.setRole(UserRole.CLIENT);
user.setFacebookLogin(facebook);
userService.createUser(user, "123");
user = userService.findFacebookUser(facebook);
assertThat(user, notNullValue());
assertThat(user.getFacebookLogin(), equalTo(facebook));
}
@Test
public void should_return_user_by_github_login() throws Exception {
String gitgub = RandomStringUtils.randomAlphabetic(10);
UserVO user = userService.findGithubUser(gitgub);
assertThat(user, nullValue());
user = new UserVO();
user.setLogin(RandomStringUtils.randomAlphabetic(10));
user.setStatus(UserStatus.ACTIVE);
user.setRole(UserRole.CLIENT);
user.setGithubLogin(gitgub);
userService.createUser(user, "123");
user = userService.findGithubUser(gitgub);
assertThat(user, notNullValue());
assertThat(user.getGithubLogin(), equalTo(gitgub));
}
@Test
public void should_refresh_user_login_data() throws Exception {
configurationService.save(Constants.MAX_LOGIN_ATTEMPTS, 10);
UserVO user = new UserVO();
user.setLogin(RandomStringUtils.randomAlphabetic(10));
user.setStatus(UserStatus.ACTIVE);
user.setRole(UserRole.CLIENT);
user = userService.createUser(user, "123");
assertThat(user, notNullValue());
TimeUnit.SECONDS.sleep(1);
user = userService.authenticate(user.getLogin(), "123");
assertThat(user, notNullValue());
assertThat(user.getLastLogin(), notNullValue());
long lastLogin = user.getLastLogin().getTime();
for (int i = 0; i < 5; i++) {
try {
userService.authenticate(user.getLogin(), "wrong_password");
TimeUnit.SECONDS.sleep(1);
fail("should throw ActionNotAllowedException");
} catch (ActionNotAllowedException e) { }
}
user = userService.findById(user.getId());
assertThat(user.getLoginAttempts(), equalTo(5));
assertThat(user.getLastLogin().getTime(), equalTo(lastLogin));
configurationService.save(Constants.LAST_LOGIN_TIMEOUT, 0);
user = userService.refreshUserLoginData(user);
assertThat(user.getLoginAttempts(), equalTo(0));
assertThat(user.getLastLogin().getTime(), not(equalTo(lastLogin)));
assertTrue(new Timestamp(lastLogin).before(user.getLastLogin()));
}
@Test
public void should_throw_NoSuchElementException_if_user_does_not_exist_when_update() throws Exception {
expectedException.expect(NoSuchElementException.class);
expectedException.expectMessage(Messages.USER_NOT_FOUND);
userService.updateUser(-1L, new UserUpdate(), UserRole.ADMIN);
}
@Test
public void should_throw_ActionNotAllowedException_trying_to_set_existing_login_when_update() throws Exception {
String existingLogin = RandomStringUtils.randomAlphabetic(10);
UserVO first = new UserVO();
first.setLogin(existingLogin);
first.setStatus(UserStatus.ACTIVE);
first.setRole(UserRole.CLIENT);
userService.createUser(first, "123");
UserVO second = new UserVO();
second.setLogin(RandomStringUtils.randomAlphabetic(10));
second.setStatus(UserStatus.ACTIVE);
second.setRole(UserRole.CLIENT);
second = userService.createUser(second, "123");
expectedException.expect(ActionNotAllowedException.class);
expectedException.expectMessage(Messages.DUPLICATE_LOGIN);
UserUpdate update = new UserUpdate();
update.setLogin(Optional.ofNullable(existingLogin));
userService.updateUser(second.getId(), update, UserRole.ADMIN);
}
@Test
public void should_update_user_identity_logins() throws Exception {
UserVO user = new UserVO();
user.setLogin(RandomStringUtils.randomAlphabetic(10));
user.setStatus(UserStatus.ACTIVE);
user.setRole(UserRole.CLIENT);
user.setFacebookLogin(RandomStringUtils.randomAlphabetic(10));
user.setGoogleLogin(RandomStringUtils.randomAlphabetic(10));
user.setGithubLogin(RandomStringUtils.randomAlphabetic(10));
user = userService.createUser(user, "123");
UserUpdate update = new UserUpdate();
update.setLogin(Optional.ofNullable(RandomStringUtils.random(10)));
update.setFacebookLogin(Optional.ofNullable(RandomStringUtils.random(10)));
update.setGoogleLogin(Optional.ofNullable(RandomStringUtils.random(10)));
update.setGithubLogin(Optional.ofNullable(RandomStringUtils.random(10)));
UserVO updatedUser = userService.updateUser(user.getId(), update, UserRole.ADMIN);
assertThat(updatedUser, notNullValue());
assertThat(updatedUser.getId(), equalTo(user.getId()));
assertThat(updatedUser.getLogin(), allOf(not(equalTo(user.getLogin())), equalTo(update.getLogin().orElse(null))));
assertThat(updatedUser.getFacebookLogin(), allOf(not(equalTo(user.getFacebookLogin())), equalTo(update.getFacebookLogin().orElse(null))));
assertThat(updatedUser.getGoogleLogin(), allOf(not(equalTo(user.getGoogleLogin())), equalTo(update.getGoogleLogin().orElse(null))));
assertThat(updatedUser.getGithubLogin(), allOf(not(equalTo(user.getGithubLogin())), equalTo(update.getGithubLogin().orElse(null))));
}
@Test
public void should_throw_ActionNotAllowedException_if_user_with_any_login_exists_when_update() throws Exception {
String google = RandomStringUtils.randomAlphabetic(10);
UserVO firstGoogleUser = new UserVO();
firstGoogleUser.setLogin(RandomStringUtils.randomAlphabetic(10));
firstGoogleUser.setGoogleLogin(google);
firstGoogleUser.setStatus(UserStatus.ACTIVE);
firstGoogleUser = userService.createUser(firstGoogleUser, RandomStringUtils.randomAlphabetic(10));
assertThat(firstGoogleUser.getGoogleLogin(), equalTo(google));
UserVO secondGoogleUser = new UserVO();
secondGoogleUser.setLogin(RandomStringUtils.randomAlphabetic(10));
secondGoogleUser.setGoogleLogin(RandomStringUtils.randomAlphabetic(10));
secondGoogleUser.setStatus(UserStatus.ACTIVE);
secondGoogleUser = userService.createUser(secondGoogleUser, RandomStringUtils.randomAlphabetic(10));
assertThat(firstGoogleUser.getId(), not(equalTo(secondGoogleUser.getId())));
try {
UserUpdate update = new UserUpdate();
update.setLogin(Optional.ofNullable(secondGoogleUser.getLogin()));
update.setGoogleLogin(Optional.ofNullable(google));
update.setFacebookLogin(Optional.ofNullable(null));
update.setGithubLogin(Optional.ofNullable(null));
userService.updateUser(secondGoogleUser.getId(), update, UserRole.ADMIN);
fail("should throw ActionNotAllowedException");
} catch (ActionNotAllowedException e) {
assertThat(e.getMessage(), equalTo(Messages.DUPLICATE_IDENTITY_LOGIN));
}
String facebook = RandomStringUtils.randomAlphabetic(10);
UserVO firstFacebookUser = new UserVO();
firstFacebookUser.setLogin(RandomStringUtils.randomAlphabetic(10));
firstFacebookUser.setFacebookLogin(facebook);
firstFacebookUser.setStatus(UserStatus.ACTIVE);
userService.createUser(firstFacebookUser, RandomStringUtils.randomAlphabetic(10));
UserVO secondFacebookUser = new UserVO();
secondFacebookUser.setLogin(RandomStringUtils.randomAlphabetic(10));
secondFacebookUser.setFacebookLogin(RandomStringUtils.randomAlphabetic(10));
secondFacebookUser.setStatus(UserStatus.ACTIVE);
secondFacebookUser = userService.createUser(secondFacebookUser, RandomStringUtils.randomAlphabetic(10));
try {
UserUpdate update = new UserUpdate();
update.setLogin(Optional.ofNullable(secondFacebookUser.getLogin()));
update.setFacebookLogin(Optional.ofNullable(facebook));
update.setGoogleLogin(Optional.ofNullable(null));
update.setGithubLogin(Optional.ofNullable(null));
userService.updateUser(secondFacebookUser.getId(), update, UserRole.ADMIN);
fail("should throw ActionNotAllowedException");
} catch (ActionNotAllowedException e) {
assertThat(e.getMessage(), equalTo(Messages.DUPLICATE_IDENTITY_LOGIN));
}
String github = RandomStringUtils.randomAlphabetic(10);
UserVO firstGithubUser = new UserVO();
firstGithubUser.setLogin(RandomStringUtils.randomAlphabetic(10));
firstGithubUser.setGithubLogin(github);
firstGithubUser.setStatus(UserStatus.ACTIVE);
userService.createUser(firstGithubUser, RandomStringUtils.randomAlphabetic(10));
UserVO secondGithubUser = new UserVO();
secondGithubUser.setLogin(RandomStringUtils.randomAlphabetic(10));
secondGithubUser.setGithubLogin(RandomStringUtils.randomAlphabetic(10));
secondGithubUser.setStatus(UserStatus.ACTIVE);
userService.createUser(secondGithubUser, RandomStringUtils.randomAlphabetic(10));
try {
UserUpdate update = new UserUpdate();
update.setLogin(Optional.ofNullable(secondGithubUser.getLogin()));
update.setGithubLogin(Optional.ofNullable(github));
update.setFacebookLogin(Optional.ofNullable(null));
update.setGoogleLogin(Optional.ofNullable(null));
userService.updateUser(secondGithubUser.getId(), update, UserRole.ADMIN);
fail("should throw ActionNotAllowedException");
} catch (ActionNotAllowedException e) {
assertThat(e.getMessage(), equalTo(Messages.DUPLICATE_IDENTITY_LOGIN));
}
}
@Test
public void should_update_password_with_admin_role() throws Exception {
UserVO user = new UserVO();
user.setLogin(RandomStringUtils.randomAlphabetic(10));
user.setStatus(UserStatus.ACTIVE);
user = userService.createUser(user, "123");
UserUpdate update = new UserUpdate();
update.setPassword(Optional.ofNullable("new_pass"));
UserVO updatedUser = userService.updateUser(user.getId(), update, UserRole.ADMIN);
assertThat(updatedUser, notNullValue());
assertThat(updatedUser.getId(), equalTo(user.getId()));
assertThat(updatedUser.getPasswordHash(), not(equalTo(user.getPasswordHash())));
assertThat(updatedUser.getPasswordSalt(), not(equalTo(user.getPasswordSalt())));
}
@Test
public void should_throw_ActionNotAllowedException_if_updating_password_with_client_role_without_old_password() throws Exception {
UserVO user = new UserVO();
user.setLogin(RandomStringUtils.randomAlphabetic(10));
user.setStatus(UserStatus.ACTIVE);
user = userService.createUser(user, "123");
expectedException.expect(ActionNotAllowedException.class);
expectedException.expectMessage(Messages.OLD_PASSWORD_REQUIRED);
UserUpdate update = new UserUpdate();
update.setPassword(Optional.ofNullable("new_pass"));
userService.updateUser(user.getId(), update, UserRole.CLIENT);
}
@Test
public void should_update_password_with_client_role_if_old_password_provided() throws Exception {
UserVO user = new UserVO();
user.setLogin(RandomStringUtils.randomAlphabetic(10));
user.setStatus(UserStatus.ACTIVE);
user = userService.createUser(user, "123");
UserUpdate update = new UserUpdate();
update.setPassword(Optional.ofNullable("new_pass"));
update.setOldPassword(Optional.ofNullable("123"));
UserVO updatedUser = userService.updateUser(user.getId(), update, UserRole.CLIENT);
assertThat(updatedUser, notNullValue());
assertThat(updatedUser.getId(), equalTo(user.getId()));
assertThat(updatedUser.getPasswordHash(), not(equalTo(user.getPasswordHash())));
assertThat(updatedUser.getPasswordSalt(), not(equalTo(user.getPasswordSalt())));
}
@Test
public void should_throw_ActionNotAllowedException_if_updating_password_with_client_role_with_wrong_old_password() throws Exception {
UserVO user = new UserVO();
user.setLogin(RandomStringUtils.randomAlphabetic(10));
user.setStatus(UserStatus.ACTIVE);
user = userService.createUser(user, "123");
expectedException.expect(ActionNotAllowedException.class);
expectedException.expectMessage(Messages.INCORRECT_CREDENTIALS);
UserUpdate update = new UserUpdate();
update.setPassword(Optional.ofNullable("new_pass"));
update.setOldPassword(Optional.ofNullable("old"));
userService.updateUser(user.getId(), update, UserRole.CLIENT);
}
@Test
public void should_throw_IllegalParametersException_if_() throws Exception {
UserVO user = new UserVO();
user.setLogin(RandomStringUtils.randomAlphabetic(10));
user.setStatus(UserStatus.ACTIVE);
user = userService.createUser(user, "123");
expectedException.expect(IllegalParametersException.class);
expectedException.expectMessage(Messages.PASSWORD_REQUIRED);
UserUpdate update = new UserUpdate();
update.setPassword(Optional.ofNullable(null));
userService.updateUser(user.getId(), update, UserRole.ADMIN);
}
@Test
@DirtiesContext(methodMode = DirtiesContext.MethodMode.BEFORE_METHOD)
public void should_return_list_of_users_by_login() throws Exception {
for (int i = 0; i < 10; i++) {
UserVO user = new UserVO();
user.setLogin(RandomStringUtils.randomAlphabetic(10));
user.setStatus(UserStatus.ACTIVE);
userService.createUser(user, RandomStringUtils.randomAlphabetic(10));
}
UserVO testUser = new UserVO();
testUser.setLogin(RandomStringUtils.randomAlphabetic(10));
testUser.setStatus(UserStatus.ACTIVE);
testUser = userService.createUser(testUser, RandomStringUtils.randomAlphabetic(10));
handleListUserRequest();
final UserVO finalTestUser = testUser;
userService.list(testUser.getLogin(), null, null, null, null, null, 100, 0)
.thenAccept(users -> {
assertThat(users, not(empty()));
assertThat(users, hasSize(1));
assertThat(users.stream().findFirst().get().getId(), equalTo(finalTestUser.getId()));
}).get(15, TimeUnit.SECONDS);
verify(requestHandler, times(1)).handle(argument.capture());
}
@Test
public void should_return_list_of_users_by_login_pattern() throws Exception {
for (int i = 0; i < 5; i++) {
UserVO user = new UserVO();
user.setLogin(RandomStringUtils.randomAlphabetic(10));
user.setStatus(UserStatus.ACTIVE);
userService.createUser(user, RandomStringUtils.randomAlphabetic(10));
}
String prefix = RandomStringUtils.randomAlphabetic(10);
for (int i = 0; i < 5; i++) {
UserVO user = new UserVO();
user.setLogin(prefix + RandomStringUtils.randomAlphabetic(10));
user.setStatus(UserStatus.ACTIVE);
userService.createUser(user, RandomStringUtils.randomAlphabetic(10));
}
handleListUserRequest();
userService.list(null, "%" + prefix + "%", null, null, null, null, 100, 0)
.thenAccept(users -> {
assertThat(users, not(empty()));
assertThat(users, hasSize(5));
for (UserVO user : users) {
assertThat(user.getLogin(), startsWith(prefix));
}
}).get(15, TimeUnit.SECONDS);
verify(requestHandler, times(1)).handle(argument.capture());
}
@Test
@DirtiesContext(methodMode = DirtiesContext.MethodMode.BEFORE_METHOD)
public void should_return_list_of_users_by_role() throws Exception {
String prefix = RandomStringUtils.randomAlphabetic(5);
for (int i = 0; i < 10; i++) {
UserVO user = new UserVO();
user.setLogin(prefix + RandomStringUtils.randomAlphabetic(10));
user.setStatus(UserStatus.ACTIVE);
user.setRole(UserRole.ADMIN);
userService.createUser(user, RandomStringUtils.randomAlphabetic(10));
}
for (int i = 0; i < 10; i++) {
UserVO user = new UserVO();
user.setLogin(prefix + RandomStringUtils.randomAlphabetic(10));
user.setStatus(UserStatus.ACTIVE);
user.setRole(UserRole.CLIENT);
userService.createUser(user, RandomStringUtils.randomAlphabetic(10));
}
handleListUserRequest();
userService.list(null, "%" + prefix + "%", UserRole.CLIENT.getValue(), null, null, null, 100, 0)
.thenAccept(users -> {
assertThat(users, not(empty()));
assertThat(users, hasSize(10));
for (UserVO user : users) {
assertThat(user.getLogin(), startsWith(prefix));
assertThat(user.getRole(), equalTo(UserRole.CLIENT));
}
}).get(15, TimeUnit.SECONDS);
verify(requestHandler, times(1)).handle(argument.capture());
}
@Test
@DirtiesContext(methodMode = DirtiesContext.MethodMode.BEFORE_METHOD)
public void should_return_list_of_users_by_status() throws Exception {
String prefix = RandomStringUtils.randomAlphabetic(5);
for (int i = 0; i < 10; i++) {
UserVO user = new UserVO();
user.setLogin(prefix + RandomStringUtils.randomAlphabetic(10));
user.setStatus(UserStatus.ACTIVE);
userService.createUser(user, RandomStringUtils.randomAlphabetic(10));
}
for (int i = 0; i < 10; i++) {
UserVO user = new UserVO();
user.setLogin(prefix + RandomStringUtils.randomAlphabetic(10));
user.setStatus(UserStatus.LOCKED_OUT);
userService.createUser(user, RandomStringUtils.randomAlphabetic(10));
}
handleListUserRequest();
userService.list(null, "%" + prefix + "%", null, UserStatus.LOCKED_OUT.getValue(), null, null, 100, 0)
.thenAccept(users -> {
assertThat(users, not(empty()));
assertThat(users, hasSize(10));
for (UserVO user : users) {
assertThat(user.getLogin(), startsWith(prefix));
assertThat(user.getStatus(), equalTo(UserStatus.LOCKED_OUT));
}
}).get(15, TimeUnit.SECONDS);
verify(requestHandler, times(1)).handle(argument.capture());
}
@Test
@DirtiesContext(methodMode = DirtiesContext.MethodMode.BEFORE_METHOD)
public void should_return_list_of_users_sorted() throws Exception {
String suffix = RandomStringUtils.randomAlphabetic(5);
List<String> prefixes = Arrays.asList("a", "b", "c", "d", "e");
Collections.shuffle(prefixes);
for (String prefix : prefixes) {
UserVO user = new UserVO();
user.setLogin(prefix + "_" + suffix);
user.setStatus(UserStatus.ACTIVE);
userService.createUser(user, RandomStringUtils.randomAlphabetic(10));
}
handleListUserRequest();
userService.list(null, "%" + suffix, null, null, "login", true, 100, 0)
.thenAccept(users -> {
assertThat(users, not(empty()));
assertThat(users, hasSize(5));
assertThat(users.get(0).getLogin(), startsWith("a"));
assertThat(users.get(1).getLogin(), startsWith("b"));
assertThat(users.get(2).getLogin(), startsWith("c"));
assertThat(users.get(3).getLogin(), startsWith("d"));
assertThat(users.get(4).getLogin(), startsWith("e"));
}).get(15, TimeUnit.SECONDS);
userService.list(null, "%" + suffix, null, null, "login", false, 100, 0)
.thenAccept(users -> {
assertThat(users, not(empty()));
assertThat(users, hasSize(5));
assertThat(users.get(0).getLogin(), startsWith("e"));
assertThat(users.get(1).getLogin(), startsWith("d"));
assertThat(users.get(2).getLogin(), startsWith("c"));
assertThat(users.get(3).getLogin(), startsWith("b"));
assertThat(users.get(4).getLogin(), startsWith("a"));
}).get(15, TimeUnit.SECONDS);
verify(requestHandler, times(2)).handle(argument.capture());
}
@Test
@DirtiesContext(methodMode = DirtiesContext.MethodMode.BEFORE_METHOD)
public void should_return_list_of_users_paginated() throws Exception {
String prefix = RandomStringUtils.randomAlphabetic(5);
List<Long> ids = new ArrayList<>(100);
for (int i = 0; i < 100; i++) {
UserVO user = new UserVO();
user.setLogin(prefix + RandomStringUtils.randomAlphabetic(10));
user.setStatus(UserStatus.ACTIVE);
user = userService.createUser(user, RandomStringUtils.randomAlphabetic(10));
ids.add(user.getId());
}
handleListUserRequest();
userService.list(null, "%" + prefix + "%", null, null, null, true, 20, 10)
.thenAccept(users -> {
assertThat(users, not(empty()));
assertThat(users, hasSize(20));
List<Long> expectedIds = ids.stream().skip(10).limit(20).collect(Collectors.toList());
List<Long> returnedIds = users.stream().map(UserVO::getId).collect(Collectors.toList());
assertThat(returnedIds, equalTo(expectedIds));
}).get(15, TimeUnit.SECONDS);
verify(requestHandler, times(1)).handle(argument.capture());
}
private void handleListUserRequest() {
when(requestHandler.handle(any(Request.class))).thenAnswer(invocation -> {
Request request = invocation.getArgumentAt(0, Request.class);
ListUserRequest req = request.getBody().cast(ListUserRequest.class);
final List<UserVO> users =
userDao.list(req.getLogin(), req.getLoginPattern(),
req.getRole(), req.getStatus(),
req.getSortField(), req.getSortOrderAsc(),
req.getTake(), req.getSkip());
return Response.newBuilder()
.withBody(new ListUserResponse(users))
.buildSuccess();
});
}
}