package com.bitmonlab.osiris.api.map.rest.impl;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import javax.ws.rs.core.Response;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.runners.MockitoJUnitRunner;
import com.bitmonlab.osiris.api.core.map.assemblers.FeatureAssemblerImpl;
import com.bitmonlab.osiris.api.core.map.exceptions.FeatureNotExistException;
import com.bitmonlab.osiris.api.core.map.exceptions.MongoGeospatialException;
import com.bitmonlab.osiris.api.core.map.managers.impl.FeatureManagerImpl;
import com.bitmonlab.osiris.api.core.map.transferobject.FeatureDTO;
import com.bitmonlab.osiris.api.map.rest.impl.FeatureResourceImpl;
import com.bitmonlab.osiris.commons.map.model.geojson.Feature;
import com.bitmonlab.osiris.commons.model.security.BasicAuth;
import com.bitmonlab.osiris.core.assembler.AssemblyException;
import com.bitmonlab.osiris.core.validations.validator.Validations;
@RunWith(MockitoJUnitRunner.class)
public class FeatureResourceImplTest {
private static final String APP_IDENTIFIER="9";
private static final String ID_FEATURE="1";
@Mock
private FeatureDTO featureDTO;
@Mock
private FeatureDTO featureDTOReturn;
@InjectMocks
private FeatureResourceImpl featureResourceImpl;
@Mock
private FeatureManagerImpl featureManagerImpl;
@Mock
private Feature feature;
@Mock
private Feature featureReturn;
@Mock
private FeatureAssemblerImpl featureAssembler;
@Mock
private Validations validations;
@Mock
private BasicAuth principal;
@Test
public void storeFeature() throws AssemblyException, MongoGeospatialException{
//Fixture
Mockito.when(featureAssembler.createDomainObject(featureDTO)).thenReturn(feature); //DTO --> Model Object
Mockito.when(featureManagerImpl.storeFeature(APP_IDENTIFIER, feature)).thenReturn(featureReturn); //store
Mockito.when(featureAssembler.createDataTransferObject(featureReturn)).thenReturn(featureDTOReturn); //Model Object --> DTO
//Experimentation
Response response=featureResourceImpl.storeFeature(principal, APP_IDENTIFIER,featureDTO);
//Expectations
Mockito.verify(validations).checkIsNotNullAndNotBlank(APP_IDENTIFIER);
Mockito.verify(validations).checkIsNotNull(featureDTO);
Mockito.verify(featureAssembler).createDomainObject(featureDTO);
Mockito.verify(featureManagerImpl).storeFeature(APP_IDENTIFIER,feature);
Mockito.verify(featureAssembler).createDataTransferObject(featureReturn);
assertNotNull(response.getEntity());
assertEquals("FeatureDTO is not the expected", featureDTOReturn, (FeatureDTO) response.getEntity());
assertEquals("The Status response is not the expected", 200, response.getStatus());
}
@Test
public void deleteGeoPoint() throws AssemblyException, FeatureNotExistException{
//Fixture
//Experimentation
Response response=featureResourceImpl.deleteFeature(principal, APP_IDENTIFIER,ID_FEATURE);
//Expectation
Mockito.verify(validations).checkIsNotNullAndNotBlank(APP_IDENTIFIER,ID_FEATURE);
Mockito.verify(featureManagerImpl).deleteFeature(APP_IDENTIFIER,ID_FEATURE);
assertEquals("The Status response is not the expected", 204, response.getStatus());
}
@Test
public void updateFeature() throws AssemblyException, FeatureNotExistException, MongoGeospatialException{
String idFeature = "1";
//Fixture
Mockito.when(featureAssembler.createDomainObject(featureDTO)).thenReturn(feature); //DTO --> Model Object
Mockito.when(featureManagerImpl.updateFeature(APP_IDENTIFIER,idFeature, feature)).thenReturn(featureReturn); //update
Mockito.when(featureAssembler.createDataTransferObject(featureReturn)).thenReturn(featureDTOReturn); //Model Object --> DTO
//Experimentation
Response response=featureResourceImpl.updateFeature(principal, APP_IDENTIFIER, idFeature, featureDTO);
//Expectations
Mockito.verify(validations).checkIsNotNullAndNotBlank(APP_IDENTIFIER,ID_FEATURE);
Mockito.verify(validations).checkIsNotNull(featureDTO);
Mockito.verify(featureManagerImpl).updateFeature(APP_IDENTIFIER,idFeature,feature);
assertNotNull(response.getEntity());
assertEquals("FeatureDTO is not the expected", featureDTOReturn, (FeatureDTO) response.getEntity());
assertEquals("The Status response is not the expected", 200, response.getStatus());
}
@Test
public void getFeatureWithID() throws AssemblyException, FeatureNotExistException {
//Fixture
Mockito.when(featureManagerImpl.getFeatureByID(APP_IDENTIFIER,ID_FEATURE)).thenReturn(feature);
Mockito.when(featureAssembler.createDataTransferObject(feature)).thenReturn(featureDTO);
//Experimentation
Response response = featureResourceImpl.getFeatureByID(principal, APP_IDENTIFIER, ID_FEATURE);
//Expectation
Mockito.verify(validations).checkIsNotNullAndNotBlank(APP_IDENTIFIER,ID_FEATURE);
Mockito.verify(featureManagerImpl).getFeatureByID(APP_IDENTIFIER, ID_FEATURE);
Mockito.verify(featureAssembler).createDataTransferObject(feature);
assertNotNull(response.getEntity());
assertEquals("FeatureDTO is not the expected", featureDTO, (FeatureDTO) response.getEntity());
assertEquals("The Status response is not the expected", 200, response.getStatus());
}
}