package com.bitmonlab.osiris.api.map.rest.impl;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import java.util.Collection;
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.assemblers.RoomAssemblerImpl;
import com.bitmonlab.osiris.api.core.map.exceptions.QueryException;
import com.bitmonlab.osiris.api.core.map.exceptions.RoomNotFoundException;
import com.bitmonlab.osiris.api.core.map.managers.impl.SearchManagerImpl;
import com.bitmonlab.osiris.api.core.map.transferobject.FeatureDTO;
import com.bitmonlab.osiris.api.core.map.transferobject.LayerDTO;
import com.bitmonlab.osiris.api.core.map.transferobject.RoomDTO;
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 SearchResourceImplTest {
private static final String APP_IDENTIFIER="9";
private static final String queryJson = "query";
private static final Integer pageIndex = 5;
private static final Integer pageSize = 20;
private static final String orderField = "mockfield";
private static final String order = "ASC";
private static final LayerDTO layerDTO=LayerDTO.ALL;
@InjectMocks
private SearchResourceImpl searchResourceImpl;
@Mock
private SearchManagerImpl searchManagerImpl;
@Mock
private FeatureAssemblerImpl featureAssembler;
@Mock
private Collection<Feature> collectionFeatures;
@Mock
private Collection<FeatureDTO> featuresDTO;
@Mock
private Validations validations;
@Mock
private RoomAssemblerImpl roomAssembler;
@Mock
private Feature room;
@Mock
private RoomDTO roomDTO;
@Mock
private BasicAuth principal;
@Test
public void getRoomByLocationTest() throws AssemblyException, RoomNotFoundException{
//Fixture
Double longitude=60.0;
Double latitude=70.0;
Integer floor=3;
Mockito.when(searchManagerImpl.getRoomByLocation(APP_IDENTIFIER, longitude, latitude, floor)).thenReturn(room);
Mockito.when(roomAssembler.createDataTransferObject(room)).thenReturn(roomDTO);
//Experimentation
Response response = searchResourceImpl.getRoomByLocation(principal, APP_IDENTIFIER, longitude, latitude, floor);
//Expectation
Mockito.verify(validations).checkIsNotNullAndNotBlank(APP_IDENTIFIER);
Mockito.verify(validations).checkMin(-180.0,longitude);
Mockito.verify(validations).checkMax(180.0,longitude);
Mockito.verify(validations).checkMin(-90.0,latitude);
Mockito.verify(validations).checkMax(90.0,latitude);
Mockito.verify(validations).checkIsNotNull(floor);
Mockito.verify(searchManagerImpl).getRoomByLocation(APP_IDENTIFIER, longitude, latitude, floor);
Mockito.verify(roomAssembler).createDataTransferObject(room);
assertNotNull("Response must not be null",response);
assertEquals("The Status response is not the expected", 200, response.getStatus());
RoomDTO roomResponseDTO=(RoomDTO)response.getEntity();
assertEquals("Response must be equals", roomDTO, roomResponseDTO);
}
@Test
public void getFeaturesByQueryTest() throws AssemblyException, QueryException{
//Fixture
Mockito.when(searchManagerImpl.getFeaturesByQuery(APP_IDENTIFIER,queryJson, layerDTO,pageIndex, pageSize)).thenReturn(collectionFeatures);
Mockito.when(featureAssembler.createDataTransferObjects(collectionFeatures)).thenReturn(featuresDTO);
//Experimentation
Response response = searchResourceImpl.getFeaturesByQuery(principal, APP_IDENTIFIER, queryJson, layerDTO, pageIndex, pageSize, "", order);
//Expectation
Mockito.verify(validations).checkIsNotNullAndNotBlank(APP_IDENTIFIER,queryJson);
Mockito.verify(validations).checkIsNotNull(layerDTO);
Mockito.verify(validations).checkMin(0, pageIndex);
Mockito.verify(validations).checkMin(1, pageSize);
Mockito.verify(searchManagerImpl).getFeaturesByQuery(APP_IDENTIFIER,queryJson,layerDTO, pageIndex, pageSize);
Mockito.verify(featureAssembler).createDataTransferObjects(collectionFeatures);
assertNotNull(response.getEntity());
assertEquals("CollectionFeatureDTO is not the expected", featuresDTO, (Collection<FeatureDTO>) response.getEntity());
assertEquals("The Status response is not the expected", 200, response.getStatus());
}
@Test
public void getFeaturesByQueryWithOrderTest() throws AssemblyException, QueryException{
//Fixture
Mockito.when(searchManagerImpl.getFeaturesByQuery(APP_IDENTIFIER,queryJson, layerDTO,pageIndex, pageSize, orderField, order)).thenReturn(collectionFeatures);
Mockito.when(featureAssembler.createDataTransferObjects(collectionFeatures)).thenReturn(featuresDTO);
//Experimentation
Response response = searchResourceImpl.getFeaturesByQuery(principal, APP_IDENTIFIER, queryJson, layerDTO, pageIndex, pageSize, orderField, order);
//Expectation
Mockito.verify(searchManagerImpl).getFeaturesByQuery(APP_IDENTIFIER,queryJson,layerDTO, pageIndex, pageSize, orderField, order);
Mockito.verify(featureAssembler).createDataTransferObjects(collectionFeatures);
assertNotNull(response.getEntity());
assertEquals("CollectionFeatureDTO is not the expected", featuresDTO, (Collection<FeatureDTO>) response.getEntity());
assertEquals("The Status response is not the expected", 200, response.getStatus());
}
}