package com.mapzen.pelias;
import com.mapzen.pelias.gson.Result;
import com.squareup.okhttp.mockwebserver.MockResponse;
import com.squareup.okhttp.mockwebserver.MockWebServer;
import com.squareup.okhttp.mockwebserver.RecordedRequest;
import org.junit.Before;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import okhttp3.Request;
import static org.fest.assertions.api.Assertions.assertThat;
import static org.mockito.Matchers.anyDouble;
import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
public class PeliasTest {
Pelias peliasWithMock;
TestCallback callback;
PeliasService mock;
@Captor @SuppressWarnings("unused") private ArgumentCaptor<Callback<Result>> cb;
@Before public void setup() throws Exception {
MockitoAnnotations.initMocks(this);
callback = new TestCallback();
mock = Mockito.mock(PeliasService.class);
peliasWithMock = new Pelias(mock);
}
@Test public void search_getSearch() throws Exception {
when(mock.getSearch(anyString(), anyDouble(), anyDouble(), anyDouble(), anyDouble()))
.thenReturn(new TestCall());
BoundingBox boundingBox = new BoundingBox(1.0, 2.0, 3.0, 4.0);
peliasWithMock.search("test", boundingBox, callback);
verify(mock).getSearch(eq("test"), eq(1.0), eq(2.0), eq(3.0), eq(4.0));
}
@Test public void search_getSearchWithLocationProvider() throws Exception {
when(mock.getSearch(anyString(), anyDouble(), anyDouble(), anyDouble(), anyDouble()))
.thenReturn(new TestCall());
peliasWithMock.setLocationProvider(new TestLocationProvider());
peliasWithMock.search("test", callback);
verify(mock).getSearch(eq("test"), eq(3.0), eq(4.0), eq(5.0), eq(6.0));
}
@Test public void search_getSearchWithFocusPoint() throws Exception {
when(mock.getSearch(anyString(), anyDouble(), anyDouble())).thenReturn(new TestCall());
peliasWithMock.search("test", 1.0, 2.0, callback);
verify(mock).getSearch(eq("test"), eq(1.0), eq(2.0));
}
@Test public void suggest_getSuggest() throws Exception {
when(mock.getSuggest(anyString(), anyDouble(), anyDouble())).thenReturn(new TestCall());
peliasWithMock.suggest("test", 1.0, 2.0, callback);
verify(mock).getSuggest(eq("test"), eq(1.0), eq(2.0));
}
@Test public void suggest_getSuggestWithLocationProvider() throws Exception {
when(mock.getSuggest(anyString(), anyDouble(), anyDouble())).thenReturn(new TestCall());
peliasWithMock.setLocationProvider(new TestLocationProvider());
peliasWithMock.suggest("test", callback);
verify(mock).getSuggest(eq("test"), eq(1.0), eq(2.0));
}
@Test public void suggest_getSuggestWithLayersCountrySources() throws Exception {
when(mock.getSuggest(anyString(), anyDouble(), anyDouble(), anyString(), anyString(),
anyString())).thenReturn(new TestCall());
peliasWithMock.setLocationProvider(new TestLocationProvider());
peliasWithMock.suggest("test", "venue", "us", "wof", callback);
verify(mock).getSuggest(eq("test"), eq(1.0), eq(2.0), eq("venue"), eq("us"), eq("wof"));
}
@Test public void reverse_getReverseGeocode() throws Exception {
when(mock.getReverse(anyDouble(), anyDouble())).thenReturn(new TestCall());
peliasWithMock.setLocationProvider(new TestLocationProvider());
peliasWithMock.reverse(30.0, 40.0, callback);
verify(mock).getReverse(eq(30.0), eq(40.0));
}
@Test public void reverse_getReverseGeocodeWithSources() throws Exception {
when(mock.getReverse(anyDouble(), anyDouble(), anyString())).thenReturn(new TestCall());
peliasWithMock.setLocationProvider(new TestLocationProvider());
peliasWithMock.reverse(30.0, 40.0, "wof", callback);
verify(mock).getReverse(eq(30.0), eq(40.0), eq("wof"));
}
@Test public void place_shouldSendSearchRequestToServer() throws Exception {
when(mock.getPlace(anyString())).thenReturn(new TestCall());
peliasWithMock.place("osm:venue:3669115471", callback);
verify(mock).getPlace(eq("osm:venue:3669115471"));
}
@Test public void setEndpoint_shouldChangeServiceEndpoint() throws Exception {
final MockWebServer server = new MockWebServer();
MockResponse response = new MockResponse();
server.enqueue(response);
server.play();
Pelias pelias = new Pelias(server.getUrl("/").toString());
pelias.setRequestHandler(new PeliasRequestHandler() {
@Override public Map<String, String> headersForRequest() {
HashMap<String, String> headers = new HashMap();
headers.put("TEST_HEADER", "TEST_HEADER_VALUE");
return headers;
}
@Override public Map<String, String> queryParamsForRequest() {
HashMap<String, String> params = new HashMap();
params.put("TEST_PARAM", "TEST_PARAM_VALUE");
return params;
}
});
pelias.suggest("test", 1.0, 2.0, callback);
RecordedRequest request = server.takeRequest();
assertThat(request.getPath()).contains("/autocomplete");
assertThat(request.getHeader("TEST_HEADER")).isEqualTo("TEST_HEADER_VALUE");
assertThat(request.getPath()).contains("TEST_PARAM");
server.shutdown();
}
@Test public void setDebug_shouldChangeLogLevel() {
assertThat(peliasWithMock.getDebug()).isFalse();
peliasWithMock.setDebug(true);
assertThat(peliasWithMock.getDebug()).isTrue();
}
@Test public void setEndpoint_shouldChangeEndpoint() {
peliasWithMock.setEndpoint("http://pelias.com/test/");
assertThat(peliasWithMock.getEndpoint()).isEqualTo("http://pelias.com/test/");
}
private class TestCallback implements Callback<Result> {
@Override public void onResponse(Call<Result> call, Response<Result> response) {
}
@Override public void onFailure(Call<Result> call, Throwable t) {
}
}
public static class TestLocationProvider implements PeliasLocationProvider {
@Override public double getLat() {
return 1.0;
}
@Override public double getLon() {
return 2.0;
}
@Override public BoundingBox getBoundingBox() {
return new BoundingBox(3.0, 4.0, 5.0, 6.0);
}
}
private class TestCall implements Call<Result> {
@Override public Response<Result> execute() throws IOException {
return Response.success(new Result());
}
@Override public void enqueue(Callback<Result> callback) {
callback.onResponse(null, Response.success(new Result()));
}
@Override public boolean isExecuted() {
return false;
}
@Override public void cancel() {
}
@Override public boolean isCanceled() {
return false;
}
@Override public Call<Result> clone() {
return null;
}
@Override public Request request() {
return null;
}
}
}