br.gov.servicos.editor.conteudo.RepositorioGitTest.java Source code

Java tutorial

Introduction

Here is the source code for br.gov.servicos.editor.conteudo.RepositorioGitTest.java

Source

package br.gov.servicos.editor.conteudo;

import br.gov.servicos.editor.git.RepositorioConfig;
import br.gov.servicos.editor.git.RepositorioGit;
import lombok.SneakyThrows;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.lib.Ref;
import org.eclipse.jgit.lib.TextProgressMonitor;
import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.jgit.revwalk.RevWalk;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import java.util.stream.Stream;

import static br.gov.servicos.editor.utils.TestData.PROFILE;
import static br.gov.servicos.editor.utils.Unchecked.Supplier.uncheckedSupplier;
import static java.nio.file.Files.createTempDirectory;
import static java.nio.file.StandardOpenOption.WRITE;
import static java.util.Arrays.asList;
import static java.util.Optional.empty;
import static org.eclipse.jgit.api.ListBranchCommand.ListMode.ALL;
import static org.eclipse.jgit.lib.Constants.*;
import static org.hamcrest.Matchers.*;
import static org.junit.Assert.*;

public class RepositorioGitTest {

    static File github;

    static {
        try {
            github = createTempDirectory("RepositorioGitTest-github").toFile();
            github.deleteOnExit();
            System.out.println("github = " + github);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    File upstream;
    File clone1;
    File clone2;

    RepositorioGit repo1;
    RepositorioGit repo2;

    @BeforeClass
    public static void setUpOrigin() {
        cloneBare("https://github.com/servicosgovbr/cartas-de-teste.git", github);
    }

    @Before
    public void setUp() {
        upstream = tempFolder();
        clone1 = tempFolder();
        clone2 = tempFolder();

        cloneBare(github.toPath().toString(), upstream);
        clone(upstream.toPath().toString(), clone1);
        clone(upstream.toPath().toString(), clone2);

        System.out.println("test upstream" + upstream);
        System.out.println("test clone1" + clone1);
        System.out.println("test clone2" + clone2);

        this.repo1 = new RepositorioGit(new RepositorioConfig("", false, true, clone1));
        this.repo2 = new RepositorioGit(new RepositorioConfig("", false, true, clone2));
    }

    @Test
    public void fluxoDeMoverBranch() throws Exception {
        moveBranch(repo1);
        garanteQueBranchFoiMovida(repo1);
    }

    @Test
    public void fluxoDeRemoverServicoNaoPublicado() throws Exception {
        salvaAlteracao(repo1, "Teste");
        garanteQueAlteracaoFoiPara(upstream, "foo");

        repo1.comRepositorioAbertoNoBranch(R_HEADS + MASTER, uncheckedSupplier(() -> {
            repo1.deleteLocalBranch("foo"); //git branch -D foo
            repo1.deleteRemoteBranch(R_HEADS + "foo"); //git push :foo
            return null;
        }));

        assertFalse(repo1.existeBranch("foo"));
    }

    @Test
    public void fluxoDeRemoverServicoPublicado() throws Exception {
        salvaAlteracao(repo1, "teste");
        garanteQueAlteracaoFoiPara(upstream, "foo");

        repo1.comRepositorioAbertoNoBranch(R_HEADS + MASTER, uncheckedSupplier(() -> {
            Path arquivo = Paths.get("LICENSE");
            repo1.deleteLocalBranch("foo"); //git branch -D foo
            repo1.deleteRemoteBranch(R_HEADS + "foo"); //git push :foo
            repo1.remove(arquivo);
            repo1.commit(arquivo, "Apagou", PROFILE);
            repo1.push("master");
            return null;
        }));

        verificaSeBranchExisteLocalERemoto(clone1);

        repo1.comRepositorioAbertoNoBranch(R_HEADS + MASTER, uncheckedSupplier(() -> {
            Path arquivo = repo1.getCaminhoAbsoluto().resolve(Paths.get("LICENSE"));
            assertFalse(Files.exists(arquivo));
            return null;
        }));
    }

    @Test
    public void existeBranchQuandoSalvaAlteracao() throws Exception {
        salvaAlteracao(repo1, "Alterao");
        assertTrue(repo1.existeBranch("foo"));
    }

    @Test
    public void existeBranchQuandoApenasRemoto() throws Exception {
        salvaAlteracao(repo2, "Alterao");
        assertTrue(repo1.existeBranch("foo"));
    }

    @Test
    public void naoExisteBranch() throws Exception {
        assertFalse(repo1.existeBranch("foo2"));
    }

    @SneakyThrows
    private void verificaSeBranchExisteLocalERemoto(File localRepo) throws GitAPIException {
        try (Git git = Git.open(localRepo)) {
            List<Ref> branchesList = git.branchList().setListMode(ALL).call();
            branchesList.stream().map(Ref::getName)
                    .map(n -> n.replaceAll(R_HEADS + "|" + R_REMOTES + "origin/", "")).forEach(System.out::println);
            Stream<String> branches = branchesList.stream().map(Ref::getName)
                    .map(n -> n.replaceAll(R_HEADS + "|" + R_REMOTES + "origin/", ""));
            assertTrue(branches.noneMatch(n -> n.equals("foo")));
        }
    }

    private void moveBranch(RepositorioGit r) throws IOException {
        r.comRepositorioAbertoNoBranch("foo-bar", uncheckedSupplier(() -> {
            Path origem = Paths.get("LICENSE");
            Path destino = Paths.get("baz-bar.md");
            r.moveBranchPara("baz-bar");
            Files.move(r.getCaminhoAbsoluto().resolve(origem), r.getCaminhoAbsoluto().resolve(destino));
            r.remove(origem);
            r.add(destino);
            r.commit(origem, "Renomeia \"foo-bar\" para \"baz-bar\"", PROFILE);
            r.commit(destino, "Renomeia \"foo-bar\" para \"baz-bar\"", PROFILE);
            r.push("baz-bar");
            return null;
        }));
    }

    private void garanteQueBranchFoiMovida(RepositorioGit r) {
        assertTrue(r.branches().noneMatch(n -> n.equals("foo-bar")));
        assertTrue(r.branches().anyMatch(n -> n.equals("baz-bar")));

        r.comRepositorioAbertoNoBranch("baz-bar", uncheckedSupplier(() -> {
            Path antigo = r.getCaminhoAbsoluto().resolve(Paths.get("LICENSE"));
            Path novo = r.getCaminhoAbsoluto().resolve(Paths.get("baz-bar.md"));

            r.pull();

            assertTrue(Files.notExists(antigo));
            assertTrue(Files.exists(novo));
            return null;
        }));
    }

    private void garanteQueAlteracaoFoiPublicada(File localRepo) throws IOException {
        garanteQueAlteracaoFoiPara(localRepo, MASTER);
    }

    private void garanteQueAlteracaoFoiRecebidaPor(RepositorioGit r, String alteracao) throws IOException {
        r.comRepositorioAbertoNoBranch("foo", uncheckedSupplier(() -> {
            Path relativo = Paths.get("LICENSE");
            Path absoluto = r.getCaminhoAbsoluto().resolve(relativo);

            r.pull();

            assertThat(Files.readAllLines(absoluto).get(0), is(alteracao));

            return null;
        }));
    }

    private void garanteQueAlteracaoFoiPara(File localRepo, String branch) throws IOException {
        try (Git git = Git.open(localRepo)) {
            Ref foo = git.getRepository().getRef(branch);
            assertThat(foo, is(notNullValue()));

            RevCommit commit = new RevWalk(git.getRepository()).parseCommit(foo.getObjectId());
            assertThat(commit.getAuthorIdent().getName(), is("fulano"));
            assertThat(commit.getAuthorIdent().getEmailAddress(), is("servicos@planejamento.gov.br"));
            assertThat(commit.getFullMessage(), is("Alterao de teste"));
        }
    }

    private void salvaAlteracao(RepositorioGit r, String alteracao) throws IOException {
        r.comRepositorioAbertoNoBranch("foo", uncheckedSupplier(() -> {
            r.pull();

            Path relativo = Paths.get("LICENSE");
            Path absoluto = r.getCaminhoAbsoluto().resolve(relativo);

            Files.write(absoluto, asList(alteracao, "\n", absoluto.toString()), WRITE);
            r.commit(relativo, "Alterao de teste", PROFILE);

            r.push("foo");

            return null;
        }));
    }

    @SneakyThrows
    private static void clone(String from, File to) {
        Git.cloneRepository().setURI(from).setDirectory(to).setProgressMonitor(new TextProgressMonitor()).call();
    }

    @SneakyThrows
    private static void cloneBare(String from, File to) {
        Git.cloneRepository().setURI(from).setDirectory(to).setBare(true)
                .setProgressMonitor(new TextProgressMonitor()).call();
    }

    @SneakyThrows
    private File tempFolder() {
        File t = createTempDirectory("test").toFile();
        t.deleteOnExit();
        return t;
    }

}