Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Uso do Flush não requerido para delete

No meu caso mesmo sem flush funcionou para o teste deveDeletarUmLeilaoComSeusLances(). Está correto?

Segue a classe abaixo:


package br.com.caelum.pm73.dao;

import static org.hamcrest.Matchers.allOf;
import static org.hamcrest.Matchers.closeTo;
import static org.hamcrest.Matchers.empty;
import static org.hamcrest.Matchers.hasItem;
import static org.hamcrest.Matchers.hasSize;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.nullValue;
import static org.junit.Assert.assertThat;

import java.util.Calendar;
import java.util.List;

import org.hibernate.Session;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import br.com.caelum.pm73.dominio.Leilao;
import br.com.caelum.pm73.dominio.Usuario;
import br.com.caelum.pm73.dominio.builder.LeilaoDataBuilder;

public class LeilaoDaoTest {
    private LeilaoDao leilaoDao;
    private Session session; 
    private Usuario mario = new Usuario("Mario", "mario@gmail.com");
    private Usuario lucia = new Usuario("Lucia", "lucia@gmail.com");
    private Usuario vendedor = new Usuario("Vendedor", "vendedor@gmail.com");
    private int quantidadeDiasAtrasParaAberturaDoLeilao = 15;

    @Before
    public void setUp() {
        session = new CriadorDeSessao().getSession();
        leilaoDao = new LeilaoDao(session);
        session.beginTransaction();
        session.save(mario);
        session.save(lucia);
        session.save(vendedor);
    }

    @Test
    public void deveContarApenasLeiloesEncerrados(){
        Leilao leilao1 = LeilaoDataBuilder.builder().tendoComo(vendedor).encerrado().construir();
        Leilao leilao2 = LeilaoDataBuilder.builder().tendoComo(vendedor).construir();

        session.save(leilao1);
        session.save(leilao2);

        assertThat(leilaoDao.total(), is(1L));
    }

    @Test
    public void deveContarZeroQuandoTodosNaoEstaoEncerrados(){
        Leilao leilao1 = LeilaoDataBuilder.builder().tendoComo(vendedor).encerrado().construir();
        Leilao leilao2 = LeilaoDataBuilder.builder().tendoComo(vendedor).encerrado().construir();

        session.save(leilao1);
        session.save(leilao2);

        assertThat(leilaoDao.total(), is(0L));
    }

    @Test
    public void deveRetornarApenasLeiloesDeProdutosNovos(){
        Leilao leilao1 = LeilaoDataBuilder.builder().tendoComo(vendedor).usado().construir();
        Leilao leilao2 = LeilaoDataBuilder.builder().tendoComo(vendedor).construir();

        session.save(leilao1);
        session.save(leilao2);

        List<Leilao> leiloesNovos = leilaoDao.novos();

        assertThat(leiloesNovos, hasItem(leilao2));
        assertThat(leiloesNovos, hasSize(1));
    }

    @Test
    public void deveRetornarApenasLeiloesAbertosComSeteOuMaisDias(){
        Leilao leilao1 = LeilaoDataBuilder.builder().tendoComo(vendedor).abertoDiasAtras(6).construir();
        Leilao leilao2 = LeilaoDataBuilder.builder().tendoComo(vendedor).abertoDiasAtras(7).construir();

        session.save(leilao1);
        session.save(leilao2);

        List<Leilao> leiloesAntigos = leilaoDao.antigos();

        assertThat(leiloesAntigos, hasItem(leilao2));
        assertThat(leiloesAntigos, hasSize(1));
    }

