package com.allanditzel.dashboard.controller.user; import com.allanditzel.dashboard.exception.UnknownResourceException; import com.allanditzel.dashboard.model.User; import com.allanditzel.dashboard.model.resource.UserResource; import com.allanditzel.dashboard.model.resource.UserResourceAssembler; import com.allanditzel.dashboard.exception.ApplicationException; import com.allanditzel.dashboard.service.user.UserService; import com.stormpath.sdk.account.Account; import com.stormpath.sdk.account.AccountCriteria; import com.stormpath.sdk.account.AccountList; import com.stormpath.sdk.application.Application; import com.stormpath.sdk.client.Client; import com.stormpath.sdk.group.Group; import com.stormpath.sdk.group.GroupCriteria; import com.stormpath.sdk.group.GroupList; import com.sun.org.apache.bcel.internal.classfile.Unknown; import org.apache.commons.lang3.RandomStringUtils; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; import org.springframework.http.MediaType; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContext; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.test.util.ReflectionTestUtils; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import java.io.IOException; import java.nio.charset.Charset; import java.security.UnrecoverableKeyException; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.mockito.Matchers.any; import static org.mockito.Mockito.verify; import static org.powermock.api.mockito.PowerMockito.*; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; @RunWith(PowerMockRunner.class) @PrepareForTest({SecurityContextHolder.class, RandomStringUtils.class}) public class UserControllerTest { private static final String USERNAME = "username"; private static final String FIRST_NAME = "firstName"; private static final String LAST_NAME = "lastName"; private static final String EMAIL = "email"; private static final String PASSWORD = "password"; @Mock private UserService userService; @Mock private UserResourceAssembler resourceAssembler; @Mock private Authentication authentication; @Mock private Application application; @Mock private AccountList accountList; @Mock private Iterator<Account> accountIterator; @Mock private Account account; @Mock private User user; @Mock private UserResource userResource; private UserController userController; @Before public void setUp() { userController = new UserController(); ReflectionTestUtils.setField(userController, "resourceAssembler", resourceAssembler); ReflectionTestUtils.setField(userController, "userService", userService); } @Test(expected = UnknownResourceException.class) public void shouldThrowUnknownResourceExceptionIfCurrentUserCannotBeFound() throws IOException { String username = "username"; String password = "password"; UsernamePasswordAuthenticationToken currentUser = new UsernamePasswordAuthenticationToken(username, password); when(userService.getByUsername(username)).thenReturn(null); userController.redirectToCurrentUser(currentUser); } @Test public void shouldReturnRedirectView() throws Exception { String username = "username"; String password = "password"; String id = "id"; String expectedRedirectView = "redirect:/api/user/" + id; UsernamePasswordAuthenticationToken currentUser = new UsernamePasswordAuthenticationToken(username, password); when(userService.getByUsername(username)).thenReturn(user); when(user.getId()).thenReturn(id); String redirectView = userController.redirectToCurrentUser(currentUser); assertEquals(expectedRedirectView, redirectView); verify(userService).getByUsername(username); verify(user).getId(); } @Test public void shouldReturnUserResourceWhenUsingId() { String id = "id"; when(userService.getById(id)).thenReturn(user); when(resourceAssembler.toResource(user)).thenReturn(userResource); UserResource resource = userController.getUser(id); assertNotNull(resource); verify(userService).getById(id); verify(resourceAssembler).toResource(user); } @Test public void shouldCreateUser() { UserResource resource = getUserResource(); when(userService.createUser(any(User.class))).thenReturn(user); when(resourceAssembler.toResource(user)).thenReturn(resource); userController.createUser(resource); verify(userService).createUser(any(User.class)); verify(resourceAssembler).toResource(user); } @Test public void shouldReturnEmptyListIfUserServiceReturnsEmptyList() { List<User> users = Collections.emptyList(); List<UserResource> userResources = Collections.emptyList(); when(userService.getAllUsers()).thenReturn(users); when(resourceAssembler.toResources(users)).thenReturn(userResources); List<UserResource> actualUserResources = userController.getAllUsers(); assertNotNull(actualUserResources); assertEquals(0, actualUserResources.size()); verify(userService).getAllUsers(); verify(resourceAssembler).toResources(users); } @Test public void shouldReturnPopulatedListOfUserResources() { List<User> users = new ArrayList<>(); users.add(getUser()); List<UserResource> userResources = new ArrayList<>(); userResources.add(getUserResource()); when(userService.getAllUsers()).thenReturn(users); when(resourceAssembler.toResources(users)).thenReturn(userResources); List<UserResource> actualUserResources = userController.getAllUsers(); assertNotNull(actualUserResources); assertEquals(1, actualUserResources.size()); verify(userService).getAllUsers(); verify(resourceAssembler).toResources(users); } private UserResource getUserResource() { UserResource resource = new UserResource(); resource.setFirstName(FIRST_NAME); resource.setLastName(LAST_NAME); resource.setEmail(EMAIL); resource.setPassword(PASSWORD); return resource; } private User getUser() { User user = new User(); user.setUsername(EMAIL); user.setFirstName(FIRST_NAME); user.setLastName(LAST_NAME); user.setEmail(EMAIL); return user; } }