package sushi.persistence.test;
import static org.junit.Assert.assertTrue;
import java.io.Serializable;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import org.junit.Before;
import org.junit.FixMethodOrder;
import org.junit.Test;
import org.junit.runners.MethodSorters;
import sushi.event.SushiEvent;
import sushi.event.SushiEventType;
import sushi.event.attribute.SushiAttribute;
import sushi.event.attribute.SushiAttributeTree;
import sushi.event.attribute.SushiAttributeTypeEnum;
import sushi.event.collection.SushiMapTree;
import sushi.persistence.Persistor;
/**
* This class tests the saving, finding and removing of {@link SushiEvent}.
* @author micha
*/
@FixMethodOrder(MethodSorters.JVM)
public class EventPersistenceTest implements PersistenceTest {
private SushiMapTree<String, Serializable> michaAttributes;
@Before
public void setup(){
Persistor.useTestEnviroment();
}
@Override
@Test
public void testStoreAndRetrieve(){
storeExampleEvents();
assertTrue("Value should be 2, but was " + SushiEvent.findAll().size(), SushiEvent.findAll().size()==2);
SushiEvent.removeAll();
assertTrue("Value should be 0, but was " + SushiEvent.findAll().size(), SushiEvent.findAll().size()==0);
}
private void storeExampleEvents() {
SushiMapTree<String, Serializable> hm = new SushiMapTree<String, Serializable>();
hm.put("kuchen", "kaese");
hm.put("kuchen2", "kirsch");
hm.put("kuchen3", "apfel");
SushiEventType firstEventType = new SushiEventType("Tsun");
firstEventType.save();
SushiEvent event1 = new SushiEvent(firstEventType, new Date(), hm);
michaAttributes = new SushiMapTree<String, Serializable>();
michaAttributes.put("getraenk1", "cola");
michaAttributes.put("getraenk2", "apfelsaft");
michaAttributes.put("getraenk3", "fanta");
Date oldDate = null;
try {
oldDate = new SimpleDateFormat("dd/MM/yyyy").parse("18/05/2011");
} catch (ParseException e) {
e.printStackTrace();
}
SushiEventType secondEventType = new SushiEventType("Micha");
secondEventType.save();
SushiEvent event2 = new SushiEvent(secondEventType, oldDate, michaAttributes);
ArrayList<SushiEvent> events = new ArrayList<SushiEvent>(Arrays.asList(event1, event2));
SushiEvent.save(events);
}
@Override
@Test
public void testFind(){
storeExampleEvents();
assertTrue(SushiEvent.findAll().size() == 2);
SushiEventType tsun = SushiEventType.findByTypeName("Tsun");
SushiEvent event = SushiEvent.findByEventType(tsun).get(0);
assertTrue(event.getValues().get("kuchen").equals("kaese"));
assertTrue(event.getValues().get("kuchen2").equals("kirsch"));
assertTrue(SushiEvent.findByValue("getraenk1", "cola" ).size() == 1);
List<SushiEvent> events = SushiEvent.findByValues(michaAttributes);
assertTrue(events.size() == 1);
event = events.get(0);
assertTrue(event.getEventType().getTypeName().equals("Micha"));
}
@Test
public void testFindBetween(){
storeExampleEvents();
SushiEventType tsun = SushiEventType.findByTypeName("Tsun");
SushiEventType micha = SushiEventType.findByTypeName("Micha");
Date oldDate = null;
try {
oldDate = new SimpleDateFormat("dd/MM/yyyy").parse("17/05/2011");
} catch (ParseException e) {
e.printStackTrace();
}
assertTrue(SushiEvent.findBetween(oldDate, new Date()).size()==2);
assertTrue(SushiEvent.findBetween(oldDate, new Date(), tsun).size()==1);
try {
oldDate = new SimpleDateFormat("dd/MM/yyyy").parse("17/05/2012");
} catch (ParseException e) {
e.printStackTrace();
}
assertTrue(SushiEvent.findBetween(oldDate, new Date()).size()==1);
assertTrue(SushiEvent.findBetween(oldDate, new Date(), tsun).size()==1);
assertTrue(SushiEvent.findBetween(oldDate, new Date(), micha).size()==0);
}
@Override
@Test
public void testRemove(){
storeExampleEvents();
List<SushiEvent> events;
events = SushiEvent.findAll();
assertTrue(events.size() == 2);
SushiEvent deleteEvent = events.get(0);
deleteEvent.remove();
events = SushiEvent.findAll();
assertTrue(events.size() == 1);
assertTrue(events.get(0).getID() != deleteEvent.getID());
}
@Test
public void testFindEventWithEventType(){
SushiAttributeTree eventTypeTree = new SushiAttributeTree();
SushiAttribute firstRootAttribute = new SushiAttribute("vehicle_information");
new SushiAttribute(firstRootAttribute, "ETA", SushiAttributeTypeEnum.DATE);
SushiAttribute secondRootAttribute = new SushiAttribute("sender", SushiAttributeTypeEnum.STRING);
eventTypeTree.addRoot(firstRootAttribute);
eventTypeTree.addRoot(secondRootAttribute);
SushiEventType testEventType = new SushiEventType("Event", eventTypeTree);
testEventType.setXMLName("EventTaxonomy");
testEventType.setXMLEvent(true);
testEventType.setTimestampName("Current timestamp");
testEventType.save();
SushiMapTree<String, Serializable> eventValueTree = new SushiMapTree<String, Serializable>();
eventValueTree.addRootElement("sender", "DHL");
eventValueTree.addChild("vehicle_information", "ETA", "24.12.2013 20:25");
SushiEvent testEvent = new SushiEvent(testEventType, new Date(), eventValueTree);
testEvent.save();
for(SushiEvent eventFromDatabase : SushiEvent.findAll()){
System.out.println(eventFromDatabase);
}
}
@Test
public void testGetNumberOfEvents() {
storeExampleEvents();
SushiEventType tsun = SushiEventType.findByTypeName("Tsun");
assertTrue(SushiEvent.getNumberOfEventsByEventType(tsun) == 1);
}
@Test
public void testGetDistinctValuesOfAttributes() {
storeExampleEvents();
SushiEventType tsun = SushiEventType.findByTypeName("Tsun");
SushiMapTree<String, Serializable> hm2 = new SushiMapTree<String, Serializable>();
hm2.put("kuchen", "kaese");
hm2.put("kuchen2", "kirschkirsch");
hm2.put("kuchen3", "apfel");
SushiEvent event2 = new SushiEvent(tsun, new Date(), hm2);
event2.save();
List<String> values = SushiEvent.findDistinctValuesOfAttributeOfType("kuchen", tsun);
assertTrue(values.contains("kaese"));
assertTrue(values.size() == 1);
List<String> values2 = SushiEvent.findDistinctValuesOfAttributeOfType("kuchen2", tsun);
assertTrue(values2.contains("kirschkirsch"));
assertTrue(values2.size() == 2);
long appearancesOfKaese = SushiEvent.findNumberOfAppearancesByAttributeValue("kuchen", "kaese", tsun);
long appearancesOfKirschkirsch = SushiEvent.findNumberOfAppearancesByAttributeValue("kuchen2", "kirschkirsch", tsun);
assertTrue("should be 2, but was " + appearancesOfKaese, appearancesOfKaese == 2);
assertTrue("should be 1, but was " + appearancesOfKirschkirsch, appearancesOfKirschkirsch == 1);
}
}