package br.com.caelum.calopsita.persistence.dao;
import static org.hamcrest.Matchers.hasItems;
import static org.junit.Assert.assertThat;
import java.util.Collections;
import org.hibernate.Session;
import org.jmock.Expectations;
import org.jmock.Sequence;
import org.junit.Before;
import org.junit.Test;
import br.com.caelum.calopsita.model.Card;
import br.com.caelum.calopsita.model.Iteration;
import br.com.caelum.calopsita.model.Project;
import br.com.caelum.calopsita.plugins.PluginResultTransformer;
import br.com.caelum.calopsita.plugins.Transformer;
public class IterationDaoTest extends AbstractDaoTest {
private IterationDao dao;
private Session mockSession;
@Override
@Before
public void setUp() throws Exception {
super.setUp();
dao = new IterationDao(session, new PluginResultTransformer(session, Collections.<Transformer>emptyList()));
}
@Test
public void orderingCardsByPriority() throws Exception {
Iteration iteration = givenAnIteration();
Card card3 = givenACard(iteration);
Card card1 = givenACard(iteration);
assertThat(dao.listCards(iteration), hasItems(card1, card3));
}
@Test
public void testDelegation() throws Exception {
IterationDao mockedDao = givenAMockedDao();
shouldExecuteCrudInSequence();
mockedDao.add(new Iteration());
mockedDao.load(new Iteration());
mockedDao.update(new Iteration());
mockedDao.remove(new Iteration());
mockery.assertIsSatisfied();
}
private IterationDao givenAMockedDao() {
mockSession = mockery.mock(Session.class);
return new IterationDao(mockSession, null);
}
private void shouldExecuteCrudInSequence() {
final Sequence crud = mockery.sequence("crud");
mockery.checking(new Expectations() {
{
one(mockSession).save(with(any(Iteration.class))); inSequence(crud);
one(mockSession).load(Iteration.class, null); will(returnValue(new Iteration())); inSequence(crud);
one(mockSession).update(with(any(Iteration.class))); inSequence(crud);
one(mockSession).delete(with(any(Iteration.class))); inSequence(crud);
}
});
}
private Card givenACard(Iteration iteration) {
Card card = new Card();
card.setName("Abc");
card.setDescription("Def");
card.setIteration(iteration);
session.save(card);
return card;
}
private Project givenAProject() {
Project project = new Project();
project.setName("A project");
session.save(project);
session.flush();
return project;
}
private Iteration givenAnIteration() {
Iteration iteration = new Iteration();
iteration.setGoal("An iteration");
iteration.setProject(givenAProject());
session.save(iteration);
session.flush();
return iteration;
}
}