add-email-alias-hosting-asset #70
@ -0,0 +1,33 @@
|
|||||||
|
package net.hostsharing.hsadminng.hs.hosting.asset.validators;
|
||||||
|
|
||||||
|
import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetEntity;
|
||||||
|
import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType;
|
||||||
|
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
import static net.hostsharing.hsadminng.hs.validation.ArrayProperty.arrayOf;
|
||||||
|
import static net.hostsharing.hsadminng.hs.validation.StringProperty.stringProperty;
|
||||||
|
|
||||||
|
class HsEMailAliasHostingAssetValidator extends HsHostingAssetEntityValidator {
|
||||||
|
|
||||||
|
private static final String UNIX_USER_REGEX = "^[a-z]{3}[0-9]{2}(-[a-z0-9]+)?$";
|
||||||
hsh-michaelhoennig marked this conversation as resolved
Outdated
|
|||||||
|
private static final String EMAIL_ADDRESS_REGEX = "^[a-zA-Z0-9_.±]+@[a-zA-Z0-9-]+.[a-zA-Z0-9-.]+$";
|
||||||
hsh-michaelhoennig marked this conversation as resolved
Outdated
hsh-marcsandlus
commented
+/- ? +/- ?
|
|||||||
|
public static final int EMAIL_ADDRESS_MAX_LENGTH = 320; // according to RFC 5321 and RFC 5322
|
||||||
|
|
||||||
|
HsEMailAliasHostingAssetValidator() {
|
||||||
|
super( BookingItem.mustBeNull(),
|
||||||
|
ParentAsset.mustBeOfType(HsHostingAssetType.MANAGED_WEBSPACE),
|
||||||
|
AssignedToAsset.mustBeNull(),
|
||||||
|
AlarmContact.isOptional(),
|
||||||
|
|
||||||
|
arrayOf(
|
||||||
|
stringProperty("target").maxLength(EMAIL_ADDRESS_MAX_LENGTH).matchesRegEx(UNIX_USER_REGEX, EMAIL_ADDRESS_REGEX)
|
||||||
|
).required().minLength(1));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Pattern identifierPattern(final HsHostingAssetEntity assetEntity) {
|
||||||
|
final var webspaceIdentifier = assetEntity.getParentAsset().getIdentifier();
|
||||||
|
return Pattern.compile("^"+webspaceIdentifier+"$|^"+webspaceIdentifier+"-[a-z0-9]+$");
|
||||||
|
}
|
||||||
|
}
|
@ -19,6 +19,7 @@ public class HsHostingAssetEntityValidatorRegistry {
|
|||||||
register(MANAGED_SERVER, new HsManagedServerHostingAssetValidator());
|
register(MANAGED_SERVER, new HsManagedServerHostingAssetValidator());
|
||||||
register(MANAGED_WEBSPACE, new HsManagedWebspaceHostingAssetValidator());
|
register(MANAGED_WEBSPACE, new HsManagedWebspaceHostingAssetValidator());
|
||||||
register(UNIX_USER, new HsUnixUserHostingAssetValidator());
|
register(UNIX_USER, new HsUnixUserHostingAssetValidator());
|
||||||
|
register(EMAIL_ALIAS, new HsEMailAliasHostingAssetValidator());
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void register(final Enum<HsHostingAssetType> type, final HsEntityValidator<HsHostingAssetEntity> validator) {
|
private static void register(final Enum<HsHostingAssetType> type, final HsEntityValidator<HsHostingAssetEntity> validator) {
|
||||||
|
@ -0,0 +1,60 @@
|
|||||||
|
package net.hostsharing.hsadminng.hs.validation;
|
||||||
|
|
||||||
|
import lombok.Setter;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import static java.util.Arrays.stream;
|
||||||
|
import static net.hostsharing.hsadminng.mapper.Array.insertAfterEntries;
|
||||||
|
|
||||||
|
@Setter
|
||||||
|
public class ArrayProperty<P extends ValidatableProperty<?, E>, E> extends ValidatableProperty<ArrayProperty<P, E>, E[]> {
|
||||||
|
|
||||||
|
private static final String[] KEY_ORDER =
|
||||||
|
insertAfterEntries(ValidatableProperty.KEY_ORDER, "required", "minLength" ,"maxLength");
|
||||||
|
private final ValidatableProperty<?, E> elementProperty;
|
||||||
|
private Integer minLength;
|
||||||
|
private Integer maxLength;
|
||||||
|
|
||||||
|
private ArrayProperty(final ValidatableProperty<?, E> elementProperty) {
|
||||||
|
//noinspection unchecked
|
||||||
|
super((Class<E[]>) elementProperty.type.arrayType(), elementProperty.propertyName, KEY_ORDER);
|
||||||
|
this.elementProperty = elementProperty;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <T> ArrayProperty<?, T[]> arrayOf(final ValidatableProperty<?, T> elementProperty) {
|
||||||
|
//noinspection unchecked
|
||||||
|
return (ArrayProperty<?, T[]>) new ArrayProperty<>(elementProperty);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ValidatableProperty<?, ?> minLength(final int minLength) {
|
||||||
|
this.minLength = minLength;
|
||||||
|
return self();
|
||||||
|
}
|
||||||
|
|
||||||
|
public ValidatableProperty<?, ?> maxLength(final int maxLength) {
|
||||||
|
this.maxLength = maxLength;
|
||||||
|
return self();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void validate(final List<String> result, final E[] propValue, final PropertiesProvider propProvider) {
|
||||||
|
if (minLength != null && propValue.length < minLength) {
|
||||||
|
result.add(propertyName + "' length is expected to be at min " + minLength + " but length of " + display(propValue) + " is " + propValue.length);
|
||||||
|
}
|
||||||
|
if (maxLength != null && propValue.length > maxLength) {
|
||||||
|
result.add(propertyName + "' length is expected to be at max " + maxLength + " but length of " + display(propValue) + " is " + propValue.length);
|
||||||
|
}
|
||||||
|
stream(propValue).forEach(e -> elementProperty.validate(result, e, propProvider));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected String simpleTypeName() {
|
||||||
|
return elementProperty.simpleTypeName() + "[]";
|
||||||
|
}
|
||||||
|
|
||||||
|
private String display(final E... propValue) {
|
||||||
|
return "[" + Arrays.toString(propValue) + "]";
|
||||||
|
}
|
||||||
|
}
|
@ -8,12 +8,12 @@ import java.util.stream.Stream;
|
|||||||
|
|
||||||
import static java.util.Optional.ofNullable;
|
import static java.util.Optional.ofNullable;
|
||||||
import static net.hostsharing.hsadminng.hash.LinuxEtcShadowHashGenerator.hash;
|
import static net.hostsharing.hsadminng.hash.LinuxEtcShadowHashGenerator.hash;
|
||||||
import static net.hostsharing.hsadminng.mapper.Array.insertAfterEntry;
|
import static net.hostsharing.hsadminng.mapper.Array.insertAfterEntries;
|
||||||
|
|
||||||
@Setter
|
@Setter
|
||||||
public class PasswordProperty extends StringProperty<PasswordProperty> {
|
public class PasswordProperty extends StringProperty<PasswordProperty> {
|
||||||
|
|
||||||
private static final String[] KEY_ORDER = insertAfterEntry(StringProperty.KEY_ORDER, "computed", "hashedUsing");
|
private static final String[] KEY_ORDER = insertAfterEntries(StringProperty.KEY_ORDER, "computed", "hashedUsing");
|
||||||
hsh-michaelhoennig marked this conversation as resolved
Outdated
hsh-marcsandlus
commented
insertEntriesAfterEntry insertEntriesAfterEntry
|
|||||||
|
|
||||||
private Algorithm hashedUsing;
|
private Algorithm hashedUsing;
|
||||||
|
|
||||||
|
@ -3,9 +3,12 @@ package net.hostsharing.hsadminng.hs.validation;
|
|||||||
import lombok.Setter;
|
import lombok.Setter;
|
||||||
import net.hostsharing.hsadminng.mapper.Array;
|
import net.hostsharing.hsadminng.mapper.Array;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.regex.Matcher;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
import static java.util.Arrays.stream;
|
||||||
|
|
||||||
@Setter
|
@Setter
|
||||||
public class StringProperty<P extends StringProperty<P>> extends ValidatableProperty<P, String> {
|
public class StringProperty<P extends StringProperty<P>> extends ValidatableProperty<P, String> {
|
||||||
@ -15,7 +18,7 @@ public class StringProperty<P extends StringProperty<P>> extends ValidatableProp
|
|||||||
Array.of("matchesRegEx", "minLength", "maxLength"),
|
Array.of("matchesRegEx", "minLength", "maxLength"),
|
||||||
ValidatableProperty.KEY_ORDER_TAIL,
|
ValidatableProperty.KEY_ORDER_TAIL,
|
||||||
Array.of("undisclosed"));
|
Array.of("undisclosed"));
|
||||||
private Pattern matchesRegEx;
|
private Pattern[] matchesRegEx;
|
||||||
private Integer minLength;
|
private Integer minLength;
|
||||||
private Integer maxLength;
|
private Integer maxLength;
|
||||||
private boolean undisclosed;
|
private boolean undisclosed;
|
||||||
@ -42,8 +45,8 @@ public class StringProperty<P extends StringProperty<P>> extends ValidatableProp
|
|||||||
return self();
|
return self();
|
||||||
}
|
}
|
||||||
|
|
||||||
public P matchesRegEx(final String regExPattern) {
|
public P matchesRegEx(final String... regExPattern) {
|
||||||
this.matchesRegEx = Pattern.compile(regExPattern);
|
this.matchesRegEx = stream(regExPattern).map(Pattern::compile).toArray(Pattern[]::new);
|
||||||
return self();
|
return self();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -65,8 +68,9 @@ public class StringProperty<P extends StringProperty<P>> extends ValidatableProp
|
|||||||
if (maxLength != null && propValue.length()>maxLength) {
|
if (maxLength != null && propValue.length()>maxLength) {
|
||||||
result.add(propertyName + "' length is expected to be at max " + maxLength + " but length of " + display(propValue) + " is " + propValue.length());
|
result.add(propertyName + "' length is expected to be at max " + maxLength + " but length of " + display(propValue) + " is " + propValue.length());
|
||||||
}
|
}
|
||||||
if (matchesRegEx != null && !matchesRegEx.matcher(propValue).matches()) {
|
if (matchesRegEx != null &&
|
||||||
result.add(propertyName + "' is expected to be match " + matchesRegEx + " but " + display(propValue) + " does not match");
|
stream(matchesRegEx).map(p -> p.matcher(propValue)).map(Matcher::matches).findAny().isEmpty()) {
|
||||||
|
result.add(propertyName + "' is expected to match any of " + Arrays.toString(matchesRegEx) + " but " + display(propValue) + " does not match any");
|
||||||
}
|
}
|
||||||
if (isReadOnly() && propValue != null) {
|
if (isReadOnly() && propValue != null) {
|
||||||
result.add(propertyName + "' is readonly but given as " + display(propValue));
|
result.add(propertyName + "' is readonly but given as " + display(propValue));
|
||||||
|
@ -29,6 +29,7 @@ public abstract class ValidatableProperty<P extends ValidatableProperty<?, ?>, T
|
|||||||
|
|
||||||
protected static final String[] KEY_ORDER_HEAD = Array.of("propertyName");
|
protected static final String[] KEY_ORDER_HEAD = Array.of("propertyName");
|
||||||
protected static final String[] KEY_ORDER_TAIL = Array.of("required", "defaultValue", "readOnly", "writeOnly", "computed", "isTotalsValidator", "thresholdPercentage");
|
protected static final String[] KEY_ORDER_TAIL = Array.of("required", "defaultValue", "readOnly", "writeOnly", "computed", "isTotalsValidator", "thresholdPercentage");
|
||||||
|
protected static final String[] KEY_ORDER = Array.join(KEY_ORDER_HEAD, KEY_ORDER_TAIL);
|
||||||
|
|
||||||
final Class<T> type;
|
final Class<T> type;
|
||||||
final String propertyName;
|
final String propertyName;
|
||||||
|
@ -51,13 +51,16 @@ public class Array {
|
|||||||
return of();
|
return of();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static <T> T[] insertAfterEntry(final T[] array, final T entryToFind, final T newEntry) {
|
@SafeVarargs
|
||||||
|
public static <T> T[] insertAfterEntries(final T[] array, final T entryToFind, final T... newEntries) {
|
||||||
final var arrayList = new ArrayList<>(asList(array));
|
final var arrayList = new ArrayList<>(asList(array));
|
||||||
final var index = arrayList.indexOf(entryToFind);
|
final var index = arrayList.indexOf(entryToFind);
|
||||||
if (index < 0) {
|
if (index < 0) {
|
||||||
throw new IllegalArgumentException("entry "+ entryToFind + " not found in " + Arrays.toString(array));
|
throw new IllegalArgumentException("entry "+ entryToFind + " not found in " + Arrays.toString(array));
|
||||||
}
|
}
|
||||||
arrayList.add(index + 1, newEntry);
|
for (int n = 0; n < newEntries.length; ++n) {
|
||||||
|
arrayList.add(index +n + 1, newEntries[n]);
|
||||||
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
final var extendedArray = (T[]) java.lang.reflect.Array.newInstance(array.getClass().getComponentType(), array.length);
|
final var extendedArray = (T[]) java.lang.reflect.Array.newInstance(array.getClass().getComponentType(), array.length);
|
||||||
|
@ -73,6 +73,7 @@ begin
|
|||||||
values (managedServerUuid, relatedManagedServerBookingItem.uuid, 'MANAGED_SERVER', null, null, 'vm10' || debitorNumberSuffix, 'some ManagedServer', '{ "monit_max_cpu_usage": 90, "monit_max_ram_usage": 80, "monit_max_ssd_usage": 70 }'::jsonb),
|
values (managedServerUuid, relatedManagedServerBookingItem.uuid, 'MANAGED_SERVER', null, null, 'vm10' || debitorNumberSuffix, 'some ManagedServer', '{ "monit_max_cpu_usage": 90, "monit_max_ram_usage": 80, "monit_max_ssd_usage": 70 }'::jsonb),
|
||||||
(uuid_generate_v4(), relatedCloudServerBookingItem.uuid, 'CLOUD_SERVER', null, null, 'vm20' || debitorNumberSuffix, 'another CloudServer', '{}'::jsonb),
|
(uuid_generate_v4(), relatedCloudServerBookingItem.uuid, 'CLOUD_SERVER', null, null, 'vm20' || debitorNumberSuffix, 'another CloudServer', '{}'::jsonb),
|
||||||
(managedWebspaceUuid, relatedManagedWebspaceBookingItem.uuid, 'MANAGED_WEBSPACE', managedServerUuid, null, defaultPrefix || '01', 'some Webspace', '{}'::jsonb),
|
(managedWebspaceUuid, relatedManagedWebspaceBookingItem.uuid, 'MANAGED_WEBSPACE', managedServerUuid, null, defaultPrefix || '01', 'some Webspace', '{}'::jsonb),
|
||||||
|
(uuid_generate_v4(), null, 'EMAIL_ALIAS', managedWebspaceUuid, null, defaultPrefix || '01-web', 'some E-Mail-Alias', '{ "target": [ "office@example.org", "archive@example.com" ] }'::jsonb),
|
||||||
(webUnixUserUuid, null, 'UNIX_USER', managedWebspaceUuid, null, defaultPrefix || '01-web', 'some UnixUser for Website', '{ "SSD-soft-quota": "128", "SSD-hard-quota": "256", "HDD-soft-quota": "512", "HDD-hard-quota": "1024"}'::jsonb),
|
(webUnixUserUuid, null, 'UNIX_USER', managedWebspaceUuid, null, defaultPrefix || '01-web', 'some UnixUser for Website', '{ "SSD-soft-quota": "128", "SSD-hard-quota": "256", "HDD-soft-quota": "512", "HDD-hard-quota": "1024"}'::jsonb),
|
||||||
(uuid_generate_v4(), null, 'DOMAIN_HTTP_SETUP', managedWebspaceUuid, webUnixUserUuid, defaultPrefix || '.example.org', 'some Domain-HTTP-Setup', '{ "option-htdocsfallback": true, "use-fcgiphpbin": "/usr/lib/cgi-bin/php", "validsubdomainnames": "*"}'::jsonb);
|
(uuid_generate_v4(), null, 'DOMAIN_HTTP_SETUP', managedWebspaceUuid, webUnixUserUuid, defaultPrefix || '.example.org', 'some Domain-HTTP-Setup', '{ "option-htdocsfallback": true, "use-fcgiphpbin": "/usr/lib/cgi-bin/php", "validsubdomainnames": "*"}'::jsonb);
|
||||||
end; $$;
|
end; $$;
|
||||||
|
@ -29,6 +29,7 @@ import java.util.UUID;
|
|||||||
import java.util.function.Supplier;
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
import static java.util.Map.entry;
|
import static java.util.Map.entry;
|
||||||
|
import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.EMAIL_ALIAS;
|
||||||
import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.MANAGED_SERVER;
|
import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.MANAGED_SERVER;
|
||||||
import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.MANAGED_WEBSPACE;
|
import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.MANAGED_WEBSPACE;
|
||||||
import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.UNIX_USER;
|
import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.UNIX_USER;
|
||||||
@ -101,7 +102,7 @@ class HsHostingAssetControllerAcceptanceTest extends ContextBasedTestWithCleanup
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void globalAdmin_canViewAllAssetsByType() {
|
void webspaceAgent_canViewAllAssetsByType() {
|
||||||
|
|
||||||
// given
|
// given
|
||||||
context("superuser-alex@hostsharing.net");
|
context("superuser-alex@hostsharing.net");
|
||||||
@ -109,42 +110,25 @@ class HsHostingAssetControllerAcceptanceTest extends ContextBasedTestWithCleanup
|
|||||||
RestAssured // @formatter:off
|
RestAssured // @formatter:off
|
||||||
.given()
|
.given()
|
||||||
.header("current-user", "superuser-alex@hostsharing.net")
|
.header("current-user", "superuser-alex@hostsharing.net")
|
||||||
|
.header("assumed-roles", "hs_hosting_asset#fir01:AGENT")
|
||||||
.port(port)
|
.port(port)
|
||||||
.when()
|
.when()
|
||||||
. get("http://localhost/api/hs/hosting/assets?type=" + MANAGED_SERVER)
|
. get("http://localhost/api/hs/hosting/assets?type=" + EMAIL_ALIAS)
|
||||||
.then().log().all().assertThat()
|
.then().log().all().assertThat()
|
||||||
.statusCode(200)
|
.statusCode(200)
|
||||||
.contentType("application/json")
|
.contentType("application/json")
|
||||||
.body("", lenientlyEquals("""
|
.body("", lenientlyEquals("""
|
||||||
[
|
[
|
||||||
{
|
{
|
||||||
"type": "MANAGED_SERVER",
|
"type": "EMAIL_ALIAS",
|
||||||
"identifier": "vm1011",
|
"identifier": "fir01-web",
|
||||||
"caption": "some ManagedServer",
|
"caption": "some E-Mail-Alias",
|
||||||
|
"alarmContact": null,
|
||||||
"config": {
|
"config": {
|
||||||
"monit_max_cpu_usage": 90,
|
"target": [
|
||||||
"monit_max_ram_usage": 80,
|
"office@example.org",
|
||||||
"monit_max_ssd_usage": 70
|
"archive@example.com"
|
||||||
}
|
]
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "MANAGED_SERVER",
|
|
||||||
"identifier": "vm1012",
|
|
||||||
"caption": "some ManagedServer",
|
|
||||||
"config": {
|
|
||||||
"monit_max_cpu_usage": 90,
|
|
||||||
"monit_max_ram_usage": 80,
|
|
||||||
"monit_max_ssd_usage": 70
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "MANAGED_SERVER",
|
|
||||||
"identifier": "vm1013",
|
|
||||||
"caption": "some ManagedServer",
|
|
||||||
"config": {
|
|
||||||
"monit_max_cpu_usage": 90,
|
|
||||||
"monit_max_ram_usage": 80,
|
|
||||||
"monit_max_ssd_usage": 70
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
@ -34,7 +34,8 @@ class HsHostingAssetPropsControllerAcceptanceTest {
|
|||||||
"MANAGED_SERVER",
|
"MANAGED_SERVER",
|
||||||
"MANAGED_WEBSPACE",
|
"MANAGED_WEBSPACE",
|
||||||
"CLOUD_SERVER",
|
"CLOUD_SERVER",
|
||||||
"UNIX_USER"
|
"UNIX_USER",
|
||||||
|
"EMAIL_ALIAS"
|
||||||
]
|
]
|
||||||
"""));
|
"""));
|
||||||
// @formatter:on
|
// @formatter:on
|
||||||
|
@ -0,0 +1,125 @@
|
|||||||
|
package net.hostsharing.hsadminng.hs.hosting.asset.validators;
|
||||||
|
|
||||||
|
import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetEntity;
|
||||||
|
import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType;
|
||||||
|
import net.hostsharing.hsadminng.mapper.Array;
|
||||||
|
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_MANAGED_SERVER_BOOKING_ITEM;
|
||||||
|
import static net.hostsharing.hsadminng.hs.booking.item.TestHsBookingItem.TEST_MANAGED_WEBSPACE_BOOKING_ITEM;
|
||||||
|
import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.EMAIL_ALIAS;
|
||||||
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
|
||||||
|
class HsEMailAliasHostingAssetValidatorUnitTest {
|
||||||
|
|
||||||
|
private final HsHostingAssetEntity TEST_MANAGED_SERVER_HOSTING_ASSET = HsHostingAssetEntity.builder()
|
||||||
|
.type(HsHostingAssetType.MANAGED_SERVER)
|
||||||
|
.identifier("vm1234")
|
||||||
|
.caption("some managed server")
|
||||||
|
.bookingItem(TEST_MANAGED_SERVER_BOOKING_ITEM)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
private final HsHostingAssetEntity TEST_MANAGED_WEBSPACE_HOSTING_ASSET = HsHostingAssetEntity.builder()
|
||||||
|
.type(HsHostingAssetType.MANAGED_WEBSPACE)
|
||||||
|
.identifier("xyz00")
|
||||||
|
.caption("some managed webspace")
|
||||||
|
.bookingItem(TEST_MANAGED_WEBSPACE_BOOKING_ITEM)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void containsAllValidations() {
|
||||||
|
// when
|
||||||
|
final var validator = HsHostingAssetEntityValidatorRegistry.forType(EMAIL_ALIAS);
|
||||||
|
|
||||||
|
// then
|
||||||
|
assertThat(validator.properties()).map(Map::toString).containsExactlyInAnyOrder(
|
||||||
|
"{type=string[], propertyName=target, required=true, minLength=1}");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void validatesValidEntity() {
|
||||||
|
// given
|
||||||
|
final var emailAliasHostingAssetEntity = HsHostingAssetEntity.builder()
|
||||||
|
.type(EMAIL_ALIAS)
|
||||||
|
.parentAsset(TEST_MANAGED_WEBSPACE_HOSTING_ASSET)
|
||||||
|
.identifier("xyz00-office")
|
||||||
|
.config(Map.ofEntries(
|
||||||
|
entry("target", Array.of("xyz00", "xyz00-abc", "office@example.com"))
|
||||||
|
))
|
||||||
|
.build();
|
||||||
|
final var validator = HsHostingAssetEntityValidatorRegistry.forType(emailAliasHostingAssetEntity.getType());
|
||||||
|
|
||||||
|
// when
|
||||||
|
final var result = validator.validateEntity(emailAliasHostingAssetEntity);
|
||||||
|
|
||||||
|
// then
|
||||||
|
assertThat(result).isEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void validatesProperties() {
|
||||||
|
// given
|
||||||
|
final var emailAliasHostingAssetEntity = HsHostingAssetEntity.builder()
|
||||||
|
.type(EMAIL_ALIAS)
|
||||||
|
.parentAsset(TEST_MANAGED_WEBSPACE_HOSTING_ASSET)
|
||||||
|
.identifier("xyz00-office")
|
||||||
|
.config(Map.ofEntries(
|
||||||
|
entry("target", Array.of("xyz00", "xyz00-abc", "garbage", "office@example.com"))
|
||||||
|
))
|
||||||
|
.build();
|
||||||
|
final var validator = HsHostingAssetEntityValidatorRegistry.forType(emailAliasHostingAssetEntity.getType());
|
||||||
|
|
||||||
|
// when
|
||||||
|
final var result = validator.validateEntity(emailAliasHostingAssetEntity);
|
||||||
|
|
||||||
|
// then
|
||||||
|
assertThat(result).containsExactlyInAnyOrder(
|
||||||
|
"'EMAIL_ALIAS:xyz00-office.parentAsset' must be of type MANAGED_WEBSPACE but is of type MANAGED_SERVER");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void validatesInvalidIdentifier() {
|
||||||
|
// given
|
||||||
|
final var emailAliasHostingAssetEntity = HsHostingAssetEntity.builder()
|
||||||
|
.type(EMAIL_ALIAS)
|
||||||
|
.parentAsset(TEST_MANAGED_WEBSPACE_HOSTING_ASSET)
|
||||||
|
.identifier("abc00-office")
|
||||||
|
.config(Map.ofEntries(
|
||||||
|
entry("target", Array.of("xyz00", "xyz00-abc", "garbage", "office@example.com"))
|
||||||
|
))
|
||||||
|
.build();
|
||||||
|
final var validator = HsHostingAssetEntityValidatorRegistry.forType(emailAliasHostingAssetEntity.getType());
|
||||||
|
|
||||||
|
// when
|
||||||
|
final var result = validator.validateEntity(emailAliasHostingAssetEntity);
|
||||||
|
|
||||||
|
// then
|
||||||
|
assertThat(result).containsExactlyInAnyOrder(
|
||||||
|
"'identifier' expected to match '^xyz00$|^xyz00-[a-z0-9]+$', but is 'abc00-office'");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void validatesInvalidReferences() {
|
||||||
|
// given
|
||||||
|
final var emailAliasHostingAssetEntity = HsHostingAssetEntity.builder()
|
||||||
|
.type(EMAIL_ALIAS)
|
||||||
|
.bookingItem(TEST_MANAGED_SERVER_BOOKING_ITEM)
|
||||||
|
.parentAsset(TEST_MANAGED_SERVER_HOSTING_ASSET)
|
||||||
|
.identifier("abc00-office")
|
||||||
|
.config(Map.ofEntries(
|
||||||
|
entry("target", Array.of("xyz00", "xyz00-abc", "garbage", "office@example.com"))
|
||||||
|
))
|
||||||
|
.build();
|
||||||
|
final var validator = HsHostingAssetEntityValidatorRegistry.forType(emailAliasHostingAssetEntity.getType());
|
||||||
|
|
||||||
|
// when
|
||||||
|
final var result = validator.validateEntity(emailAliasHostingAssetEntity);
|
||||||
|
|
||||||
|
// then
|
||||||
|
assertThat(result).containsExactlyInAnyOrder(
|
||||||
|
"'identifier' expected to match '^xyz00$|^xyz00-[a-z0-9]+$', but is 'abc00-office'");
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user
matcht nicht mit bestehenden Paketen