From c001a3128d666db1ba9efc226d1247da1dfa8c91 Mon Sep 17 00:00:00 2001 From: latlon team <info@lat-lon.de> Date: Tue, 18 Feb 2025 09:37:11 +0000 Subject: [PATCH] Code drop - XPLANBOX-3701 - disable chunk encoding, ensure startup if bucket policy cannot be set (eed3d7ce1) - XPLANBOX-3696 - Update tests with internalId and enhance assertions for planStatus (7337c0999) - XPLANBOX-3696 - Enhance assertion to check if not requested status is not returned (252ac98fd) - XPLANBOX-3562 - renamed Query param planStatus and splitted values in v2 (not comma separated) in SoapUI-Tests (f6618f75f) - XPLANBOX-3562 - implemented support of multiple planStatus query params, renamed planStatus param (6139a7a07) - XPLANBOX-3696 - Enhance v1 SoapUI tests to test internalId and planstatus parameters in /plans TestCase (c1192f0ae) - XPLANBOX-3696 - Disable test GET BP 6.0.2 pI getByPlanIdNoResult (c0f90aea9) - XPLANBOX-3696 - Enhance v2 /plans tests by two new parameter tests and four tests checking empty results (negative verification) (344d1fddb) - XPLANBOX-3696 - Implement assertions for new parameters of /plans path in OpenAPI document in v1 and v2 test suites (b75116f9a) - XPLANBOX-3562 - implemented filter parameter internalId and planstatus (db92d4dc0) Co-authored-by: Dirk Stenger <stenger@lat-lon.de> Co-authored-by: Lyn Elisa Goltz <goltz@lat-lon.de> Dropped from commit: 677f1992e8dfeb962d1d625d2903616ed640e4f0 --- .../de/latlon/xplan/commons/s3/S3Storage.java | 32 +- .../s3/config/AmazonS3ReadOnlyContext.java | 15 +- .../manager/db/repository/PlanRepository.java | 19 +- .../db/repository/PlanRepositoryTest.java | 88 +- .../xplan/manager/database/XPlanDao.java | 15 +- .../manager/database/XPlanDbAdapter.java | 24 +- .../api/manager/handler/PlanHandler.java | 11 +- .../api/manager/openapi/v1/ApiV1Config.java | 2 +- .../api/manager/openapi/v2/ApiV2Config.java | 2 +- .../xplanbox/api/manager/v1/PlansApi.java | 22 +- .../api/manager/v1/model/PlanStatusEnum.java | 5 + .../xplanbox/api/manager/v2/PlansApi2.java | 24 +- .../src/main/resources/application.properties | 1 + .../api/manager/config/TestContext.java | 16 +- .../api/manager/handler/PlanHandlerTest.java | 35 +- .../xplanbox/api/manager/v1/PlansApiTest.java | 10 + .../api/manager/v2/PlansApi2Test.java | 10 + .../xplan-manager-api-soapui-project.xml | 1161 +++++++++++++++-- .../src/main/resources/application.properties | 1 + .../src/main/resources/application.properties | 1 + 20 files changed, 1287 insertions(+), 207 deletions(-) diff --git a/xplan-core/xplan-core-commons/src/main/java/de/latlon/xplan/commons/s3/S3Storage.java b/xplan-core/xplan-core-commons/src/main/java/de/latlon/xplan/commons/s3/S3Storage.java index 6c7d68d84..663aed7b2 100644 --- a/xplan-core/xplan-core-commons/src/main/java/de/latlon/xplan/commons/s3/S3Storage.java +++ b/xplan-core/xplan-core-commons/src/main/java/de/latlon/xplan/commons/s3/S3Storage.java @@ -72,18 +72,26 @@ public class S3Storage { public void setBucketExpirationDate(String id, int expirationInDays) throws StorageException { createBucketIfNotExists(); - LifecycleRule rule = LifecycleRule.builder() - .id(id) - .expiration(LifecycleExpiration.builder().days(expirationInDays).build()) - .status(ExpirationStatus.ENABLED) - .filter(LifecycleRuleFilter.builder().build()) - .build(); - BucketLifecycleConfiguration bucketLifecycleConfig = BucketLifecycleConfiguration.builder().rules(rule).build(); - PutBucketLifecycleConfigurationRequest lifecycleRequest = PutBucketLifecycleConfigurationRequest.builder() - .bucket(bucketName) - .lifecycleConfiguration(bucketLifecycleConfig) - .build(); - client.putBucketLifecycleConfiguration(lifecycleRequest); + try { + LifecycleRule rule = LifecycleRule.builder() + .id(id) + .expiration(LifecycleExpiration.builder().days(expirationInDays).build()) + .status(ExpirationStatus.ENABLED) + .filter(LifecycleRuleFilter.builder().build()) + .build(); + BucketLifecycleConfiguration bucketLifecycleConfig = BucketLifecycleConfiguration.builder() + .rules(rule) + .build(); + PutBucketLifecycleConfigurationRequest lifecycleRequest = PutBucketLifecycleConfigurationRequest.builder() + .bucket(bucketName) + .lifecycleConfiguration(bucketLifecycleConfig) + .build(); + client.putBucketLifecycleConfiguration(lifecycleRequest); + } + catch (Exception e) { + LOG.warn("Could not set expiration date for bucket {} to {} days: {}", bucketName, expirationInDays, + e.getMessage()); + } } /** diff --git a/xplan-core/xplan-core-commons/src/main/java/de/latlon/xplan/commons/s3/config/AmazonS3ReadOnlyContext.java b/xplan-core/xplan-core-commons/src/main/java/de/latlon/xplan/commons/s3/config/AmazonS3ReadOnlyContext.java index 512e200a1..184da117d 100644 --- a/xplan-core/xplan-core-commons/src/main/java/de/latlon/xplan/commons/s3/config/AmazonS3ReadOnlyContext.java +++ b/xplan-core/xplan-core-commons/src/main/java/de/latlon/xplan/commons/s3/config/AmazonS3ReadOnlyContext.java @@ -35,6 +35,7 @@ import software.amazon.awssdk.auth.credentials.AwsCredentialsProvider; import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider; import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.s3.S3Client; +import software.amazon.awssdk.services.s3.S3Configuration; /** * Spring configuration for using AWS S3 as a storage. @@ -53,15 +54,21 @@ public class AmazonS3ReadOnlyContext { @Bean(destroyMethod = "close") public S3Client s3Client(AwsCredentialsProvider credentialsProvider, @Value("${xplanbox.s3.region:#{environment.XPLAN_S3_REGION}}") String region, - @Value("${xplanbox.s3.endpoint.url:#{environment.XPLAN_S3_ENDPOINT}}") String endpointUrl) + @Value("${xplanbox.s3.endpoint.url:#{environment.XPLAN_S3_ENDPOINT}}") String endpointUrl, + @Value("${xplanbox.s3.chunkedEncodingEnabled:true}") boolean chunkedEncodingEnabled) throws URISyntaxException { - if (endpointUrl == null || endpointUrl.isEmpty()) { LOG.info("Using S3 region {}", region); - return S3Client.builder().credentialsProvider(credentialsProvider).region(Region.of(region)).build(); + return S3Client.builder() + .serviceConfiguration(S3Configuration.builder().chunkedEncodingEnabled(chunkedEncodingEnabled).build()) + .credentialsProvider(credentialsProvider) + .region(Region.of(region)) + .build(); } - LOG.info("Using S3 url {} (region {})", endpointUrl); + LOG.info("Using S3 url {} (region {}) chunk encoding is {}", endpointUrl, region, + chunkedEncodingEnabled ? "enabled" : "disabled"); return S3Client.builder() + .serviceConfiguration(S3Configuration.builder().chunkedEncodingEnabled(chunkedEncodingEnabled).build()) .credentialsProvider(credentialsProvider) .region(Region.of(region)) .endpointOverride(new URI(endpointUrl)) diff --git a/xplan-core/xplan-core-manager-db/src/main/java/de/latlon/xplan/core/manager/db/repository/PlanRepository.java b/xplan-core/xplan-core-manager-db/src/main/java/de/latlon/xplan/core/manager/db/repository/PlanRepository.java index ce0a28399..79842d373 100644 --- a/xplan-core/xplan-core-manager-db/src/main/java/de/latlon/xplan/core/manager/db/repository/PlanRepository.java +++ b/xplan-core/xplan-core-manager-db/src/main/java/de/latlon/xplan/core/manager/db/repository/PlanRepository.java @@ -20,31 +20,34 @@ */ package de.latlon.xplan.core.manager.db.repository; +import java.util.List; + import de.latlon.xplan.core.manager.db.model.Plan; +import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.CrudRepository; import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; -import java.util.Date; -import java.util.List; - /** * @author <a href="mailto:goltz@lat-lon.de">Lyn Goltz </a> * @since 7.0 */ @Repository @Transactional -public interface PlanRepository extends CrudRepository<Plan, Integer> { +public interface PlanRepository extends CrudRepository<Plan, Integer>, JpaSpecificationExecutor<Plan> { List<Plan> findByName(String name); - @Query(value = "from Plan as p where lower(p.name) like lower(concat('%', :name, '%'))") - List<Plan> findByNameLike(@Param("name") String name); + @Query(value = "from Plan as p where (lower(p.name) like lower(concat('%', :name, '%')) or :name is null) " + + "and (p.internalid = :internalid or :internalid is null) " + "and p.planstatus in :planStatuses") + List<Plan> findBySearchParams(@Param("name") String name, @Param("internalid") String internalid, + @Param("planStatuses") List<String> planStatuses); - @Query(value = "from Plan as p where p.hasRaster = true AND wmssortdate=(SELECT min(wmssortdate) FROM Plan as p1 WHERE p1.wmssortdate IS NOT NULL AND p1.wmssortdate > :sortDate)") - List<Plan> findByPlanWithMoreRecentRasterPlan(@Param("sortDate") Date sortDate); + @Query(value = "from Plan as p where (lower(p.name) like lower(concat('%', :name, '%')) or :name is null) " + + "and (p.internalid = :internalid or :internalid is null)") + List<Plan> findBySearchParams(@Param("name") String name, @Param("internalid") String internalid); boolean existsPlanById(Integer id); diff --git a/xplan-core/xplan-core-manager-db/src/test/java/de/latlon/xplan/core/manager/db/repository/PlanRepositoryTest.java b/xplan-core/xplan-core-manager-db/src/test/java/de/latlon/xplan/core/manager/db/repository/PlanRepositoryTest.java index f83479a05..a24d0c0d7 100644 --- a/xplan-core/xplan-core-manager-db/src/test/java/de/latlon/xplan/core/manager/db/repository/PlanRepositoryTest.java +++ b/xplan-core/xplan-core-manager-db/src/test/java/de/latlon/xplan/core/manager/db/repository/PlanRepositoryTest.java @@ -22,6 +22,8 @@ package de.latlon.xplan.core.manager.db.repository; import static de.latlon.xplan.commons.XPlanType.BP_Plan; import static de.latlon.xplan.commons.XPlanVersion.XPLAN_51; +import static de.latlon.xplan.manager.web.shared.PlanStatus.ARCHIVIERT; +import static de.latlon.xplan.manager.web.shared.PlanStatus.FESTGESTELLT; import static de.latlon.xplan.manager.web.shared.PlanStatus.IN_AUFSTELLUNG; import static java.nio.charset.StandardCharsets.UTF_8; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -147,50 +149,43 @@ class PlanRepositoryTest { @Test @Commit - void verify_findByNameLike() { + void verify_findBySearchParams() { assertFalse(TestTransaction.isFlaggedForRollback()); - String name = "saveAndFindByLikeName"; - Bereich bereich = new Bereich().nummer("0").name("test"); - Feature feature = new Feature().num(1).fid("123"); - Plan plan = new Plan().name(name) - .importDate(new Date()) - .version(XPLAN_51) - .type(BP_Plan) - .hasRaster(false) - .bereiche(Collections.singleton(bereich)) - .features(Collections.singleton(feature)); - planRepository.save(plan); - List<Plan> existingPlan = planRepository.findByNameLike("iKEnAme"); - assertFalse(existingPlan.isEmpty()); + createAndSavePlan("saveAndFindByLikeName1", null, null); + createAndSavePlan("saveAndFindByLikeName2", "internalId1", null); + createAndSavePlan("saveAndFindByLikeName3", "internalId2", FESTGESTELLT); + createAndSavePlan("saveAndFindByLikeName4", null, IN_AUFSTELLUNG); + createAndSavePlan(null, null, ARCHIVIERT); + createAndSavePlan(null, "internalId3", null); + createAndSavePlan(null, "internalId4", FESTGESTELLT); + List<Plan> existingPlanByName = planRepository.findBySearchParams("iKEnAme", null); + assertFalse(existingPlanByName.isEmpty()); - List<Plan> nonExistingPlan = planRepository.findByNameLike("unknown"); - assertTrue(nonExistingPlan.isEmpty()); - } + List<Plan> existingPlanByInternalId = planRepository.findBySearchParams(null, "internalId2"); + assertFalse(existingPlanByInternalId.isEmpty()); - @Test - @Commit - void verify_findByPlanWithMoreRecentRasterPlan() { - assertFalse(TestTransaction.isFlaggedForRollback()); - Bereich bereich = new Bereich().nummer("0").name("test"); - Feature feature = new Feature().num(1).fid("123"); - Date wmsSortDate = new Date(); - Plan plan = new Plan().name("saveAndFindPlanWithMoreRecentRasterPlan") - .importDate(new Date()) - .version(XPLAN_51) - .type(BP_Plan) - .hasRaster(true) - .wmssortdate(wmsSortDate) - .bereiche(Collections.singleton(bereich)) - .features(Collections.singleton(feature)); - planRepository.save(plan); + List<Plan> existingPlanByPlanstatus = planRepository.findBySearchParams(null, null, + Collections.singletonList(FESTGESTELLT.getMessage())); + assertFalse(existingPlanByPlanstatus.isEmpty()); - Date tomorrow = new Date(wmsSortDate.getTime() - (1000 * 60 * 60 * 24)); - List<Plan> existingPlan = planRepository.findByPlanWithMoreRecentRasterPlan(tomorrow); - assertFalse(existingPlan.isEmpty()); + List<Plan> existingPlanByNameAndPlanstatus = planRepository.findBySearchParams("veand", null, + Collections.singletonList(FESTGESTELLT.getMessage())); + assertFalse(existingPlanByNameAndPlanstatus.isEmpty()); - Date yesterday = new Date(wmsSortDate.getTime() + (1000 * 60 * 60 * 24)); - List<Plan> nonExistingPlan = planRepository.findByPlanWithMoreRecentRasterPlan(yesterday); - assertTrue(nonExistingPlan.isEmpty()); + List<Plan> existingPlanByNameAndInternalId = planRepository.findBySearchParams("veand", "internalId1"); + assertFalse(existingPlanByNameAndInternalId.isEmpty()); + + List<Plan> existingPlanByNameAndInternalIdAndPlanStatus = planRepository.findBySearchParams("veand", + "internalId2", Collections.singletonList(FESTGESTELLT.getMessage())); + assertFalse(existingPlanByNameAndInternalIdAndPlanStatus.isEmpty()); + + List<Plan> nonExistingPlanByNameAndInternalId = planRepository.findBySearchParams("unknown", "unknown"); + assertTrue(nonExistingPlanByNameAndInternalId.isEmpty()); + + List<Plan> nonExistingPlanByNameAndInternalIdAndPlanstatus = planRepository.findBySearchParams( + "saveAndFindByLikeName2", "internalId1", + List.of(FESTGESTELLT.getMessage(), IN_AUFSTELLUNG.getMessage())); + assertTrue(nonExistingPlanByNameAndInternalIdAndPlanstatus.isEmpty()); } @Test @@ -246,4 +241,19 @@ class PlanRepositoryTest { assertFalse(notPlanExists); } + private void createAndSavePlan(String name, String internalId, PlanStatus planStatus) { + Bereich bereich = new Bereich().nummer("0").name("test"); + Feature feature = new Feature().num(1).fid("123"); + Plan plan = new Plan().name(name) + .internalid(internalId) + .planstatus(planStatus != null ? planStatus.getMessage() : null) + .importDate(new Date()) + .version(XPLAN_51) + .type(BP_Plan) + .hasRaster(false) + .bereiche(Collections.singleton(bereich)) + .features(Collections.singleton(feature)); + planRepository.save(plan); + } + } diff --git a/xplan-core/xplan-core-manager/src/main/java/de/latlon/xplan/manager/database/XPlanDao.java b/xplan-core/xplan-core-manager/src/main/java/de/latlon/xplan/manager/database/XPlanDao.java index fc65b6889..47c0eeb46 100644 --- a/xplan-core/xplan-core-manager/src/main/java/de/latlon/xplan/manager/database/XPlanDao.java +++ b/xplan-core/xplan-core-manager/src/main/java/de/latlon/xplan/manager/database/XPlanDao.java @@ -22,7 +22,6 @@ package de.latlon.xplan.manager.database; import java.io.InputStream; import java.sql.SQLException; -import java.util.Date; import java.util.List; import java.util.Set; import java.util.stream.Collectors; @@ -160,18 +159,8 @@ public class XPlanDao { return xPlanDbAdapter.getXPlanByName(planName); } - public List<XPlan> getXPlansLikeName(String planName) { - return xPlanDbAdapter.getXPlansLikeName(planName); - } - - /** - * retrieves the id of the plan closest in future to the date passed - * @param releaseDate minimal release date - * @return id of plan with minimal release date - * @throws SQLException - */ - public int getPlanIdOfMoreRecentRasterPlan(Date releaseDate) { - return xPlanDbAdapter.selectXPlanIdOfMoreRecentRasterPlan(releaseDate); + public List<XPlan> getXPlansBySearchParams(String planName, String internalId, List<PlanStatus> planStatuses) { + return xPlanDbAdapter.getXPlansBySearchParams(planName, internalId, planStatuses); } /** diff --git a/xplan-core/xplan-core-manager/src/main/java/de/latlon/xplan/manager/database/XPlanDbAdapter.java b/xplan-core/xplan-core-manager/src/main/java/de/latlon/xplan/manager/database/XPlanDbAdapter.java index ea56708e7..a38ba2201 100644 --- a/xplan-core/xplan-core-manager/src/main/java/de/latlon/xplan/manager/database/XPlanDbAdapter.java +++ b/xplan-core/xplan-core-manager/src/main/java/de/latlon/xplan/manager/database/XPlanDbAdapter.java @@ -38,7 +38,6 @@ import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.nio.file.Files; -import java.sql.SQLException; import java.util.ArrayList; import java.util.Date; import java.util.List; @@ -279,27 +278,14 @@ public class XPlanDbAdapter { } @Transactional(readOnly = true) - public List<XPlan> getXPlansLikeName(String planName) { - List<Plan> plans = planRepository.findByNameLike(planName); + public List<XPlan> getXPlansBySearchParams(String planName, String internalId, List<PlanStatus> planStatuses) { + List<Plan> plans = planStatuses != null && !planStatuses.isEmpty() + ? planRepository.findBySearchParams(planName, internalId, + planStatuses.stream().map(PlanStatus::getMessage).toList()) + : planRepository.findBySearchParams(planName, internalId); return plans.stream().map(plan -> convertToXPlan(plan)).collect(Collectors.toList()); } - /** - * retrieves the id of the plan closest in future to the date passed - * @param releaseDate minimal release date - * @return id of plan with minimal release date, -1 if no such plan exists - * @throws SQLException - */ - @Transactional(readOnly = true) - public int selectXPlanIdOfMoreRecentRasterPlan(Date releaseDate) { - if (releaseDate == null) - return -1; - List<Plan> plan = planRepository.findByPlanWithMoreRecentRasterPlan(releaseDate); - if (plan.isEmpty()) - return -1; - return plan.get(0).getId(); - } - /** * exports a plan * @param planId of plan to export diff --git a/xplan-manager/xplan-manager-api/src/main/java/de/latlon/xplanbox/api/manager/handler/PlanHandler.java b/xplan-manager/xplan-manager-api/src/main/java/de/latlon/xplanbox/api/manager/handler/PlanHandler.java index 7744f7897..4840af248 100644 --- a/xplan-manager/xplan-manager-api/src/main/java/de/latlon/xplanbox/api/manager/handler/PlanHandler.java +++ b/xplan-manager/xplan-manager-api/src/main/java/de/latlon/xplanbox/api/manager/handler/PlanHandler.java @@ -49,6 +49,7 @@ import de.latlon.xplanbox.api.commons.exception.InvalidPlanIdSyntax; import de.latlon.xplanbox.api.commons.exception.UnsupportedParameterValue; import de.latlon.xplanbox.api.manager.v1.model.Bereich; import de.latlon.xplanbox.api.manager.v1.model.Gemeinde; +import de.latlon.xplanbox.api.manager.v1.model.PlanStatusEnum; import de.latlon.xplanbox.api.manager.v1.model.StatusMessage; import de.latlon.xplanbox.security.authorization.AgsAccessor; import jakarta.inject.Singleton; @@ -127,11 +128,11 @@ public class PlanHandler implements AgsAccessor { return xPlanDao.getXPlanByName(planName); } - public List<XPlan> findPlans(String planName) throws Exception { - LOG.info("Searching plan by name '{}'", StringUtils.normalizeSpace(planName)); - if (planName != null) - return xPlanDao.getXPlansLikeName(planName); - return xPlanDao.getXPlanList(); + public List<XPlan> findPlans(String planName, String internalId, List<PlanStatusEnum> planStatuses) { + LOG.info("Searching plan by name '{}', internalId '{}' and planstatus '{}'", + StringUtils.normalizeSpace(planName), StringUtils.normalizeSpace(internalId), planStatuses); + return xPlanDao.getXPlansBySearchParams(planName, internalId, + planStatuses != null ? planStatuses.stream().map(PlanStatusEnum::toPlanStatus).toList() : null); } public List<XPlan> findPlansById(List<Integer> planIds) throws Exception { diff --git a/xplan-manager/xplan-manager-api/src/main/java/de/latlon/xplanbox/api/manager/openapi/v1/ApiV1Config.java b/xplan-manager/xplan-manager-api/src/main/java/de/latlon/xplanbox/api/manager/openapi/v1/ApiV1Config.java index 930a39110..ec376485f 100644 --- a/xplan-manager/xplan-manager-api/src/main/java/de/latlon/xplanbox/api/manager/openapi/v1/ApiV1Config.java +++ b/xplan-manager/xplan-manager-api/src/main/java/de/latlon/xplanbox/api/manager/openapi/v1/ApiV1Config.java @@ -102,7 +102,7 @@ public class ApiV1Config extends AbstractApiConfig { protected void addInfo(OpenAPI openApi, ManagerApiConfiguration managerApiConfiguration) { openApi.setInfo(new Info().title("XPlanManagerAPI") - .version("1.5.0") + .version("1.6.0") .description("XPlanManager REST API") .termsOfService(getTermsOfService(managerApiConfiguration)) .license(new License().name("Apache 2.0").url("http://www.apache.org/licenses/LICENSE-2.0.html"))); diff --git a/xplan-manager/xplan-manager-api/src/main/java/de/latlon/xplanbox/api/manager/openapi/v2/ApiV2Config.java b/xplan-manager/xplan-manager-api/src/main/java/de/latlon/xplanbox/api/manager/openapi/v2/ApiV2Config.java index 1e5d613ee..3a98bcf57 100644 --- a/xplan-manager/xplan-manager-api/src/main/java/de/latlon/xplanbox/api/manager/openapi/v2/ApiV2Config.java +++ b/xplan-manager/xplan-manager-api/src/main/java/de/latlon/xplanbox/api/manager/openapi/v2/ApiV2Config.java @@ -103,7 +103,7 @@ public class ApiV2Config extends AbstractApiConfig { protected void addInfo(OpenAPI openApi, ManagerApiConfiguration managerApiConfiguration) { openApi.setInfo(new Info().title("XPlanManagerAPI") - .version("2.0.0") + .version("2.1.0") .description("XPlanManager REST API v2") .termsOfService(getTermsOfService(managerApiConfiguration)) .license(new License().name("Apache 2.0").url("http://www.apache.org/licenses/LICENSE-2.0.html"))); diff --git a/xplan-manager/xplan-manager-api/src/main/java/de/latlon/xplanbox/api/manager/v1/PlansApi.java b/xplan-manager/xplan-manager-api/src/main/java/de/latlon/xplanbox/api/manager/v1/PlansApi.java index fba168eea..efba5119a 100644 --- a/xplan-manager/xplan-manager-api/src/main/java/de/latlon/xplanbox/api/manager/v1/PlansApi.java +++ b/xplan-manager/xplan-manager-api/src/main/java/de/latlon/xplanbox/api/manager/v1/PlansApi.java @@ -34,6 +34,7 @@ import de.latlon.xplanbox.api.manager.handler.PlanHandler; import de.latlon.xplanbox.api.manager.v1.model.Bereich; import de.latlon.xplanbox.api.manager.v1.model.Gemeinde; import de.latlon.xplanbox.api.manager.v1.model.PlanInfo; +import de.latlon.xplanbox.api.manager.v1.model.PlanStatusEnum; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.media.ArraySchema; @@ -72,24 +73,30 @@ public class PlansApi { @GET @Produces({ "application/json" }) @Operation(summary = "Search for plan by name", - description = "Returns a list of plans where the plan name contains the query string case insensitve", + description = "Returns a list of plans where the plan matches the passed query parameter", tags = { "search" }, responses = { @ApiResponse(responseCode = "200", description = "OK", content = @Content( array = @ArraySchema(schema = @Schema(implementation = PlanInfo.class)))), @ApiResponse(responseCode = "406", description = "Requested format is not available") }) - public Response findByNameOrId( + public Response searchPlans( @QueryParam("planName") @Parameter(description = "The name of the plan to search for", example = "bplan_123, fplan-123, rplan20200803") String planName, + @QueryParam("internalId") @Parameter(description = "The internalId of the plan to search for", + example = "ID_8ee57554-5f58-42ea-86a4-e9f4acd9d3c1") String internalId, + @QueryParam("planStatus") @Parameter(description = "The planStatus of the plan to search for", + example = "FESTGESTELLT") List<PlanStatusEnum> planStatuses, @QueryParam("planId") @Parameter(description = "The ID of the plan to search for", example = "1, 2, 42") List<Integer> planIds, @QueryParam("includeGeltungsbereich") @DefaultValue("false") @Parameter( description = "true if the geltungsbereichWGS84 should be included in the response, false otherwise (default: false).") boolean includeGeltungsbereich) throws Exception { - if (planName != null && !planIds.isEmpty()) - throw new InvalidSearch("Searching by name and id within the same request is not supported!"); - List<XPlan> plans = searchByNameOrId(planName, planIds); + if ((planName != null || internalId != null || (planStatuses != null && !planStatuses.isEmpty())) + && !planIds.isEmpty()) + throw new InvalidSearch( + "Searching by planName, internalId or planstatus and id within the same request is not supported!"); + List<XPlan> plans = searchPlans(planName, internalId, planStatuses, planIds); List<PlanInfo> planInfos = plans.stream().map(xPlan -> { List<Bereich> bereiche = planHandler.findBereiche(xPlan.getId()); List<Gemeinde> gemeinden = planHandler.findGemeinden(xPlan.getId()); @@ -103,11 +110,12 @@ public class PlansApi { return Response.ok().entity(planInfos).build(); } - private List<XPlan> searchByNameOrId(String planName, List<Integer> planIds) throws Exception { + private List<XPlan> searchPlans(String planName, String internalId, List<PlanStatusEnum> planStatuses, + List<Integer> planIds) throws Exception { if (!planIds.isEmpty()) { return planHandler.findPlansById(planIds); } - return planHandler.findPlans(planName); + return planHandler.findPlans(planName, internalId, planStatuses); } } diff --git a/xplan-manager/xplan-manager-api/src/main/java/de/latlon/xplanbox/api/manager/v1/model/PlanStatusEnum.java b/xplan-manager/xplan-manager-api/src/main/java/de/latlon/xplanbox/api/manager/v1/model/PlanStatusEnum.java index 3430778e1..5d7eab259 100644 --- a/xplan-manager/xplan-manager-api/src/main/java/de/latlon/xplanbox/api/manager/v1/model/PlanStatusEnum.java +++ b/xplan-manager/xplan-manager-api/src/main/java/de/latlon/xplanbox/api/manager/v1/model/PlanStatusEnum.java @@ -22,6 +22,7 @@ package de.latlon.xplanbox.api.manager.v1.model; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonValue; +import de.latlon.xplan.manager.web.shared.PlanStatus; /** * Enumeration for plan status. @@ -59,4 +60,8 @@ public enum PlanStatusEnum { throw new IllegalArgumentException("Unexpected value '" + value + "'"); } + public PlanStatus toPlanStatus() { + return PlanStatus.valueOf(value); + } + } diff --git a/xplan-manager/xplan-manager-api/src/main/java/de/latlon/xplanbox/api/manager/v2/PlansApi2.java b/xplan-manager/xplan-manager-api/src/main/java/de/latlon/xplanbox/api/manager/v2/PlansApi2.java index f093eaa61..c60f5f619 100644 --- a/xplan-manager/xplan-manager-api/src/main/java/de/latlon/xplanbox/api/manager/v2/PlansApi2.java +++ b/xplan-manager/xplan-manager-api/src/main/java/de/latlon/xplanbox/api/manager/v2/PlansApi2.java @@ -33,6 +33,7 @@ import de.latlon.xplanbox.api.manager.exception.InvalidSearch; import de.latlon.xplanbox.api.manager.handler.PlanHandler; import de.latlon.xplanbox.api.manager.v1.model.Bereich; import de.latlon.xplanbox.api.manager.v1.model.Gemeinde; +import de.latlon.xplanbox.api.manager.v1.model.PlanStatusEnum; import de.latlon.xplanbox.api.manager.v2.model.PlanInfo; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; @@ -68,24 +69,30 @@ public class PlansApi2 { @GET @Produces({ "application/json" }) @Operation(summary = "Search for plan by name", - description = "Returns a list of plans where the plan name contains the query string case insensitve", + description = "Returns a list of plans where the plan matches the passed query parameter", tags = { "search" }, responses = { @ApiResponse(responseCode = "200", description = "OK", content = @Content( array = @ArraySchema(schema = @Schema(implementation = PlanInfo.class)))), @ApiResponse(responseCode = "406", description = "Requested format is not available") }) - public Response findByNameOrId( + public Response searchPlans( @QueryParam("planName") @Parameter(description = "The name of the plan to search for", - example = "bplan_123, fplan-123, rplan20200803") String planName, + example = "bplan_123") String planName, + @QueryParam("internalId") @Parameter(description = "The internalId of the plan to search for", + example = "ID_8ee57554-5f58-42ea-86a4-e9f4acd9d3c1") String internalId, + @QueryParam("planStatus") @Parameter(description = "The planStatuses of the plan to search for", + example = "FESTGESTELLT") List<PlanStatusEnum> planStatuses, @QueryParam("planId") @Parameter(description = "The ID of the plan to search for", example = "1, 2, 42") List<Integer> planIds, @QueryParam("includeGeltungsbereich") @DefaultValue("false") @Parameter( description = "true if the geltungsbereichWGS84 should be included in the response, false otherwise (default: false).") boolean includeGeltungsbereich) throws Exception { - if (planName != null && !planIds.isEmpty()) - throw new InvalidSearch("Searching by name and id within the same request is not supported!"); - List<XPlan> plans = searchByNameOrId(planName, planIds); + if ((planName != null || internalId != null || (planStatuses != null && !planStatuses.isEmpty())) + && !planIds.isEmpty()) + throw new InvalidSearch( + "Searching by planName, internalId or planstatus and id within the same request is not supported!"); + List<XPlan> plans = searchPlans(planName, internalId, planStatuses, planIds); List<PlanInfo> planInfos = plans.stream().map(xPlan -> { List<Bereich> bereiche = planHandler.findBereiche(xPlan.getId()); List<Gemeinde> gemeinden = planHandler.findGemeinden(xPlan.getId()); @@ -98,11 +105,12 @@ public class PlansApi2 { return Response.ok().entity(planInfos).build(); } - private List<XPlan> searchByNameOrId(String planName, List<Integer> planIds) throws Exception { + private List<XPlan> searchPlans(String planName, String internalId, List<PlanStatusEnum> planStatuses, + List<Integer> planIds) throws Exception { if (!planIds.isEmpty()) { return planHandler.findPlansById(planIds); } - return planHandler.findPlans(planName); + return planHandler.findPlans(planName, internalId, planStatuses); } } diff --git a/xplan-manager/xplan-manager-api/src/main/resources/application.properties b/xplan-manager/xplan-manager-api/src/main/resources/application.properties index 83110655a..4adebb1b7 100644 --- a/xplan-manager/xplan-manager-api/src/main/resources/application.properties +++ b/xplan-manager/xplan-manager-api/src/main/resources/application.properties @@ -46,6 +46,7 @@ xplanbox.s3.accessKeyId=${XPLAN_S3_ACCESS_KEY} xplanbox.s3.endpoint.url=${XPLAN_S3_ENDPOINT} xplanbox.s3.region=${XPLAN_S3_REGION} xplanbox.s3.secretKey=${XPLAN_S3_SECRET_ACCESS_KEY} +xplanbox.s3.chunkedEncodingEnabled=${XPLAN_S3_CHUNKENCODING_ENABLED:true} xplanbox.validation.profiles=${XPLAN_VALIDATION_PROFILES:} xplanbox.s3.bucket.validation=${XPLAN_S3_BUCKET_VALIDATION:validation} diff --git a/xplan-manager/xplan-manager-api/src/test/java/de/latlon/xplanbox/api/manager/config/TestContext.java b/xplan-manager/xplan-manager-api/src/test/java/de/latlon/xplanbox/api/manager/config/TestContext.java index b69884006..916fc28c7 100644 --- a/xplan-manager/xplan-manager-api/src/test/java/de/latlon/xplanbox/api/manager/config/TestContext.java +++ b/xplan-manager/xplan-manager-api/src/test/java/de/latlon/xplanbox/api/manager/config/TestContext.java @@ -39,7 +39,6 @@ import java.sql.DatabaseMetaData; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; -import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -234,6 +233,7 @@ public class TestContext { XPlan mockPlan_5 = new XPlan("lplan_51", "5", "LP_Plan", "XPLAN_51"); XPlan mockPlan_6 = new XPlan("soplan_40", "6", "SO_Plan", "XPLAN_40"); XPlan mockPlan_7 = new XPlan("bplan_51", "7", "BP_Plan", "XPLAN_51"); + mockPlan_2.setInternalId("ID_2_II"); mockPlan_123.setPlanStatus(FESTGESTELLT); mockPlan_2.setPlanStatus(FESTGESTELLT); mockPlan_3.setPlanStatus(FESTGESTELLT); @@ -256,11 +256,17 @@ public class TestContext { when(xplanDao.retrieveXPlanArtefact(7)).thenReturn(getClass().getResourceAsStream("/xplan51_ohneBereich.gml")) .thenReturn(getClass().getResourceAsStream("/xplan51_ohneBereich.gml")); when(xplanDao.existsPlan(123)).thenReturn(true); - List<XPlan> mockList = new ArrayList<>(); - mockList.add(mockPlan_123); + List<XPlan> mockList = Collections.singletonList(mockPlan_123); + List<XPlan> allPlans = List.of(mockPlan_1, mockPlan_123, mockPlan_2, mockPlan_3, mockPlan_4, mockPlan_5, + mockPlan_6, mockPlan_7); when(xplanDao.getXPlanByName("bplan_41")).thenReturn(mockList); - when(xplanDao.getXPlansLikeName("bplan_41")).thenReturn(mockList); - when(xplanDao.getXPlanList()).thenReturn(mockList); + when(xplanDao.getXPlansBySearchParams("bplan_41", null, Collections.emptyList())).thenReturn(mockList); + when(xplanDao.getXPlansBySearchParams(null, "ID_2_II", Collections.emptyList())) + .thenReturn(Collections.singletonList(mockPlan_2)); + when(xplanDao.getXPlansBySearchParams(null, null, Collections.singletonList(FESTGESTELLT))) + .thenReturn(Collections.singletonList(mockPlan_3)); + when(xplanDao.getXPlansBySearchParams(null, null, Collections.emptyList())).thenReturn(allPlans); + when(xplanDao.getXPlanList()).thenReturn(allPlans); when(xplanDao.retrieveAllXPlanArtefacts(anyString())).thenReturn(mock(List.class)); when(xplanDao.retrieveAllXPlanArtefacts("42")).thenThrow(new PlanNotFoundException(42)); when(xplanDao.retrieveGeltungsbereichOfPlanWithId("123")).thenReturn(geltungsbereichWGS84()); diff --git a/xplan-manager/xplan-manager-api/src/test/java/de/latlon/xplanbox/api/manager/handler/PlanHandlerTest.java b/xplan-manager/xplan-manager-api/src/test/java/de/latlon/xplanbox/api/manager/handler/PlanHandlerTest.java index e5ba8a55a..51fe8899a 100644 --- a/xplan-manager/xplan-manager-api/src/test/java/de/latlon/xplanbox/api/manager/handler/PlanHandlerTest.java +++ b/xplan-manager/xplan-manager-api/src/test/java/de/latlon/xplanbox/api/manager/handler/PlanHandlerTest.java @@ -23,6 +23,7 @@ package de.latlon.xplanbox.api.manager.handler; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertThrows; +import java.util.Collections; import java.util.List; import de.latlon.xplan.commons.archive.XPlanArchiveCreator; @@ -32,6 +33,7 @@ import de.latlon.xplanbox.api.commons.exception.InvalidPlanIdSyntax; import de.latlon.xplanbox.api.manager.config.ApplicationContext; import de.latlon.xplanbox.api.manager.config.HsqlJpaContext; import de.latlon.xplanbox.api.manager.config.TestContext; +import de.latlon.xplanbox.api.manager.v1.model.PlanStatusEnum; import de.latlon.xplanbox.api.manager.v1.model.StatusMessage; import jakarta.ws.rs.core.StreamingOutput; import org.junit.jupiter.api.Test; @@ -70,7 +72,7 @@ class PlanHandlerTest { } @Test - void verifyThat_exportPlan_WithWrongIdThrowsException() throws Exception { + void verifyThat_exportPlan_WithWrongIdThrowsException() { assertThrows(InvalidPlanId.class, () -> { StreamingOutput planAsStream = planHandler.exportPlan("42"); assertThat(planAsStream).isNotNull(); @@ -84,39 +86,52 @@ class PlanHandlerTest { } @Test - void verifyThat_findPlanById_WithWrongIdFails() throws Exception { + void verifyThat_findPlanById_WithWrongIdFails() { assertThrows(InvalidPlanId.class, () -> { planHandler.findPlanById("42"); }); } @Test - void verifyThat_findPlanByName() throws Exception { + void verifyThat_findPlanByName() { List<XPlan> plans = planHandler.findPlansByName("bplan_41"); assertThat(plans).hasSize(1); assertThat(plans.get(0).getId()).isEqualTo("123"); } @Test - void verifyThat_findPlans() throws Exception { - List<XPlan> planList = planHandler.findPlans("bplan_41"); + void verifyThat_findPlansByName() { + List<XPlan> planList = planHandler.findPlans("bplan_41", null, Collections.emptyList()); assertThat(planList).contains(new XPlan("bplan_41", "123", "BP_Plan", "XPLAN_41")); } @Test - void verifyThat_findPlans_ReturnsEmptyList() throws Exception { - List<XPlan> planList = planHandler.findPlans("xplan"); + void verifyThat_findPlansByInternalId() { + List<XPlan> planList = planHandler.findPlans(null, "ID_2_II", Collections.emptyList()); + assertThat(planList).contains(new XPlan("bplan_51", "2", "BP_Plan", "XPLAN_51")); + } + + @Test + void verifyThat_findPlansByPlanstatus() { + List<XPlan> planList = planHandler.findPlans(null, null, + Collections.singletonList(PlanStatusEnum.FESTGESTELLT)); + assertThat(planList).contains(new XPlan("bplan_53", "3", "BP_Plan", "XPLAN_53")); + } + + @Test + void verifyThat_findPlans_ReturnsEmptyList() { + List<XPlan> planList = planHandler.findPlans("xplan", null, Collections.emptyList()); assertThat(planList).hasSize(0); } @Test - void verifyThat_findPlansWithNullName() throws Exception { - List<XPlan> planList = planHandler.findPlans(null); + void verifyThat_findPlansWithNullName() { + List<XPlan> planList = planHandler.findPlans(null, null, Collections.emptyList()); assertThat(planList).isNotEmpty(); } @Test - void verifyThat_deleteWithNonIntegerFailes() { + void verifyThat_deleteWithNonIntegerFails() { assertThrows(InvalidPlanIdSyntax.class, () -> planHandler.deletePlan("999999999999999999999")); } diff --git a/xplan-manager/xplan-manager-api/src/test/java/de/latlon/xplanbox/api/manager/v1/PlansApiTest.java b/xplan-manager/xplan-manager-api/src/test/java/de/latlon/xplanbox/api/manager/v1/PlansApiTest.java index ea986cca5..047526035 100644 --- a/xplan-manager/xplan-manager-api/src/test/java/de/latlon/xplanbox/api/manager/v1/PlansApiTest.java +++ b/xplan-manager/xplan-manager-api/src/test/java/de/latlon/xplanbox/api/manager/v1/PlansApiTest.java @@ -74,4 +74,14 @@ class PlansApiTest extends ManagerApiJerseyTest<PlansApi> { "{\"id\":123,\"type\":\"BP_Plan\",\"version\":\"XPLAN_41\",\"planStatus\":\"FESTGESTELLT\",\"raster\":false,\"importDate\":null,\"inspirePublished\":false,\"bbox\":null,\"geltungsbereichWGS84\":{\"type\":\"Polygon\",\"bbox\":null,\"coordinates\":[[[0.0,0.0],[1.0,0.0],[1.0,1.0],[0.0,1.0],[0.0,0.0]]]},"); } + @Test + void verifyThat_GetPlansByPlanStatus_ReturnCorrectStatus() { + Response response = target("/plans").queryParam("planStatus", "FESTGESTELLT") + .queryParam("planStatus", "ARCHIVIERT") + .request() + .accept(APPLICATION_JSON) + .get(); + assertThat(response.getStatus()).isEqualTo(200); + } + } diff --git a/xplan-manager/xplan-manager-api/src/test/java/de/latlon/xplanbox/api/manager/v2/PlansApi2Test.java b/xplan-manager/xplan-manager-api/src/test/java/de/latlon/xplanbox/api/manager/v2/PlansApi2Test.java index 89eb92cec..fe30e5b0a 100644 --- a/xplan-manager/xplan-manager-api/src/test/java/de/latlon/xplanbox/api/manager/v2/PlansApi2Test.java +++ b/xplan-manager/xplan-manager-api/src/test/java/de/latlon/xplanbox/api/manager/v2/PlansApi2Test.java @@ -74,4 +74,14 @@ class PlansApi2Test extends ManagerApiJerseyTest<PlansApi2> { "{\"id\":123,\"type\":\"BP_Plan\",\"version\":\"XPLAN_41\",\"planStatus\":\"FESTGESTELLT\",\"raster\":false,\"importDate\":null,\"inspirePublished\":false,\"bbox\":null,\"geltungsbereichWGS84\":{\"type\":\"Polygon\",\"bbox\":null,\"coordinates\":[[[0.0,0.0],[1.0,0.0],[1.0,1.0],[0.0,1.0],[0.0,0.0]]]},"); } + @Test + void verifyThat_GetPlansByPlanStatus_ReturnCorrectStatus() { + Response response = target("/plans").queryParam("planStatus", "FESTGESTELLT") + .queryParam("planStatus", "ARCHIVIERT") + .request() + .accept(APPLICATION_JSON) + .get(); + assertThat(response.getStatus()).isEqualTo(200); + } + } diff --git a/xplan-tests/xplan-tests-soapui/src/main/resources/xplan-manager-api-soapui-project.xml b/xplan-tests/xplan-tests-soapui/src/main/resources/xplan-manager-api-soapui-project.xml index 825545aa5..7bfad28b8 100644 --- a/xplan-tests/xplan-tests-soapui/src/main/resources/xplan-manager-api-soapui-project.xml +++ b/xplan-tests/xplan-tests-soapui/src/main/resources/xplan-manager-api-soapui-project.xml @@ -2060,6 +2060,48 @@ Search for plan by name</con:description> <con:params/> <con:element>data</con:element> </con:representation> + <con:representation type="FAULT"> + <con:mediaType xsi:nil="true"/> + <con:status>400</con:status> + <con:params/> + <con:element>data</con:element> + </con:representation> + <con:representation type="FAULT"> + <con:mediaType xsi:nil="true"/> + <con:status>400</con:status> + <con:params/> + <con:element>data</con:element> + </con:representation> + <con:representation type="FAULT"> + <con:mediaType xsi:nil="true"/> + <con:status>400</con:status> + <con:params/> + <con:element>data</con:element> + </con:representation> + <con:representation type="FAULT"> + <con:mediaType xsi:nil="true"/> + <con:status>400</con:status> + <con:params/> + <con:element>data</con:element> + </con:representation> + <con:representation type="FAULT"> + <con:mediaType xsi:nil="true"/> + <con:status>400</con:status> + <con:params/> + <con:element>data</con:element> + </con:representation> + <con:representation type="FAULT"> + <con:mediaType xsi:nil="true"/> + <con:status>400</con:status> + <con:params/> + <con:element>data</con:element> + </con:representation> + <con:representation type="FAULT"> + <con:mediaType xsi:nil="true"/> + <con:status>400</con:status> + <con:params/> + <con:element>data</con:element> + </con:representation> <con:request name="Request 1" id="ba7c71b2-c264-4a61-b0b0-1146f2594e7e" mediaType="application/json"> <con:settings/> <con:endpoint>${#Project#baseUrlManagerApi}/xplan-manager-api/xmanager/api/v1</con:endpoint> @@ -2082,6 +2124,106 @@ Search for plan by name</con:description> </con:parameterOrder> </con:request> </con:method> + <con:method name="findByInternalId" id="ff9ed0ac-3441-41a3-aaaf-21dbd87f3a70" method="GET"> + <con:description>Returns a list of plans where the plan name contains the query string case insensitve +Search for plan by name</con:description> + <con:settings/> + <con:parameters> + <con:parameter> + <con:name>internalId</con:name> + <con:style>QUERY</con:style> + <con:description>The name of the plan to search for</con:description> + </con:parameter> + <con:parameter> + <con:name>includeGeltungsbereich</con:name> + <con:value/> + <con:style>QUERY</con:style> + <con:default/> + <con:description xsi:nil="true"/> + </con:parameter> + </con:parameters> + <con:representation type="RESPONSE"> + <con:mediaType>application/json</con:mediaType> + <con:status>200</con:status> + <con:params/> + </con:representation> + <con:representation type="FAULT"> + <con:mediaType xsi:nil="true"/> + <con:status>404</con:status> + <con:params/> + <con:element>data</con:element> + </con:representation> + <con:request name="Request 1" id="4c698a47-e7d1-4e83-bdf0-c61cfc21c738" mediaType="application/json"> + <con:settings/> + <con:endpoint>${#Project#baseUrlManagerApi}/xplan-manager-api/xmanager/api/v1</con:endpoint> + <con:request/> + <con:credentials> + <con:username>${#Project#username}</con:username> + <con:password>${#Project#password}</con:password> + <con:domain xsi:nil="true"/> + <con:authType>No Authorization</con:authType> + </con:credentials> + <con:jmsConfig JMSDeliveryMode="PERSISTENT"/> + <con:jmsPropertyConfig/> + <con:parameters/> + <con:parameterOrder> + <con:entry>internalId</con:entry> + <con:entry>includeGeltungsbereich</con:entry> + </con:parameterOrder> + </con:request> + </con:method> + <con:method name="findByPlanStatus" id="ff9ed0ac-3441-41a3-aaaf-21dbd87f3a70" method="GET"> + <con:description>Returns a list of plans where the plan name contains the query string case insensitve +Search for plan by name</con:description> + <con:settings/> + <con:parameters> + <con:parameter> + <con:name>planStatus</con:name> + <con:value/> + <con:style>QUERY</con:style> + <con:default/> + <con:description>The name of the plan to search for</con:description> + </con:parameter> + <con:parameter> + <con:name>includeGeltungsbereich</con:name> + <con:value/> + <con:style>QUERY</con:style> + <con:default/> + <con:description xsi:nil="true"/> + </con:parameter> + </con:parameters> + <con:representation type="RESPONSE"> + <con:mediaType>application/json</con:mediaType> + <con:status>200</con:status> + <con:params/> + </con:representation> + <con:representation type="FAULT"> + <con:mediaType xsi:nil="true"/> + <con:status>404</con:status> + <con:params/> + <con:element>data</con:element> + </con:representation> + <con:request name="Request 1" id="4c698a47-e7d1-4e83-bdf0-c61cfc21c738" mediaType="application/json"> + <con:settings/> + <con:endpoint>${#Project#baseUrlManagerApi}/xplan-manager-api/xmanager/api/v1</con:endpoint> + <con:request/> + <con:credentials> + <con:username>${#Project#username}</con:username> + <con:password>${#Project#password}</con:password> + <con:domain xsi:nil="true"/> + <con:authType>No Authorization</con:authType> + </con:credentials> + <con:jmsConfig JMSDeliveryMode="PERSISTENT"/> + <con:jmsPropertyConfig/> + <con:parameters> + <entry key="planStatus" value="" xmlns="http://eviware.com/soapui/config"/> + </con:parameters> + <con:parameterOrder> + <con:entry>planStatus</con:entry> + <con:entry>includeGeltungsbereich</con:entry> + </con:parameterOrder> + </con:request> + </con:method> </con:resource> </con:interface> <con:testSuite id="546177ed-bd4c-4071-b255-022d28f71ac6" name="Authorization Setup"> @@ -2275,6 +2417,24 @@ testRunner.testCase.testSuite.project.testSuiteList.each <ignoreComments>false</ignoreComments> </con:configuration> </con:assertion> + <con:assertion type="JsonPath Match" id="374fd3c7-d785-4106-9f40-400f38989c7d" name="path /plans internalId parameter"> + <con:configuration> + <path>$.paths./plans.get.parameters[?(@.name == 'internalId')].name</path> + <content>[internalId]</content> + <allowWildcards>false</allowWildcards> + <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences> + <ignoreComments>false</ignoreComments> + </con:configuration> + </con:assertion> + <con:assertion type="JsonPath Match" id="374fd3c7-d785-4106-9f40-400f38989c7d" name="path /plans planStatus parameter"> + <con:configuration> + <path>$.paths./plans.get.parameters[?(@.name == 'planStatus')].name</path> + <content>[planStatus]</content> + <allowWildcards>false</allowWildcards> + <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences> + <ignoreComments>false</ignoreComments> + </con:configuration> + </con:assertion> <con:assertion type="JsonPath RegEx Match" id="d439e627-6cd0-4e22-9967-b1bc2f392af1" name="version"> <con:configuration> <path>$.info.version</path> @@ -2850,6 +3010,7 @@ assert actualHeader != null</scriptText> <con:jmsConfig JMSDeliveryMode="PERSISTENT"/> <con:jmsPropertyConfig/> <con:parameters> + <con:entry key="internalId" value="soapui-internal-id-BP-41"/> <con:entry key="skipFlaechenschluss" value="true"/> <con:entry key="profiles" value=""/> <con:entry key="skipSemantisch" value="true"/> @@ -7980,6 +8141,24 @@ assert actualHeader != null</scriptText> <ignoreComments>false</ignoreComments> </con:configuration> </con:assertion> + <con:assertion type="JsonPath Match" id="a6ecb45b-6c24-49c3-97a9-c3197dc6a3a0" name="planStatus"> + <con:configuration> + <path>$[0].planStatus</path> + <content>FESTGESTELLT</content> + <allowWildcards>false</allowWildcards> + <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences> + <ignoreComments>false</ignoreComments> + </con:configuration> + </con:assertion> + <con:assertion type="JsonPath Match" id="af928d7c-30d5-4901-8dc3-f3b4239afb30" name="internalId"> + <con:configuration> + <path>$[0].xplanModelData.internalId</path> + <content>soapui-internal-id-BP-41</content> + <allowWildcards>false</allowWildcards> + <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences> + <ignoreComments>false</ignoreComments> + </con:configuration> + </con:assertion> <con:assertion type="JsonPath Match" id="4e49f759-7fd9-4f6c-951e-09cd193baaf4" name="ags"> <con:configuration> <path>$[0].xplanModelData.ags</path> @@ -8144,6 +8323,24 @@ assert actualHeader != null</scriptText> <ignoreComments>false</ignoreComments> </con:configuration> </con:assertion> + <con:assertion type="JsonPath Match" id="2b2b88af-4aed-4bc7-9f7a-00873141e1cf" name="planStatus"> + <con:configuration> + <path>$[0].planStatus</path> + <content>FESTGESTELLT</content> + <allowWildcards>false</allowWildcards> + <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences> + <ignoreComments>false</ignoreComments> + </con:configuration> + </con:assertion> + <con:assertion type="JsonPath Match" id="d1ba726b-e56b-4e24-a9cd-da3cee85f9c6" name="internalId"> + <con:configuration> + <path>$[0].xplanModelData.internalId</path> + <content>soapui-internal-id-BP-41</content> + <allowWildcards>false</allowWildcards> + <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences> + <ignoreComments>false</ignoreComments> + </con:configuration> + </con:assertion> <con:assertion type="JsonPath Match" id="4e49f759-7fd9-4f6c-951e-09cd193baaf4" name="ags"> <con:configuration> <path>$[0].xplanModelData.ags</path> @@ -8290,6 +8487,15 @@ assert actualHeader != null</scriptText> <ignoreComments>false</ignoreComments> </con:configuration> </con:assertion> + <con:assertion type="JsonPath Match" id="a3370515-e19f-4317-b06a-5ca50c5cb269" name="planStatus"> + <con:configuration> + <path>$[0].planStatus</path> + <content>FESTGESTELLT</content> + <allowWildcards>false</allowWildcards> + <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences> + <ignoreComments>false</ignoreComments> + </con:configuration> + </con:assertion> <con:assertion type="JsonPath Match" id="11dca079-8e56-45f3-8591-4990d0f59978" name="ags"> <con:configuration> <path>$[0].xplanModelData.ags</path> @@ -8412,86 +8618,304 @@ assert actualHeader != null</scriptText> </con:restRequest> </con:config> </con:testStep> - <con:testStep type="restrequest" name="GET BP 5.4 pI,pN invalidPlanNameExpectError400" id="60bb9823-bfc2-4bae-bdce-a8fda7507667"> + <con:testStep type="restrequest" name="GET BP 4.1 iI findByInternalId" id="d6906818-3fac-4f46-a462-f7b7500c692e"> <con:settings/> - <con:config service="XPlanManagerAPI" resourcePath="/plans" methodName="invalidPlanIdAndPlanName" xsi:type="con:RestRequestStep" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> - <con:restRequest name="GET BP 5.4 pI,pN invalidPlanNameExpectError400" id="ba7c71b2-c264-4a61-b0b0-1146f2594e7e" mediaType="application/json"> + <con:config service="XPlanManagerAPI" resourcePath="/plans" methodName="findByInternalId" xsi:type="con:RestRequestStep" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> + <con:restRequest name="GET BP 4.1 iI findByInternalId" id="653c7a59-0292-405d-8596-a225f505b1fb" mediaType="application/json"> <con:settings> <con:setting id="com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers"><xml-fragment/></con:setting> </con:settings> <con:endpoint>${#Project#baseUrlManagerApi}/xplan-manager-api/xmanager/api/v1</con:endpoint> <con:request/> <con:originalUri>http://localhost/xplan-manager-api/xmanager/api/v1/plans</con:originalUri> - <con:assertion type="Valid HTTP Status Codes" id="200d0bb7-3731-4077-857e-d470e6d261d6" name="Valid HTTP Status Codes"> + <con:assertion type="Valid HTTP Status Codes" id="7c256da6-27a4-473d-8c2d-bf06f2bba366" name="Valid HTTP Status Codes"> <con:configuration> - <codes>400</codes> + <codes>200</codes> </con:configuration> </con:assertion> - <con:credentials> - <con:username>${#Project#username}</con:username> - <con:password>${#Project#password}</con:password> - <con:domain xsi:nil="true"/> - <con:authType>No Authorization</con:authType> - </con:credentials> - <con:jmsConfig JMSDeliveryMode="PERSISTENT"/> - <con:jmsPropertyConfig/> - <con:parameters> - <con:entry key="includeGeltungsbereich" value=""/> - <con:entry key="planName" value="XPlanManagerAPI-Test"/> - <con:entry key="planId" value="${#TestSuite#currentPlanIdMultiplePlansHafenCity14}"/> - </con:parameters> - <con:parameterOrder> - <con:entry>planId</con:entry> - <con:entry>planName</con:entry> - <con:entry>includeGeltungsbereich</con:entry> - </con:parameterOrder> - </con:restRequest> - </con:config> - </con:testStep> - <con:properties/> - </con:testCase> - <con:testCase id="c6fda1ed-fa1f-4c4a-961f-f0358047598a" failOnError="false" failTestCaseOnErrors="true" keepSession="false" maxResults="0" name="/plan/{planId}/aenderungen/ TestCase" searchProperties="true" timeout="0" wsrmEnabled="false" wsrmVersion="1.0" wsrmAckTo="" amfAuthorisation="false" amfEndpoint="" amfLogin="" amfPassword=""> - <con:description>TestCase generated for REST Resource [/plan/{planId}/aenderung/] located at [/plan/{planId}/aenderung/]</con:description> - <con:settings/> - <con:testStep type="restrequest" name="GET BP 5.0 pI currentStatus" id="d3ed7782-4011-4476-afaa-a06874f55efe"> - <con:settings/> - <con:config service="XPlanManagerAPI" resourcePath="/plan/{planId}/aenderungen" methodName="getAenderung" xsi:type="con:RestRequestStep" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> - <con:restRequest name="GET BP 5.0 pI currentStatus" id="a6a96284-b3ed-448c-9668-ab61b1d29b90" mediaType="application/json"> - <con:settings> - <con:setting id="com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers"><xml-fragment/></con:setting> - </con:settings> - <con:endpoint>${#Project#baseUrlManagerApi}/xplan-manager-api/xmanager/api/v1</con:endpoint> - <con:request/> - <con:originalUri>http://localhost/xplan-manager-api/xmanager/api/v1/plan//aenderung/</con:originalUri> - <con:assertion type="Valid HTTP Status Codes" id="0e64eb81-e36a-40be-a6d8-759b75afa07a" name="Valid HTTP Status Codes"> + <con:assertion type="JsonPath Match" id="8a5449af-71b6-49e9-81c3-7ae4f704dec1" name="id"> <con:configuration> - <codes>200</codes> + <path>$.[0]id</path> + <content>${#TestSuite#currentPlanIdImport}</content> + <allowWildcards>false</allowWildcards> + <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences> + <ignoreComments>false</ignoreComments> </con:configuration> </con:assertion> - <con:assertion type="JsonPath Match" id="56315f47-3003-4d77-a911-09224aae6ff4" name="JsonPath Match"> + <con:assertion type="JsonPath Match" id="4e49f759-7fd9-4f6c-951e-09cd193baaf4" name="type"> <con:configuration> - <path>$.aendert[0].planName</path> - <content>BPlan Demo-Gemeinde</content> + <path>$.[0]type</path> + <content>BP_Plan</content> <allowWildcards>false</allowWildcards> <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences> <ignoreComments>false</ignoreComments> </con:configuration> </con:assertion> - <con:credentials> - <con:username>${#Project#username}</con:username> - <con:password>${#Project#password}</con:password> - <con:domain xsi:nil="true"/> - <con:authType>No Authorization</con:authType> - </con:credentials> - <con:jmsConfig JMSDeliveryMode="PERSISTENT"/> - <con:jmsPropertyConfig/> - <con:parameters> - <entry key="planId" value="${#TestSuite#currentPlanIdAenderung}" xmlns="http://eviware.com/soapui/config"/> - </con:parameters> - </con:restRequest> - </con:config> - </con:testStep> - <con:testStep type="restrequest" name="PUT BP 5.0 pI modifyStatusXSSExpectError400" id="e69f4d01-9afb-4cb0-b50d-838a0e6dc931"> + <con:assertion type="JsonPath Match" id="a6ecb45b-6c24-49c3-97a9-c3197dc6a3a0" name="planStatus"> + <con:configuration> + <path>$[0].planStatus</path> + <content>FESTGESTELLT</content> + <allowWildcards>false</allowWildcards> + <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences> + <ignoreComments>false</ignoreComments> + </con:configuration> + </con:assertion> + <con:assertion type="JsonPath Match" id="af928d7c-30d5-4901-8dc3-f3b4239afb30" name="internalId"> + <con:configuration> + <path>$[0].xplanModelData.internalId</path> + <content>soapui-internal-id-BP-41</content> + <allowWildcards>false</allowWildcards> + <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences> + <ignoreComments>false</ignoreComments> + </con:configuration> + </con:assertion> + <con:assertion type="JsonPath Match" id="4e49f759-7fd9-4f6c-951e-09cd193baaf4" name="ags"> + <con:configuration> + <path>$[0].xplanModelData.ags</path> + <content>02000000</content> + <allowWildcards>false</allowWildcards> + <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences> + <ignoreComments>false</ignoreComments> + </con:configuration> + </con:assertion> + <con:assertion type="JsonPath Match" id="4e49f759-7fd9-4f6c-951e-09cd193baaf4" name="gemeindeName"> + <con:configuration> + <path>$[0].xplanModelData.gemeindeName</path> + <content>Hamburg</content> + <allowWildcards>false</allowWildcards> + <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences> + <ignoreComments>false</ignoreComments> + </con:configuration> + </con:assertion> + <con:assertion type="JsonPath Match" id="4e49f759-7fd9-4f6c-951e-09cd193baaf4" name="gemeinden.gemeindeName"> + <con:configuration> + <path>$[0].xplanModelData.gemeinden[0].gemeindeName</path> + <content>Hamburg</content> + <allowWildcards>false</allowWildcards> + <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences> + <ignoreComments>false</ignoreComments> + </con:configuration> + </con:assertion> + <con:assertion type="JsonPath Match" id="4e49f759-7fd9-4f6c-951e-09cd193baaf4" name="gemeinden.ortsteilName"> + <con:configuration> + <path>$[0].xplanModelData.gemeinden[0].ortsteilName</path> + <content>Bezirk Eimsbüttel Ortsteil 320</content> + <allowWildcards>false</allowWildcards> + <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences> + <ignoreComments>false</ignoreComments> + </con:configuration> + </con:assertion> + <con:assertion type="JsonPath RegEx Match" id="661feb7b-2379-46aa-a994-f7034df08aaf" name="link self"> + <con:configuration> + <path>$[0].links[?(@.rel == 'self' && (@.type == 'application/json'))].href</path> + <content>true</content> + <allowWildcards>false</allowWildcards> + <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences> + <ignoreComments>false</ignoreComments> + <regEx>^.*/api/v1/plan/.*$</regEx> + </con:configuration> + </con:assertion> + <con:assertion type="JsonPath Count" id="1f02b841-df99-4f50-bc12-f75834e396e0" name="link self count"> + <con:configuration> + <path>$[0].links[?(@.rel == 'self')]</path> + <content>1</content> + <allowWildcards>false</allowWildcards> + <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences> + <ignoreComments>false</ignoreComments> + </con:configuration> + </con:assertion> + <con:assertion type="JsonPath RegEx Match" id="661feb7b-2379-46aa-a994-f7034df08aaf" name="link alternate xml"> + <con:configuration> + <path>$[0].links[?(@.rel == 'alternate' && @.type == 'application/xml')].href</path> + <content>true</content> + <allowWildcards>false</allowWildcards> + <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences> + <ignoreComments>false</ignoreComments> + <regEx>^.*/api/v1/plan/.*$</regEx> + </con:configuration> + </con:assertion> + <con:assertion type="JsonPath RegEx Match" id="661feb7b-2379-46aa-a994-f7034df08aaf" name="link alternate zip"> + <con:configuration> + <path>$[0].links[?(@.rel == 'alternate' && @.type == 'application/zip')].href</path> + <content>true</content> + <allowWildcards>false</allowWildcards> + <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences> + <ignoreComments>false</ignoreComments> + <regEx>^.*/api/v1/plan/.*$</regEx> + </con:configuration> + </con:assertion> + <con:assertion type="JsonPath Count" id="1f02b841-df99-4f50-bc12-f75834e396e0" name="link alternate count"> + <con:configuration> + <path>$[0].links[?(@.rel == 'alternate')]</path> + <content>2</content> + <allowWildcards>false</allowWildcards> + <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences> + <ignoreComments>false</ignoreComments> + </con:configuration> + </con:assertion> + <con:assertion type="JsonPath RegEx Match" id="4a57e07a-a8c7-4341-92cd-ce53cb3a5cc2" name="link planwerkwms"> + <con:configuration> + <path>$[0].links[?(@.rel == 'planwerkwms')].href</path> + <content>true</content> + <allowWildcards>false</allowWildcards> + <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences> + <ignoreComments>false</ignoreComments> + <regEx>^.*/services/planwerkwms/planname/.*$</regEx> + </con:configuration> + </con:assertion> + <con:credentials> + <con:username>${#Project#username}</con:username> + <con:password>${#Project#password}</con:password> + <con:domain xsi:nil="true"/> + <con:authType>No Authorization</con:authType> + </con:credentials> + <con:jmsConfig JMSDeliveryMode="PERSISTENT"/> + <con:jmsPropertyConfig/> + <con:parameters> + <con:entry key="includeGeltungsbereich" value=""/> + <con:entry key="internalId" value="soapui-internal-id-BP-41"/> + </con:parameters> + <con:parameterOrder> + <con:entry>internalId</con:entry> + <con:entry>includeGeltungsbereich</con:entry> + </con:parameterOrder> + </con:restRequest> + </con:config> + </con:testStep> + <con:testStep type="restrequest" name="GET XX X.X pS findByPlanStatus" id="5b7db0a1-0e64-40c9-b2e7-f5a885c94bfa"> + <con:settings/> + <con:config service="XPlanManagerAPI" resourcePath="/plans" methodName="findByPlanStatus" xsi:type="con:RestRequestStep" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> + <con:restRequest name="GET XX X.X pS findByPlanStatus" id="d916a64f-7bd0-408d-9ebf-5fabc9a2dab1" mediaType="application/json"> + <con:settings> + <con:setting id="com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers"><xml-fragment/></con:setting> + </con:settings> + <con:endpoint>${#Project#baseUrlManagerApi}/xplan-manager-api/xmanager/api/v1</con:endpoint> + <con:request/> + <con:originalUri>http://localhost/xplan-manager-api/xmanager/api/v1/plans</con:originalUri> + <con:assertion type="Valid HTTP Status Codes" id="19bc0b9a-e121-4a54-a603-e7ea4fcefc73" name="Valid HTTP Status Codes"> + <con:configuration> + <codes>200</codes> + </con:configuration> + </con:assertion> + <con:assertion type="JsonPath Match" id="11dca079-8e56-45f3-8591-4990d0f59978" name="planStatus"> + <con:configuration> + <path>$[0].planStatus</path> + <content>FESTGESTELLT</content> + <allowWildcards>false</allowWildcards> + <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences> + <ignoreComments>false</ignoreComments> + </con:configuration> + </con:assertion> + <con:assertion type="JsonPath Match" id="2ed49aac-f4fd-4df3-9408-92fde0b64f39" name="planStatusNotInAufstellungAndArchiviert"> + <con:configuration> + <path>$[?(@.planStatus == 'IN_AUFSTELLUNG' || @.planStatus == 'ARCHIVIERT')].planStatus</path> + <content>[]</content> + <allowWildcards>false</allowWildcards> + <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences> + <ignoreComments>false</ignoreComments> + </con:configuration> + </con:assertion> + <con:credentials> + <con:username>${#Project#username}</con:username> + <con:password>${#Project#password}</con:password> + <con:domain xsi:nil="true"/> + <con:authType>No Authorization</con:authType> + </con:credentials> + <con:jmsConfig JMSDeliveryMode="PERSISTENT"/> + <con:jmsPropertyConfig/> + <con:parameters> + <con:entry key="includeGeltungsbereich" value=""/> + <con:entry key="internalId" value="soapui-test-id"/> + <con:entry key="planStatus" value="FESTGESTELLT"/> + <con:entry key="planId" value="${#TestSuite#currentPlanIdMultiplePlansHafenCity14}"/> + </con:parameters> + <con:parameterOrder> + <con:entry>includeGeltungsbereich</con:entry> + <con:entry>planStatus</con:entry> + </con:parameterOrder> + </con:restRequest> + </con:config> + </con:testStep> + <con:testStep type="restrequest" name="GET BP 5.4 pI,pN invalidPlanNameExpectError400" id="60bb9823-bfc2-4bae-bdce-a8fda7507667"> + <con:settings/> + <con:config service="XPlanManagerAPI" resourcePath="/plans" methodName="invalidPlanIdAndPlanName" xsi:type="con:RestRequestStep" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> + <con:restRequest name="GET BP 5.4 pI,pN invalidPlanNameExpectError400" id="ba7c71b2-c264-4a61-b0b0-1146f2594e7e" mediaType="application/json"> + <con:settings> + <con:setting id="com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers"><xml-fragment/></con:setting> + </con:settings> + <con:endpoint>${#Project#baseUrlManagerApi}/xplan-manager-api/xmanager/api/v1</con:endpoint> + <con:request/> + <con:originalUri>http://localhost/xplan-manager-api/xmanager/api/v1/plans</con:originalUri> + <con:assertion type="Valid HTTP Status Codes" id="200d0bb7-3731-4077-857e-d470e6d261d6" name="Valid HTTP Status Codes"> + <con:configuration> + <codes>400</codes> + </con:configuration> + </con:assertion> + <con:credentials> + <con:username>${#Project#username}</con:username> + <con:password>${#Project#password}</con:password> + <con:domain xsi:nil="true"/> + <con:authType>No Authorization</con:authType> + </con:credentials> + <con:jmsConfig JMSDeliveryMode="PERSISTENT"/> + <con:jmsPropertyConfig/> + <con:parameters> + <con:entry key="includeGeltungsbereich" value=""/> + <con:entry key="planName" value="XPlanManagerAPI-Test"/> + <con:entry key="planId" value="${#TestSuite#currentPlanIdMultiplePlansHafenCity14}"/> + </con:parameters> + <con:parameterOrder> + <con:entry>planId</con:entry> + <con:entry>planName</con:entry> + <con:entry>includeGeltungsbereich</con:entry> + </con:parameterOrder> + </con:restRequest> + </con:config> + </con:testStep> + <con:properties/> + </con:testCase> + <con:testCase id="c6fda1ed-fa1f-4c4a-961f-f0358047598a" failOnError="false" failTestCaseOnErrors="true" keepSession="false" maxResults="0" name="/plan/{planId}/aenderungen/ TestCase" searchProperties="true" timeout="0" wsrmEnabled="false" wsrmVersion="1.0" wsrmAckTo="" amfAuthorisation="false" amfEndpoint="" amfLogin="" amfPassword=""> + <con:description>TestCase generated for REST Resource [/plan/{planId}/aenderung/] located at [/plan/{planId}/aenderung/]</con:description> + <con:settings/> + <con:testStep type="restrequest" name="GET BP 5.0 pI currentStatus" id="d3ed7782-4011-4476-afaa-a06874f55efe"> + <con:settings/> + <con:config service="XPlanManagerAPI" resourcePath="/plan/{planId}/aenderungen" methodName="getAenderung" xsi:type="con:RestRequestStep" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> + <con:restRequest name="GET BP 5.0 pI currentStatus" id="a6a96284-b3ed-448c-9668-ab61b1d29b90" mediaType="application/json"> + <con:settings> + <con:setting id="com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers"><xml-fragment/></con:setting> + </con:settings> + <con:endpoint>${#Project#baseUrlManagerApi}/xplan-manager-api/xmanager/api/v1</con:endpoint> + <con:request/> + <con:originalUri>http://localhost/xplan-manager-api/xmanager/api/v1/plan//aenderung/</con:originalUri> + <con:assertion type="Valid HTTP Status Codes" id="0e64eb81-e36a-40be-a6d8-759b75afa07a" name="Valid HTTP Status Codes"> + <con:configuration> + <codes>200</codes> + </con:configuration> + </con:assertion> + <con:assertion type="JsonPath Match" id="56315f47-3003-4d77-a911-09224aae6ff4" name="JsonPath Match"> + <con:configuration> + <path>$.aendert[0].planName</path> + <content>BPlan Demo-Gemeinde</content> + <allowWildcards>false</allowWildcards> + <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences> + <ignoreComments>false</ignoreComments> + </con:configuration> + </con:assertion> + <con:credentials> + <con:username>${#Project#username}</con:username> + <con:password>${#Project#password}</con:password> + <con:domain xsi:nil="true"/> + <con:authType>No Authorization</con:authType> + </con:credentials> + <con:jmsConfig JMSDeliveryMode="PERSISTENT"/> + <con:jmsPropertyConfig/> + <con:parameters> + <entry key="planId" value="${#TestSuite#currentPlanIdAenderung}" xmlns="http://eviware.com/soapui/config"/> + </con:parameters> + </con:restRequest> + </con:config> + </con:testStep> + <con:testStep type="restrequest" name="PUT BP 5.0 pI modifyStatusXSSExpectError400" id="e69f4d01-9afb-4cb0-b50d-838a0e6dc931"> <con:settings/> <con:config service="XPlanManagerAPI" resourcePath="/plan/{planId}/aenderungen" methodName="replaceAenderung" xsi:type="con:RestRequestStep" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <con:restRequest name="PUT BP 5.0 pI modifyStatusXSSExpectError400" id="753e70a8-62cd-41c0-a640-3158cc4a249e" mediaType="application/json" postQueryString="false"> @@ -22870,19 +23294,37 @@ assert expectedHeader == actualHeader</scriptText> <ignoreComments>false</ignoreComments> </con:configuration> </con:assertion> - <con:assertion type="JsonPath Match" id="338faceb-131f-43eb-bf38-2bf035ec149f" name="path /report/{uuid}"> + <con:assertion type="JsonPath Match" id="255bad80-de80-4f80-a730-02eb6ca8cd9a" name="path /plans internalId parameter"> <con:configuration> - <path>$.paths./report/{uuid}.get.operationId</path> - <content>reportByUuid</content> + <path>$.paths./plans.get.parameters[?(@.name == 'internalId')].name</path> + <content>[internalId]</content> <allowWildcards>false</allowWildcards> <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences> <ignoreComments>false</ignoreComments> </con:configuration> </con:assertion> - <con:assertion type="JsonPath Match" id="2397109c-69bb-40f6-9b5a-2f5db5d69ade" name="path /report/{uuid}/geomfindings"> + <con:assertion type="JsonPath Match" id="255bad80-de80-4f80-a730-02eb6ca8cd9a" name="path /plans planStatus parameter"> <con:configuration> - <path>$.paths./report/{uuid}/geomfindings.get.operationId</path> - <content>geomfindingsByUuid</content> + <path>$.paths./plans.get.parameters[?(@.name == 'planStatus')].name</path> + <content>[planStatus]</content> + <allowWildcards>false</allowWildcards> + <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences> + <ignoreComments>false</ignoreComments> + </con:configuration> + </con:assertion> + <con:assertion type="JsonPath Match" id="338faceb-131f-43eb-bf38-2bf035ec149f" name="path /report/{uuid}"> + <con:configuration> + <path>$.paths./report/{uuid}.get.operationId</path> + <content>reportByUuid</content> + <allowWildcards>false</allowWildcards> + <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences> + <ignoreComments>false</ignoreComments> + </con:configuration> + </con:assertion> + <con:assertion type="JsonPath Match" id="2397109c-69bb-40f6-9b5a-2f5db5d69ade" name="path /report/{uuid}/geomfindings"> + <con:configuration> + <path>$.paths./report/{uuid}/geomfindings.get.operationId</path> + <content>geomfindingsByUuid</content> <allowWildcards>false</allowWildcards> <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences> <ignoreComments>false</ignoreComments> @@ -24383,6 +24825,15 @@ if( ++context.loopIndex < 40 && json.status != "VALIDATION_FAILED" ){ <ignoreComments>false</ignoreComments> </con:configuration> </con:assertion> + <con:assertion type="JsonPath Match" id="26c4f63b-5966-47de-9a7f-c217d50feaa9" name="internalId"> + <con:configuration> + <path>$[0].xplanModelData.internalId</path> + <content>soapui-test-id</content> + <allowWildcards>false</allowWildcards> + <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences> + <ignoreComments>false</ignoreComments> + </con:configuration> + </con:assertion> <con:assertion type="JsonPath Match" id="6045130d-e4df-49a7-883b-3688df7dc91b" name="gemeinden.ags"> <con:configuration> <path>$[0].xplanModelData.gemeinden[0].ags</path> @@ -24472,9 +24923,55 @@ if( ++context.loopIndex < 40 && json.status != "VALIDATION_FAILED" ){ </con:parameters> </con:config> </con:testStep> - <con:testStep type="httprequest" name="GET BP 6.0.2 pI getByPlanId" id="075daffd-664c-441f-b138-6fe75430bc69"> + <con:testStep type="httprequest" name="GET BP 6.0.2 pN getByPlanNameNoResult" id="1f2ea819-c0b0-4e3b-a3b8-5dd8f808c771"> <con:settings/> - <con:config method="GET" xsi:type="con:HttpRequest" id="241a13cd-fc19-4992-83ba-d7e6b56b3743" name="GET BP 6.0.2 pI getByPlanId" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> + <con:config method="GET" xsi:type="con:HttpRequest" id="241a13cd-fc19-4992-83ba-d7e6b56b3743" name="GET BP 6.0.2 pN getByPlanNameNoResult" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> + <con:settings> + <con:setting id="com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers"><entry key="Accept" value="application/json" xmlns="http://eviware.com/soapui/config"/></con:setting> + </con:settings> + <con:endpoint>${#Project#baseUrlManagerApi}/xplan-manager-api/api/v2/plans</con:endpoint> + <con:request/> + <con:assertion type="Valid HTTP Status Codes" id="e21d229a-4da0-46d6-95ba-9d521f98ad6d" name="Valid HTTP Status Codes"> + <con:configuration> + <codes>200</codes> + </con:configuration> + </con:assertion> + <con:assertion type="JsonPath Match" id="bc4fee9b-67a9-4af7-b18b-1dfade4b8a74" name="emptyArray"> + <con:configuration> + <path>$</path> + <content>[]</content> + <allowWildcards>false</allowWildcards> + <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences> + <ignoreComments>false</ignoreComments> + </con:configuration> + </con:assertion> + <con:credentials> + <con:username>${#Project#username}</con:username> + <con:password>${#Project#password}</con:password> + <con:selectedAuthProfile>Basic</con:selectedAuthProfile> + <con:addedBasicAuthenticationTypes>Basic</con:addedBasicAuthenticationTypes> + <con:preemptive>true</con:preemptive> + <con:authType>Preemptive</con:authType> + </con:credentials> + <con:jmsConfig JMSDeliveryMode="PERSISTENT"/> + <con:jmsPropertyConfig/> + <con:parameters> + <con:parameter> + <con:name>planName</con:name> + <con:value>no-result</con:value> + <con:style>QUERY</con:style> + </con:parameter> + <con:parameter> + <con:name>includeGeltungsbereich</con:name> + <con:value>true</con:value> + <con:style>QUERY</con:style> + </con:parameter> + </con:parameters> + </con:config> + </con:testStep> + <con:testStep type="httprequest" name="GET BP 6.0.2 iI getByInternalId" id="12c9788b-58e7-4cc7-a30a-63cbda2686a4"> + <con:settings/> + <con:config method="GET" xsi:type="con:HttpRequest" id="241a13cd-fc19-4992-83ba-d7e6b56b3743" name="GET BP 6.0.2 iI getByInternalId" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <con:settings> <con:setting id="com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers"><entry key="Accept" value="application/json" xmlns="http://eviware.com/soapui/config"/></con:setting> </con:settings> @@ -24512,6 +25009,15 @@ if( ++context.loopIndex < 40 && json.status != "VALIDATION_FAILED" ){ <ignoreComments>false</ignoreComments> </con:configuration> </con:assertion> + <con:assertion type="JsonPath Match" id="6045130d-e4df-49a7-883b-3688df7dc91b" name="internalId"> + <con:configuration> + <path>$[0].xplanModelData.internalId</path> + <content>soapui-test-id</content> + <allowWildcards>false</allowWildcards> + <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences> + <ignoreComments>false</ignoreComments> + </con:configuration> + </con:assertion> <con:assertion type="JsonPath Match" id="6045130d-e4df-49a7-883b-3688df7dc91b" name="gemeinden.ags"> <con:configuration> <path>$[0].xplanModelData.gemeinden[0].ags</path> @@ -24549,7 +25055,7 @@ if( ++context.loopIndex < 40 && json.status != "VALIDATION_FAILED" ){ <ignoreComments>false</ignoreComments> </con:configuration> </con:assertion> - <con:assertion type="JsonPath RegEx Match" id="c4de6278-26a0-4499-b07a-a01eb57cafd2" name="link planwerkwms"> + <con:assertion type="JsonPath RegEx Match" id="39a75872-c3c6-4fe9-ac53-858e3008c208" name="link planwerkwms"> <con:configuration> <path>$[0].links[?(@.rel == 'planwerkwms')].href</path> <content>true</content> @@ -24559,10 +25065,19 @@ if( ++context.loopIndex < 40 && json.status != "VALIDATION_FAILED" ){ <regEx>^.*/services/planwerkwms/planname/.*$</regEx> </con:configuration> </con:assertion> - <con:assertion type="XPath Match" id="c49ca5e9-39d5-475d-b721-c32dc9fe86e5" name="geltungsbereichWGS84"> + <con:assertion type="JsonPath Match" id="57fc059a-8898-4adf-9161-588cdaa49fbf" name="geltungsbereichWGS84.type"> <con:configuration> - <path>exists(//*:geltungsbereichWGS84)</path> - <content>false</content> + <path>$[0].geltungsbereichWGS84.type</path> + <content>Polygon</content> + <allowWildcards>false</allowWildcards> + <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences> + <ignoreComments>false</ignoreComments> + </con:configuration> + </con:assertion> + <con:assertion type="JsonPath Existence Match" id="4e500b26-89ef-4749-b0fd-707dc9ec031a" name="geltungsbereichWGS84.coordinates exists"> + <con:configuration> + <path>$[0].geltungsbereichWGS84.coordinates</path> + <content>true</content> <allowWildcards>false</allowWildcards> <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences> <ignoreComments>false</ignoreComments> @@ -24580,8 +25095,504 @@ if( ++context.loopIndex < 40 && json.status != "VALIDATION_FAILED" ){ <con:jmsPropertyConfig/> <con:parameters> <con:parameter> - <con:name>planId</con:name> - <con:value>${#TestSuite#planId}</con:value> + <con:name>internalId</con:name> + <con:value>soapui-test-id</con:value> + <con:style>QUERY</con:style> + </con:parameter> + <con:parameter> + <con:name>includeGeltungsbereich</con:name> + <con:value>true</con:value> + <con:style>QUERY</con:style> + </con:parameter> + </con:parameters> + </con:config> + </con:testStep> + <con:testStep type="httprequest" name="GET BP 6.0.2 iI getByInternalIdNoResult" id="dfa4da6b-1d1e-4dd6-896c-084266fc51ee"> + <con:settings/> + <con:config method="GET" xsi:type="con:HttpRequest" id="241a13cd-fc19-4992-83ba-d7e6b56b3743" name="GET BP 6.0.2 iI getByInternalIdNoResult" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> + <con:settings> + <con:setting id="com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers"><entry key="Accept" value="application/json" xmlns="http://eviware.com/soapui/config"/></con:setting> + </con:settings> + <con:endpoint>${#Project#baseUrlManagerApi}/xplan-manager-api/api/v2/plans</con:endpoint> + <con:request/> + <con:assertion type="Valid HTTP Status Codes" id="e21d229a-4da0-46d6-95ba-9d521f98ad6d" name="Valid HTTP Status Codes"> + <con:configuration> + <codes>200</codes> + </con:configuration> + </con:assertion> + <con:assertion type="JsonPath Match" id="1ab16b67-2dbd-400a-b4cc-ba27a9518d41" name="emptyArray"> + <con:configuration> + <path>$</path> + <content>[]</content> + <allowWildcards>false</allowWildcards> + <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences> + <ignoreComments>false</ignoreComments> + </con:configuration> + </con:assertion> + <con:credentials> + <con:username>${#Project#username}</con:username> + <con:password>${#Project#password}</con:password> + <con:selectedAuthProfile>Basic</con:selectedAuthProfile> + <con:addedBasicAuthenticationTypes>Basic</con:addedBasicAuthenticationTypes> + <con:preemptive>true</con:preemptive> + <con:authType>Preemptive</con:authType> + </con:credentials> + <con:jmsConfig JMSDeliveryMode="PERSISTENT"/> + <con:jmsPropertyConfig/> + <con:parameters> + <con:parameter> + <con:name>internalId</con:name> + <con:value>no-result</con:value> + <con:style>QUERY</con:style> + </con:parameter> + <con:parameter> + <con:name>includeGeltungsbereich</con:name> + <con:value>true</con:value> + <con:style>QUERY</con:style> + </con:parameter> + </con:parameters> + </con:config> + </con:testStep> + <con:testStep type="httprequest" name="GET BP 6.0.2 pS getByPlanStatus" id="83408d13-be80-4fea-942b-0d7f538d2c43"> + <con:settings/> + <con:config method="GET" xsi:type="con:HttpRequest" id="241a13cd-fc19-4992-83ba-d7e6b56b3743" name="GET BP 6.0.2 pS getByPlanStatus" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> + <con:settings> + <con:setting id="com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers"><entry key="Accept" value="application/json" xmlns="http://eviware.com/soapui/config"/></con:setting> + </con:settings> + <con:endpoint>${#Project#baseUrlManagerApi}/xplan-manager-api/api/v2/plans</con:endpoint> + <con:request/> + <con:assertion type="Valid HTTP Status Codes" id="e21d229a-4da0-46d6-95ba-9d521f98ad6d" name="Valid HTTP Status Codes"> + <con:configuration> + <codes>200</codes> + </con:configuration> + </con:assertion> + <con:assertion type="JsonPath Match" id="6045130d-e4df-49a7-883b-3688df7dc91b" name="type"> + <con:configuration> + <path>$[0].type</path> + <content>BP_Plan</content> + <allowWildcards>false</allowWildcards> + <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences> + <ignoreComments>false</ignoreComments> + </con:configuration> + </con:assertion> + <con:assertion type="JsonPath Match" id="6045130d-e4df-49a7-883b-3688df7dc91b" name="version"> + <con:configuration> + <path>$[0].version</path> + <content>XPLAN_60</content> + <allowWildcards>false</allowWildcards> + <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences> + <ignoreComments>false</ignoreComments> + </con:configuration> + </con:assertion> + <con:assertion type="JsonPath Match" id="6045130d-e4df-49a7-883b-3688df7dc91b" name="planStatus"> + <con:configuration> + <path>$[0].planStatus</path> + <content>FESTGESTELLT</content> + <allowWildcards>false</allowWildcards> + <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences> + <ignoreComments>false</ignoreComments> + </con:configuration> + </con:assertion> + <con:assertion type="JsonPath Match" id="6045130d-e4df-49a7-883b-3688df7dc91b" name="internalId"> + <con:configuration> + <path>$[0].xplanModelData.internalId</path> + <content>soapui-test-id</content> + <allowWildcards>false</allowWildcards> + <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences> + <ignoreComments>false</ignoreComments> + </con:configuration> + </con:assertion> + <con:assertion type="JsonPath Match" id="6045130d-e4df-49a7-883b-3688df7dc91b" name="gemeinden.ags"> + <con:configuration> + <path>$[0].xplanModelData.gemeinden[0].ags</path> + <content>02000000</content> + <allowWildcards>false</allowWildcards> + <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences> + <ignoreComments>false</ignoreComments> + </con:configuration> + </con:assertion> + <con:assertion type="JsonPath Match" id="6045130d-e4df-49a7-883b-3688df7dc91b" name="gemeinden.gemeindeName"> + <con:configuration> + <path>$[0].xplanModelData.gemeinden[0].gemeindeName</path> + <content>Freie und Hansestadt Hamburg</content> + <allowWildcards>false</allowWildcards> + <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences> + <ignoreComments>false</ignoreComments> + </con:configuration> + </con:assertion> + <con:assertion type="JsonPath RegEx Match" id="661feb7b-2379-46aa-a994-f7034df08aaf" name="link self"> + <con:configuration> + <path>$[0].links[?(@.rel == 'self' && (@.type == 'application/json'))].href</path> + <content>true</content> + <allowWildcards>false</allowWildcards> + <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences> + <ignoreComments>false</ignoreComments> + <regEx>^.*/api/v2/plan/.*$</regEx> + </con:configuration> + </con:assertion> + <con:assertion type="JsonPath Count" id="1f02b841-df99-4f50-bc12-f75834e396e0" name="link self count"> + <con:configuration> + <path>$[0].links[?(@.rel == 'self')]</path> + <content>1</content> + <allowWildcards>false</allowWildcards> + <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences> + <ignoreComments>false</ignoreComments> + </con:configuration> + </con:assertion> + <con:assertion type="JsonPath RegEx Match" id="39a75872-c3c6-4fe9-ac53-858e3008c208" name="link planwerkwms"> + <con:configuration> + <path>$[0].links[?(@.rel == 'planwerkwms')].href</path> + <content>true</content> + <allowWildcards>false</allowWildcards> + <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences> + <ignoreComments>false</ignoreComments> + <regEx>^.*/services/planwerkwms/planname/.*$</regEx> + </con:configuration> + </con:assertion> + <con:assertion type="JsonPath Match" id="57fc059a-8898-4adf-9161-588cdaa49fbf" name="geltungsbereichWGS84.type"> + <con:configuration> + <path>$[0].geltungsbereichWGS84.type</path> + <content>Polygon</content> + <allowWildcards>false</allowWildcards> + <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences> + <ignoreComments>false</ignoreComments> + </con:configuration> + </con:assertion> + <con:assertion type="JsonPath Existence Match" id="4e500b26-89ef-4749-b0fd-707dc9ec031a" name="geltungsbereichWGS84.coordinates exists"> + <con:configuration> + <path>$[0].geltungsbereichWGS84.coordinates</path> + <content>true</content> + <allowWildcards>false</allowWildcards> + <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences> + <ignoreComments>false</ignoreComments> + </con:configuration> + </con:assertion> + <con:credentials> + <con:username>${#Project#username}</con:username> + <con:password>${#Project#password}</con:password> + <con:selectedAuthProfile>Basic</con:selectedAuthProfile> + <con:addedBasicAuthenticationTypes>Basic</con:addedBasicAuthenticationTypes> + <con:preemptive>true</con:preemptive> + <con:authType>Preemptive</con:authType> + </con:credentials> + <con:jmsConfig JMSDeliveryMode="PERSISTENT"/> + <con:jmsPropertyConfig/> + <con:parameters> + <con:parameter required="false" disableUrlEncoding="false"> + <con:name>includeGeltungsbereich</con:name> + <con:value>true</con:value> + <con:style>QUERY</con:style> + <con:type xmlns:xs="http://www.w3.org/2001/XMLSchema">xs:string</con:type> + <con:default/> + <con:description xsi:nil="true"/> + </con:parameter> + <con:parameter> + <con:name>planStatus</con:name> + <con:value>FESTGESTELLT</con:value> + <con:style>QUERY</con:style> + </con:parameter> + <con:parameter> + <con:name>planStatus</con:name> + <con:value>ARCHIVIERT</con:value> + <con:style>QUERY</con:style> + </con:parameter> + <con:parameter> + <con:name>planStatus</con:name> + <con:value>IN_AUFSTELLUNG</con:value> + <con:style>QUERY</con:style> + </con:parameter> + </con:parameters> + </con:config> + </con:testStep> + <con:testStep type="httprequest" name="GET BP 6.0.2 pS getByPlanStatusNoResult" id="04f8be4c-639f-460b-bea4-db0589fd906f"> + <con:settings/> + <con:config method="GET" xsi:type="con:HttpRequest" id="241a13cd-fc19-4992-83ba-d7e6b56b3743" name="GET BP 6.0.2 pS getByPlanStatusNoResult" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> + <con:settings> + <con:setting id="com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers"><entry key="Accept" value="application/json" xmlns="http://eviware.com/soapui/config"/></con:setting> + </con:settings> + <con:endpoint>${#Project#baseUrlManagerApi}/xplan-manager-api/api/v2/plans</con:endpoint> + <con:request/> + <con:assertion type="Valid HTTP Status Codes" id="e21d229a-4da0-46d6-95ba-9d521f98ad6d" name="Valid HTTP Status Codes"> + <con:configuration> + <codes>200</codes> + </con:configuration> + </con:assertion> + <con:assertion type="JsonPath Match" id="cef1f4c8-cdcd-4f3b-be2c-3034bf5468c5" name="planStatusNotFestgestelltAndArchiviert"> + <con:configuration> + <path>$[?(@.planStatus == 'FESTGESTELLT' || @.planStatus == 'ARCHIVIERT')].planStatus</path> + <content>[]</content> + <allowWildcards>false</allowWildcards> + <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences> + <ignoreComments>false</ignoreComments> + </con:configuration> + </con:assertion> + <con:credentials> + <con:username>${#Project#username}</con:username> + <con:password>${#Project#password}</con:password> + <con:selectedAuthProfile>Basic</con:selectedAuthProfile> + <con:addedBasicAuthenticationTypes>Basic</con:addedBasicAuthenticationTypes> + <con:preemptive>true</con:preemptive> + <con:authType>Preemptive</con:authType> + </con:credentials> + <con:jmsConfig JMSDeliveryMode="PERSISTENT"/> + <con:jmsPropertyConfig/> + <con:parameters> + <con:parameter> + <con:name>planStatus</con:name> + <con:value>IN_AUFSTELLUNG</con:value> + <con:style>QUERY</con:style> + </con:parameter> + <con:parameter> + <con:name>includeGeltungsbereich</con:name> + <con:value>true</con:value> + <con:style>QUERY</con:style> + </con:parameter> + </con:parameters> + </con:config> + </con:testStep> + <con:testStep type="httprequest" name="GET BP 6.0.2 pI getByPlanId" id="075daffd-664c-441f-b138-6fe75430bc69"> + <con:settings/> + <con:config method="GET" xsi:type="con:HttpRequest" id="241a13cd-fc19-4992-83ba-d7e6b56b3743" name="GET BP 6.0.2 pI getByPlanId" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> + <con:settings> + <con:setting id="com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers"><entry key="Accept" value="application/json" xmlns="http://eviware.com/soapui/config"/></con:setting> + </con:settings> + <con:endpoint>${#Project#baseUrlManagerApi}/xplan-manager-api/api/v2/plans</con:endpoint> + <con:request/> + <con:assertion type="Valid HTTP Status Codes" id="e21d229a-4da0-46d6-95ba-9d521f98ad6d" name="Valid HTTP Status Codes"> + <con:configuration> + <codes>200</codes> + </con:configuration> + </con:assertion> + <con:assertion type="JsonPath Match" id="6045130d-e4df-49a7-883b-3688df7dc91b" name="type"> + <con:configuration> + <path>$[0].type</path> + <content>BP_Plan</content> + <allowWildcards>false</allowWildcards> + <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences> + <ignoreComments>false</ignoreComments> + </con:configuration> + </con:assertion> + <con:assertion type="JsonPath Match" id="6045130d-e4df-49a7-883b-3688df7dc91b" name="version"> + <con:configuration> + <path>$[0].version</path> + <content>XPLAN_60</content> + <allowWildcards>false</allowWildcards> + <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences> + <ignoreComments>false</ignoreComments> + </con:configuration> + </con:assertion> + <con:assertion type="JsonPath Match" id="6045130d-e4df-49a7-883b-3688df7dc91b" name="planStatus"> + <con:configuration> + <path>$[0].planStatus</path> + <content>FESTGESTELLT</content> + <allowWildcards>false</allowWildcards> + <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences> + <ignoreComments>false</ignoreComments> + </con:configuration> + </con:assertion> + <con:assertion type="JsonPath Match" id="a7b8842d-363f-48ee-b3d3-495b76150b86" name="internalId"> + <con:configuration> + <path>$[0].xplanModelData.internalId</path> + <content>soapui-test-id</content> + <allowWildcards>false</allowWildcards> + <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences> + <ignoreComments>false</ignoreComments> + </con:configuration> + </con:assertion> + <con:assertion type="JsonPath Match" id="6045130d-e4df-49a7-883b-3688df7dc91b" name="gemeinden.ags"> + <con:configuration> + <path>$[0].xplanModelData.gemeinden[0].ags</path> + <content>02000000</content> + <allowWildcards>false</allowWildcards> + <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences> + <ignoreComments>false</ignoreComments> + </con:configuration> + </con:assertion> + <con:assertion type="JsonPath Match" id="6045130d-e4df-49a7-883b-3688df7dc91b" name="gemeinden.gemeindeName"> + <con:configuration> + <path>$[0].xplanModelData.gemeinden[0].gemeindeName</path> + <content>Freie und Hansestadt Hamburg</content> + <allowWildcards>false</allowWildcards> + <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences> + <ignoreComments>false</ignoreComments> + </con:configuration> + </con:assertion> + <con:assertion type="JsonPath RegEx Match" id="661feb7b-2379-46aa-a994-f7034df08aaf" name="link self"> + <con:configuration> + <path>$[0].links[?(@.rel == 'self' && (@.type == 'application/json'))].href</path> + <content>true</content> + <allowWildcards>false</allowWildcards> + <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences> + <ignoreComments>false</ignoreComments> + <regEx>^.*/api/v2/plan/.*$</regEx> + </con:configuration> + </con:assertion> + <con:assertion type="JsonPath Count" id="1f02b841-df99-4f50-bc12-f75834e396e0" name="link self count"> + <con:configuration> + <path>$[0].links[?(@.rel == 'self')]</path> + <content>1</content> + <allowWildcards>false</allowWildcards> + <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences> + <ignoreComments>false</ignoreComments> + </con:configuration> + </con:assertion> + <con:assertion type="JsonPath RegEx Match" id="c4de6278-26a0-4499-b07a-a01eb57cafd2" name="link planwerkwms"> + <con:configuration> + <path>$[0].links[?(@.rel == 'planwerkwms')].href</path> + <content>true</content> + <allowWildcards>false</allowWildcards> + <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences> + <ignoreComments>false</ignoreComments> + <regEx>^.*/services/planwerkwms/planname/.*$</regEx> + </con:configuration> + </con:assertion> + <con:assertion type="XPath Match" id="c49ca5e9-39d5-475d-b721-c32dc9fe86e5" name="geltungsbereichWGS84"> + <con:configuration> + <path>exists(//*:geltungsbereichWGS84)</path> + <content>false</content> + <allowWildcards>false</allowWildcards> + <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences> + <ignoreComments>false</ignoreComments> + </con:configuration> + </con:assertion> + <con:credentials> + <con:username>${#Project#username}</con:username> + <con:password>${#Project#password}</con:password> + <con:selectedAuthProfile>Basic</con:selectedAuthProfile> + <con:addedBasicAuthenticationTypes>Basic</con:addedBasicAuthenticationTypes> + <con:preemptive>true</con:preemptive> + <con:authType>Preemptive</con:authType> + </con:credentials> + <con:jmsConfig JMSDeliveryMode="PERSISTENT"/> + <con:jmsPropertyConfig/> + <con:parameters> + <con:parameter> + <con:name>planId</con:name> + <con:value>${#TestSuite#planId}</con:value> + <con:style>QUERY</con:style> + </con:parameter> + </con:parameters> + </con:config> + </con:testStep> + <con:testStep type="httprequest" name="GET BP 6.0.2 pI getByPlanIdNoResult" id="3977ff62-7e54-4c63-8e38-105af0dc632c" disabled="true"> + <con:settings/> + <con:config method="GET" xsi:type="con:HttpRequest" id="241a13cd-fc19-4992-83ba-d7e6b56b3743" name="GET BP 6.0.2 pI getByPlanIdNoResult" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> + <con:settings> + <con:setting id="com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers"><entry key="Accept" value="application/json" xmlns="http://eviware.com/soapui/config"/></con:setting> + </con:settings> + <con:endpoint>${#Project#baseUrlManagerApi}/xplan-manager-api/api/v2/plans</con:endpoint> + <con:request/> + <con:assertion type="Valid HTTP Status Codes" id="e21d229a-4da0-46d6-95ba-9d521f98ad6d" name="Valid HTTP Status Codes"> + <con:configuration> + <codes>200</codes> + </con:configuration> + </con:assertion> + <con:assertion type="JsonPath Match" id="6045130d-e4df-49a7-883b-3688df7dc91b" name="type"> + <con:configuration> + <path>$[0].type</path> + <content>BP_Plan</content> + <allowWildcards>false</allowWildcards> + <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences> + <ignoreComments>false</ignoreComments> + </con:configuration> + </con:assertion> + <con:assertion type="JsonPath Match" id="6045130d-e4df-49a7-883b-3688df7dc91b" name="version"> + <con:configuration> + <path>$[0].version</path> + <content>XPLAN_60</content> + <allowWildcards>false</allowWildcards> + <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences> + <ignoreComments>false</ignoreComments> + </con:configuration> + </con:assertion> + <con:assertion type="JsonPath Match" id="6045130d-e4df-49a7-883b-3688df7dc91b" name="planStatus"> + <con:configuration> + <path>$[0].planStatus</path> + <content>FESTGESTELLT</content> + <allowWildcards>false</allowWildcards> + <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences> + <ignoreComments>false</ignoreComments> + </con:configuration> + </con:assertion> + <con:assertion type="JsonPath Match" id="a7b8842d-363f-48ee-b3d3-495b76150b86" name="internalId"> + <con:configuration> + <path>$[0].xplanModelData.internalId</path> + <content>soapui-test-id</content> + <allowWildcards>false</allowWildcards> + <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences> + <ignoreComments>false</ignoreComments> + </con:configuration> + </con:assertion> + <con:assertion type="JsonPath Match" id="6045130d-e4df-49a7-883b-3688df7dc91b" name="gemeinden.ags"> + <con:configuration> + <path>$[0].xplanModelData.gemeinden[0].ags</path> + <content>02000000</content> + <allowWildcards>false</allowWildcards> + <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences> + <ignoreComments>false</ignoreComments> + </con:configuration> + </con:assertion> + <con:assertion type="JsonPath Match" id="6045130d-e4df-49a7-883b-3688df7dc91b" name="gemeinden.gemeindeName"> + <con:configuration> + <path>$[0].xplanModelData.gemeinden[0].gemeindeName</path> + <content>Freie und Hansestadt Hamburg</content> + <allowWildcards>false</allowWildcards> + <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences> + <ignoreComments>false</ignoreComments> + </con:configuration> + </con:assertion> + <con:assertion type="JsonPath RegEx Match" id="661feb7b-2379-46aa-a994-f7034df08aaf" name="link self"> + <con:configuration> + <path>$[0].links[?(@.rel == 'self' && (@.type == 'application/json'))].href</path> + <content>true</content> + <allowWildcards>false</allowWildcards> + <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences> + <ignoreComments>false</ignoreComments> + <regEx>^.*/api/v2/plan/.*$</regEx> + </con:configuration> + </con:assertion> + <con:assertion type="JsonPath Count" id="1f02b841-df99-4f50-bc12-f75834e396e0" name="link self count"> + <con:configuration> + <path>$[0].links[?(@.rel == 'self')]</path> + <content>1</content> + <allowWildcards>false</allowWildcards> + <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences> + <ignoreComments>false</ignoreComments> + </con:configuration> + </con:assertion> + <con:assertion type="JsonPath RegEx Match" id="c4de6278-26a0-4499-b07a-a01eb57cafd2" name="link planwerkwms"> + <con:configuration> + <path>$[0].links[?(@.rel == 'planwerkwms')].href</path> + <content>true</content> + <allowWildcards>false</allowWildcards> + <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences> + <ignoreComments>false</ignoreComments> + <regEx>^.*/services/planwerkwms/planname/.*$</regEx> + </con:configuration> + </con:assertion> + <con:assertion type="XPath Match" id="c49ca5e9-39d5-475d-b721-c32dc9fe86e5" name="geltungsbereichWGS84"> + <con:configuration> + <path>exists(//*:geltungsbereichWGS84)</path> + <content>false</content> + <allowWildcards>false</allowWildcards> + <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences> + <ignoreComments>false</ignoreComments> + </con:configuration> + </con:assertion> + <con:credentials> + <con:username>${#Project#username}</con:username> + <con:password>${#Project#password}</con:password> + <con:selectedAuthProfile>Basic</con:selectedAuthProfile> + <con:addedBasicAuthenticationTypes>Basic</con:addedBasicAuthenticationTypes> + <con:preemptive>true</con:preemptive> + <con:authType>Preemptive</con:authType> + </con:credentials> + <con:jmsConfig JMSDeliveryMode="PERSISTENT"/> + <con:jmsPropertyConfig/> + <con:parameters> + <con:parameter> + <con:name>planId</con:name> + <con:value>999999999</con:value> <con:style>QUERY</con:style> </con:parameter> </con:parameters> diff --git a/xplan-validator/xplan-validator-api/src/main/resources/application.properties b/xplan-validator/xplan-validator-api/src/main/resources/application.properties index 8d571c0c9..306cb0274 100644 --- a/xplan-validator/xplan-validator-api/src/main/resources/application.properties +++ b/xplan-validator/xplan-validator-api/src/main/resources/application.properties @@ -47,6 +47,7 @@ xplanbox.s3.accessKeyId=${XPLAN_S3_ACCESS_KEY} xplanbox.s3.endpoint.url=${XPLAN_S3_ENDPOINT} xplanbox.s3.region=${XPLAN_S3_REGION} xplanbox.s3.secretKey=${XPLAN_S3_SECRET_ACCESS_KEY} +xplanbox.s3.chunkedEncodingEnabled=${XPLAN_S3_CHUNKENCODING_ENABLED:true} xplanbox.validation.profiles=${XPLAN_VALIDATION_PROFILES:} xplanbox.s3.bucket.validation=${XPLAN_S3_BUCKET_VALIDATION:validation} diff --git a/xplan-validator/xplan-validator-executor/src/main/resources/application.properties b/xplan-validator/xplan-validator-executor/src/main/resources/application.properties index 768094edc..8e08692ca 100644 --- a/xplan-validator/xplan-validator-executor/src/main/resources/application.properties +++ b/xplan-validator/xplan-validator-executor/src/main/resources/application.properties @@ -46,6 +46,7 @@ xplanbox.s3.accessKeyId=${XPLAN_S3_ACCESS_KEY} xplanbox.s3.endpoint.url=${XPLAN_S3_ENDPOINT} xplanbox.s3.region=${XPLAN_S3_REGION} xplanbox.s3.secretKey=${XPLAN_S3_SECRET_ACCESS_KEY} +xplanbox.s3.chunkedEncodingEnabled=${XPLAN_S3_CHUNKENCODING_ENABLED:true} xplanbox.validation.profiles=${XPLAN_VALIDATION_PROFILES:} xplanbox.s3.bucket.validation=${XPLAN_S3_BUCKET_VALIDATION:validation} -- GitLab