package com.bitmonlab.osiris.imports.map.dao.impl; import static org.mockito.Mockito.verify; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.joda.time.DateTime; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Mockito; import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; import org.springframework.data.mongodb.UncategorizedMongoDbException; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.query.BasicQuery; import org.springframework.data.mongodb.core.query.Query; import com.bitmonlab.osiris.commons.map.model.geojson.Feature; import com.bitmonlab.osiris.commons.map.model.geojson.Geometry; import com.bitmonlab.osiris.commons.map.model.geojson.Point; import com.bitmonlab.osiris.commons.map.model.imports.LockImport; import com.bitmonlab.osiris.imports.map.dao.impl.ImportRepositoryCustomImpl; import com.fasterxml.jackson.core.JsonProcessingException; import com.mongodb.BasicDBObject; import com.mongodb.DBCollection; @RunWith(PowerMockRunner.class) @PrepareForTest({ImportRepositoryCustomImpl.class,BasicDBObject.class,Query.class,DateTime.class}) public class ImportRepositoryCustomImplTest { @InjectMocks private ImportRepositoryCustomImpl importRepositoryCustom; @Mock private MongoTemplate mongoTemplate; @Mock private Feature feature1; @Mock private Geometry geometry1; @Mock private DBCollection dbCollection; @Mock private BasicDBObject obj; @Mock private BasicQuery basicQuery; @Mock private List<Feature> features; @Mock private LockImport lockImport; @Mock private DateTime now; @Mock private List<LockImport> lockImportList; @Mock private Map<String,String> properties; private final static String collectionMap = "map_app_"; private final String collectionLock = "lock_import_process"; @Test public void importRepository() throws Exception { String appIdentifier = "1"; String collectionNameMap = collectionMap+appIdentifier; List<Feature> featureCollection = new ArrayList<Feature>(); Feature feature = new Feature(); Point point = new Point(); List<Double> coordinates = new ArrayList<Double>(); coordinates.add(-3.8889018); coordinates.add(40.5020356); point.setCoordinates(coordinates); feature.setGeometry(point); feature.setId("102855090"); properties = new HashMap<String,String>(); properties.put("building","glass"); feature.setProperties(properties); featureCollection.add(feature); //Fixture Mockito.when(mongoTemplate.collectionExists(collectionNameMap)).thenReturn(true); Mockito.when(mongoTemplate.getCollection(collectionNameMap)).thenReturn(dbCollection); PowerMockito.whenNew(BasicDBObject.class).withNoArguments().thenReturn(obj); Mockito.when(obj.put("geometry", "2dsphere")).thenReturn(obj); //Experimentation importRepositoryCustom.saveGeoJson(appIdentifier, featureCollection); //Expectation verify(mongoTemplate).dropCollection(collectionNameMap); verify(mongoTemplate).createCollection(collectionNameMap); verify(mongoTemplate).save(feature,collectionNameMap); } @Test public void importRepositoryGraphIndoor() throws Exception { String appIdentifier = "1"; String collectionNameMap = collectionMap+appIdentifier; List<Feature> featureCollection = new ArrayList<Feature>(); Feature feature = new Feature(); Point point = new Point(); List<Double> coordinates = new ArrayList<Double>(); coordinates.add(-3.8889018); coordinates.add(40.5020356); point.setCoordinates(coordinates); feature.setGeometry(point); feature.setId("102855090"); properties = new HashMap<String,String>(); properties.put("@graphIndoor","true"); feature.setProperties(properties); featureCollection.add(feature); //Fixture Mockito.when(mongoTemplate.collectionExists(collectionNameMap)).thenReturn(true); Mockito.when(mongoTemplate.getCollection(collectionNameMap)).thenReturn(dbCollection); PowerMockito.whenNew(BasicDBObject.class).withNoArguments().thenReturn(obj); Mockito.when(obj.put("geometry", "2dsphere")).thenReturn(obj); //Experimentation importRepositoryCustom.saveGeoJson(appIdentifier, featureCollection); //Expectation verify(mongoTemplate).dropCollection(collectionNameMap); verify(mongoTemplate).createCollection(collectionNameMap); } //@Test(expected=MongoGeospatialException.class) @Test public void importRepositoryMongoGeospatialExceptionThenContinue() throws Exception { String appIdentifier = "1"; String collectionNameMap = collectionMap+appIdentifier; List<Feature> featureCollection = new ArrayList<Feature>(); featureCollection.add(feature1); //Fixture Mockito.when(mongoTemplate.collectionExists(collectionNameMap)).thenReturn(true); Mockito.when(mongoTemplate.getCollection(collectionNameMap)).thenReturn(dbCollection); PowerMockito.whenNew(BasicDBObject.class).withNoArguments().thenReturn(obj); Mockito.when(obj.put("geometry", "2dsphere")).thenReturn(obj); Mockito.when(feature1.getGeometry()).thenReturn(geometry1); Mockito.doThrow(UncategorizedMongoDbException.class).when(mongoTemplate).save(feature1,collectionNameMap); //Experimentation importRepositoryCustom.saveGeoJson(appIdentifier, featureCollection ); //Expectation verify(mongoTemplate).dropCollection(collectionNameMap); verify(mongoTemplate).createCollection(collectionNameMap); verify(dbCollection).ensureIndex(obj); verify(mongoTemplate).save(feature1,collectionNameMap); } //@Test(expected=JsonMapperFromFeatureException.class) @Test public void importRepositoryJsonMapperFromFeatureException() throws Exception { String appIdentifier = "1"; String collectionNameMap = collectionMap+appIdentifier; List<Feature> featureCollection = new ArrayList<Feature>(); featureCollection.add(feature1); //Fixture Mockito.when(mongoTemplate.collectionExists(collectionNameMap)).thenReturn(true); Mockito.when(mongoTemplate.getCollection(collectionNameMap)).thenReturn(dbCollection); PowerMockito.whenNew(BasicDBObject.class).withNoArguments().thenReturn(obj); Mockito.when(obj.put("geometry", "2dsphere")).thenReturn(obj); Mockito.when(feature1.getGeometry()).thenReturn(geometry1); Mockito.doThrow(JsonProcessingException.class).when(mongoTemplate).save(feature1,collectionNameMap); //Experimentation importRepositoryCustom.saveGeoJson(appIdentifier, featureCollection ); //Expectation verify(mongoTemplate).dropCollection(collectionNameMap); verify(mongoTemplate).createCollection(collectionNameMap); verify(dbCollection).ensureIndex(obj); verify(mongoTemplate).save(feature1,collectionNameMap); } @Test public void lockImportProcess() throws Exception{ String idApplication = "1"; String strNow = DateTime.now().toString(); //Fixture Mockito.when(mongoTemplate.collectionExists(collectionLock)).thenReturn(true); Mockito.when(mongoTemplate.getCollection(collectionLock)).thenReturn(dbCollection); PowerMockito.whenNew(LockImport.class).withNoArguments().thenReturn(lockImport); PowerMockito.mockStatic(DateTime.class); Mockito.when(DateTime.now()).thenReturn(now); Mockito.when(now.toString()).thenReturn(strNow); //Experimentation importRepositoryCustom.lockImportProcess(idApplication); //Expectations verify(lockImport).setAppIdentifier(idApplication); verify(lockImport).setTimeStamp(strNow); verify(mongoTemplate).save(lockImport,collectionLock); } @Test public void isImportProcessLocked() throws Exception{ String idApplication = "1"; String strQuery = "{ '_id':'" + idApplication + "'}"; //Fixture Query query=Mockito.mock(Query.class); PowerMockito.whenNew(BasicQuery.class).withArguments(strQuery).thenReturn(basicQuery); Mockito.when(mongoTemplate.find(query, LockImport.class, collectionLock)).thenReturn(lockImportList); Mockito.when(lockImportList.get(0)).thenReturn(lockImport); //Experimentation importRepositoryCustom.isImportProcessLocked(idApplication); //Expectations } @Test public void isImportProcessLockedSpentTheTime() throws Exception{ String idApplication = "1"; String strQuery = "{ '_id':'" + idApplication + "'}"; String strNow = DateTime.now().toString(); //Fixture Query query=Mockito.mock(Query.class); PowerMockito.whenNew(BasicQuery.class).withArguments(strQuery).thenReturn(basicQuery); Mockito.when(mongoTemplate.find(query, LockImport.class, collectionLock)).thenReturn(lockImportList); Mockito.when(mongoTemplate.collectionExists(collectionLock)).thenReturn(true); Mockito.when(mongoTemplate.getCollection(collectionLock)).thenReturn(dbCollection); PowerMockito.whenNew(LockImport.class).withNoArguments().thenReturn(lockImport); PowerMockito.mockStatic(DateTime.class); Mockito.when(DateTime.now()).thenReturn(now); Mockito.when(now.toString()).thenReturn(strNow); //Experimentation importRepositoryCustom.isImportProcessLocked(idApplication); //Expectations } @Test public void deleteLockImportProcess() throws Exception{ String idApplication = "1"; String strQuery = "{ '_id':'" + idApplication + "'}"; //Fixture PowerMockito.whenNew(BasicQuery.class).withArguments(strQuery).thenReturn(basicQuery); Mockito.when(mongoTemplate.collectionExists(collectionLock)).thenReturn(true); //Experimentation importRepositoryCustom.deleteLockImportProcess(idApplication); //Expectations verify(mongoTemplate).collectionExists(collectionLock); verify(mongoTemplate).remove(basicQuery,collectionLock); } }