package core.framework.test.mongo;
import com.mongodb.client.model.Filters;
import core.framework.api.mongo.Mongo;
import core.framework.api.mongo.MongoCollection;
import core.framework.api.util.Lists;
import core.framework.test.IntegrationTest;
import org.bson.types.ObjectId;
import org.junit.After;
import org.junit.Test;
import javax.inject.Inject;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
/**
* @author neo
*/
public class MongoIntegrationTest extends IntegrationTest {
@Inject
MongoCollection<TestMongoEntity> testEntityCollection;
@Inject
Mongo mongo;
@After
public void cleanup() {
mongo.dropCollection("entity");
}
@Test
public void insert() {
TestMongoEntity entity = new TestMongoEntity();
entity.stringField = "string";
entity.zonedDateTimeField = ZonedDateTime.of(LocalDateTime.of(2016, 9, 1, 11, 0, 0), ZoneId.of("UTC"));
testEntityCollection.insert(entity);
assertNotNull(entity.id);
Optional<TestMongoEntity> loadedEntity = testEntityCollection.get(entity.id);
assertTrue(loadedEntity.isPresent());
assertEquals(entity.stringField, loadedEntity.get().stringField);
assertEquals(entity.zonedDateTimeField.toInstant(), loadedEntity.get().zonedDateTimeField.toInstant());
}
@Test
public void replace() {
TestMongoEntity entity = new TestMongoEntity();
entity.id = new ObjectId();
entity.stringField = "value1";
testEntityCollection.replace(entity);
TestMongoEntity loadedEntity = testEntityCollection.get(entity.id).orElseThrow(() -> new Error("not found"));
assertEquals(entity.stringField, loadedEntity.stringField);
entity.stringField = "value2";
testEntityCollection.replace(entity);
loadedEntity = testEntityCollection.get(entity.id).orElseThrow(() -> new Error("not found"));
assertEquals(entity.stringField, loadedEntity.stringField);
}
@Test
public void search() {
TestMongoEntity entity = new TestMongoEntity();
entity.id = new ObjectId();
entity.stringField = "value";
testEntityCollection.insert(entity);
List<TestMongoEntity> entities = testEntityCollection.find(Filters.eq("string_field", "value"));
assertEquals(1, entities.size());
assertEquals(entity.id, entities.get(0).id);
assertEquals(entity.stringField, entities.get(0).stringField);
}
@Test
public void searchByEnum() {
TestMongoEntity entity = new TestMongoEntity();
entity.id = new ObjectId();
entity.stringField = "value";
entity.enumField = TestMongoEntity.TestEnum.VALUE1;
testEntityCollection.insert(entity);
List<TestMongoEntity> entities = testEntityCollection.find(Filters.eq("enum_field", TestMongoEntity.TestEnum.VALUE1));
assertEquals(1, entities.size());
assertEquals(entity.id, entities.get(0).id);
assertEquals(entity.stringField, entities.get(0).stringField);
assertEquals(entity.enumField, entities.get(0).enumField);
}
@Test
public void bulkInsert() {
List<TestMongoEntity> entities = testEntities();
testEntityCollection.bulkInsert(entities);
for (TestMongoEntity entity : entities) {
assertNotNull(entity.id);
}
Optional<TestMongoEntity> loadedEntity = testEntityCollection.get(entities.get(0).id);
assertTrue(loadedEntity.isPresent());
assertEquals(entities.get(0).stringField, loadedEntity.get().stringField);
}
@Test
public void bulkReplace() {
List<TestMongoEntity> entities = testEntities();
entities.forEach(entity -> entity.id = new ObjectId());
testEntityCollection.bulkReplace(entities);
Optional<TestMongoEntity> loadedEntity = testEntityCollection.get(entities.get(0).id);
assertTrue(loadedEntity.isPresent());
assertEquals(entities.get(0).stringField, loadedEntity.get().stringField);
entities.get(0).stringField = "string1-updated";
entities.get(1).stringField = "string2-updated";
testEntityCollection.bulkReplace(entities);
loadedEntity = testEntityCollection.get(entities.get(0).id);
assertTrue(loadedEntity.isPresent());
assertEquals(entities.get(0).stringField, loadedEntity.get().stringField);
}
@Test
public void bulkDelete() {
List<TestMongoEntity> entities = testEntities();
testEntityCollection.bulkInsert(entities);
long deletedCount = testEntityCollection.bulkDelete(entities.stream().map(entity -> entity.id).collect(Collectors.toList()));
assertEquals(2, deletedCount);
assertFalse(testEntityCollection.get(entities.get(0).id).isPresent());
}
private List<TestMongoEntity> testEntities() {
List<TestMongoEntity> entities = Lists.newArrayList();
TestMongoEntity entity1 = new TestMongoEntity();
entity1.stringField = "string1";
entities.add(entity1);
TestMongoEntity entity2 = new TestMongoEntity();
entity2.stringField = "string2";
entities.add(entity2);
return entities;
}
}