package br.gov.servicos.editor.conteudo.cartas; import br.gov.servicos.editor.conteudo.ConteudoMetadadosProvider; import br.gov.servicos.editor.conteudo.ConteudoVersionado; import br.gov.servicos.editor.frontend.Siorg; import br.gov.servicos.editor.git.RepositorioGit; import br.gov.servicos.editor.utils.EscritorDeArquivos; import br.gov.servicos.editor.utils.LeitorDeArquivos; import br.gov.servicos.editor.utils.ReformatadorXml; import com.github.slugify.Slugify; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Captor; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; import java.io.File; import java.io.FileNotFoundException; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Date; import java.util.Optional; import java.util.function.Supplier; import static br.gov.servicos.editor.conteudo.TipoPagina.SERVICO; import static br.gov.servicos.editor.utils.TestData.PROFILE; import static java.util.Optional.of; 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.eq; import static org.mockito.Mockito.verify; @RunWith(MockitoJUnitRunner.class) @SuppressFBWarnings("DMI_HARDCODED_ABSOLUTE_FILENAME") public class CartaTest { static final Date HORARIO = new Date(); ConteudoVersionado conteudoVersionado; @Mock RepositorioGit repositorio; @Mock LeitorDeArquivos leitorDeArquivos; @Mock EscritorDeArquivos escritorDeArquivos; @Mock ReformatadorXml reformatadorXml; @Mock Siorg siorg; @Mock ConteudoMetadadosProvider provider; @Captor ArgumentCaptor<Supplier<Optional<String>>> captor; @Before public void setUp() throws Exception { conteudoVersionado = new ConteudoVersionado("um-id-qualquer", SERVICO, repositorio, leitorDeArquivos, escritorDeArquivos, new Slugify(), reformatadorXml, siorg); } @Test public void resolveCaminhoAbsoluto() throws Exception { given(repositorio.getCaminhoAbsoluto()) .willReturn(Paths.get("/um/caminho/qualquer")); assertThat(conteudoVersionado.getCaminhoAbsoluto(), is(Paths.get("/um/caminho/qualquer/", SERVICO.getCaminhoPasta().toString(), "um-id-qualquer.xml"))); } @Test public void resolveCaminhoRelativo() throws Exception { given(repositorio.getCaminhoAbsoluto()) .willReturn(Paths.get("/um/caminho/qualquer")); assertThat(conteudoVersionado.getCaminhoRelativo(), is(Paths.get(SERVICO.getCaminhoPasta().toString(), "um-id-qualquer.xml"))); } @Test public void retornaConteudoDoArquivoNoBranch() throws Exception { given( repositorio.comRepositorioAbertoNoBranch( eq("refs/heads/servico-um-id-qualquer"), captor.capture())) .willReturn(of("<servico/>")); given(repositorio.getCaminhoAbsoluto()) .willReturn(Paths.get("/um/caminho/qualquer")); given(leitorDeArquivos.ler(Paths.get("/um/caminho/qualquer/", SERVICO.getCaminhoPasta().toString(), "um-id-qualquer.xml").toFile())) .willReturn(of("<servico/>")); assertThat(conteudoVersionado.getConteudoRaw(), is("<servico/>")); assertThat(captor.getValue().get().get(), is("<servico/>")); } @Test public void retornaConteudoVazioQuandoArquivoNaoExisteNoBranch() throws Exception { given(repositorio.comRepositorioAbertoNoBranch(eq("refs/heads/servico-um-id-qualquer"), captor.capture())) .willReturn(of("<servico/>")); assertThat(conteudoVersionado.getConteudoRaw(), is("<servico/>")); given(repositorio.getCaminhoAbsoluto()) .willReturn(Paths.get("/um/caminho/qualquer")); given(leitorDeArquivos.ler(new File("/um/caminho/qualquer/" + SERVICO.getCaminhoPasta() + "/um-id-qualquer.xml"))) .willReturn(Optional.empty()); assertThat(captor.getValue().get().isPresent(), is(false)); } @Test(expected = FileNotFoundException.class) public void jogaFileNotFoundExceptionCasoNaoHajaArquivoNoBranch() throws Exception { given(repositorio.getCaminhoAbsoluto()) .willReturn(Paths.get("/um/caminho/qualquer")); given(repositorio.comRepositorioAbertoNoBranch( eq("refs/heads/servico-um-id-qualquer"), any())) .willReturn(Optional.empty()); conteudoVersionado.getConteudoRaw(); } @Test public void salvaConteudoNoBranch() throws Exception { given(repositorio.comRepositorioAbertoNoBranch(eq("refs/heads/servico-um-id-qualquer"), captor.capture())) .willReturn(null); conteudoVersionado.salvar(PROFILE, "<servico/>"); given(repositorio.getCaminhoAbsoluto()) .willReturn(Paths.get("/um/caminho/qualquer")); captor.getValue().get(); verify(repositorio).pull(); Path caminho = Paths.get(SERVICO.getCaminhoPasta() + "/um-id-qualquer.xml"); verify(repositorio).add(caminho); verify(repositorio).commit(caminho, "Cria 'um-id-qualquer'", PROFILE); verify(repositorio).push("refs/heads/servico-um-id-qualquer"); } }