package ch.alv.components.data.adapter;
import ch.alv.components.core.search.MapBasedValuesProvider;
import ch.alv.components.core.search.ValuesProvider;
import ch.alv.components.data.DataLayerException;
import ch.alv.components.data.mock.MockMongoDbDocument;
import ch.alv.components.data.mock.MockMongoDbQueryProvider;
import de.flapdoodle.embed.mongo.MongodExecutable;
import de.flapdoodle.embed.mongo.MongodProcess;
import de.flapdoodle.embed.mongo.MongodStarter;
import de.flapdoodle.embed.mongo.config.IMongodConfig;
import de.flapdoodle.embed.mongo.config.MongodConfigBuilder;
import de.flapdoodle.embed.mongo.config.Net;
import de.flapdoodle.embed.mongo.distribution.Version;
import de.flapdoodle.embed.process.runtime.Network;
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.util.HashMap;
import java.util.Map;
import static org.junit.Assert.*;
/**
* Unit tests for the {@link ch.alv.components.data.query.DefaultQueryFactory} class.
*
* @since 1.0.0
*/
@SuppressWarnings("unchecked")
public class MongoDbDataStoreAdapterTest {
private static final int PORT_NBR = 27017;
private static final String DATABASE_NAME = "embedded";
private MongodProcess mongod;
private DataStoreAdapter adapter;
@Rule
public ExpectedException expectedException = ExpectedException.none();
@Before
public void before() throws Exception {
MongodStarter starter = MongodStarter.getDefaultInstance();
IMongodConfig mongodConfig = new MongodConfigBuilder()
.version(Version.Main.PRODUCTION)
.net(new Net(27017, Network.localhostIsIPv6()))
.build();
MongodExecutable mongodExecutable = null;
mongodExecutable = starter.prepare(mongodConfig);
mongod = mongodExecutable.start();
ApplicationContext context = new ClassPathXmlApplicationContext("spring/mongodb-data-store-adapter-test-context.xml");
BeanFactory factory = context;
adapter = (DataStoreAdapter) factory.getBean("adapter");
}
@After
public void after() {
mongod.stop();
}
@Test
public void testFind() throws DataLayerException {
MockMongoDbDocument entity = new MockMongoDbDocument();
entity.setName("testName");
entity = (MockMongoDbDocument) adapter.save(entity, MockMongoDbDocument.class);
assertNotNull(adapter.find(entity.getId(), MockMongoDbDocument.class));
assertNull(adapter.find("unknownItem", MockMongoDbDocument.class));
MockMongoDbDocument entity2 = new MockMongoDbDocument();
entity2.setName("otherName");
adapter.save(entity2, MockMongoDbDocument.class);
assertEquals(2, adapter.find(MockMongoDbDocument.class).size());
Map<String, String[]> values = new HashMap<>();
values.put("name", new String[] { "testName" });
ValuesProvider valuesProvider = new MapBasedValuesProvider();
valuesProvider.setValues(values);
assertEquals(1, adapter.find(MockMongoDbQueryProvider.NAME, valuesProvider, MockMongoDbDocument.class).size());
expectedException.expect(DataLayerException.class);
expectedException.expectMessage("Could not execute query with name 'unknownQuery'.");
adapter.find("unknownQuery", new MapBasedValuesProvider(), MockMongoDbDocument.class);
}
@Test
public void testCreate() throws DataLayerException {
assertNotNull(adapter.save(new MockMongoDbDocument(), MockMongoDbDocument.class).getId());
}
@Test
public void testUpdate() throws DataLayerException {
MockMongoDbDocument entity = new MockMongoDbDocument();
entity = (MockMongoDbDocument) adapter.save(entity, MockMongoDbDocument.class);
String id = entity.getId();
assertNull(entity.getName());
entity.setName("testName");
adapter.save(entity, MockMongoDbDocument.class);
entity = (MockMongoDbDocument) adapter.find(id, MockMongoDbDocument.class);
assertEquals("testName", entity.getName());
}
@Test
public void testDelete() throws DataLayerException {
MockMongoDbDocument doc = new MockMongoDbDocument();
doc = (MockMongoDbDocument) adapter.save(doc, MockMongoDbDocument.class);
adapter.delete(doc.getId(), MockMongoDbDocument.class);
assertNull(adapter.find(doc.getId(), MockMongoDbDocument.class));
adapter.delete("unknown", MockMongoDbDocument.class);
}
}