/*
* This is part of Geomajas, a GIS framework, http://www.geomajas.org/.
*
* Copyright 2008-2015 Geosparc nv, http://www.geosparc.com/, Belgium.
*
* The program is available in open source according to the GNU Affero
* General Public License. All contributions in this program are covered
* by the Geomajas Contributors License Agreement. For full licensing
* details, see LICENSE.txt in the project root.
*/
package org.geomajas.gwt2.plugin.geocoder.client.widget;
import com.google.gwtmockito.GwtMock;
import com.google.gwtmockito.GwtMockitoTestRunner;
import junit.framework.Assert;
import org.geomajas.configuration.client.ClientUserDataInfo;
import org.geomajas.geometry.Bbox;
import org.geomajas.geometry.Coordinate;
import org.geomajas.gwt.client.command.CommandCallback;
import org.geomajas.gwt.client.command.GwtCommand;
import org.geomajas.gwt2.client.GeomajasServerExtension;
import org.geomajas.gwt2.client.map.MapPresenter;
import org.geomajas.gwt2.client.map.ViewPort;
import org.geomajas.gwt2.client.service.CommandService;
import org.geomajas.gwt2.plugin.geocoder.client.event.LocationNotFoundEvent;
import org.geomajas.gwt2.plugin.geocoder.client.event.LocationNotFoundHandler;
import org.geomajas.gwt2.plugin.geocoder.client.event.SelectAlternativeEvent;
import org.geomajas.gwt2.plugin.geocoder.client.event.SelectAlternativeHandler;
import org.geomajas.gwt2.plugin.geocoder.client.event.SelectLocationEvent;
import org.geomajas.gwt2.plugin.geocoder.client.event.SelectLocationHandler;
import org.geomajas.plugin.geocoder.command.dto.GetLocationForStringAlternative;
import org.geomajas.plugin.geocoder.command.dto.GetLocationForStringRequest;
import org.geomajas.plugin.geocoder.command.dto.GetLocationForStringResponse;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import java.util.List;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.stub;
import static org.mockito.Mockito.verify;
/**
* Widget for starting a geocoder location search.
*
* @author Jan Venstermans
*/
@RunWith(GwtMockitoTestRunner.class) // for the final class GeomajasServerExtension
public class GeocoderWidgetPresenterImplTest {
private GeocoderWidgetPresenterImpl presenter;
@Mock
private MapPresenter mapPresenterMock;
@Mock
private GeocoderWidgetView geocoderWidgetViewMock;
// used for impl specific treatment of LocationNotFoundEvent
@GwtMock
private GeocoderWidgetViewImpl geocoderWidgetViewImplMock;
@Mock
private GeocoderWidgetAlternativesView alternativesViewMock;
@GwtMock // used because GeomajasServerExtension is final
private GeomajasServerExtension serverExtensionMock;
@Mock
private CommandService commandServiceMock;
@Mock
private ClientUserDataInfo infoMock;
@Mock
private ViewPort viewPortMock;
@Mock
private List<GetLocationForStringAlternative> alternativeListMock;
// response dummy data
private String location = "location";
private String canonicalLocation = "canonicalLocation";
private String geocoderName = "geocoderName";
private Coordinate center = new Coordinate(2, 3);
private Bbox bbox = new Bbox(0, 0, 5, 8);
@Before
public void before() {
MockitoAnnotations.initMocks(this);
presenter = new GeocoderWidgetPresenterImpl(mapPresenterMock, geocoderWidgetViewMock, alternativesViewMock);
reset(mapPresenterMock);
reset(geocoderWidgetViewMock);
reset(alternativesViewMock);
stub(serverExtensionMock.getCommandService()).toReturn(commandServiceMock);
stub(mapPresenterMock.getViewPort()).toReturn(viewPortMock);
GeomajasServerExtension.setInstance(serverExtensionMock);
}
@Test
public void setHandlersToViewsOnConstructionTest() {
presenter = new GeocoderWidgetPresenterImpl(mapPresenterMock, geocoderWidgetViewMock, alternativesViewMock);
verify(geocoderWidgetViewMock).setPresenter(presenter);
verify(alternativesViewMock).setPresenter(presenter);
}
@Test
public void registerGeocoderEventHandlersOnConstruction() {
// after construction, the default geocoder event handler should be the presenter itself
presenter.fireGeocoderEvent(new SelectLocationEvent(mapPresenterMock, createGetLocationForStringResponse()));
presenter.fireGeocoderEvent(new SelectAlternativeEvent(mapPresenterMock, alternativeListMock));
verifyPresentationAsSelectLocationHandlerExecuted();
verifyPresentationAsSelectAlternativeHandlerExecuted();
// impl specific treatment of LocationNotFoundEvent
presenter = new GeocoderWidgetPresenterImpl(mapPresenterMock, geocoderWidgetViewImplMock, alternativesViewMock);
presenter.fireGeocoderEvent(new LocationNotFoundEvent(location));
verifyPresentationImplAsLocationNotFoundHandlerExecuted();
}
@Test
public void findLocationTest() {
String crs = "crs";
stub(viewPortMock.getCrs()).toReturn(crs);
String servicePattern = "servicePattern";
presenter.setServicePattern(servicePattern);
presenter.findLocation(location);
ArgumentCaptor<GwtCommand> commandCaptor = ArgumentCaptor.forClass(GwtCommand.class);
ArgumentCaptor<CommandCallback> callbackCaptor = ArgumentCaptor.forClass(CommandCallback.class);
verify(commandServiceMock).execute(commandCaptor.capture(), callbackCaptor.capture());
// assert command
GwtCommand command = commandCaptor.getValue();
Assert.assertEquals(GetLocationForStringRequest.COMMAND, command.getCommandName());
Assert.assertTrue(command.getCommandRequest() instanceof GetLocationForStringRequest);
GetLocationForStringRequest request = (GetLocationForStringRequest) command.getCommandRequest();
Assert.assertEquals(crs, request.getCrs());
Assert.assertEquals(location, request.getLocation());
Assert.assertEquals(servicePattern, request.getServicePattern());
// assert callback
//callbackCaptor.getValue().execute();
}
@Test
public void goToLocationOneLocationFoundTest() {
SelectLocationHandler selectLocationHandlerMock = mock(SelectLocationHandler.class);
presenter.setSelectLocationHandler(selectLocationHandlerMock);
GetLocationForStringResponse response = createGetLocationForStringResponse();
response.setLocationFound(true);
presenter.goToLocation(response, location);
ArgumentCaptor<SelectLocationEvent> selectLocationEventArgumentCaptor = ArgumentCaptor.forClass(SelectLocationEvent.class);
verify(selectLocationHandlerMock).onSelectLocation(selectLocationEventArgumentCaptor.capture());
SelectLocationEvent event = selectLocationEventArgumentCaptor.getValue();
Assert.assertEquals(response.getCanonicalLocation(), event.getCanonicalLocation());
Assert.assertEquals(response.getCenter(), event.getCenter());
Assert.assertEquals(response.getBbox(), event.getBbox());
Assert.assertEquals(response.getGeocoderName(), event.getGeocoderName());
Assert.assertEquals(response.getUserData(), event.getUserData());
Assert.assertEquals(mapPresenterMock, event.getMapWidget());
}
@Test
public void goToLocationAlternativeLocationsFoundTest() {
SelectAlternativeHandler selectAlternativeHandlerMock = mock(SelectAlternativeHandler.class);
stub(alternativeListMock.size()).toReturn(2);
presenter.setSelectAlternativeHandler(selectAlternativeHandlerMock);
GetLocationForStringResponse response = createGetLocationForStringResponse();
response.setLocationFound(false);
response.setAlternatives(alternativeListMock);
presenter.goToLocation(response, location);
ArgumentCaptor<SelectAlternativeEvent> selectAlternativeEventArgumentCaptor = ArgumentCaptor.forClass(SelectAlternativeEvent.class);
verify(selectAlternativeHandlerMock).onSelectAlternative(selectAlternativeEventArgumentCaptor.capture());
SelectAlternativeEvent event = selectAlternativeEventArgumentCaptor.getValue();
Assert.assertEquals(alternativeListMock, event.getAlternatives());
Assert.assertEquals(mapPresenterMock, event.getMapWidget());
}
@Test
public void goToLocationNoLocationsFoundTest() {
LocationNotFoundHandler locationNotFoundHandler = mock(LocationNotFoundHandler.class);
presenter.setLocationNotFoundHandler(locationNotFoundHandler);
GetLocationForStringResponse response = createGetLocationForStringResponse();
response.setLocationFound(false);
response.setAlternatives(null);
presenter.goToLocation(response, location);
ArgumentCaptor<LocationNotFoundEvent> locationNotFoundEventArgumentCaptor = ArgumentCaptor.forClass(LocationNotFoundEvent.class);
verify(locationNotFoundHandler).onLocationNotFound(locationNotFoundEventArgumentCaptor.capture());
LocationNotFoundEvent event = locationNotFoundEventArgumentCaptor.getValue();
Assert.assertEquals(location, event.getLocation());
}
@Test
public void presentationAsLocationNotFoundHandlerTest(){
presenter = new GeocoderWidgetPresenterImpl(mapPresenterMock, geocoderWidgetViewImplMock, alternativesViewMock);
LocationNotFoundEvent event = new LocationNotFoundEvent(location);
((LocationNotFoundHandler) presenter).onLocationNotFound(event);
verifyPresentationImplAsLocationNotFoundHandlerExecuted();
}
@Test
public void presentationAsSelectAlternativeHandlerTest(){
stub(alternativeListMock.size()).toReturn(2);
SelectAlternativeEvent event = new SelectAlternativeEvent(mapPresenterMock, alternativeListMock);
((SelectAlternativeHandler) presenter).onSelectAlternative(event);
verifyPresentationAsSelectAlternativeHandlerExecuted();
}
@Test
public void presentationAsSelectLocationHandlerTest(){
SelectLocationEvent event = new SelectLocationEvent(mapPresenterMock, createGetLocationForStringResponse());
((SelectLocationHandler) presenter).onSelectLocation(event);
verifyPresentationAsSelectLocationHandlerExecuted();
}
private GetLocationForStringResponse createGetLocationForStringResponse() {
GetLocationForStringResponse response = new GetLocationForStringResponse();
response.setCanonicalLocation(canonicalLocation);
response.setCenter(center);
response.setBbox(bbox);
response.setGeocoderName(geocoderName);
response.setUserData(infoMock);
return response;
}
private void verifyPresentationAsSelectLocationHandlerExecuted() {
verify(viewPortMock).applyBounds(bbox);
verify(geocoderWidgetViewMock).setValue(canonicalLocation);
}
private void verifyPresentationAsSelectAlternativeHandlerExecuted() {
verify(alternativesViewMock).setAlternatives(alternativeListMock);
verify(alternativesViewMock).show();
verify(geocoderWidgetViewMock).alternativesViewIsShown(true);
}
private void verifyPresentationImplAsLocationNotFoundHandlerExecuted() {
verify(geocoderWidgetViewImplMock).showLocationNotFoundMessage(location);
}
}