package br.gov.servicos.editor.conteudo.cartas; import br.gov.servicos.editor.conteudo.ConteudoVersionado; import br.gov.servicos.editor.conteudo.ConteudoVersionadoFactory; import br.gov.servicos.editor.conteudo.TipoPagina; import br.gov.servicos.editor.frontend.Siorg; import br.gov.servicos.editor.security.TipoPermissao; import br.gov.servicos.editor.security.UserProfiles; import br.gov.servicos.editor.utils.ReformatadorXml; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.AccessDeniedException; import org.springframework.web.servlet.view.RedirectView; import javax.xml.transform.dom.DOMSource; import static br.gov.servicos.editor.conteudo.TipoPagina.SERVICO; import static br.gov.servicos.editor.utils.TestData.PROFILE; import static org.hamcrest.core.Is.is; import static org.junit.Assert.assertThat; import static org.mockito.BDDMockito.given; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyString; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.verify; @RunWith(MockitoJUnitRunner.class) public class SalvarCartaControllerTest { public static final DOMSource DOM = new DOMSource(); public static final String CARTA = "<servico><url>http://estruturaorganizacional.dados.gov.br/id/unidade-organizacional/1934</url><nome>Carta A</nome></servico>"; @Mock ReformatadorXml reformatadorXml; @Mock UserProfiles userProfiles; @Mock ConteudoVersionadoFactory factory; @Mock ConteudoVersionado carta; @Autowired Siorg siorg; SalvarCartaController controller; @Before public void setUp() throws Exception { controller = new SalvarCartaController(reformatadorXml, userProfiles, factory, siorg); given(factory.pagina(anyString(), eq(SERVICO))) .willReturn(carta); } @Test public void deveReformatarAntesDeSalvar() throws Exception { given(userProfiles.get()).willReturn(PROFILE); given(userProfiles.temPermissaoParaTipoPaginaOrgaoEspecifico(eq(TipoPermissao.EDITAR_SALVAR), any(TipoPagina.class), anyString())).willReturn(true); controller.salvar("servico", "", DOM); verify(reformatadorXml).formata(DOM); } @Test public void deveDelegarSalvamentoParaCarta() throws Exception { given(userProfiles.get()).willReturn(PROFILE); given(userProfiles.temPermissaoParaTipoPaginaOrgaoEspecifico(eq(TipoPermissao.EDITAR_SALVAR), any(TipoPagina.class), anyString())).willReturn(true); given(reformatadorXml.formata(DOM)).willReturn("<servico/>"); controller.salvar("servico", "", DOM); verify(carta).salvar(PROFILE, "<servico/>"); } @Test public void deveRedirecionarParaServico() throws Exception { given(reformatadorXml.formata(DOM)).willReturn("<servico/>"); given(carta.getId()).willReturn("id-da-carta"); given(userProfiles.temPermissaoParaTipoPaginaOrgaoEspecifico(eq(TipoPermissao.EDITAR_SALVAR), any(TipoPagina.class), anyString())).willReturn(true); RedirectView view = controller.salvar("servico", "", DOM); assertThat(view.getUrl(), is("/editar/api/pagina/servico/id-da-carta")); } @Test(expected = AccessDeniedException.class) public void usuarioNaoPodeSalvarCartaPoisNaoTemPermissao() throws Exception { given(userProfiles.get()).willReturn(PROFILE); given(userProfiles.temPermissaoParaTipoPagina(eq(TipoPermissao.EDITAR_SALVAR), any(TipoPagina.class))).willReturn(false); given(userProfiles.temPermissaoParaTipoPaginaOrgaoEspecifico(eq(TipoPermissao.EDITAR_SALVAR), any(TipoPagina.class), anyString())).willReturn(false); controller.salvar("servico", "", DOM); } }