    @Test
    public void deveTrazerLeiloesNaoEncerradosNoPeriodo() {
        Leilao leilao1 = LeilaoDataBuilder.builder().tendoComo(vendedor).abertoDiasAtras(quantidadeDiasAtrasParaAberturaDoLeilao + 1).construir();
        Leilao leilao2 = LeilaoDataBuilder.builder().tendoComo(vendedor).abertoDiasAtras(quantidadeDiasAtrasParaAberturaDoLeilao).construir();
        Leilao leilao3 = LeilaoDataBuilder.builder().tendoComo(vendedor).abertoHoje().construir();

        session.save(leilao1);
        session.save(leilao2);
        session.save(leilao3);

        List<Leilao> leiloesNaoEncerradosPorPeriodo = leilaoDao.porPeriodo(instanciarDataPassadaCom(quantidadeDiasAtrasParaAberturaDoLeilao), instanciarDataPassadaCom(quantidadeDiasAtrasParaAberturaDoLeilao-5));

        assertThat(leiloesNaoEncerradosPorPeriodo, hasItem(leilao2));
        assertThat(leiloesNaoEncerradosPorPeriodo, hasSize(1));
    }


    @Test
    public void naoDeveTrazerLeiloesEncerradosNoPeriodo() {
        Leilao leilao1 = LeilaoDataBuilder.builder().tendoComo(vendedor).encerrado().abertoDiasAtras(quantidadeDiasAtrasParaAberturaDoLeilao + 1).construir();
        Leilao leilao2 = LeilaoDataBuilder.builder().tendoComo(vendedor).encerrado().abertoDiasAtras(quantidadeDiasAtrasParaAberturaDoLeilao).construir();
        Leilao leilao3 = LeilaoDataBuilder.builder().tendoComo(vendedor).abertoHoje().construir();

        session.save(leilao1);
        session.save(leilao2);
        session.save(leilao3);

        List<Leilao> leiloesNaoEncerradosPorPeriodo = leilaoDao.porPeriodo(instanciarDataPassadaCom(quantidadeDiasAtrasParaAberturaDoLeilao), Calendar.getInstance());

        assertThat(leiloesNaoEncerradosPorPeriodo, hasItem(leilao3));
        assertThat(leiloesNaoEncerradosPorPeriodo, hasSize(1));
    }

    @Test
    public void deveTrazerLeiloesNaoEncerradosComNoMinimoQuatroLancesEDentroDeUmIntervaloValoresMinimo() {
        Leilao primeiroLeilaoValidoParaQuery = LeilaoDataBuilder.builder().iniciandoEm(1149).tendoComo(vendedor)
                .comLanceDe(lucia, 1150)
                .comLanceDe(mario, 1251)
                .comLanceDe(lucia, 1350)
                .comLanceDe(mario, 1350)
                .construir();

        Leilao segundoLeilaoValidoParaQuery = LeilaoDataBuilder.builder().iniciandoEm(1600).tendoComo(vendedor)
                .comLanceDe(lucia, 1601)
                .comLanceDe(mario, 1650)
                .comLanceDe(lucia, 1750)
                .comLanceDe(mario, 1850)
                .construir();

        session.save(primeiroLeilaoValidoParaQuery);
        session.save(segundoLeilaoValidoParaQuery);

        List<Leilao> leiloesDisputados = leilaoDao.disputadosEntre(1149, 1600);

        assertThat(leiloesDisputados, allOf(hasItem(primeiroLeilaoValidoParaQuery), hasItem(segundoLeilaoValidoParaQuery)));
        assertThat(leiloesDisputados, hasSize(2));
    }

    @Test
    public void naoDeveTrazerLeiloesEncerradosOuComMenosDeQuatroLancesOuForaDeUmIntervaloValoresMinimo() {
        Leilao leilaoEncerrado = LeilaoDataBuilder.builder().tendoComo(vendedor).iniciandoEm(1600).encerrado()
                .comLanceDe(lucia, 1601)
                .comLanceDe(mario, 1650)
                .comLanceDe(lucia, 1750)
                .comLanceDe(mario, 1850)
                .construir();

        Leilao leilaoComNumeroLancesInsuficientes = LeilaoDataBuilder.builder().iniciandoEm(1149).tendoComo(vendedor)
                .comLanceDe(lucia, 1150)
                .comLanceDe(mario, 1251)
                .comLanceDe(lucia, 1251)
                .construir();

        Leilao leilaoForaIntervaloInferiorDoValorMinimo = LeilaoDataBuilder.builder().iniciandoEm(1148).tendoComo(vendedor)
                .comLanceDe(lucia, 1601)
                .comLanceDe(mario, 1650)
                .comLanceDe(lucia, 1750)
                .comLanceDe(mario, 1850)
                .construir();

        Leilao leilaoForaIntervaloSuperiorDoValorMinimo = LeilaoDataBuilder.builder().iniciandoEm(1601).tendoComo(vendedor)
                .comLanceDe(lucia, 1601)
                .comLanceDe(mario, 1650)
                .comLanceDe(lucia, 1750)
                .comLanceDe(mario, 1850)
                .construir();

        session.save(leilaoEncerrado);
        session.save(leilaoComNumeroLancesInsuficientes);
        session.save(leilaoForaIntervaloInferiorDoValorMinimo);
        session.save(leilaoForaIntervaloSuperiorDoValorMinimo);

        List<Leilao> leiloesDisputados = leilaoDao.disputadosEntre(1149, 1600);

        assertThat(leiloesDisputados, is(empty()));
    }

