package br.gov.servicos.editor.cartas;

import br.gov.servicos.editor.servicos.Metadados;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
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.format.Formatter;

import java.io.FileNotFoundException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

import static java.util.Locale.getDefault;
import static org.hamcrest.core.Is.is;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import static org.mockito.BDDMockito.given;

@SuppressFBWarnings("DMI_HARDCODED_ABSOLUTE_FILENAME")
@RunWith(MockitoJUnitRunner.class)
public class ListaDeCartasTest {
    @Mock
    RepositorioGit repositorioGit;

    @Mock
    Formatter<Carta> formatter;

    @Mock
    Importador importador;

    @Mock
    Carta carta;

    ListaDeCartas listaDeCartas;

    @Before
    public void setUp() throws Exception {
        listaDeCartas = new ListaDeCartas(importador, repositorioGit, formatter);
    }

    @Test
    public void deveListarDiretorioDeCartas() throws Exception {
        Metadados m1 = new Metadados().withId("id-qualquer");

        Path dir = Files.createTempDirectory("listar-cartas-controller");
        Path v3 = dir.resolve("cartas-servico/v3/servicos");

        assertTrue(v3.toFile().mkdirs());
        Files.createFile(v3.resolve("id-qualquer.xml"));

        given(repositorioGit.getCaminhoAbsoluto())
                .willReturn(dir);

        given(formatter.parse("id-qualquer", getDefault()))
                .willReturn(carta);

        given(carta.getMetadados()).willReturn(m1);

        Iterable<Metadados> metadados = listaDeCartas.listar();

        assertThat(metadados.iterator().next(), is(m1));
    }

    @Test(expected = FileNotFoundException.class)
    public void jogaExcecaoCasoDiretorioDeCartasNaoExista() throws Exception {
        given(repositorioGit.getCaminhoAbsoluto()).willReturn(Paths.get("/caminho/nao/existente"));

        listaDeCartas.listar();
    }

}

@@ -83,16 +83,54 @@
 adados;%0A
+import com.google.common.cache.Cache;%0A
 import e
@@ -333,16 +333,114 @@
 Runner;%0A
+import org.springframework.cache.CacheManager;%0Aimport org.springframework.cache.guava.GuavaCache;%0A
 import o
@@ -595,24 +595,91 @@
 ile.Paths;%0A%0A
+import static br.gov.servicos.editor.config.CacheConfig.METADADOS;%0A
 import stati
@@ -877,16 +877,98 @@
 o.given;
+%0Aimport static org.mockito.Mockito.mock;%0Aimport static org.mockito.Mockito.verify;
 %0A%0A@Suppr
@@ -1239,16 +1239,58 @@
 carta;%0A%0A
+    @Mock%0A    CacheManager cacheManager;%0A%0A
     List
@@ -1453,156 +1453,27 @@
 tter
-);%0A    %7D%0A%0A    @Test%0A    public void deveListarDiretorioDeCartas() throws Exception %7B%0A        Metadados m1 = new Metadados().withId(%22id-qualqu
+, cacheManag
 er
-%22
 );%0A%0A
+%0A
     
@@ -1883,24 +1883,168 @@
 rn(carta);%0A%0A
+    %7D%0A%0A    @Test%0A    public void deveListarDiretorioDeCartas() throws Exception %7B%0A        Metadados m1 = new Metadados().withId(%22id-qualquer%22);%0A
         give
@@ -2482,10 +2482,553 @@
 %0A    %7D%0A%0A
+    @Test%0A    @SuppressWarnings(%22unchecked%22)%0A    public void forcaAtualizacaoDoCacheAoInicializar() throws Exception %7B%0A        Cache cache = mock(Cache.class);%0A%0A        Metadados m1 = new Metadados().withId(%22id-qualquer%22);%0A        given(importador.isImportadoComSucesso()).willReturn(true);%0A        given(carta.getMetadados()).willReturn(m1);%0A        given(cacheManager.getCache(METADADOS)).willReturn(new GuavaCache(METADADOS, cache));%0A%0A%0A        listaDeCartas.esquentarCacheDeMetadados();%0A%0A        verify(cache).put(%22id-qualquer%22, m1);%0A    %7D%0A
 %7D%0A

Corrige testes - #308