package uk.ac.ox.zoo.seeg.abraid.mp.dataacquisition.acquirers.healthmap.geonames;
import org.junit.Test;
import uk.ac.ox.zoo.seeg.abraid.mp.common.web.JsonParserException;
import uk.ac.ox.zoo.seeg.abraid.mp.common.web.WebServiceClient;
import uk.ac.ox.zoo.seeg.abraid.mp.common.web.WebServiceClientException;
import uk.ac.ox.zoo.seeg.abraid.mp.dataacquisition.acquirers.healthmap.geonames.domain.GeoName;
import static com.googlecode.catchexception.CatchException.catchException;
import static com.googlecode.catchexception.CatchException.caughtException;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
/**
* Tests the GeoNamesWebService class.
*
* Copyright (c) 2014 University of Oxford
*/
public class GeoNamesWebServiceTest {
@Test
public void successfulGeoNamesCall() {
// Arrange
int geoNameId = 898335;
String json = "{\"alternateNames\":[],\"countryName\":\"Zambia\",\"adminCode1\":\"07\",\"lng\":\"26.76667\"," +
"\"adminName2\":\"\",\"fcodeName\":\"populated place\",\"adminName3\":\"\",\"timezone\":" +
"{\"dstOffset\":2,\"gmtOffset\":2,\"timeZoneId\":\"Africa/Lusaka\"},\"adminName4\":\"\"," +
"\"adminName5\":\"\",\"bbox\":{\"south\":-17.108993648751756,\"east\":26.776076165520003," +
"\"north\":-17.091006351248247,\"west\":26.75725783448},\"name\":\"Siambara\",\"fcode\":\"PPL\"," +
"\"geonameId\":898335,\"lat\":\"-17.1\",\"population\":0,\"adminName1\":\"Southern\",\"countryId\":" +
"\"895949\",\"adminId1\":\"896972\",\"fclName\":\"city, village,...\",\"countryCode\":\"ZM\"," +
"\"srtm3\":1315,\"toponymName\":\"Siambara\",\"fcl\":\"P\",\"continentCode\":\"AF\"}";
String url = getGeoNamesUrl(geoNameId);
WebServiceClient client = getMockWebServiceClient(url, json);
GeoNamesWebService webService = getGeoNamesWebService(client);
// Act
GeoName geoName = webService.getById(geoNameId);
// Assert
assertThat(geoName.getFeatureCode()).isEqualTo("PPL");
assertThat(geoName.getGeoNameId()).isEqualTo(geoNameId);
}
@Test
public void nonExistentGeoName() {
// Arrange
int geoNameId = 898337123;
String json = "{\"status\":{\"message\":\"this geonameid does not exist\",\"value\":15}}";
String url = getGeoNamesUrl(geoNameId);
WebServiceClient client = getMockWebServiceClient(url, json);
GeoNamesWebService webService = getGeoNamesWebService(client);
// Act
GeoName geoName = webService.getById(geoNameId);
// Assert
assertThat(geoName).isNull();
}
@Test
public void otherGeoNamesErrorMessage() {
// Arrange
int geoNameId = 898337123;
String json = "{\"status\":{\"message\":\"hourly limit of credits exceeded\",\"value\":19}}";
String url = getGeoNamesUrl(geoNameId);
WebServiceClient client = getMockWebServiceClient(url, json);
GeoNamesWebService webService = getGeoNamesWebService(client);
// Act
GeoName geoName = webService.getById(geoNameId);
// Assert
assertThat(geoName).isNull();
}
@Test
public void webServiceClientThrewException() {
// Arrange
int geoNameId = 12345;
String url = getGeoNamesUrl(geoNameId);
WebServiceClient client = mock(WebServiceClient.class);
//noinspection unchecked
when(client.makeGetRequest(url)).thenThrow(WebServiceClientException.class);
GeoNamesWebService webService = getGeoNamesWebService(client);
// Act
catchException(webService).getById(geoNameId);
// Assert
assertThat(caughtException()).isInstanceOf(WebServiceClientException.class);
}
@Test
public void invalidJsonReturnedByGeoNames() {
// Arrange
int geoNameId = 67890;
String json = "this is invalid JSON";
String url = getGeoNamesUrl(geoNameId);
WebServiceClient client = getMockWebServiceClient(url, json);
GeoNamesWebService webService = getGeoNamesWebService(client);
// Act
catchException(webService).getById(geoNameId);
// Assert
assertThat(caughtException()).isInstanceOf(JsonParserException.class);
}
private String getGeoNamesUrl(int geoNameId) {
return "http://api.geonames.org/getJSON?username=testuser&geonameId=" + geoNameId;
}
private GeoNamesWebService getGeoNamesWebService(WebServiceClient client) {
GeoNamesWebService webService = new GeoNamesWebService(client);
webService.setRootUrlGetJSON("http://api.geonames.org/getJSON");
webService.setGeoNameIdParameterName("geonameId");
webService.setUsername("testuser");
webService.setUsernameParameterName("username");
return webService;
}
private WebServiceClient getMockWebServiceClient(String url, String json) {
WebServiceClient client = mock(WebServiceClient.class);
when(client.makeGetRequest(url)).thenReturn(json);
return client;
}
}