/*******************************************************************************
* Copyright (c) 2012-2017 Codenvy, S.A.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Codenvy, S.A. - initial API and implementation
*******************************************************************************/
package org.eclipse.che.api.user.server;
import org.eclipse.che.api.core.ConflictException;
import org.eclipse.che.api.core.Page;
import org.eclipse.che.api.core.ServerException;
import org.eclipse.che.api.core.model.user.User;
import org.eclipse.che.api.core.notification.EventService;
import org.eclipse.che.api.user.server.event.BeforeUserRemovedEvent;
import org.eclipse.che.api.user.server.event.PostUserPersistedEvent;
import org.eclipse.che.api.user.server.event.UserCreatedEvent;
import org.eclipse.che.api.user.server.event.UserRemovedEvent;
import org.eclipse.che.api.user.server.model.impl.ProfileImpl;
import org.eclipse.che.api.user.server.model.impl.UserImpl;
import org.eclipse.che.api.user.server.spi.PreferenceDao;
import org.eclipse.che.api.user.server.spi.ProfileDao;
import org.eclipse.che.api.user.server.spi.UserDao;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.testng.MockitoTestNGListener;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Listeners;
import org.testng.annotations.Test;
import java.util.Arrays;
import java.util.Collections;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyMapOf;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.mockito.MockitoAnnotations.initMocks;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertNotNull;
import static org.testng.Assert.assertTrue;
import static org.testng.Assert.fail;
/**
* Tests for {@link UserManager}.
*
* @author Max Shaposhnik (mshaposhnik@codenvy.com)
* @author Yevhenii Voevodin
*/
@Listeners(MockitoTestNGListener.class)
public class UserManagerTest {
@Mock
private UserDao userDao;
@Mock
private ProfileDao profileDao;
@Mock
private PreferenceDao preferencesDao;
@Mock
private EventService eventService;
@Mock
private PostUserPersistedEvent postUserPersistedEvent;
@Mock
private BeforeUserRemovedEvent beforeUserRemovedEvent;
private UserManager manager;
@BeforeMethod
public void setUp() {
initMocks(this);
manager = new UserManager(userDao, profileDao, preferencesDao, eventService, new String[] {"reserved"});
when(eventService.publish(any())).thenAnswer(invocationOnMock -> {
Object arg = invocationOnMock.getArguments()[0];
if (arg instanceof BeforeUserRemovedEvent) {
return beforeUserRemovedEvent;
} else {
return postUserPersistedEvent;
}
});
}
@Test
public void shouldCreateProfileAndPreferencesOnUserCreation() throws Exception {
final UserImpl user = new UserImpl(null, "test@email.com", "testName", null, null);
manager.create(user, false);
verify(userDao).create(any(UserImpl.class));
verify(profileDao).create(any(ProfileImpl.class));
verify(preferencesDao).setPreferences(anyString(), anyMapOf(String.class, String.class));
}
@Test
public void shouldGeneratePasswordWhenCreatingUserAndItIsMissing() throws Exception {
final User user = new UserImpl(null, "test@email.com", "testName", null, null);
manager.create(user, false);
final ArgumentCaptor<UserImpl> userCaptor = ArgumentCaptor.forClass(UserImpl.class);
verify(userDao).create(userCaptor.capture());
assertNotNull(userCaptor.getValue().getPassword());
}
@Test
public void shouldGenerateIdentifierWhenCreatingUserWithNullId() throws Exception {
final User user = new UserImpl(null, "test@email.com", "testName", null, null);
manager.create(user, false);
final ArgumentCaptor<UserImpl> userCaptor = ArgumentCaptor.forClass(UserImpl.class);
verify(userDao).create(userCaptor.capture());
final String id = userCaptor.getValue().getId();
assertNotNull(id);
}
@Test
public void shouldNotGenerateIdentifierWhenCreatingUserWithNotNullId() throws Exception {
final User user = new UserImpl("identifier", "test@email.com", "testName", null, null);
manager.create(user, false);
final ArgumentCaptor<UserImpl> userCaptor = ArgumentCaptor.forClass(UserImpl.class);
verify(userDao).create(userCaptor.capture());
final String id = userCaptor.getValue().getId();
assertNotNull(id);
assertEquals(id, "identifier");
}
@Test(expectedExceptions = NullPointerException.class)
public void shouldThrowNpeWhenUpdatingUserWithNullEntity() throws Exception {
manager.update(null);
}
@Test
public void shouldUpdateUser() throws Exception {
final User user = new UserImpl("identifier", "test@email.com", "testName", "password", Collections.emptyList());
manager.update(user);
verify(userDao).update(new UserImpl(user));
}
@Test(expectedExceptions = NullPointerException.class)
public void shouldThrownNpeWhenTryingToGetUserByNullId() throws Exception {
manager.getById(null);
}
@Test
public void shouldGetUserById() throws Exception {
final User user = new UserImpl("identifier", "test@email.com", "testName", "password", Collections.singletonList("alias"));
when(manager.getById(user.getId())).thenReturn(user);
assertEquals(manager.getById(user.getId()), user);
}
@Test(expectedExceptions = NullPointerException.class)
public void shouldThrownNpeWhenTryingToGetUserByNullAlias() throws Exception {
manager.getByAlias(null);
}
@Test
public void shouldGetUserByAlias() throws Exception {
final User user = new UserImpl("identifier", "test@email.com", "testName", "password", Collections.singletonList("alias"));
when(manager.getByAlias("alias")).thenReturn(user);
assertEquals(manager.getByAlias("alias"), user);
}
@Test(expectedExceptions = NullPointerException.class)
public void shouldThrownNpeWhenTryingToGetUserByNullName() throws Exception {
manager.getByName(null);
}
@Test
public void shouldGetUserByName() throws Exception {
final User user = new UserImpl("identifier", "test@email.com", "testName", "password", Collections.singletonList("alias"));
when(manager.getByName(user.getName())).thenReturn(user);
assertEquals(manager.getByName(user.getName()), user);
}
@Test(expectedExceptions = NullPointerException.class)
public void shouldThrownNpeWhenTryingToGetUserWithNullEmail() throws Exception {
manager.getByEmail(null);
}
@Test
public void shouldGetUserByEmail() throws Exception {
final User user = new UserImpl("identifier", "test@email.com", "testName", "password", Collections.singletonList("alias"));
when(manager.getByEmail(user.getEmail())).thenReturn(user);
assertEquals(manager.getByEmail(user.getEmail()), user);
}
@Test
public void shouldGetTotalUserCount() throws Exception {
when(userDao.getTotalCount()).thenReturn(5L);
assertEquals(manager.getTotalCount(), 5);
verify(userDao).getTotalCount();
}
@Test
public void shouldGetAllUsers() throws Exception {
final Page users = new Page(Arrays.asList(
new UserImpl("identifier1", "test1@email.com", "testName1", "password", Collections.singletonList("alias1")),
new UserImpl("identifier2", "test2@email.com", "testName2", "password", Collections.singletonList("alias2")),
new UserImpl("identifier3", "test3@email.com", "testName3", "password", Collections.singletonList("alias3"))), 0, 30, 3);
when(userDao.getAll(30, 0)).thenReturn(users);
assertEquals(manager.getAll(30, 0), users);
verify(userDao).getAll(30, 0);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void shouldThrowIllegalArgumentExceptionsWhenGetAllUsersWithNegativeMaxItems() throws Exception {
manager.getAll(-5, 0);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void shouldThrowIllegalArgumentExceptionsWhenGetAllUsersWithNegativeSkipCount() throws Exception {
manager.getAll(30, -11);
}
@Test(expectedExceptions = NullPointerException.class)
public void shouldThrowNpeWhenRemovingUserByNullId() throws Exception {
manager.remove(null);
}
@Test
public void shouldRemoveUser() throws Exception {
manager.remove("user123");
verify(userDao).remove("user123");
}
@Test(expectedExceptions = ConflictException.class)
public void shouldThrowConflictExceptionOnCreationIfUserNameIsReserved() throws Exception {
final User user = new UserImpl("id", "test@email.com", "reserved");
manager.create(user, false);
}
@Test
public void shouldFireBeforeUserRemovedEventOnRemoveExistedUser() throws Exception {
final UserImpl user = new UserImpl("identifier", "test@email.com", "testName", "password", Collections.singletonList("alias"));
when(userDao.getById(user.getId())).thenReturn(user);
manager.remove(user.getId());
ArgumentCaptor<Object> firedEvents = ArgumentCaptor.forClass(Object.class);
verify(eventService, times(2)).publish(firedEvents.capture());
// the first event - BeforeUserRemovedEvent
// the second event - UserRemovedEvent
Object event = firedEvents.getAllValues().get(0);
assertTrue(event instanceof BeforeUserRemovedEvent, "Not a BeforeUserRemovedEvent");
assertEquals(((BeforeUserRemovedEvent)event).getUser(), user);
}
@Test
public void shouldFireUserRemovedEventOnRemoveExistedUser() throws Exception {
final UserImpl user = new UserImpl("identifier", "test@email.com", "testName", "password", Collections.singletonList("alias"));
when(userDao.getById(user.getId())).thenReturn(user);
manager.remove(user.getId());
ArgumentCaptor<Object> firedEvents = ArgumentCaptor.forClass(Object.class);
verify(eventService, times(2)).publish(firedEvents.capture());
// the first event - BeforeUserRemovedEvent
// the second event - UserRemovedEvent
Object event = firedEvents.getAllValues().get(1);
assertTrue(event instanceof UserRemovedEvent, "Not a UserRemovedEvent");
assertEquals(((UserRemovedEvent)event).getUserId(), user.getId());
}
@Test
public void shouldNotRemoveUserWhenSubscriberThrowsExceptionOnRemoveExistedUser() throws Exception {
final UserImpl user = new UserImpl("identifier", "test@email.com", "testName", "password", Collections.singletonList("alias"));
when(userDao.getById(user.getId())).thenReturn(user);
doThrow(new ServerException("error")).when(beforeUserRemovedEvent).propagateException();
try {
manager.remove(user.getId());
fail("ServerException expected.");
} catch (ServerException ignored) {
}
ArgumentCaptor<Object> firedEvents = ArgumentCaptor.forClass(Object.class);
verify(eventService, times(1)).publish(firedEvents.capture());
assertTrue(firedEvents.getValue() instanceof BeforeUserRemovedEvent, "Not a BeforeUserRemovedEvent");
}
@Test
public void shouldFirePostUserPersistedEventNewUserCreatedAndBeforeCommit() throws Exception {
final UserImpl user = new UserImpl("identifier", "test@email.com", "testName", "password", Collections.singletonList("alias"));
manager.create(user, false);
ArgumentCaptor<Object> firedEvents = ArgumentCaptor.forClass(Object.class);
verify(eventService, times(2)).publish(firedEvents.capture());
// the first event - PostUserPersistedEvent
// the second event - UserCreatedEvent
Object event = firedEvents.getAllValues().get(0);
assertTrue(event instanceof PostUserPersistedEvent, "Not a PostUserPersistedEvent");
assertEquals(((PostUserPersistedEvent)event).getUser(), user);
}
@Test
public void shouldFireUserCreatedEventOnNewUserCreated() throws Exception {
final UserImpl user = new UserImpl("identifier", "test@email.com", "testName", "password", Collections.singletonList("alias"));
manager.create(user, false);
ArgumentCaptor<Object> firedEvents = ArgumentCaptor.forClass(Object.class);
verify(eventService, times(2)).publish(firedEvents.capture());
// the first event - PostUserPersistedEvent
// the second event - UserCreatedEvent
Object event = firedEvents.getAllValues().get(1);
assertTrue(event instanceof UserCreatedEvent, "Not a UserCreatedEvent");
assertEquals(((UserCreatedEvent)event).getUser(), user);
}
@Test
public void shouldNotCreteUserWhenSubscriberThrowsExceptionOnCreatingNewUser() throws Exception {
final UserImpl user = new UserImpl("identifier", "test@email.com", "testName", "password", Collections.singletonList("alias"));
doThrow(new ServerException("error")).when(postUserPersistedEvent).propagateException();
try {
manager.create(user, false);
fail("ServerException expected.");
} catch (ServerException ignored) {
}
ArgumentCaptor<Object> firedEvents = ArgumentCaptor.forClass(Object.class);
verify(eventService, times(1)).publish(firedEvents.capture());
assertTrue(firedEvents.getValue() instanceof PostUserPersistedEvent, "Not a PostUserPersistedEvent");
}
}