/** * */ package net.frontlinesms.data; import java.util.Arrays; import java.util.Collections; import java.util.List; import org.springframework.context.support.ClassPathXmlApplicationContext; import net.frontlinesms.data.domain.FrontlineMessage; import net.frontlinesms.data.domain.FrontlineMultimediaMessage; import net.frontlinesms.data.domain.FrontlineMessage.Type; import net.frontlinesms.data.repository.MessageDao; import net.frontlinesms.junit.BaseTestCase; /** * Check that database changes do not break persistence. * @author Alex Anderson <alex@frontlinesms.com> */ public class DatabaseMigrationTest extends BaseTestCase { private static final FrontlineMessage STANDARD_MESSAGE = FrontlineMessage.createOutgoingMessage(System.currentTimeMillis(), "+123456789", "+987654321", "hi."); @SuppressWarnings("unchecked") private static final FrontlineMultimediaMessage MM_MESSAGE = new FrontlineMultimediaMessage(Type.OUTBOUND, "hi", "sup", Collections.EMPTY_LIST); private MessageDao dao; public void testAddingMultimediaMessages() { // Initialise the database WITHOUT multimedia messages initSpringHibernate("testAddingMultimediaMessages.1"); // persist some non-multimedia messages dao.saveMessage(STANDARD_MESSAGE); // retrieve the message List<FrontlineMessage> allMessages1 = dao.getAllMessages(); assertEquals(1, allMessages1.size()); assertEquals(STANDARD_MESSAGE, allMessages1.get(0)); // deinitialise the database deinitSpringHibernate(false); // Initiliase the database WITH multimedia messages initSpringHibernate("testAddingMultimediaMessages.2"); // persist some multimedia messages dao.saveMessage(MM_MESSAGE); // retrieve the multimedia messages List<FrontlineMessage> allMessages2 = dao.getAllMessages(); assertEquals(2, allMessages2.size()); assertEquals(Arrays.asList(STANDARD_MESSAGE, MM_MESSAGE), allMessages2); // deinitialise the database deinitSpringHibernate(true); } /** * Initialise the application context. * @param entityClasses the classes to initialise as JPA entities for persistence and retrieval */ private void initSpringHibernate(String resourceName, Class<?>... entityClasses) { // load application context ClassPathXmlApplicationContext app = new ClassPathXmlApplicationContext( getClass().getSimpleName() + "-" + resourceName + ".xml", this.getClass()); // update class properties from application context this.dao = (MessageDao) app.getBean("messageDao"); } /** Undoes the configuration from {@link #initSpringHibernate(Class...)} * @param clearDatabase */ private void deinitSpringHibernate(boolean clearDatabase) { // delete messages from db if(clearDatabase) { for(FrontlineMessage m : this.dao.getAllMessages()) { this.dao.deleteMessage(m); } } // unset class properties loaded from application context this.dao = null; } }