package uk.ac.ox.zoo.seeg.abraid.mp.common.service.workflow.support.runrequest;
import net.lingala.zip4j.exception.ZipException;
import org.apache.commons.io.FileUtils;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import uk.ac.ox.zoo.seeg.abraid.mp.common.dto.json.JsonModelRunResponse;
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 java.io.File;
import java.io.IOException;
import java.net.URI;
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.Matchers.any;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
/**
* Tests the ModelWrapperWebService class.
*
* Copyright (c) 2014 University of Oxford
*/
public class ModelWrapperWebServiceTest {
@Rule
public TemporaryFolder testFolder = new TemporaryFolder(); ///CHECKSTYLE:SUPPRESS VisibilityModifier
private static final URI ROOT_URL = URI.create("http://localhost:8080/ModelWrapper");
@Test
public void startRunWithTypicalParameters() throws IOException, ZipException {
// Arrange
String expectedUrl = "http://localhost:8080/ModelWrapper/model/run";
File mockZip = testFolder.newFile();
FileUtils.writeStringToFile(mockZip, "Some fake content");
String responseJson = "{ \"errorText\": \"Some Error\" }";
ModelWrapperWebService webService = getModelWrapperWebService(expectedUrl, mockZip, responseJson);
// Act
JsonModelRunResponse actualResponse = webService.startRun(ROOT_URL, mockZip);
// Assert
assertThat(actualResponse.getErrorText()).isEqualTo("Some Error");
}
@Test
public void startRunPropagatesWebServiceClientException() throws IOException, ZipException {
// Arrange
File mockZip = testFolder.newFile();
FileUtils.writeStringToFile(mockZip, "Some fake content");
WebServiceClient client = mock(WebServiceClient.class);
when(client.makePostRequestWithBinary(anyString(), any(File.class))).thenThrow(new WebServiceClientException(""));
ModelWrapperWebService webService = getModelWrapperWebService(client);
// Act
catchException(webService).startRun(ROOT_URL, mockZip);
// Assert
assertThat(caughtException()).isInstanceOf(WebServiceClientException.class);
}
@Test
public void startRunWithInvalidResponseJSONThrowsException() throws IOException, ZipException {
// Arrange
String expectedUrl = "http://localhost:8080/ModelWrapper/model/run";
File mockZip = testFolder.newFile();
FileUtils.writeStringToFile(mockZip, "Some fake content");
String responseJson = "{ asdas }";
ModelWrapperWebService webService = getModelWrapperWebService(expectedUrl, mockZip, responseJson);
// Act
catchException(webService).startRun(ROOT_URL, mockZip);
// Assert
assertThat(caughtException()).isInstanceOf(JsonParserException.class);
}
private ModelWrapperWebService getModelWrapperWebService(String expectedUrl, File expectedRequestBody, String responseJson) throws IOException, ZipException {
WebServiceClient client = mock(WebServiceClient.class);
when(client.makePostRequestWithBinary(expectedUrl, expectedRequestBody)).thenReturn(responseJson);
return getModelWrapperWebService(client);
}
private ModelWrapperWebService getModelWrapperWebService(WebServiceClient client) {
return new ModelWrapperWebService(client);
}
}