package uk.co.acuminous.julez.event.source;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import javax.sql.DataSource;
import org.joda.time.DateTime;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import uk.co.acuminous.julez.event.Event;
import uk.co.acuminous.julez.jdbc.DefaultEventSql;
import uk.co.acuminous.julez.mapper.TransformingMapper;
import uk.co.acuminous.julez.runner.ScenarioRunnerEvent;
import uk.co.acuminous.julez.scenario.ScenarioEvent;
import uk.co.acuminous.julez.test.JdbcTestUtils;
import uk.co.acuminous.julez.test.TestEventSchema;
import uk.co.acuminous.julez.test.TestUtils;
import uk.co.acuminous.julez.transformer.DefaultColumnNameTransformer;
public class JdbcEventRepositoryTest {
private DataSource dataSource;
private TransformingMapper columnMapper;
@Before
public void init() {
TestEventSchema.ddl();
dataSource = JdbcTestUtils.getDataSource();
String[] persistentProperties = { Event.ID, Event.TIMESTAMP, Event.TYPE };
columnMapper = new TransformingMapper(new DefaultColumnNameTransformer(), persistentProperties);
}
@After
public void nuke() throws Exception {
JdbcTestUtils.nukeDatabase();
}
@Test
public void addsScenarioEventsToRepository() {
ScenarioEvent event = new ScenarioEvent("id", System.currentTimeMillis(), ScenarioEvent.FAIL);
JdbcEventRepository repository = new JdbcEventRepository(dataSource, columnMapper);
repository.onEvent(event);
assertEquals(event, repository.iterator().next());
}
@Test
public void addsScenarioRunnerEventsToRepository() {
ScenarioRunnerEvent event = new ScenarioRunnerEvent("id", System.currentTimeMillis(), ScenarioRunnerEvent.END);
JdbcEventRepository repository = new JdbcEventRepository(dataSource, columnMapper);
repository.onEvent(event);
assertEquals(event, repository.iterator().next());
}
@Test
public void ignoresNullRepositoryValues() {
ScenarioRunnerEvent event = new ScenarioRunnerEvent("id", System.currentTimeMillis(), ScenarioRunnerEvent.END);
JdbcEventRepository repository = new JdbcEventRepository(dataSource, columnMapper);
repository.onEvent(event);
Event actual = repository.iterator().next();
assertFalse(actual.getData().containsKey("statusCode"));
}
@Test
public void tolleratesUnmappedColumns() {
ScenarioRunnerEvent event = new ScenarioRunnerEvent("id", System.currentTimeMillis(), ScenarioRunnerEvent.END);
event.put("Foo", "Bar");
JdbcEventRepository repository = new JdbcEventRepository(dataSource, columnMapper);
repository.onEvent(event);
Event actual = repository.iterator().next();
assertFalse(actual.getData().containsKey("Foo"));
}
@Test
public void listsretriesEventsFromRepositoryInOrder() {
JdbcEventRepository repository = new JdbcEventRepository(dataSource, columnMapper);
List<Event> expectedEvents = initTestData(repository);
assertTrue(TestUtils.checkEvents(expectedEvents, repository));
}
@Test
public void countsEventsInTheRepository() {
JdbcEventRepository repository = new JdbcEventRepository(dataSource, columnMapper);
List<Event> events = initTestData(repository);
assertEquals(events.size(), TestUtils.countEvents(repository));
}
@Test
public void canOverideSelectQuery() {
JdbcEventRepository repository = new JdbcEventRepository(dataSource, columnMapper, new DefaultEventSql(columnMapper.getValues()) {
@Override
public String getSelectStatement() {
return "SELECT * FROM EVENT WHERE TYPE='Scenario/begin'";
}
});
initTestData(repository);
assertEquals(2, TestUtils.countEvents(repository));
}
@Test
public void canOverideInsertQuery() {
JdbcEventRepository repository = new JdbcEventRepository(dataSource, columnMapper, new DefaultEventSql(columnMapper.getValues()) {
@Override
public String getInsertStatement() {
return "INSERT INTO event (id, timestamp, type) VALUES (?, ?, ? + '/override')" ;
}
});
ScenarioRunnerEvent event = new ScenarioRunnerEvent("id", System.currentTimeMillis(), ScenarioRunnerEvent.END);
repository.onEvent(event);
assertEquals("ScenarioRunner/end/override", repository.iterator().next().getType());
}
@Test
public void maintainsColumnOrderSpecifiedInSqlStatementProvider() {
JdbcEventRepository repository = new JdbcEventRepository(dataSource, columnMapper, new DefaultEventSql("ID", "TYPE", "TIMESTAMP"));
Map<String, String> data = new LinkedHashMap<String, String>();
data.put("#TYPE", "type");
data.put("#TIMESTAMP", "1");
data.put("#ID", "id");
Event event = new Event(data);
repository.onEvent(event);
assertEquals(event, repository.iterator().next());
}
private List<Event> initTestData(JdbcEventRepository repository) {
DateTime now = new DateTime();
ScenarioRunnerEvent eventA1 = new ScenarioRunnerEvent("A1", now.minusSeconds(8).getMillis(), ScenarioRunnerEvent.BEGIN);
ScenarioEvent eventA2 = new ScenarioEvent("A2", now.minusSeconds(7).getMillis(), ScenarioEvent.BEGIN);
ScenarioRunnerEvent eventB1 = new ScenarioRunnerEvent("B1", now.minusSeconds(6).getMillis(), ScenarioRunnerEvent.BEGIN);
ScenarioEvent eventB2 = new ScenarioEvent("B2", now.minusSeconds(5).getMillis(), ScenarioEvent.BEGIN);
ScenarioEvent eventA3 = new ScenarioEvent("A3", now.minusSeconds(4).getMillis(), ScenarioEvent.PASS);
ScenarioEvent eventB3 = new ScenarioEvent("B3", now.minusSeconds(3).getMillis(), ScenarioEvent.FAIL);
ScenarioRunnerEvent eventA4 = new ScenarioRunnerEvent("A4", now.minusSeconds(2).getMillis(), ScenarioRunnerEvent.END);
ScenarioRunnerEvent eventB4 = new ScenarioRunnerEvent("B4", now.minusSeconds(2).getMillis(), ScenarioRunnerEvent.END);
List<Event> events = Arrays.asList(eventA1, eventA2, eventB1, eventB2, eventA3, eventB3, eventA4, eventB4);
for (Event event : events) {
repository.onEvent(event);
}
return events;
}
}