package au.org.aurin.wif.restclient.suitability; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.testng.AbstractTestNGSpringContextTests; import org.springframework.web.client.HttpClientErrorException; import org.testng.Assert; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import au.org.aurin.wif.exception.validate.WifInvalidInputException; import au.org.aurin.wif.impl.datacreator.DBSuitabilityDataCreatorServiceImpl; import au.org.aurin.wif.impl.suitability.WMSOutcome; import au.org.aurin.wif.io.SslUtil; import au.org.aurin.wif.model.WifProject; import au.org.aurin.wif.model.allocation.AllocationLU; import au.org.aurin.wif.model.reports.suitability.SuitabilityAnalysisReport; import au.org.aurin.wif.model.suitability.FactorImportance; import au.org.aurin.wif.model.suitability.FactorTypeRating; import au.org.aurin.wif.model.suitability.SuitabilityLU; import au.org.aurin.wif.model.suitability.SuitabilityRule; import au.org.aurin.wif.model.suitability.SuitabilityScenario; import au.org.aurin.wif.restclient.ProjectServiceClient; import au.org.aurin.wif.svc.WifKeys; /** * The Class SuitabilityScenarioServiceRestIT. */ @ContextConfiguration(locations = { "/test-integration-client-context.xml" }) public class SuitabilityScenarioServiceRestIT extends AbstractTestNGSpringContextTests { /** The suitability scenario service client. */ @Autowired private SuitabilityScenarioServiceClient suitabilityScenarioServiceClient; /** The project service client. */ @Autowired private ProjectServiceClient projectServiceClient; /** The suitability scenario id. */ private String suitabilityScenarioId; /** The role id. */ private final String roleId = "aurin"; /** The suitability scenario label. */ private final String suitabilityScenarioLabel = "suitabilityScenarioTest474533%##$%%18"; /** The wif project id. */ String wifProjectId; /** The suitability lu id. */ private String suitabilityLUId; /** The allocation lu id. */ private String allocationLUId; /** The Constant LOGGER. */ private static final Logger LOGGER = LoggerFactory .getLogger(SuitabilityScenarioServiceRestIT.class); /** * Setup. * * @throws WifInvalidInputException * the wif invalid input exception */ @BeforeClass(enabled = true, groups = { "restclienttest", "suitability" }) public void setup() throws WifInvalidInputException { SslUtil.trustSelfSignedSSL(); wifProjectId = WifKeys.TEST_PROJECT_ID; final WifProject project = projectServiceClient.getProjectConfiguration( roleId, wifProjectId); LOGGER.debug("fullConfiguration " + project.toString()); final AllocationLU allocationLU = project .getExistingLandUseByLabel("Industrial"); final SuitabilityLU suitabilityLU = project .getSuitabilityLUByName("Residential"); suitabilityLUId = suitabilityLU.getId(); allocationLUId = allocationLU.getId(); Assert.assertEquals(project.getLabel(), "Demonstration"); Assert.assertNotNull(project.getCreationDate()); Assert.assertNotNull(project.getId()); Assert.assertNotNull(project.getSuitabilityLUs().iterator().next() .getAssociatedALUsMap().size()); } /** * Creates the suitability scenario. * * @throws Exception * the exception */ @Test(enabled = true, groups = { "restclienttest", "suitability" }) public void createSuitabilityScenario() throws Exception { final WifProject project = projectServiceClient.getProjectConfiguration( roleId, wifProjectId); // Creating dummy scenario suitabilityScenarioId = "restsuitabilityTestId" + System.currentTimeMillis(); final SuitabilityScenario suitabilityScenario = DBSuitabilityDataCreatorServiceImpl .createSimpleSuitabilityScenario(project, suitabilityScenarioId); suitabilityScenario.setLabel(suitabilityScenarioLabel); suitabilityScenarioId = suitabilityScenarioServiceClient .createSuitabilityScenario(roleId, wifProjectId, suitabilityScenario); Assert.assertNotNull(suitabilityScenarioId); final WifProject project2 = projectServiceClient.getProjectConfiguration( roleId, wifProjectId); Assert.assertNotNull(project2.getSuitabilityScenariosMap()); Assert.assertTrue(project2.getSuitabilityScenariosMap().containsKey( suitabilityScenarioId)); } /** * Gets the suitability scenario. * * @return the suitability scenario * @throws Exception * the exception */ @Test(enabled = true, groups = { "restclienttest", "suitability" }, dependsOnMethods = { "createSuitabilityScenario" }) public void getSuitabilityScenario() throws Exception { final SuitabilityScenario suitabilityScenario = suitabilityScenarioServiceClient .getSuitabilityScenario(roleId, wifProjectId, suitabilityScenarioId); Assert.assertEquals(suitabilityScenario.getLabel(), suitabilityScenarioLabel); } /** * Gets the suitability scenarios for project. * * @return the suitability scenarios for project * @throws Exception * the exception */ @Test(enabled = true, groups = { "restclienttest", "suitability" }, dependsOnMethods = "getSuitabilityScenario") public void getSuitabilityScenariosForProject() throws Exception { final List<SuitabilityScenario> list = suitabilityScenarioServiceClient .getSuitabilityScenariosForProject(roleId, wifProjectId); LOGGER.debug("Scenarios = " + list.size()); Assert.assertNotEquals(list.size(), 1); } /** * Update suitability scenario. * * @throws Exception * the exception */ @Test(enabled = true, groups = { "restclienttest", "suitability" }, dependsOnMethods = { "getSuitabilityScenariosForProject" }) public void updateSuitabilityScenario() throws Exception { final SuitabilityScenario suitabilityScenario = suitabilityScenarioServiceClient .getSuitabilityScenario(roleId, wifProjectId, suitabilityScenarioId); suitabilityScenario.setLabel("suitabilityScenario REST test"); suitabilityScenarioServiceClient.updateSuitabilityScenario(roleId, wifProjectId, suitabilityScenarioId, suitabilityScenario); final SuitabilityScenario tmp = suitabilityScenarioServiceClient .getSuitabilityScenario(roleId, wifProjectId, suitabilityScenarioId); Assert.assertEquals(tmp.getLabel(), "suitabilityScenario REST test"); } /** * Update complex scenario. * * @throws Exception * the exception */ @Test(enabled = true, groups = { "restclienttest", "suitability" }, dependsOnMethods = "updateSuitabilityScenario") public void updateComplexScenario() throws Exception { // Get the scenario LOGGER.debug("****************** updateComplexScenario"); final SuitabilityScenario suitabilityScenario = suitabilityScenarioServiceClient .getSuitabilityScenario(roleId, wifProjectId, suitabilityScenarioId); Assert.assertEquals(suitabilityScenario.getLabel(), "suitabilityScenario REST test"); // Making changes suitabilityScenario.setLabel("Update Suburbanization"); final Set<SuitabilityRule> suitabilityRules = suitabilityScenario .getSuitabilityRules(); Assert.assertEquals(suitabilityRules.size(), 1); final SuitabilityRule rule = suitabilityRules.iterator().next(); Assert.assertEquals(rule.getConvertibleLUsMap().size(), 2); rule.getConvertibleLUsMap().put(allocationLUId, "Residential"); final Set<FactorImportance> factorImportances = rule.getFactorImportances(); for (final FactorImportance factorImportance : factorImportances) { final Set<FactorTypeRating> factorTypeRatings = factorImportance .getFactorTypeRatings(); for (final FactorTypeRating factorTypeRating : factorTypeRatings) { factorTypeRating.setScore(11.1); } factorImportance.setImportance(33.0); } // TODO Make this test a little bit more specific! // boolean found = false; // boolean notFound = true; // Updating scenario suitabilityScenarioServiceClient.updateSuitabilityScenario(roleId, WifKeys.TEST_PROJECT_ID.toString(), WifKeys.TEST_SUITABILITY_SCENARIO_ID, suitabilityScenario); // Checking changes final SuitabilityScenario changedSuitabilityScenario = suitabilityScenarioServiceClient .getSuitabilityScenario(roleId, wifProjectId, suitabilityScenarioId); Assert.assertEquals(changedSuitabilityScenario.getLabel(), "Update Suburbanization"); final Set<SuitabilityRule> changedSuitabilityRules = changedSuitabilityScenario .getSuitabilityRules(); Assert.assertEquals(changedSuitabilityRules.size(), 1); Assert.assertEquals(changedSuitabilityRules.size(), 1); final SuitabilityRule changedRule = changedSuitabilityRules.iterator() .next(); Assert.assertEquals(changedRule.getConvertibleLUsMap().size(), 3); final Set<FactorImportance> changedFactorImportances = changedRule .getFactorImportances(); for (final FactorImportance factorImportance : changedFactorImportances) { Assert.assertEquals(factorImportance.getImportance(), 33.0); final Set<FactorTypeRating> factorTypeRatings = factorImportance .getFactorTypeRatings(); for (final FactorTypeRating factorTypeRating : factorTypeRatings) { Assert.assertEquals(factorTypeRating.getScore(), 11.1); } } // LOGGER.debug("found rating: " + found); // Assert.assertTrue(found); // LOGGER.debug("LU not found: " + notFound); // Assert.assertTrue(notFound); } /** * Gets the wMS outcome async. * * @return the wMS outcome async * @throws Exception * the exception */ @Test(enabled = true, groups = { "restclienttest", "suitability" }, dependsOnMethods = "updateComplexScenario") public void getWMSOutcomeAsync() throws Exception { // Getting the WMS Outcome Async final String areaAnalyzed = WifKeys.POLYGON_TEST; final String crsArea = WifKeys.CRS_TEST; suitabilityScenarioServiceClient.getWMSOutcomeAsync(roleId, wifProjectId, suitabilityScenarioId, areaAnalyzed, crsArea); HashMap<String, String> resp = new HashMap<String, String>(); do { LOGGER.debug("Waiting for setup to complete..."); Thread.sleep(5000); resp = suitabilityScenarioServiceClient.getStatus(roleId, wifProjectId, suitabilityScenarioId); LOGGER.debug("Status is " + resp.get(WifKeys.STATUS_KEY)); } while (!resp.get(WifKeys.STATUS_KEY) .equals(WifKeys.PROCESS_STATE_SUCCESS)); LOGGER.debug("Analysis finished..."); } /** * Gets the wMS test. * * @return the wMS test * @throws Exception * the exception */ @Test(enabled = true, dependsOnMethods = { "getWMSOutcomeAsync" }, groups = { "restclienttest", "suitability" }) public void getWMSTest() throws Exception { LOGGER.debug("getWMSTest: {}"); final WMSOutcome wms = suitabilityScenarioServiceClient.getWMS(roleId, WifKeys.TEST_PROJECT_ID, WifKeys.TEST_SUITABILITY_SCENARIO_ID); LOGGER.debug("wms.getServerURL() {}", wms.getServerURL()); LOGGER.debug("wms.getStoreName() {}", wms.getStoreName()); final Map<String, Integer> scoreColumns = wms.getScoreColumns(); LOGGER.debug("scoreColumns size: {}", scoreColumns.size()); for (final String key : scoreColumns.keySet()) { LOGGER.debug("column: {}, range {}", key, scoreColumns.get(key)); } LOGGER.debug("getWMSTest: finished"); Assert.assertEquals(scoreColumns.size(), 6); Assert.assertNotNull(wms.getServerURL()); Assert.assertTrue(scoreColumns.containsKey("score_residential")); Assert.assertEquals(scoreColumns.get("score_residential"), new Integer( 15000)); } /** * Gets the suitability scenario report. * * @return the suitability scenario report * @throws Exception * the exception */ @Test(enabled = true, groups = { "restclienttest", "suitability" }, dependsOnMethods = { "createSuitabilityScenario" }) public void getSuitabilityScenarioReport() throws Exception { final SuitabilityAnalysisReport suitabilityAnalysisReport = suitabilityScenarioServiceClient .getSuitabilityScenarioReport(roleId, WifKeys.TEST_PROJECT_ID, WifKeys.TEST_SUITABILITY_SCENARIO_ID); Assert.assertEquals(suitabilityAnalysisReport.getReportType(), "SuitabilityScenario"); } /** * Delete suitability scenario. * * @throws Exception * the exception */ @Test(enabled = true, alwaysRun = true, groups = { "restclienttest", "suitability" }, dependsOnMethods = { "updateSuitabilityScenario", "updateComplexScenario", "getWMSOutcomeAsync", "getWMSTest", "getSuitabilityScenarioReport" }, expectedExceptions = HttpClientErrorException.class) public void deleteSuitabilityScenario() throws Exception { suitabilityScenarioServiceClient.deleteSuitabilityScenario(roleId, wifProjectId, suitabilityScenarioId); final WifProject project2 = projectServiceClient.getProjectConfiguration( roleId, wifProjectId); Assert.assertNotNull(project2.getSuitabilityScenariosMap()); Assert.assertFalse(project2.getSuitabilityScenariosMap().containsKey( suitabilityScenarioId)); Assert.assertNull(suitabilityScenarioServiceClient.getSuitabilityScenario( roleId, wifProjectId, suitabilityScenarioId)); } }