package org.myeslib.example.jdbi.routes; import static org.mockito.Matchers.any; import static org.mockito.Mockito.when; import java.util.UUID; import javax.inject.Singleton; import javax.sql.DataSource; import lombok.extern.slf4j.Slf4j; import org.apache.camel.CamelContext; import org.apache.camel.Produce; import org.apache.camel.ProducerTemplate; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.impl.DefaultCamelContext; import org.apache.camel.test.junit4.CamelTestSupport; import org.h2.jdbcx.JdbcConnectionPool; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.mockito.Mockito; import org.myeslib.core.data.AggregateRootHistory; import org.myeslib.core.data.Snapshot; import org.myeslib.core.data.UnitOfWork; import org.myeslib.core.storage.SnapshotReader; import org.myeslib.example.SampleDomain.CreateInventoryItem; import org.myeslib.example.SampleDomain.IncreaseInventory; import org.myeslib.example.SampleDomain.InventoryItemAggregateRoot; import org.myeslib.example.SampleDomain.ItemDescriptionGeneratorService; import org.myeslib.example.jdbi.modules.CamelModule; import org.myeslib.example.jdbi.modules.DatabaseModule; import org.myeslib.example.jdbi.modules.HazelcastModule; import org.myeslib.example.jdbi.modules.InventoryItemModule; import org.myeslib.util.jdbi.AggregateRootHistoryReaderDao; import org.myeslib.util.jdbi.ArTablesMetadata; import org.skife.jdbi.v2.DBI; import com.google.inject.Binder; import com.google.inject.Guice; import com.google.inject.Inject; import com.google.inject.Injector; import com.google.inject.Module; import com.google.inject.Provides; import com.google.inject.util.Modules; import com.googlecode.flyway.core.Flyway; @Slf4j public class JdbiConsumeCommandsRouteTest extends CamelTestSupport { private static Injector injector ; @Produce(uri = "direct:processCommand") protected ProducerTemplate template; @Inject DataSource datasource; @Inject DBI dbi; @Inject ArTablesMetadata metadata; @Inject JdbiConsumeCommandsRoute consumeCommandsRoute; @Inject ItemDescriptionGeneratorService service; @Inject SnapshotReader<UUID, InventoryItemAggregateRoot> snapshotReader; @Inject AggregateRootHistoryReaderDao<UUID> historyReader; @BeforeClass public static void staticSetUp() throws Exception { injector = Guice.createInjector(new CamelModule(1, 1), new HazelcastModule(), Modules.override(new DatabaseModule(1, 1 ), new InventoryItemModule()).with(new TestModule())); } public static class TestModule implements Module { @Provides @Singleton public DataSource datasource() { JdbcConnectionPool pool = JdbcConnectionPool.create("jdbc:h2:mem:test;MODE=Oracle", "scott", "tiger"); return pool; } @Override public void configure(Binder binder) { binder.bind(ItemDescriptionGeneratorService.class) .toInstance(Mockito.mock(ItemDescriptionGeneratorService.class)); } } @Before public void setUp() throws Exception { injector.injectMembers(this); super.setUp(); Flyway flyway = new Flyway(); flyway.setDataSource(datasource); //flyway.setLocations("../myeslib-database/src/main/resources/db/h2"); flyway.migrate(); } @Override public CamelContext createCamelContext() { CamelContext c = new DefaultCamelContext(); return c; } @Test public void test() { when(service.generate(any(UUID.class))).thenReturn("an inventory item description from mock"); UUID id = UUID.randomUUID(); CreateInventoryItem command1 = new CreateInventoryItem(UUID.randomUUID(), id); template.sendBody(command1); IncreaseInventory command2 = new IncreaseInventory(UUID.randomUUID(), id, 2, 1L); UnitOfWork uow = template.requestBody(command2, UnitOfWork.class); AggregateRootHistory historyFromDatabase = historyReader.get(id); UnitOfWork lastUow = historyFromDatabase.getUnitsOfWork().get(historyFromDatabase.getUnitsOfWork().size()-1); assertEquals(uow, lastUow); Snapshot<InventoryItemAggregateRoot> snapshot = snapshotReader.get(command1.getId()); assertTrue(snapshot.getAggregateInstance().getAvailable() == 2); log.info("result value after sending the command: {}", uow); // log.info("value on aggregateRootMap: {}", aggregateMapFactory.get(HazelcastMaps.INVENTORY_ITEM_AGGREGATE_HISTORY.name()).get(command1.getId())); // log.info("value on table: \n{}", getAggregateRootHistoryAsJson(command1.getId().toString())); // log.info("value on snapshotMap: {}", snapshotMapFactory.get(HazelcastMaps.INVENTORY_ITEM_LAST_SNAPSHOT.name()).get(command1.getId())); // } @Override protected RouteBuilder createRouteBuilder() { return consumeCommandsRoute; } }