package com.wesabe.grendel.entities.dao.tests;
import static org.fest.assertions.Assertions.*;
import static org.mockito.Matchers.*;
import static org.mockito.Mockito.*;
import javax.ws.rs.core.MediaType;
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.inject.Provider;
import com.wesabe.grendel.entities.Document;
import com.wesabe.grendel.entities.User;
import com.wesabe.grendel.entities.dao.DocumentDAO;
@RunWith(Enclosed.class)
public class DocumentDAOTest {
private static abstract class Context {
protected Session session;
protected DocumentDAO dao;
public void setup() throws Exception {
this.session = mock(Session.class);
this.dao = new DocumentDAO(new Provider<Session>() {
@Override
public Session get() {
return session;
}
});
}
}
public static class Finding_A_Document_By_Owner_And_Name extends Context {
private Query query;
private Document doc;
private User owner;
private String name;
@Before
@Override
public void setup() throws Exception {
super.setup();
this.doc = mock(Document.class);
this.owner = mock(User.class);
this.name = "woohoo.txt";
this.query = mock(Query.class);
when(query.setString(Mockito.anyString(), Mockito.anyString())).thenReturn(query);
when(query.setParameter(Mockito.anyString(), Mockito.anyObject())).thenReturn(query);
when(query.uniqueResult()).thenReturn(doc);
when(session.getNamedQuery(anyString())).thenReturn(query);
}
@Test
public void itCreatesANamedQueryAndParameterizesIt() throws Exception {
dao.findByOwnerAndName(owner, name);
final InOrder inOrder = inOrder(session, query);
inOrder.verify(session).getNamedQuery("com.wesabe.grendel.entities.Document.ByOwnerAndName");
inOrder.verify(query).setParameter("owner", owner)
; inOrder.verify(query).setString("name", name);
}
@Test
public void itReturnsTheDocument() throws Exception {
assertThat(dao.findByOwnerAndName(owner, name)).isEqualTo(doc);
}
}
public static class Deleting_A_Document extends Context {
private Document doc;
@Before
@Override
public void setup() throws Exception {
super.setup();
this.doc = mock(Document.class);
}
@Test
public void itDeletesTheDocument() throws Exception {
dao.delete(doc);
verify(session).delete(doc);
}
}
public static class Saving_Or_Creating_A_Document extends Context {
private Document doc;
@Before
@Override
public void setup() throws Exception {
super.setup();
this.doc = mock(Document.class);
}
@Test
public void itReturnsTheDocument() throws Exception {
assertThat(dao.saveOrUpdate(doc)).isEqualTo(doc);
}
@Test
public void itCreatesADatabaseEntry() throws Exception {
dao.saveOrUpdate(doc);
verify(session).saveOrUpdate(doc);
}
}
public static class Building_A_New_Document extends Context {
private User user;
@Before
@Override
public void setup() throws Exception {
super.setup();
this.user = mock(User.class);
}
@Test
public void itReturnsADocumentWithTheOwner() throws Exception {
assertThat(dao.newDocument(user, "document1.txt", MediaType.APPLICATION_OCTET_STREAM_TYPE).getOwner()).isEqualTo(user);
}
@Test
public void itReturnsADocumentWithTheName() throws Exception {
assertThat(dao.newDocument(user, "document1.txt", MediaType.APPLICATION_OCTET_STREAM_TYPE).getName()).isEqualTo("document1.txt");
}
@Test
public void itReturnsADocumentWithTheOnwerr() throws Exception {
assertThat(dao.newDocument(user, "document1.txt", MediaType.APPLICATION_OCTET_STREAM_TYPE).getContentType()).isEqualTo(MediaType.APPLICATION_OCTET_STREAM_TYPE);
}
}
}