    @Test
    public void deveDevolverLeiloesSemRepeticaoComPeloMenosUmLancePorUsuario(){
        Leilao leilao1 = LeilaoDataBuilder.builder().tendoComo(vendedor)
                .comLanceDe(lucia, 1600)
                .comLanceDe(mario, 1700)
                .comLanceDe(lucia, 1800)
                .construir();
        Leilao leilao2 = LeilaoDataBuilder.builder().tendoComo(vendedor)
                .comLanceDe(mario, 1700)
                .construir();
        Leilao leilao3 = LeilaoDataBuilder.builder().tendoComo(vendedor)
                .construir();

        session.save(leilao1);
        session.save(leilao2);
        session.save(leilao3);

        List<Leilao> leiloesComLancesDeUmUsuario = leilaoDao.listaLeiloesDoUsuario(lucia);

        assertThat(leiloesComLancesDeUmUsuario, hasItem(leilao1));
        assertThat(leiloesComLancesDeUmUsuario, hasSize(1));        
    }

    @Test
    public void deveRetornarValorMedioLanceDeUmUsuarioComPeloMenosUmLance(){
        Leilao leilao = LeilaoDataBuilder.builder()
                .tendoComo(vendedor)
                .iniciandoEm(50.0)
                .comLanceDe(lucia, 100)
                .comLanceDe(mario, 150)
                .comLanceDe(lucia, 200)
                .construir();

        Leilao leilao2 = LeilaoDataBuilder.builder()
            .tendoComo(vendedor)
            .iniciandoEm(250.0)
            .comLanceDe(lucia, 100.0)
            .construir();

        session.save(leilao);
        session.save(leilao2);

        assertThat(leilaoDao.getValorInicialMedioDoUsuario(lucia), closeTo(150.0, 0.001));
    }

    @Test
    public void deveDeletarUmLeilaoComSeusLances(){
        Leilao leilao = LeilaoDataBuilder.builder()
                .tendoComo(vendedor)
                .iniciandoEm(50.0)
                .comLanceDe(lucia, 100)
                .comLanceDe(mario, 150)
                .comLanceDe(lucia, 200)
                .construir();

        leilaoDao.salvar(leilao);
        leilaoDao.deleta(leilao);

        assertThat(leilaoDao.porId(leilao.getId()), is(nullValue()));
    }


    private Calendar instanciarDataPassadaCom(int diasAtras) {
        Calendar inicio = Calendar.getInstance();
        inicio.add(Calendar.DAY_OF_MONTH, -diasAtras);
        inicio.clear(Calendar.HOUR_OF_DAY);
        inicio.clear(Calendar.MINUTE);
        inicio.clear(Calendar.SECOND);
        inicio.clear(Calendar.MILLISECOND);
        return inicio;
    }

    @After
    public void tearDown(){
        session.getTransaction().rollback();
        session.close();
    }
}
1 resposta
solução!

Oi Felipe, tudo bem ?

Algumas vezes, o uso do flush não é obrigatório, nós o deixamos para garantir que a deleção será executada, algumas vezes ele deixa para deletar depois.

Espero ter ajudado.

Abraços