package com.wesabe.grendel.entities.dao.tests;
import static org.fest.assertions.Assertions.*;
import static org.mockito.Mockito.*;
import java.io.Serializable;
import org.hibernate.Query;
import org.hibernate.Session;
import org.junit.Before;
import org.junit.Test;
import org.junit.experimental.runners.Enclosed;
import org.junit.runner.RunWith;
import org.mockito.InOrder;
import org.mockito.Mockito;
import com.google.common.collect.ImmutableList;
import com.google.inject.Provider;
import com.wesabe.grendel.entities.User;
import com.wesabe.grendel.entities.dao.UserDAO;
@RunWith(Enclosed.class)
public class UserDAOTest {
private static abstract class Context {
protected Session session;
protected UserDAO dao;
public void setup() throws Exception {
this.session = mock(Session.class);
this.dao = new UserDAO(new Provider<Session>() {
@Override
public Session get() {
return session;
}
});
}
}
public static class Checking_For_A_Users_Existence extends Context {
private Query query;
@Before
@Override
public void setup() throws Exception {
super.setup();
this.query = mock(Query.class);
when(query.setString(Mockito.anyString(), Mockito.anyString())).thenReturn(query);
when(session.getNamedQuery(anyString())).thenReturn(query);
}
@Test
public void itCreatesANamedQueryAndParameterizesIt() throws Exception {
dao.contains("woo");
final InOrder inOrder = inOrder(session, query);
inOrder.verify(session).getNamedQuery("com.wesabe.grendel.entities.User.Exists");
inOrder.verify(query).setString("id", "woo");
}
@Test
public void itReturnsTrueIfTheUserWasFound() throws Exception {
when(query.uniqueResult()).thenReturn("woo");
assertThat(dao.contains("woo")).isTrue();
}
@Test
public void itReturnsFalseIfTheUserWasNotFound() throws Exception {
when(query.uniqueResult()).thenReturn(null);
assertThat(dao.contains("woo")).isFalse();
}
}
public static class Finding_A_User_By_Id extends Context {
private User user;
@Before
@Override
public void setup() throws Exception {
super.setup();
this.user = mock(User.class);
}
@Test
public void itReturnsTheUser() throws Exception {
when(session.get(Mockito.any(Class.class), Mockito.any(Serializable.class))).thenReturn(user);
assertThat(dao.findById("woo")).isEqualTo(user);
}
@Test
public void itScopesTheQueryToTheClassAndId() throws Exception {
dao.findById("woo");
verify(session).get(User.class, "woo");
}
}
public static class Finding_All_Users extends Context {
private User user;
private Query query;
@Before
@Override
public void setup() throws Exception {
super.setup();
this.user = mock(User.class);
this.query = mock(Query.class);
when(session.getNamedQuery(Mockito.anyString())).thenReturn(query);
}
@Test
public void itCreatesANamedQueryAndParameterizesIt() throws Exception {
dao.findAll();
verify(session).getNamedQuery("com.wesabe.grendel.entities.User.All");
}
@Test
public void itReturnsTheUsers() throws Exception {
when(query.list()).thenReturn(ImmutableList.of(user));
assertThat(dao.findAll()).containsOnly(user);
}
}
public static class Saving_Or_Creating_A_User extends Context {
private User user;
@Before
@Override
public void setup() throws Exception {
super.setup();
this.user = mock(User.class);
}
@Test
public void itReturnsTheUser() throws Exception {
assertThat(dao.saveOrUpdate(user)).isEqualTo(user);
}
@Test
public void itCreatesADatabaseEntry() throws Exception {
dao.saveOrUpdate(user);
verify(session).saveOrUpdate(user);
}
}
public static class Deleting_A_User extends Context {
private User user;
@Before
@Override
public void setup() throws Exception {
super.setup();
this.user = mock(User.class);
}
@Test
public void itDeletesTheUser() throws Exception {
dao.delete(user);
verify(session).delete(user);
}
}
}