package br.gov.servicos.editor.usuarios;
import br.gov.servicos.editor.security.UserProfiles;
import br.gov.servicos.editor.usuarios.cadastro.FormularioUsuario;
import br.gov.servicos.editor.usuarios.recuperarsenha.RecuperacaoSenhaService;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import org.springframework.security.access.AccessDeniedException;
import org.springframework.validation.BindingResult;
import org.springframework.web.servlet.ModelAndView;
import static br.gov.servicos.editor.usuarios.GerenciarUsuarioController.COMPLETAR_CADASTRO;
import static br.gov.servicos.editor.usuarios.GerenciarUsuarioController.RECUPERAR_SENHA;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.mockito.Mockito.*;
@RunWith(MockitoJUnitRunner.class)
public class GerenciarUsuarioControllerTest {
static final String CPF = "12312312319";
static final String TOKEN = "token";
static final String USUARIO_ID = "123412341234";
static final FormularioUsuario FORM_USUARIO = new FormularioUsuario().withPapelId("1");
static final Usuario USUARIO = new Usuario().withCpf(CPF).withId(Long.valueOf(USUARIO_ID)).withPapel(new Papel());
@Mock
private UsuarioService usuarioService;
@Mock
private UsuarioFactory factory;
@Mock
private BindingResult bindingResult;
@Mock
private RecuperacaoSenhaService tokenService;
@Mock
private UserProfiles userProfiles;
@Mock
private PapelRepository papelRepository;
@InjectMocks
private GerenciarUsuarioController controller;
@Before
public void setUp() {
when(papelRepository.findById(any())).thenReturn(new Papel());
}
@Test
public void salvaNovoUsuario() {
when(userProfiles.temPermissaoGerenciarUsuarioOrgaoEPapel(any(), any())).thenReturn(true);
when(bindingResult.hasErrors()).thenReturn(false);
when(factory.criarUsuario(FORM_USUARIO)).thenReturn(USUARIO);
when(usuarioService.save(USUARIO)).thenReturn(USUARIO);
controller.criar(FORM_USUARIO, bindingResult);
verify(usuarioService).save(USUARIO);
}
@Test
public void vaiParaPaginaDeIntrucoesParaFinalizarCadastro() {
when(userProfiles.temPermissaoGerenciarUsuarioOrgaoEPapel(any(), any())).thenReturn(true);
when(bindingResult.hasErrors()).thenReturn(false);
when(factory.criarUsuario(FORM_USUARIO)).thenReturn(USUARIO);
when(usuarioService.save(USUARIO)).thenReturn(USUARIO);
when(tokenService.gerarTokenParaUsuario(USUARIO_ID)).thenReturn(TOKEN);
ModelAndView modelAndView = controller.criar(FORM_USUARIO, bindingResult);
assertThat(modelAndView.getViewName(), equalTo("instrucoes-recuperar-senha"));
assertThat(modelAndView.getModel().get("link"), equalTo("/editar/recuperar-senha?token="
+ TOKEN + "&usuarioId=" + USUARIO_ID + "&pagina=" + COMPLETAR_CADASTRO));
assertThat(modelAndView.getModel().get("usuario"), equalTo(USUARIO));
}
@Test(expected = AccessDeniedException.class)
public void deveLancarExcecaoSeNaoPermitidoAlterarUsuario() {
when(userProfiles.temPermissaoGerenciarUsuarioOrgaoEPapel(any(), any())).thenReturn(false);
controller.criar(FORM_USUARIO, bindingResult);
}
@Test
public void naoSalvaSeFormularioPossuiErros() {
when(userProfiles.temPermissaoGerenciarUsuarioOrgaoEPapel(any(), any())).thenReturn(true);
when(bindingResult.hasErrors()).thenReturn(true);
when(factory.criarUsuario(FORM_USUARIO)).thenReturn(USUARIO);
controller.criar(FORM_USUARIO, bindingResult);
verify(usuarioService, never()).save(USUARIO);
}
@Test
public void retornaMesmoUsuarioFormularioSeFormularioPossuiErros() {
when(userProfiles.temPermissaoGerenciarUsuarioOrgaoEPapel(any(), any())).thenReturn(true);
when(bindingResult.hasErrors()).thenReturn(true);
ModelAndView modelAndView = controller.criar(FORM_USUARIO, bindingResult);
assertThat(modelAndView.getViewName(), equalTo("cadastrar"));
}
@Test
public void mostraInformacoesDoUsuarioNasIntrucoesDeRecuperarSenhas() {
when(usuarioService.findById(USUARIO_ID)).thenReturn(USUARIO);
ModelAndView modelAndView = controller.requisitarTrocaSenha(USUARIO_ID);
assertThat(modelAndView.getModel().get("usuario"), equalTo(USUARIO));
}
@Test
public void mostrarLinkComTokenNasIntrucoesDeRecuperarSenhas() {
when(usuarioService.findById(USUARIO_ID)).thenReturn(USUARIO);
when(tokenService.gerarTokenParaUsuario(USUARIO_ID)).thenReturn(TOKEN);
ModelAndView modelAndView = controller.requisitarTrocaSenha(USUARIO_ID);
assertThat(modelAndView.getModel().get("link"), equalTo("/editar/recuperar-senha?token=" + TOKEN +
"&usuarioId=" + USUARIO_ID + "&pagina=" + RECUPERAR_SENHA));
}
}