package br.gov.servicos.editor.security;
import br.gov.servicos.editor.usuarios.FormularioAcessoCidadao;
import br.gov.servicos.editor.usuarios.Papel;
import br.gov.servicos.editor.usuarios.PapelRepository;
import br.gov.servicos.editor.usuarios.Usuario;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.runners.MockitoJUnitRunner;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import java.util.Collections;
import static org.hamcrest.Matchers.instanceOf;
import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertThat;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.verify;
@RunWith(MockitoJUnitRunner.class)
public class AcessoCidadaoServiceTest {
public static final String CIDADAO = "CIDADAO";
@Mock
PapelRepository repository;
@Mock
GerenciadorPermissoes gerenciadorPermissoes;
AcessoCidadaoService service;
@Before
public void setUp() {
Mockito.when(repository.findByNome(CIDADAO)).thenReturn(criaPapelCidadao());
Mockito.when(gerenciadorPermissoes.getPermissoes(anyString())).thenReturn(Collections.emptyList());
service = new AcessoCidadaoService(repository);
Usuario.setGerenciadorPermissoes(gerenciadorPermissoes);
}
@Test
public void deveBuscarPapelCidadao() {
chamaServico();
verify(repository).findByNome(CIDADAO);
}
@Test
public void deveAutorizarAcesso() {
chamaServico();
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
Object principal = authentication.getPrincipal();
assertThat(principal, instanceOf(Usuario.class));
assertThat(authentication.isAuthenticated(), is(true));
}
@Test
public void usuarioAutorizadoDeveSerCidadao() {
chamaServico();
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
Usuario usuario = (Usuario) authentication.getPrincipal();
assertThat(usuario.getPapel().getNome(), is(CIDADAO));
}
private void chamaServico() {
service.autenticaCidadao(criaCidadao());
}
private FormularioAcessoCidadao criaCidadao() {
return new FormularioAcessoCidadao("Nome", "um@email.com", "123.123.123-12");
}
private Papel criaPapelCidadao() {
Papel cidadao = new Papel();
cidadao.setNome(CIDADAO);
return cidadao;
}
}