package br.gov.servicos.editor.usuarios.recuperarsenha; import br.gov.servicos.editor.usuarios.Papel; import br.gov.servicos.editor.usuarios.Usuario; import br.gov.servicos.editor.usuarios.token.CpfTokenInvalido; import br.gov.servicos.editor.usuarios.token.TokenExpirado; 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.validation.BindingResult; import org.springframework.validation.FieldError; import org.springframework.web.servlet.ModelAndView; import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.MatcherAssert.assertThat; import static org.mockito.Mockito.*; @RunWith(MockitoJUnitRunner.class) public class RecuperarSenhaControllerTest { static final String USUARIO_ID = "123412341234"; static final String PAGINA = "recuperarSenha"; static final String CPF = "12312312319"; static final Usuario USUARIO = new Usuario().withCpf(CPF).withId(Long.valueOf(USUARIO_ID)).withPapel(new Papel()); @Mock private RecuperacaoSenhaService tokenService; @Mock private BindingResult bindingResult; @InjectMocks private RecuperarSenhaController controller; @Test public void deveTentarSalvarNovaSenhaSeFormularioNãoPossuirErrosBasicos() throws CpfTokenInvalido, TokenExpirado { CamposVerificacaoRecuperarSenha camposVerificacaoRecuperarSenha = new CamposVerificacaoRecuperarSenha() .withUsuarioId(USUARIO_ID); FormularioRecuperarSenha formulario = new FormularioRecuperarSenha() .withCamposVerificacaoRecuperarSenha(camposVerificacaoRecuperarSenha); when(tokenService.trocarSenha(formulario)).thenReturn(USUARIO); when(bindingResult.hasErrors()).thenReturn(false); controller.recuperarSenha(PAGINA, formulario, bindingResult); verify(tokenService).trocarSenha(formulario); } @Test public void deveAdicionarErroAResultBidingCasoTokenEstejaInvalido() throws CpfTokenInvalido, TokenExpirado { FormularioRecuperarSenha formulario = new FormularioRecuperarSenha(); when(bindingResult.hasErrors()).thenReturn(false); int tentativasSobrando = 3; doThrow(new CpfTokenInvalido(tentativasSobrando)).when(tokenService).trocarSenha(formulario); ModelAndView endereco = controller.recuperarSenha(PAGINA, formulario, bindingResult); FieldError fieldError = new FieldError(FormularioRecuperarSenha.NOME_CAMPO, CamposVerificacaoRecuperarSenha.NOME, "O CPF informado não é compatível com o cadastrado. Você possui mais " + tentativasSobrando + " tentativas."); verify(bindingResult).addError(fieldError); assertThat(endereco.getViewName(), equalTo("recuperar-senha")); } @Test public void deveAdicionarErroDeTokenBloqueadoAoResultBidingCasoTokenEstejaUltrapassadoNumeroDeTentativas() throws CpfTokenInvalido, TokenExpirado { FormularioRecuperarSenha formulario = new FormularioRecuperarSenha(); when(bindingResult.hasErrors()).thenReturn(false); int tentativasSobrando = 0; doThrow(new CpfTokenInvalido(tentativasSobrando)).when(tokenService).trocarSenha(formulario); controller.recuperarSenha(PAGINA, formulario, bindingResult); FieldError fieldError = new FieldError(FormularioRecuperarSenha.NOME_CAMPO, CamposVerificacaoRecuperarSenha.NOME, "O CPF informado não é compatível com o cadastrado e este link foi bloqueado. " + "Entre em contato com o responsável pelo seu órgão para solicitar um novo link."); verify(bindingResult).addError(fieldError); } @Test public void deveAdicionarErroDeTokenExpiraCasoTokenEstejaExpirado() throws CpfTokenInvalido, TokenExpirado { FormularioRecuperarSenha formulario = new FormularioRecuperarSenha(); when(bindingResult.hasErrors()).thenReturn(false); doThrow(new TokenExpirado()).when(tokenService).trocarSenha(formulario); controller.recuperarSenha(PAGINA, formulario, bindingResult); FieldError fieldError = new FieldError(FormularioRecuperarSenha.NOME_CAMPO, CamposVerificacaoRecuperarSenha.NOME, "Este link não é válido. Solicite um novo link para alterar sua senha."); verify(bindingResult).addError(fieldError); } }