package edu.lmu.cs.headmaster.ws.dao;
import java.util.List;
import junit.framework.Assert;
import org.joda.time.DateTime;
import org.junit.Before;
import org.junit.Test;
import edu.lmu.cs.headmaster.ws.domain.Event;
import edu.lmu.cs.headmaster.ws.domain.Student;
import edu.lmu.cs.headmaster.ws.util.ApplicationContextTest;
import edu.lmu.cs.headmaster.ws.util.DomainObjectUtils;
public class EventDaoTest extends ApplicationContextTest {
private EventDao eventDao;
private StudentDao studentDao;
@Before
public void getRequiredBeans() {
eventDao = (EventDao)applicationContext.getBean("eventDao");
studentDao = (StudentDao)applicationContext.getBean("studentDao");
}
@Test
public void testGetEventById() {
// Grab the known event in the fixture.
Event event = eventDao.getEventById(1000000L);
Assert.assertEquals(Long.valueOf(1000000L), event.getId());
Assert.assertEquals("Summit", event.getTitle());
Assert.assertEquals("The big one", event.getDescription());
Assert.assertEquals(new DateTime(2012, 7, 28, 10, 31, 3, 0), event.getDateTime());
Assert.assertEquals(3, event.getAttendees().size());
// ID tests will suffice here. We leave another unit test to validate
// the loading of entire student objects.
List<Student> attendees = event.getAttendees();
Assert.assertEquals(Long.valueOf(1000002L), attendees.get(0).getId());
Assert.assertEquals(Long.valueOf(1000000L), attendees.get(1).getId());
Assert.assertEquals(Long.valueOf(1000001L), attendees.get(2).getId());
}
@Test
public void testGetEventsByDate() {
// Supply a date range that encloses the known event(s) in the fixture.
List<Event> events = eventDao.getEventsByDate(
new DateTime(2012, 6, 1, 0, 0, 0, 0),
new DateTime(2012, 7, 31, 23, 59, 59, 999),
0, 10
);
// There should only be one event there. We'll check just the ID.
Assert.assertEquals(1, events.size());
Assert.assertEquals(Long.valueOf(1000000L), events.get(0).getId());
// Now supply a date range that is entirely before the fixture event(s);
events = eventDao.getEventsByDate(
new DateTime(2012, 1, 1, 0, 0, 0, 0),
new DateTime(2012, 6, 30, 23, 59, 59, 999),
0, 10
);
// Now there should be nothing.
Assert.assertEquals(0, events.size());
// Finally, we go entirely after the fixture event(s).
events = eventDao.getEventsByDate(
new DateTime(2012, 8, 1, 0, 0, 0, 0),
new DateTime(2012, 9, 30, 23, 59, 59, 999),
0, 10
);
// Now there should be nothing.
Assert.assertEquals(0, events.size());
}
@Test
public void testGetEventsByTerm() {
// Use a text query that can be found in the event title. We
// intentionally mix case to validate the case insensitivity.
List<Event> events = eventDao.getEvents("mMIt", 0, 10);
// There should only be one event there. We'll check just the ID.
Assert.assertEquals(1, events.size());
Assert.assertEquals(Long.valueOf(1000000L), events.get(0).getId());
// Do another one with a term in the description.
events = eventDao.getEvents("The big", 0, 10);
// We should get the same event back.
Assert.assertEquals(1, events.size());
Assert.assertEquals(Long.valueOf(1000000L), events.get(0).getId());
// Finally, we go with a term that should not match anything.
events = eventDao.getEvents("blarg", 0, 10);
// Now there should be nothing.
Assert.assertEquals(0, events.size());
}
@Test
public void testCreateEventWithoutStudents() {
// Create an id-less event.
Event eventToCreate = DomainObjectUtils.createEventObject(
"Reading", "Rainbow", new DateTime(2013, 3, 12, 6, 6, 7, 0)
);
// Save the event.
eventDao.createEvent(eventToCreate);
// The created event should now have an ID. Because we know what is in
// the test fixture, we know what ID to expect.
Assert.assertEquals(Long.valueOf(1L), eventToCreate.getId());
// Reload the event that was just created.
Event createdEvent = eventDao.getEventById(1L);
assertSimpleEquality(eventToCreate, createdEvent);
Assert.assertEquals(0, createdEvent.getAttendees().size());
}
@Test
public void testCreateEventWithStudents() {
// Create an id-less event.
Event eventToCreate = DomainObjectUtils.createEventObject(
"Big meeting", "Very important", new DateTime(2013, 12, 24, 11, 59, 59, 0)
);
// Have two students attend it.
eventToCreate.getAttendees().add(studentDao.getStudentById(1000001L));
eventToCreate.getAttendees().add(studentDao.getStudentById(1000002L));
// Save the event.
eventDao.createEvent(eventToCreate);
// The created event should now have an ID. Because we know what is in
// the test fixture, we know what ID to expect.
Assert.assertEquals(Long.valueOf(1L), eventToCreate.getId());
// Reload the event that was just created. Because we know what is in the
// test fixture, we know what ID to expect.
Event createdEvent = eventDao.getEventById(1L);
assertSimpleEquality(eventToCreate, createdEvent);
// Check the list of attendees (by ID only in this test).
Assert.assertEquals(2, createdEvent.getAttendees().size());
List<Student> attendees = createdEvent.getAttendees();
Assert.assertEquals(Long.valueOf(1000001L), attendees.get(0).getId());
Assert.assertEquals(Long.valueOf(1000002L), attendees.get(1).getId());
}
/**
* Helper function for asserting the equality of two events.
*/
private void assertSimpleEquality(Event event1, Event event2) {
Assert.assertEquals(event1.getId(), event2.getId());
Assert.assertEquals(event1.getTitle(), event2.getTitle());
Assert.assertEquals(event1.getDescription(), event2.getDescription());
Assert.assertEquals(event1.getDateTime(), event2.getDateTime());
}
}