package com.qprogramming.tasq.account;
import com.qprogramming.tasq.manage.AppService;
import com.qprogramming.tasq.manage.Theme;
import com.qprogramming.tasq.manage.ThemeService;
import com.qprogramming.tasq.projects.ProjectService;
import com.qprogramming.tasq.support.web.Message;
import com.qprogramming.tasq.test.MockSecurityContext;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import org.springframework.context.MessageSource;
import org.springframework.data.domain.*;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.session.SessionInformation;
import org.springframework.security.core.session.SessionRegistry;
import org.springframework.ui.Model;
import org.springframework.web.servlet.i18n.SessionLocaleResolver;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import javax.servlet.ServletContext;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.net.URL;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
import java.util.Locale;
import static com.qprogramming.tasq.test.TestUtils.*;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyLong;
import static org.mockito.Matchers.anyObject;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.*;
@RunWith(MockitoJUnitRunner.class)
public class AccountControllerTest {
@Rule
public ExpectedException thrown = ExpectedException.none();
private AccountController accountCtr;
@Mock
private AccountService accSrvMock;
@Mock
private MockSecurityContext securityMock;
@Mock
private RedirectAttributes raMock;
@Mock
private ProjectService projSrvMock;
@Mock
private Authentication authMock;
@Mock
private Model modelMock;
@Mock
private MessageSource msgMock;
@Mock
private HttpServletResponse responseMock;
@Mock
private HttpServletRequest requestMock;
@Mock
private HttpSession httpSesssionMock;
@Mock
private ServletContext scMock;
@Mock
private ServletOutputStream outStreamMock;
@Mock
private SessionLocaleResolver localeResolverMock;
@Mock
private SessionRegistry sessionRegistry;
@Mock
private ThemeService themeSrvMock;
@Mock
private AppService appSrvMock;
private Account testAccount;
private List<Account> accountsList;
@Before
public void setUp() {
accountCtr = new AccountController(accSrvMock, projSrvMock, msgMock, localeResolverMock, sessionRegistry,
themeSrvMock, appSrvMock);
testAccount = createAccount();
when(securityMock.getAuthentication()).thenReturn(authMock);
when(authMock.getPrincipal()).thenReturn(testAccount);
SecurityContextHolder.setContext(securityMock);
accountsList = createAccountList();
}
@Test
public void getUserTest() {
when(accSrvMock.findByUsername(USERNAME)).thenReturn(testAccount);
when(projSrvMock.findAllByUser(1L)).thenReturn(null);
accountCtr.getUser(USERNAME, modelMock, raMock);
verify(modelMock, times(2)).addAttribute(anyString(), anyObject());
}
@Test
public void getUserNotFoundTest() {
when(accSrvMock.findByUsername(USERNAME)).thenReturn(null);
when(msgMock.getMessage(anyString(), any(Object[].class), any(Locale.class))).thenReturn("TEST");
accountCtr.getUser(USERNAME, modelMock, raMock);
verify(raMock, times(1)).addFlashAttribute(anyString(),
new Message(anyString(), Message.Type.DANGER, new Object[]{}));
}
@Test
public void listUsersTest() {
List<Account> single = new LinkedList<Account>();
single.add(testAccount);
Page<Account> result = new PageImpl<Account>(accountsList);
Page<Account> singleResult = new PageImpl<Account>(single);
List<Object> principals = new LinkedList<Object>();
List<SessionInformation> sessions = new LinkedList<SessionInformation>();
principals.add(testAccount);
SessionInformation session = new SessionInformation(testAccount, "12345", new Date());
sessions.add(session);
Pageable p = new PageRequest(0, 5, new Sort(Sort.Direction.ASC, "surname"));
when(accSrvMock.findByNameSurnameContaining("Do", p)).thenReturn(singleResult);
when(accSrvMock.findAll(p)).thenReturn(result);
when(sessionRegistry.getAllPrincipals()).thenReturn(principals);
when(sessionRegistry.getAllSessions(testAccount, false)).thenReturn(sessions);
Assert.assertEquals(5, accountCtr.listUsers(null, p).getTotalElements());
accountCtr.listUsers(null, p);
Assert.assertEquals(1, accountCtr.listUsers("Do", p).getTotalElements());
accountCtr.listUsers(null, p);
}
@Test
public void getAccountsTest() {
when(accSrvMock.findAll()).thenReturn(accountsList);
List<DisplayAccount> list = accountCtr.listAccounts(null, responseMock).getBody();
Assert.assertEquals(5, list.size());
}
@Test
public void setRoleTest() {
List<Account> admins = new LinkedList<Account>();
admins.add(testAccount);
when(accSrvMock.findById(anyLong())).thenReturn(testAccount);
when(accSrvMock.findAdmins()).thenReturn(admins);
Assert.assertNotEquals("OK", accountCtr.setRole(1L, Roles.ROLE_POWERUSER));
}
@Test
public void saveSettingsTest() {
URL fileURL = getClass().getResource("/com/qprogramming/tasq/avatar.png");
MockMultipartFile mockMultipartFile;
try {
mockMultipartFile = new MockMultipartFile("content", fileURL.getFile(), "text/plain",
getClass().getResourceAsStream("/com/qprogramming/tasq/avatar.png"));
when(themeSrvMock.findById(1L)).thenReturn(new Theme());
when(accSrvMock.verifyPassword(any(Account.class), anyString())).thenReturn(true);
accountCtr.saveSettings(mockMultipartFile, EMAIL, testAccount.getName(), testAccount.getSurname(), "true", "true", "true", "en", 1L, "", raMock, requestMock, responseMock);
verify(accSrvMock, times(1)).update(any(Account.class));
verify(localeResolverMock, times(1)).setLocale(requestMock, responseMock, new Locale("en"));
} catch (IOException e) {
e.printStackTrace();
Assert.fail(e.getMessage());
}
}
@Test
public void saveSettingsAvatarTooBigTest() {
when(msgMock.getMessage(anyString(), any(Object[].class), any(Locale.class))).thenReturn("TEST");
URL fileURL = getClass().getResource("/com/qprogramming/tasq/avatar_tooBig.png");
MockMultipartFile mockMultipartFile;
try {
mockMultipartFile = new MockMultipartFile("content", fileURL.getFile(), "text/plain",
getClass().getResourceAsStream("/com/qprogramming/tasq/avatar_tooBig.png"));
when(themeSrvMock.findById(1L)).thenReturn(new Theme());
when(accSrvMock.verifyPassword(any(Account.class), anyString())).thenReturn(true);
accountCtr.saveSettings(mockMultipartFile, EMAIL, testAccount.getName(), testAccount.getSurname(), "true", "true", "true", "en", 1L, "", raMock, requestMock, responseMock);
verify(raMock, times(1)).addFlashAttribute(anyString(),
new Message(anyString(), Message.Type.DANGER, new Object[]{}));
} catch (IOException e) {
e.printStackTrace();
Assert.fail(e.getMessage());
}
}
}