From 9ddca2444636f1424024e80169a9383f5ffa9ade Mon Sep 17 00:00:00 2001 From: Michael Hoennig Date: Sun, 30 Jun 2024 10:58:01 +0200 Subject: [PATCH] WIP --- .../errors/MultiValidationException.java | 2 +- .../HsBookingItemEntityValidator.java | 8 ++- .../HsBookingItemEntityValidatorRegistry.java | 6 +- .../asset/HsHostingAssetController.java | 46 +++++++------- .../HsHostingAssetEntityProcessor.java | 61 +++++++++++++++++++ .../HsHostingAssetEntityValidator.java | 16 +++-- ...HsHostingAssetEntityValidatorRegistry.java | 16 ----- ...OfficeCoopAssetsTransactionController.java | 2 +- ...OfficeCoopSharesTransactionController.java | 2 +- .../hs/validation/HsEntityValidator.java | 7 ++- ...oudServerBookingItemValidatorUnitTest.java | 14 ++--- ...gedServerBookingItemValidatorUnitTest.java | 18 +++--- ...dWebspaceBookingItemValidatorUnitTest.java | 14 ++--- ...udServerHostingAssetValidatorUnitTest.java | 10 +-- ...gAssetEntityValidatorRegistryUnitTest.java | 26 -------- ...HsHostingAssetEntityValidatorUnitTest.java | 23 ++++--- ...edServerHostingAssetValidatorUnitTest.java | 12 ++-- ...WebspaceHostingAssetValidatorUnitTest.java | 14 +++-- ...UnixUserHostingAssetValidatorUnitTest.java | 6 +- 19 files changed, 179 insertions(+), 124 deletions(-) create mode 100644 src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsHostingAssetEntityProcessor.java diff --git a/src/main/java/net/hostsharing/hsadminng/errors/MultiValidationException.java b/src/main/java/net/hostsharing/hsadminng/errors/MultiValidationException.java index a6ba69e8..c8e721a2 100644 --- a/src/main/java/net/hostsharing/hsadminng/errors/MultiValidationException.java +++ b/src/main/java/net/hostsharing/hsadminng/errors/MultiValidationException.java @@ -15,7 +15,7 @@ public class MultiValidationException extends ValidationException { ); } - public static void throwInvalid(final List violations) { + public static void throwIfNotEmpty(final List violations) { if (!violations.isEmpty()) { throw new MultiValidationException(violations); } diff --git a/src/main/java/net/hostsharing/hsadminng/hs/booking/item/validators/HsBookingItemEntityValidator.java b/src/main/java/net/hostsharing/hsadminng/hs/booking/item/validators/HsBookingItemEntityValidator.java index 5cd0d71a..bd36a97b 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/booking/item/validators/HsBookingItemEntityValidator.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/booking/item/validators/HsBookingItemEntityValidator.java @@ -20,7 +20,13 @@ public class HsBookingItemEntityValidator extends HsEntityValidator validate(final HsBookingItemEntity bookingItem) { + @Override + public List validateEntity(final HsBookingItemEntity bookingItem) { + return validateProperties(bookingItem); + } + + @Override + public List validateContext(final HsBookingItemEntity bookingItem) { return sequentiallyValidate( () -> validateProperties(bookingItem), () -> optionallyValidate(bookingItem.getParentItem()), diff --git a/src/main/java/net/hostsharing/hsadminng/hs/booking/item/validators/HsBookingItemEntityValidatorRegistry.java b/src/main/java/net/hostsharing/hsadminng/hs/booking/item/validators/HsBookingItemEntityValidatorRegistry.java index e067781e..388855ff 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/booking/item/validators/HsBookingItemEntityValidatorRegistry.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/booking/item/validators/HsBookingItemEntityValidatorRegistry.java @@ -45,11 +45,13 @@ public class HsBookingItemEntityValidatorRegistry { } public static List doValidate(final HsBookingItemEntity bookingItem) { - return HsBookingItemEntityValidatorRegistry.forType(bookingItem.getType()).validate(bookingItem); + return HsEntityValidator.sequentiallyValidate( + () -> HsBookingItemEntityValidatorRegistry.forType(bookingItem.getType()).validateEntity(bookingItem), + () -> HsBookingItemEntityValidatorRegistry.forType(bookingItem.getType()).validateContext(bookingItem)); } public static HsBookingItemEntity validated(final HsBookingItemEntity entityToSave) { - MultiValidationException.throwInvalid(doValidate(entityToSave)); + MultiValidationException.throwIfNotEmpty(doValidate(entityToSave)); return entityToSave; } } diff --git a/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetController.java b/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetController.java index b0e5cd62..ca4c4a3e 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetController.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetController.java @@ -1,6 +1,7 @@ package net.hostsharing.hsadminng.hs.hosting.asset; import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemRepository; +import net.hostsharing.hsadminng.hs.hosting.asset.validators.HsHostingAssetEntityProcessor; import net.hostsharing.hsadminng.hs.hosting.asset.validators.HsHostingAssetEntityValidatorRegistry; import net.hostsharing.hsadminng.hs.hosting.generated.api.v1.api.HsHostingAssetsApi; @@ -21,11 +22,10 @@ import jakarta.persistence.EntityManager; import jakarta.persistence.EntityNotFoundException; import jakarta.persistence.PersistenceContext; import java.util.List; +import java.util.Map; import java.util.UUID; import java.util.function.BiConsumer; -import static net.hostsharing.hsadminng.hs.hosting.asset.validators.HsHostingAssetEntityValidatorRegistry.validated; - @RestController public class HsHostingAssetController implements HsHostingAssetsApi { @@ -56,7 +56,7 @@ public class HsHostingAssetController implements HsHostingAssetsApi { final var entities = assetRepo.findAllByCriteria(debitorUuid, parentAssetUuid, HsHostingAssetType.of(type)); - final var resources = mapper.mapList(entities, HsHostingAssetResource.class); + final var resources = mapper.mapList(entities, HsHostingAssetResource.class, ENTITY_TO_RESOURCE_POSTMAPPER); return ResponseEntity.ok(resources); } @@ -70,16 +70,21 @@ public class HsHostingAssetController implements HsHostingAssetsApi { context.define(currentUser, assumedRoles); - final var entityToSave = mapper.map(body, HsHostingAssetEntity.class, RESOURCE_TO_ENTITY_POSTMAPPER); + final var entity = mapper.map(body, HsHostingAssetEntity.class, RESOURCE_TO_ENTITY_POSTMAPPER); - final var saved = validated(assetRepo.save(entityToSave)); + final var mapped = new HsHostingAssetEntityProcessor(entity) + .validateEntity() + .prepareForSave() + .saveUsing(assetRepo::save) + .validateContext() + .mapUsing(e -> mapper.map(e, HsHostingAssetResource.class)) + .revampProperties(); final var uri = MvcUriComponentsBuilder.fromController(getClass()) .path("/api/hs/hosting/assets/{id}") - .buildAndExpand(saved.getUuid()) + .buildAndExpand(mapped.getUuid()) .toUri(); - final var mapped = mapper.map(saved, HsHostingAssetResource.class, ENTITY_TO_RESOURCE_POSTMAPPER); return ResponseEntity.created(uri).body(mapped); } @@ -123,21 +128,18 @@ public class HsHostingAssetController implements HsHostingAssetsApi { context.define(currentUser, assumedRoles); - final var current = assetRepo.findByUuid(assetUuid).orElseThrow(); + final var entity = assetRepo.findByUuid(assetUuid).orElseThrow(); - new HsHostingAssetEntityPatcher(em, current).apply(body); + new HsHostingAssetEntityPatcher(em, entity).apply(body); -// TODO.refa: draft for an alternative API -// validate(current) // self-validation, hashing passwords etc. -// .then(HsHostingAssetEntityValidatorRegistry::prepareForSave) // hashing passwords etc. -// .then(assetRepo::save) -// .then(HsHostingAssetEntityValidatorRegistry::validateInContext) -// // In this last step we need the entity and the mapped resource instance, -// // which is exactly what a postmapper takes as arguments. -// .then(this::mapToResource) using postProcessProperties to remove write-only + add read-only properties + final var mapped = new HsHostingAssetEntityProcessor(entity) + .validateEntity() + .prepareForSave() + .saveUsing(assetRepo::save) + .validateContext() + .mapUsing(e -> mapper.map(e, HsHostingAssetResource.class)) + .revampProperties(); - final var saved = validated(assetRepo.save(current)); - final var mapped = mapper.map(saved, HsHostingAssetResource.class, ENTITY_TO_RESOURCE_POSTMAPPER); return ResponseEntity.ok(mapped); } @@ -155,6 +157,8 @@ public class HsHostingAssetController implements HsHostingAssetsApi { } }; - final BiConsumer ENTITY_TO_RESOURCE_POSTMAPPER - = HsHostingAssetEntityValidatorRegistry::postprocessProperties; + @SuppressWarnings("unchecked") + final BiConsumer ENTITY_TO_RESOURCE_POSTMAPPER = (entity, resource) + -> HsHostingAssetEntityValidatorRegistry.forType(entity.getType()) + .revampProperties(entity, (Map) resource.getConfig()); } diff --git a/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsHostingAssetEntityProcessor.java b/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsHostingAssetEntityProcessor.java new file mode 100644 index 00000000..286cbed4 --- /dev/null +++ b/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsHostingAssetEntityProcessor.java @@ -0,0 +1,61 @@ +package net.hostsharing.hsadminng.hs.hosting.asset.validators; + +import net.hostsharing.hsadminng.errors.MultiValidationException; +import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetEntity; +import net.hostsharing.hsadminng.hs.hosting.generated.api.v1.model.HsHostingAssetResource; +import net.hostsharing.hsadminng.hs.validation.HsEntityValidator; + +import java.util.Map; +import java.util.function.Function; + +/** + * Wraps the steps of the pararation, validation, mapping and revamp around saving of a HsHostingAssetEntity into a readable API. + */ +public class HsHostingAssetEntityProcessor { + + private final HsEntityValidator validator; + private HsHostingAssetEntity entity; + private HsHostingAssetResource resource; + + public HsHostingAssetEntityProcessor(final HsHostingAssetEntity entity) { + this.entity = entity; + this.validator = HsHostingAssetEntityValidatorRegistry.forType(entity.getType()); + } + + /// validates the entity itself including its properties + public HsHostingAssetEntityProcessor validateEntity() { + MultiValidationException.throwIfNotEmpty(validator.validateEntity(entity)); + return this; + } + + /// hashing passwords etc. + public HsHostingAssetEntityProcessor prepareForSave() { + // FIXME: add computed properties + return this; + } + + public HsHostingAssetEntityProcessor saveUsing(final Function saveFunction) { + entity = saveFunction.apply(entity); + return this; + } + + /// validates the entity within it's parent and child hierarchy (e.g. totals validators and other limits) + public HsHostingAssetEntityProcessor validateContext() { + MultiValidationException.throwIfNotEmpty(validator.validateContext(entity)); + return this; + } + + /// maps entity to JSON resource representation + public HsHostingAssetEntityProcessor mapUsing( + final Function mapFunction) { + resource = mapFunction.apply(entity); + return this; + } + + /// removes write-only-properties and ads computed-properties + @SuppressWarnings("unchecked") + public HsHostingAssetResource revampProperties() { + validator.revampProperties(entity, (Map) resource.getConfig()); + return resource; + } +} diff --git a/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsHostingAssetEntityValidator.java b/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsHostingAssetEntityValidator.java index 9f4a6e61..165c0649 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsHostingAssetEntityValidator.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsHostingAssetEntityValidator.java @@ -45,10 +45,16 @@ public abstract class HsHostingAssetEntityValidator extends HsEntityValidator validate(final HsHostingAssetEntity assetEntity) { + public List validateEntity(final HsHostingAssetEntity assetEntity) { return sequentiallyValidate( () -> validateEntityReferencesAndProperties(assetEntity), - () -> validateIdentifierPattern(assetEntity), // might need proper parentAsset or billingItem + () -> validateIdentifierPattern(assetEntity) + ); + } + + @Override + public List validateContext(final HsHostingAssetEntity assetEntity) { + return sequentiallyValidate( () -> optionallyValidate(assetEntity.getBookingItem()), () -> optionallyValidate(assetEntity.getParentAsset()), () -> validateAgainstSubEntities(assetEntity) @@ -82,14 +88,16 @@ public abstract class HsHostingAssetEntityValidator extends HsEntityValidator optionallyValidate(final HsHostingAssetEntity assetEntity) { return assetEntity != null ? enrich(prefix(assetEntity.toShortString(), "parentAsset"), - HsHostingAssetEntityValidatorRegistry.forType(assetEntity.getType()).validate(assetEntity)) + // FIXME: actually only validateSubEntities is necessary + HsHostingAssetEntityValidatorRegistry.forType(assetEntity.getType()).validateContext(assetEntity)) : emptyList(); } private static List optionallyValidate(final HsBookingItemEntity bookingItem) { return bookingItem != null ? enrich(prefix(bookingItem.toShortString(), "bookingItem"), - HsBookingItemEntityValidatorRegistry.doValidate(bookingItem)) + // FIXME: actually only validateSubEntities is necessary + HsBookingItemEntityValidatorRegistry.doValidate(bookingItem)) : emptyList(); } diff --git a/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsHostingAssetEntityValidatorRegistry.java b/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsHostingAssetEntityValidatorRegistry.java index a5331f81..690be147 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsHostingAssetEntityValidatorRegistry.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsHostingAssetEntityValidatorRegistry.java @@ -40,22 +40,6 @@ public class HsHostingAssetEntityValidatorRegistry { return validators.keySet(); } - public static List doValidate(final HsHostingAssetEntity hostingAsset) { - final var validator = HsHostingAssetEntityValidatorRegistry.forType(hostingAsset.getType()); - return validator.validate(hostingAsset); - } - - public static HsHostingAssetEntity validated(final HsHostingAssetEntity entityToSave) { - MultiValidationException.throwInvalid(doValidate(entityToSave)); - return entityToSave; - } - - public static void postprocessProperties(final HsHostingAssetEntity entity, final HsHostingAssetResource resource) { - final var validator = HsHostingAssetEntityValidatorRegistry.forType(entity.getType()); - final var config = validator.postProcess(entity, asMap(resource)); - resource.setConfig(config); - } - @SuppressWarnings("unchecked") private static Map asMap(final HsHostingAssetResource resource) { if (resource.getConfig() instanceof Map map) { diff --git a/src/main/java/net/hostsharing/hsadminng/hs/office/coopassets/HsOfficeCoopAssetsTransactionController.java b/src/main/java/net/hostsharing/hsadminng/hs/office/coopassets/HsOfficeCoopAssetsTransactionController.java index 6279ad05..8ec1d956 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/office/coopassets/HsOfficeCoopAssetsTransactionController.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/office/coopassets/HsOfficeCoopAssetsTransactionController.java @@ -96,7 +96,7 @@ public class HsOfficeCoopAssetsTransactionController implements HsOfficeCoopAsse validateDebitTransaction(requestBody, violations); validateCreditTransaction(requestBody, violations); validateAssetValue(requestBody, violations); - MultiValidationException.throwInvalid(violations); + MultiValidationException.throwIfNotEmpty(violations); } private static void validateDebitTransaction( diff --git a/src/main/java/net/hostsharing/hsadminng/hs/office/coopshares/HsOfficeCoopSharesTransactionController.java b/src/main/java/net/hostsharing/hsadminng/hs/office/coopshares/HsOfficeCoopSharesTransactionController.java index f90d5276..78b41c9f 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/office/coopshares/HsOfficeCoopSharesTransactionController.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/office/coopshares/HsOfficeCoopSharesTransactionController.java @@ -98,7 +98,7 @@ public class HsOfficeCoopSharesTransactionController implements HsOfficeCoopShar validateSubscriptionTransaction(requestBody, violations); validateCancellationTransaction(requestBody, violations); validateshareCount(requestBody, violations); - MultiValidationException.throwInvalid(violations); + MultiValidationException.throwIfNotEmpty(violations); } private static void validateSubscriptionTransaction( diff --git a/src/main/java/net/hostsharing/hsadminng/hs/validation/HsEntityValidator.java b/src/main/java/net/hostsharing/hsadminng/hs/validation/HsEntityValidator.java index bf755bd2..9eb051f1 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/validation/HsEntityValidator.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/validation/HsEntityValidator.java @@ -32,7 +32,8 @@ public abstract class HsEntityValidator { return String.join(".", parts); } - public abstract List validate(final E entity); + public abstract List validateEntity(final E entity); + public abstract List validateContext(final E entity); public final List> properties() { return Arrays.stream(propertyValidators) @@ -60,7 +61,7 @@ public abstract class HsEntityValidator { } @SafeVarargs - protected static List sequentiallyValidate(final Supplier>... validators) { + public static List sequentiallyValidate(final Supplier>... validators) { return new ArrayList<>(stream(validators) .map(Supplier::get) .filter(violations -> !violations.isEmpty()) @@ -89,7 +90,7 @@ public abstract class HsEntityValidator { throw new IllegalArgumentException("Integer value (or null) expected, but got " + value); } - public Map postProcess(final E entity, final Map config) { + public Map revampProperties(final E entity, final Map config) { final var copy = new HashMap<>(config); stream(propertyValidators).forEach(p -> { // FIXME: maybe move to ValidatableProperty.postProcess(...)? diff --git a/src/test/java/net/hostsharing/hsadminng/hs/booking/item/validators/HsCloudServerBookingItemValidatorUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/booking/item/validators/HsCloudServerBookingItemValidatorUnitTest.java index 9258a4a1..b5307cd7 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/booking/item/validators/HsCloudServerBookingItemValidatorUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/booking/item/validators/HsCloudServerBookingItemValidatorUnitTest.java @@ -55,13 +55,13 @@ class HsCloudServerBookingItemValidatorUnitTest { // then assertThat(validator.properties()).map(Map::toString).containsExactlyInAnyOrder( - "{type=boolean, propertyName=active, required=false, defaultValue=true, isTotalsValidator=false}", - "{type=integer, propertyName=CPUs, min=1, max=32, required=true, isTotalsValidator=false}", - "{type=integer, propertyName=RAM, unit=GB, min=1, max=128, required=true, isTotalsValidator=false}", - "{type=integer, propertyName=SSD, unit=GB, min=0, max=1000, step=25, required=true, isTotalsValidator=false}", - "{type=integer, propertyName=HDD, unit=GB, min=0, max=4000, step=250, required=false, defaultValue=0, isTotalsValidator=false}", - "{type=integer, propertyName=Traffic, unit=GB, min=250, max=10000, step=250, required=true, isTotalsValidator=false}", - "{type=enumeration, propertyName=SLA-Infrastructure, values=[BASIC, EXT8H, EXT4H, EXT2H], required=false, isTotalsValidator=false}"); + "{type=boolean, propertyName=active, defaultValue=true}", + "{type=integer, propertyName=CPUs, min=1, max=32, required=true}", + "{type=integer, propertyName=RAM, unit=GB, min=1, max=128, required=true}", + "{type=integer, propertyName=SSD, unit=GB, min=0, max=1000, step=25, required=true}", + "{type=integer, propertyName=HDD, unit=GB, min=0, max=4000, step=250, defaultValue=0}", + "{type=integer, propertyName=Traffic, unit=GB, min=250, max=10000, step=250, required=true}", + "{type=enumeration, propertyName=SLA-Infrastructure, values=[BASIC, EXT8H, EXT4H, EXT2H]}"); } @Test diff --git a/src/test/java/net/hostsharing/hsadminng/hs/booking/item/validators/HsManagedServerBookingItemValidatorUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/booking/item/validators/HsManagedServerBookingItemValidatorUnitTest.java index 1fe754ea..11020d92 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/booking/item/validators/HsManagedServerBookingItemValidatorUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/booking/item/validators/HsManagedServerBookingItemValidatorUnitTest.java @@ -63,17 +63,17 @@ class HsManagedServerBookingItemValidatorUnitTest { // then assertThat(validator.properties()).map(Map::toString).containsExactlyInAnyOrder( - "{type=integer, propertyName=CPUs, min=1, max=32, required=true, isTotalsValidator=false}", - "{type=integer, propertyName=RAM, unit=GB, min=1, max=128, required=true, isTotalsValidator=false}", + "{type=integer, propertyName=CPUs, min=1, max=32, required=true}", + "{type=integer, propertyName=RAM, unit=GB, min=1, max=128, required=true}", "{type=integer, propertyName=SSD, unit=GB, min=25, max=1000, step=25, required=true, isTotalsValidator=true, thresholdPercentage=200}", - "{type=integer, propertyName=HDD, unit=GB, min=0, max=4000, step=250, required=false, defaultValue=0, isTotalsValidator=true, thresholdPercentage=200}", + "{type=integer, propertyName=HDD, unit=GB, min=0, max=4000, step=250, defaultValue=0, isTotalsValidator=true, thresholdPercentage=200}", "{type=integer, propertyName=Traffic, unit=GB, min=250, max=10000, step=250, required=true, isTotalsValidator=true, thresholdPercentage=200}", - "{type=enumeration, propertyName=SLA-Platform, values=[BASIC, EXT8H, EXT4H, EXT2H], required=false, defaultValue=BASIC, isTotalsValidator=false}", - "{type=boolean, propertyName=SLA-EMail, required=false, defaultValue=false, isTotalsValidator=false}", - "{type=boolean, propertyName=SLA-Maria, required=false, isTotalsValidator=false}", - "{type=boolean, propertyName=SLA-PgSQL, required=false, isTotalsValidator=false}", - "{type=boolean, propertyName=SLA-Office, required=false, isTotalsValidator=false}", - "{type=boolean, propertyName=SLA-Web, required=false, isTotalsValidator=false}"); + "{type=enumeration, propertyName=SLA-Platform, values=[BASIC, EXT8H, EXT4H, EXT2H], defaultValue=BASIC}", + "{type=boolean, propertyName=SLA-EMail}", // TODO.impl: falseIf-validation is missing in output + "{type=boolean, propertyName=SLA-Maria}", + "{type=boolean, propertyName=SLA-PgSQL}", + "{type=boolean, propertyName=SLA-Office}", + "{type=boolean, propertyName=SLA-Web}"); } @Test diff --git a/src/test/java/net/hostsharing/hsadminng/hs/booking/item/validators/HsManagedWebspaceBookingItemValidatorUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/booking/item/validators/HsManagedWebspaceBookingItemValidatorUnitTest.java index dd9081ee..e75cd551 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/booking/item/validators/HsManagedWebspaceBookingItemValidatorUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/booking/item/validators/HsManagedWebspaceBookingItemValidatorUnitTest.java @@ -55,12 +55,12 @@ class HsManagedWebspaceBookingItemValidatorUnitTest { // then assertThat(validator.properties()).map(Map::toString).containsExactlyInAnyOrder( - "{type=integer, propertyName=SSD, unit=GB, min=1, max=100, step=1, required=true, isTotalsValidator=false}", - "{type=integer, propertyName=HDD, unit=GB, min=0, max=250, step=10, required=false, isTotalsValidator=false}", - "{type=integer, propertyName=Traffic, unit=GB, min=10, max=1000, step=10, required=true, isTotalsValidator=false}", - "{type=integer, propertyName=Multi, min=1, max=100, step=1, required=false, defaultValue=1, isTotalsValidator=false}", - "{type=integer, propertyName=Daemons, min=0, max=10, required=false, defaultValue=0, isTotalsValidator=false}", - "{type=boolean, propertyName=Online Office Server, required=false, isTotalsValidator=false}", - "{type=enumeration, propertyName=SLA-Platform, values=[BASIC, EXT24H], required=false, defaultValue=BASIC, isTotalsValidator=false}"); + "{type=integer, propertyName=SSD, unit=GB, min=1, max=100, step=1, required=true}", + "{type=integer, propertyName=HDD, unit=GB, min=0, max=250, step=10}", + "{type=integer, propertyName=Traffic, unit=GB, min=10, max=1000, step=10, required=true}", + "{type=integer, propertyName=Multi, min=1, max=100, step=1, defaultValue=1}", + "{type=integer, propertyName=Daemons, min=0, max=10, defaultValue=0}", + "{type=boolean, propertyName=Online Office Server}", + "{type=enumeration, propertyName=SLA-Platform, values=[BASIC, EXT24H], defaultValue=BASIC}"); } } diff --git a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsCloudServerHostingAssetValidatorUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsCloudServerHostingAssetValidatorUnitTest.java index fff0fd56..2344da87 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsCloudServerHostingAssetValidatorUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsCloudServerHostingAssetValidatorUnitTest.java @@ -29,7 +29,7 @@ class HsCloudServerHostingAssetValidatorUnitTest { // when - final var result = validator.validate(cloudServerHostingAssetEntity); + final var result = validator.validateEntity(cloudServerHostingAssetEntity); // then assertThat(result).containsExactlyInAnyOrder( @@ -49,7 +49,7 @@ class HsCloudServerHostingAssetValidatorUnitTest { // when - final var result = validator.validate(cloudServerHostingAssetEntity); + final var result = validator.validateEntity(cloudServerHostingAssetEntity); // then assertThat(result).containsExactlyInAnyOrder( @@ -71,12 +71,12 @@ class HsCloudServerHostingAssetValidatorUnitTest { final var mangedServerHostingAssetEntity = HsHostingAssetEntity.builder() .type(MANAGED_SERVER) .identifier("xyz00") - .bookingItem(HsBookingItemEntity.builder().type(HsBookingItemType.CLOUD_SERVER).build()) + .bookingItem(TEST_CLOUD_SERVER_BOOKING_ITEM) .build(); final var validator = HsHostingAssetEntityValidatorRegistry.forType(mangedServerHostingAssetEntity.getType()); // when - final var result = validator.validate(mangedServerHostingAssetEntity); + final var result = validator.validateContext(mangedServerHostingAssetEntity); // then assertThat(result).containsExactlyInAnyOrder( @@ -96,7 +96,7 @@ class HsCloudServerHostingAssetValidatorUnitTest { final var validator = HsHostingAssetEntityValidatorRegistry.forType(mangedServerHostingAssetEntity.getType()); // when - final var result = validator.validate(mangedServerHostingAssetEntity); + final var result = validator.validateEntity(mangedServerHostingAssetEntity); // then assertThat(result).containsExactlyInAnyOrder( diff --git a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsHostingAssetEntityValidatorRegistryUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsHostingAssetEntityValidatorRegistryUnitTest.java index 32c098f3..881b5c5f 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsHostingAssetEntityValidatorRegistryUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsHostingAssetEntityValidatorRegistryUnitTest.java @@ -1,16 +1,10 @@ package net.hostsharing.hsadminng.hs.hosting.asset.validators; -import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemEntity; -import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType; -import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetEntity; import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType; import org.junit.jupiter.api.Test; -import java.util.Map; - import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.catchThrowable; -import static org.assertj.core.api.Assertions.entry; class HsHostingAssetEntityValidatorRegistryUnitTest { @@ -41,24 +35,4 @@ class HsHostingAssetEntityValidatorRegistryUnitTest { HsHostingAssetType.UNIX_USER ); } - - @Test - void validatedDoesNotThrowAnExceptionForValidEntity() { - final var givenBookingItem = HsBookingItemEntity.builder() - .type(HsBookingItemType.CLOUD_SERVER) - .resources(Map.ofEntries( - entry("CPUs", 4), - entry("RAM", 20), - entry("SSD", 50), - entry("Traffic", 250) - )) - .build(); - final var validEntity = HsHostingAssetEntity.builder() - .type(HsHostingAssetType.CLOUD_SERVER) - .bookingItem(givenBookingItem) - .identifier("vm1234") - .caption("some valid cloud server") - .build(); - HsHostingAssetEntityValidatorRegistry.validated(validEntity); - } } diff --git a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsHostingAssetEntityValidatorUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsHostingAssetEntityValidatorUnitTest.java index 73776e89..a6667210 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsHostingAssetEntityValidatorUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsHostingAssetEntityValidatorUnitTest.java @@ -2,34 +2,43 @@ package net.hostsharing.hsadminng.hs.hosting.asset.validators; import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemEntity; import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType; +import net.hostsharing.hsadminng.hs.booking.item.TestHsBookingItem; import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetEntity; +import net.hostsharing.hsadminng.mapper.Array; import org.junit.jupiter.api.Test; +import java.util.List; +import java.util.stream.Stream; +import static net.hostsharing.hsadminng.hs.booking.item.TestHsBookingItem.TEST_MANAGED_SERVER_BOOKING_ITEM; import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.MANAGED_SERVER; import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.catchThrowable; class HsHostingAssetEntityValidatorUnitTest { @Test - void validThrowsException() { + void validatesEntity() { // given final var managedServerHostingAssetEntity = HsHostingAssetEntity.builder() .type(MANAGED_SERVER) .identifier("vm1234") - .bookingItem(HsBookingItemEntity.builder().type(HsBookingItemType.MANAGED_SERVER).build()) + .bookingItem(TEST_MANAGED_SERVER_BOOKING_ITEM) .parentAsset(HsHostingAssetEntity.builder().type(MANAGED_SERVER).build()) .assignedToAsset(HsHostingAssetEntity.builder().type(MANAGED_SERVER).build()) .build(); // when - final var result = catchThrowable( ()-> HsHostingAssetEntityValidatorRegistry.validated(managedServerHostingAssetEntity)); + final var validator = HsHostingAssetEntityValidatorRegistry.forType(managedServerHostingAssetEntity.getType()); + final List result = Stream.concat( + validator.validateEntity(managedServerHostingAssetEntity).stream(), + validator.validateContext(managedServerHostingAssetEntity).stream() + ).toList(); // then - assertThat(result.getMessage()).contains( + assertThat(result).containsExactlyInAnyOrder( "'MANAGED_SERVER:vm1234.parentAsset' must be null but is set to D-???????-?:null", - "'MANAGED_SERVER:vm1234.assignedToAsset' must be null but is set to D-???????-?:null" - ); + "'MANAGED_SERVER:vm1234.assignedToAsset' must be null but is set to D-???????-?:null"); } } + +// FIXME: add tests validatesContext + revampProperties diff --git a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsManagedServerHostingAssetValidatorUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsManagedServerHostingAssetValidatorUnitTest.java index 2eb7f581..e40c7ab2 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsManagedServerHostingAssetValidatorUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsManagedServerHostingAssetValidatorUnitTest.java @@ -8,6 +8,8 @@ import org.junit.jupiter.api.Test; import java.util.Map; import static java.util.Map.entry; +import static net.hostsharing.hsadminng.hs.booking.item.TestHsBookingItem.TEST_CLOUD_SERVER_BOOKING_ITEM; +import static net.hostsharing.hsadminng.hs.booking.item.TestHsBookingItem.TEST_MANAGED_SERVER_BOOKING_ITEM; import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.MANAGED_SERVER; import static org.assertj.core.api.Assertions.assertThat; @@ -19,7 +21,7 @@ class HsManagedServerHostingAssetValidatorUnitTest { final var mangedWebspaceHostingAssetEntity = HsHostingAssetEntity.builder() .type(MANAGED_SERVER) .identifier("vm1234") - .bookingItem(HsBookingItemEntity.builder().type(HsBookingItemType.MANAGED_SERVER).build()) + .bookingItem(TEST_MANAGED_SERVER_BOOKING_ITEM) .parentAsset(HsHostingAssetEntity.builder().build()) .assignedToAsset(HsHostingAssetEntity.builder().build()) .config(Map.ofEntries( @@ -31,7 +33,7 @@ class HsManagedServerHostingAssetValidatorUnitTest { final var validator = HsHostingAssetEntityValidatorRegistry.forType(mangedWebspaceHostingAssetEntity.getType()); // when - final var result = validator.validate(mangedWebspaceHostingAssetEntity); + final var result = validator.validateContext(mangedWebspaceHostingAssetEntity); // then assertThat(result).containsExactlyInAnyOrder( @@ -53,7 +55,7 @@ class HsManagedServerHostingAssetValidatorUnitTest { final var validator = HsHostingAssetEntityValidatorRegistry.forType(mangedServerHostingAssetEntity.getType()); // when - final var result = validator.validate(mangedServerHostingAssetEntity); + final var result = validator.validateEntity(mangedServerHostingAssetEntity); // then assertThat(result).containsExactlyInAnyOrder( @@ -68,12 +70,12 @@ class HsManagedServerHostingAssetValidatorUnitTest { .identifier("xyz00") .parentAsset(HsHostingAssetEntity.builder().build()) .assignedToAsset(HsHostingAssetEntity.builder().build()) - .bookingItem(HsBookingItemEntity.builder().type(HsBookingItemType.CLOUD_SERVER).build()) + .bookingItem(TEST_CLOUD_SERVER_BOOKING_ITEM) .build(); final var validator = HsHostingAssetEntityValidatorRegistry.forType(mangedServerHostingAssetEntity.getType()); // when - final var result = validator.validate(mangedServerHostingAssetEntity); + final var result = validator.validateContext(mangedServerHostingAssetEntity); // then assertThat(result).containsExactlyInAnyOrder( diff --git a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsManagedWebspaceHostingAssetValidatorUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsManagedWebspaceHostingAssetValidatorUnitTest.java index 7b981b68..92d52cc0 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsManagedWebspaceHostingAssetValidatorUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsManagedWebspaceHostingAssetValidatorUnitTest.java @@ -7,6 +7,7 @@ import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType; import org.junit.jupiter.api.Test; import java.util.Map; +import java.util.stream.Stream; import static java.util.Map.entry; import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.MANAGED_WEBSPACE; @@ -70,7 +71,7 @@ class HsManagedWebspaceHostingAssetValidatorUnitTest { .build(); // when - final var result = validator.validate(mangedWebspaceHostingAssetEntity); + final var result = validator.validateContext(mangedWebspaceHostingAssetEntity); // then assertThat(result).isEmpty(); @@ -88,7 +89,7 @@ class HsManagedWebspaceHostingAssetValidatorUnitTest { .build(); // when - final var result = validator.validate(mangedWebspaceHostingAssetEntity); + final var result = validator.validateEntity(mangedWebspaceHostingAssetEntity); // then assertThat(result).containsExactly("'identifier' expected to match '^abc[0-9][0-9]$', but is 'xyz00'"); @@ -109,7 +110,7 @@ class HsManagedWebspaceHostingAssetValidatorUnitTest { .build(); // when - final var result = validator.validate(mangedWebspaceHostingAssetEntity); + final var result = validator.validateEntity(mangedWebspaceHostingAssetEntity); // then assertThat(result).containsExactly("'MANAGED_WEBSPACE:abc00.config.unknown' is not expected but is set to 'some value'"); @@ -131,7 +132,10 @@ class HsManagedWebspaceHostingAssetValidatorUnitTest { .build(); // when - final var result = validator.validate(mangedWebspaceHostingAssetEntity); + final var result = Stream.concat( + validator.validateEntity(mangedWebspaceHostingAssetEntity).stream(), + validator.validateContext(mangedWebspaceHostingAssetEntity).stream()) + .toList(); // then assertThat(result).isEmpty(); @@ -154,7 +158,7 @@ class HsManagedWebspaceHostingAssetValidatorUnitTest { .build(); // when - final var result = validator.validate(mangedWebspaceHostingAssetEntity); + final var result = validator.validateContext(mangedWebspaceHostingAssetEntity); // then assertThat(result).containsExactly( diff --git a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsUnixUserHostingAssetValidatorUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsUnixUserHostingAssetValidatorUnitTest.java index 2c92d69b..d720aaa0 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsUnixUserHostingAssetValidatorUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsUnixUserHostingAssetValidatorUnitTest.java @@ -46,7 +46,7 @@ class HsUnixUserHostingAssetValidatorUnitTest { final var validator = HsHostingAssetEntityValidatorRegistry.forType(unixUserHostingAsset.getType()); // when - final var result = validator.validate(unixUserHostingAsset); + final var result = validator.validateEntity(unixUserHostingAsset); // FIXME: validateContext // then assertThat(result).isEmpty(); @@ -74,7 +74,7 @@ class HsUnixUserHostingAssetValidatorUnitTest { final var validator = HsHostingAssetEntityValidatorRegistry.forType(unixUserHostingAsset.getType()); // when - final var result = validator.validate(unixUserHostingAsset); + final var result = validator.validateEntity(unixUserHostingAsset); // then assertThat(result).containsExactlyInAnyOrder( @@ -101,7 +101,7 @@ class HsUnixUserHostingAssetValidatorUnitTest { final var validator = HsHostingAssetEntityValidatorRegistry.forType(unixUserHostingAsset.getType()); // when - final var result = validator.validate(unixUserHostingAsset); + final var result = validator.validateEntity(unixUserHostingAsset); // then assertThat(result).containsExactly(