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();
}
}