package uk.ac.ox.zoo.seeg.abraid.mp.publicsite.web; import org.junit.Test; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import uk.ac.ox.zoo.seeg.abraid.mp.common.domain.*; import uk.ac.ox.zoo.seeg.abraid.mp.common.dto.json.*; import uk.ac.ox.zoo.seeg.abraid.mp.common.service.core.ModelRunService; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; /** * Tests the ModelRunDetails controller. * Copyright (c) 2014 University of Oxford */ public class ModelRunDetailsControllerTest { @Test public void getModelRunSummaryStatisticsReturnsBadRequestIfModelRunDoesNotExist() throws Exception { // Arrange String name = "modelRun1"; ModelRunService modelRunService = mockModelRunService(name, null); ModelRunDetailsController controller = new ModelRunDetailsController(modelRunService); // Act ResponseEntity response = controller.getModelRunSummaryStatistics(name); // Assert assertThat(response.getStatusCode()).isEqualTo(HttpStatus.BAD_REQUEST); } @Test public void getModelRunSummaryStatisticsReturnsBadRequestIfModelRunIsNotComplete() throws Exception { // Arrange String name = "modelRun2"; ModelRun modelRun = mock(ModelRun.class); when(modelRun.getStatus()).thenReturn(ModelRunStatus.FAILED); ModelRunService modelRunService = mockModelRunService(name, modelRun); ModelRunDetailsController controller = new ModelRunDetailsController(modelRunService); // Act ResponseEntity response = controller.getModelRunSummaryStatistics(name); // Assert assertThat(response.getStatusCode()).isEqualTo(HttpStatus.BAD_REQUEST); } @Test public void getModelRunSummaryStatisticsReturnsEmptyJsonIfNoSubmodelStatistics() throws Exception { // Arrange String name = "modelRun3"; ModelRun modelRun = mockCompletedModelRunWithStatistics(new ArrayList<SubmodelStatistic>()); ModelRunService modelRunService = mockModelRunService(name, modelRun); ModelRunDetailsController controller = new ModelRunDetailsController(modelRunService); // Act ResponseEntity response = controller.getModelRunSummaryStatistics(name); // Assert assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK); assertThat(response.getBody().getClass()).isEqualTo(JsonModelRunStatistics.class); assertNullBody(response); } @Test public void getModelRunSummaryStatisticsReturnsExpectedJson() throws Exception { // Arrange String name = "modelRun4"; ModelRun modelRun = mockCompletedModelRunWithStatistics(Arrays.asList( new SubmodelStatistic(4.0, 5.0, 6.0, 7.0, 8.0), new SubmodelStatistic(6.0, 7.0, 8.0, 9.0, 10.0) )); ModelRunService modelRunService = mockModelRunService(name, modelRun); ModelRunDetailsController controller = new ModelRunDetailsController(modelRunService); // Act ResponseEntity response = controller.getModelRunSummaryStatistics(name); // Assert assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK); assertThat(response.getBody().getClass()).isEqualTo(JsonModelRunStatistics.class); assertExpectedBody(response); } @Test public void getCovariateInfluencesReturnsBadRequestIfModelDoesNotExist() throws Exception { // Arrange String name = "modelRun5"; ModelRunService modelRunService = mockModelRunService(name, null); ModelRunDetailsController controller = new ModelRunDetailsController(modelRunService); // Act ResponseEntity response = controller.getCovariateInfluences(name); // Assert assertThat(response.getStatusCode()).isEqualTo(HttpStatus.BAD_REQUEST); } @Test public void getCovariateInfluencesReturnsBadRequestIfModelIsNotComplete() throws Exception { // Arrange String name = "modelRun6"; ModelRun modelRun = mock(ModelRun.class); when(modelRun.getStatus()).thenReturn(ModelRunStatus.IN_PROGRESS); ModelRunService modelRunService = mockModelRunService(name, modelRun); ModelRunDetailsController controller = new ModelRunDetailsController(modelRunService); // Act ResponseEntity response = controller.getCovariateInfluences(name); // Assert assertThat(response.getStatusCode()).isEqualTo(HttpStatus.BAD_REQUEST); } @Test public void getCovariateInfluencesReturnsEmptyJsonIfNoCovariateInfluences() throws Exception { // Arrange String name = "modelRun7"; ModelRun modelRun = mockCompletedModelRunWithCovariates(new ArrayList<CovariateInfluence>(), new ArrayList<EffectCurveCovariateInfluence>()); ModelRunService modelRunService = mockModelRunService(name, modelRun); ModelRunDetailsController controller = new ModelRunDetailsController(modelRunService); // Act ResponseEntity response = controller.getCovariateInfluences(name); // Assert assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK); assertThat(response.getBody().toString()).isEqualTo("[]"); } @Test public void getCovariateInfluencesReturnsExpectedJson() throws Exception { // Arrange String name = "modelRun7"; CovariateFile covariateFile = mock(CovariateFile.class); when(covariateFile.getName()).thenReturn("Name"); when(covariateFile.getId()).thenReturn(4); when(covariateFile.getDiscrete()).thenReturn(true); when(covariateFile.getCovariateValueHistogramData()).thenReturn(Arrays.asList( new CovariateValueBin(covariateFile, 0, 1, 2), new CovariateValueBin(covariateFile, 3, 4, 5) )); CovariateInfluence covariateInfluence = new CovariateInfluence(covariateFile, 12.3); EffectCurveCovariateInfluence effectCurveCovariateInfluence = new EffectCurveCovariateInfluence(); effectCurveCovariateInfluence.setCovariateFile(covariateFile); effectCurveCovariateInfluence.setCovariateValue(3.21); EffectCurveCovariateInfluence badEffectCurveCovariateInfluence = new EffectCurveCovariateInfluence(); badEffectCurveCovariateInfluence.setCovariateFile(mock(CovariateFile.class)); badEffectCurveCovariateInfluence.setCovariateValue(3.14); ModelRun modelRun = mockCompletedModelRunWithCovariates(Arrays.asList(covariateInfluence), Arrays.asList(effectCurveCovariateInfluence, badEffectCurveCovariateInfluence)); ModelRunService modelRunService = mockModelRunService(name, modelRun); ModelRunDetailsController controller = new ModelRunDetailsController(modelRunService); // Act ResponseEntity response = controller.getCovariateInfluences(name); // Assert assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK); List<JsonCovariateInfluence> body = (List<JsonCovariateInfluence>) response.getBody(); assertThat(body).hasSize(1); assertThat(body.get(0).getName()).isEqualTo("Name"); assertThat(body.get(0).getDiscrete()).isEqualTo(true); assertThat(body.get(0).getMeanInfluence()).isEqualTo(12.3); assertThat(body.get(0).getEffectCurve()).hasSize(1); assertThat(body.get(0).getEffectCurve().iterator().next().getCovariateValue()).isEqualTo(3.21); assertThat(body.get(0).getValuesHistogram()).hasSize(2); assertThat(body.get(0).getValuesHistogram().iterator().next().getCount()).isEqualTo(2); } @Test public void getEffectCurveCovariateInfluencesReturnsBadRequestIfModelDoesNotExist() throws Exception { // Arrange String name = "modelRun5"; ModelRunService modelRunService = mockModelRunService(name, null); ModelRunDetailsController controller = new ModelRunDetailsController(modelRunService); // Act ResponseEntity response = controller.getEffectCurveCovariateInfluences(name); // Assert assertThat(response.getStatusCode()).isEqualTo(HttpStatus.BAD_REQUEST); } @Test public void getEffectCurveCovariateInfluencesReturnsBadRequestIfModelIsNotComplete() throws Exception { // Arrange String name = "modelRun6"; ModelRun modelRun = mock(ModelRun.class); when(modelRun.getStatus()).thenReturn(ModelRunStatus.IN_PROGRESS); ModelRunService modelRunService = mockModelRunService(name, modelRun); ModelRunDetailsController controller = new ModelRunDetailsController(modelRunService); // Act ResponseEntity response = controller.getEffectCurveCovariateInfluences(name); // Assert assertThat(response.getStatusCode()).isEqualTo(HttpStatus.BAD_REQUEST); } @Test public void getEffectCurveCovariateInfluencesReturnsEmptyDTOIfNoEffectCurveCovariateInfluences() throws Exception { // Arrange String name = "modelRun7"; ModelRun modelRun = mockCompletedModelRunWithEffectCurve(new ArrayList<EffectCurveCovariateInfluence>()); ModelRunService modelRunService = mockModelRunService(name, modelRun); ModelRunDetailsController controller = new ModelRunDetailsController(modelRunService); // Act ResponseEntity response = controller.getEffectCurveCovariateInfluences(name); // Assert assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK); WrappedList<JsonEffectCurveCovariateInfluence> body = (WrappedList<JsonEffectCurveCovariateInfluence>) response.getBody(); assertThat(body.getList()).isEmpty(); } @Test public void getEffectCurveCovariateInfluencesReturnsExpectedDTOs() throws Exception { // Arrange String name = "modelRun7"; EffectCurveCovariateInfluence covariateInfluence = new EffectCurveCovariateInfluence(); CovariateFile covariateFile = mock(CovariateFile.class); when(covariateFile.getName()).thenReturn("Display name"); covariateInfluence.setCovariateFile(covariateFile); covariateInfluence.setCovariateValue(1.23); covariateInfluence.setLowerQuantile(2.3); covariateInfluence.setUpperQuantile(3.2); covariateInfluence.setMeanInfluence(3.21); ModelRun modelRun = mockCompletedModelRunWithEffectCurve(Arrays.asList(covariateInfluence)); ModelRunService modelRunService = mockModelRunService(name, modelRun); ModelRunDetailsController controller = new ModelRunDetailsController(modelRunService); // Act ResponseEntity response = controller.getEffectCurveCovariateInfluences(name); // Assert assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK); WrappedList<JsonEffectCurveCovariateInfluence> body = (WrappedList<JsonEffectCurveCovariateInfluence>) response.getBody(); assertThat(body.getList()).hasSize(1); assertThat(body.getList().get(0).getName()).isEqualTo("Display name"); assertThat(body.getList().get(0).getMeanInfluence()).isEqualTo(3.21); assertThat(body.getList().get(0).getLowerQuantile()).isEqualTo(2.3); assertThat(body.getList().get(0).getUpperQuantile()).isEqualTo(3.2); assertThat(body.getList().get(0).getCovariateValue()).isEqualTo(1.23); } private ModelRun mockCompletedModelRunWithStatistics(List<SubmodelStatistic> submodelStatistics) { ModelRun modelRun = mock(ModelRun.class); when(modelRun.getStatus()).thenReturn(ModelRunStatus.COMPLETED); when(modelRun.getSubmodelStatistics()).thenReturn(submodelStatistics); return modelRun; } private ModelRun mockCompletedModelRunWithCovariates(List<CovariateInfluence> covariateInfluences, List<EffectCurveCovariateInfluence> effectCurveCovariateInfluences) { ModelRun modelRun = mock(ModelRun.class); when(modelRun.getStatus()).thenReturn(ModelRunStatus.COMPLETED); when(modelRun.getCovariateInfluences()).thenReturn(covariateInfluences); when(modelRun.getEffectCurveCovariateInfluences()).thenReturn(effectCurveCovariateInfluences); return modelRun; } private ModelRun mockCompletedModelRunWithEffectCurve( List<EffectCurveCovariateInfluence> effectCurveCovariateInfluences) { ModelRun modelRun = mock(ModelRun.class); when(modelRun.getStatus()).thenReturn(ModelRunStatus.COMPLETED); when(modelRun.getEffectCurveCovariateInfluences()).thenReturn(effectCurveCovariateInfluences); return modelRun; } private ModelRunService mockModelRunService(String name, ModelRun modelRun) { ModelRunService modelRunService = mock(ModelRunService.class); when(modelRunService.getModelRunByName(name)).thenReturn(modelRun); return modelRunService; } private void assertNullBody(ResponseEntity response) { JsonModelRunStatistics body = (JsonModelRunStatistics) response.getBody(); assertThat(body.getKappa()).isNull(); assertThat(body.getKappaSd()).isNull(); assertThat(body.getAuc()).isNull(); assertThat(body.getAucSd()).isNull(); assertThat(body.getSens()).isNull(); assertThat(body.getSensSd()).isNull(); assertThat(body.getSpec()).isNull(); assertThat(body.getSpecSd()).isNull(); assertThat(body.getPcc()).isNull(); assertThat(body.getPccSd()).isNull(); } private void assertExpectedBody(ResponseEntity response) { JsonModelRunStatistics body = (JsonModelRunStatistics) response.getBody(); assertThat(body.getKappa()).isEqualTo(5.0); assertThat(body.getAuc()).isEqualTo(6.0); assertThat(body.getSens()).isEqualTo(7.0); assertThat(body.getSpec()).isEqualTo(8.0); assertThat(body.getPcc()).isEqualTo(9.0); assertSd(body.getKappaSd()); assertSd(body.getAucSd()); assertSd(body.getSensSd()); assertSd(body.getSpecSd()); assertSd(body.getPccSd()); } private void assertSd(double sd) { assertThat(sd).isEqualTo(Math.sqrt(2)); } }