package br.gov.servicos.editor.security; import br.gov.servicos.editor.usuarios.Papel; import br.gov.servicos.editor.usuarios.Usuario; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.InjectMocks; import org.mockito.Matchers; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; import javax.servlet.http.HttpServletRequest; import java.util.Collection; import java.util.Collections; import static br.gov.servicos.editor.security.TipoPermissao.CADASTRAR; import static br.gov.servicos.editor.security.TipoPermissao.CADASTRAR_OUTROS_ORGAOS; import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.mockito.Matchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @RunWith(MockitoJUnitRunner.class) public class LoginUserProfilesTest { private static final String EMAIL = "email@institucional.gov.br"; private static final String NOME = "Editor de Serviço"; private static final String ORGAO_ID = "orgaoId"; private static final String OUTRO_ORGAO = "outroOrgaoId"; private static final String NOME_PAPEL = "EDITOR"; private static final Collection<Permissao> PERMISSOES = Collections.emptyList(); @Mock private HttpServletRequest httpServletRequest; @Mock private Authentication authentication; @InjectMocks private LoginUserProfiles userProfiles; @Mock private GerenciadorPermissoes gerenciadorPermissoes; @Before public void setUp() { SecurityContextHolder.getContext().setAuthentication(authentication); } @Test public void deveEnviarUserProfileVazioCasoUsuarioNaoEstejaLogado() { when(authentication.getPrincipal()).thenReturn(mock(Object.class)); assertThat(userProfiles.get(), equalTo(new UserProfile())); } @Test public void deveEnviarUserProfileComDadosDeUsuarioLogado() { Papel papel = new Papel(); papel.setNome(NOME_PAPEL); Usuario usuario = new Usuario().withEmailPrimario(EMAIL).withNome(NOME).withPapel(papel); Usuario.setGerenciadorPermissoes(gerenciadorPermissoes); when(gerenciadorPermissoes.getPermissoes(Matchers.anyString())).thenReturn(PERMISSOES); when(authentication.getPrincipal()).thenReturn(usuario); UserProfile actual = userProfiles.get(); assertThat(actual.getEmail(), equalTo(EMAIL)); assertThat(actual.getName(), equalTo(NOME)); assertThat(actual.getId(), equalTo(EMAIL)); } @Test public void deveValidarSeUsuarioTiverPermissaoParaOperacao() { Usuario usuario = mock(Usuario.class); when(authentication.getPrincipal()).thenReturn(usuario); when(usuario.temPermissaoComOrgao(any(), any())).thenReturn(true); assertTrue(userProfiles.temPermissaoParaOrgao(TipoPermissao.PUBLICAR, ORGAO_ID)); } @Test public void deveInvalidarSeUsuarioNãoTiverPermissaoParaOperacao() { Usuario usuario = mock(Usuario.class); when(authentication.getPrincipal()).thenReturn(usuario); when(usuario.temPermissaoComOrgao(any(), any())).thenReturn(false); assertFalse(userProfiles.temPermissaoParaOrgao(TipoPermissao.PUBLICAR, OUTRO_ORGAO)); } @Test public void deveInvalidarSeUsuarioNaoTemPermissaoParaCadastrarPapel() { Usuario usuario = mock(Usuario.class); when(authentication.getPrincipal()).thenReturn(usuario); when(usuario.temPermissao(CADASTRAR.comPapel("PUBLICADOR"))).thenReturn(false); assertFalse(userProfiles.temPermissaoGerenciarUsuarioOrgaoEPapel(ORGAO_ID, "PUBLICADOR")); } @Test public void deveInvalidarSeSiorgForDiferenteDeOrgaoId() { Usuario usuario = mock(Usuario.class); when(authentication.getPrincipal()).thenReturn(usuario); when(usuario.temPermissao(CADASTRAR.comPapel("PUBLICADOR"))).thenReturn(true); when(usuario.getSiorg()).thenReturn(OUTRO_ORGAO); assertFalse(userProfiles.temPermissaoGerenciarUsuarioOrgaoEPapel(ORGAO_ID, "PUBLICADOR")); } @Test public void deveValidarSeSiorForIgualAoOrgaoId() { Usuario usuario = mock(Usuario.class); when(authentication.getPrincipal()).thenReturn(usuario); when(usuario.temPermissao(CADASTRAR.comPapel("PUBLICADOR"))).thenReturn(true); when(usuario.getSiorg()).thenReturn(ORGAO_ID); assertTrue(userProfiles.temPermissaoGerenciarUsuarioOrgaoEPapel(ORGAO_ID, "PUBLICADOR")); } @Test public void deveValidarSeUsuarioTemPermissaoDeCadastrarOutrosOrgaosMesmoSeSiorgForDiferenteDeOrgaoId() { Usuario usuario = mock(Usuario.class); when(authentication.getPrincipal()).thenReturn(usuario); when(usuario.temPermissao(CADASTRAR.comPapel("PUBLICADOR"))).thenReturn(true); when(usuario.temPermissao(CADASTRAR_OUTROS_ORGAOS.getNome())).thenReturn(true); when(usuario.getSiorg()).thenReturn(OUTRO_ORGAO); assertTrue(userProfiles.temPermissaoGerenciarUsuarioOrgaoEPapel(ORGAO_ID, "PUBLICADOR")); } }