Skip to content

Commit

Permalink
Try to improve readability with a mini DSL
Browse files Browse the repository at this point in the history
  • Loading branch information
reda-alaoui committed Sep 5, 2024
1 parent 499d501 commit d161159
Show file tree
Hide file tree
Showing 4 changed files with 57 additions and 35 deletions.
58 changes: 33 additions & 25 deletions core/src/main/java/com/cosium/hal_mock_mvc/Form.java
Original file line number Diff line number Diff line change
Expand Up @@ -30,88 +30,93 @@ public class Form {
this.template = requireNonNull(template);
}

public Form withString(String propertyName, String value, PropertyValidator... ignoredValidators)
public Form withString(
String propertyName, String value, PropertyValidationOption... validationOptions)
throws Exception {
FormProperty<?> property =
new FormProperty<>(
String.class, propertyName, Optional.ofNullable(value).stream().toList(), false);
propertyByName.put(property.name(), validate(property, ignoredValidators));
propertyByName.put(property.name(), validate(property, validationOptions));
return this;
}

public Form withBoolean(
String propertyName, Boolean value, PropertyValidator... ignoredValidators) throws Exception {
String propertyName, Boolean value, PropertyValidationOption... validationOptions)
throws Exception {
FormProperty<?> property =
new FormProperty<>(
Boolean.class, propertyName, Optional.ofNullable(value).stream().toList(), false);
propertyByName.put(property.name(), validate(property, ignoredValidators));
propertyByName.put(property.name(), validate(property, validationOptions));
return this;
}

public Form withInteger(
String propertyName, Integer value, PropertyValidator... ignoredValidators) throws Exception {
String propertyName, Integer value, PropertyValidationOption... validationOptions)
throws Exception {
FormProperty<?> property =
new FormProperty<>(
Integer.class, propertyName, Optional.ofNullable(value).stream().toList(), false);
propertyByName.put(property.name(), validate(property, ignoredValidators));
propertyByName.put(property.name(), validate(property, validationOptions));
return this;
}

public Form withLong(String propertyName, Long value, PropertyValidator... ignoredValidators)
public Form withLong(
String propertyName, Long value, PropertyValidationOption... validationOptions)
throws Exception {
FormProperty<?> property =
new FormProperty<>(
Long.class, propertyName, Optional.ofNullable(value).stream().toList(), false);
propertyByName.put(property.name(), validate(property, ignoredValidators));
propertyByName.put(property.name(), validate(property, validationOptions));
return this;
}

public Form withDouble(String propertyName, Double value, PropertyValidator... ignoredValidators)
public Form withDouble(
String propertyName, Double value, PropertyValidationOption... validationOptions)
throws Exception {
FormProperty<?> property =
new FormProperty<>(
Double.class, propertyName, Optional.ofNullable(value).stream().toList(), false);
propertyByName.put(property.name(), validate(property, ignoredValidators));
propertyByName.put(property.name(), validate(property, validationOptions));
return this;
}

public Form withStrings(
String propertyName, List<String> value, PropertyValidator... ignoredValidators)
String propertyName, List<String> value, PropertyValidationOption... validationOptions)
throws Exception {
FormProperty<?> property = new FormProperty<>(String.class, propertyName, value, true);
propertyByName.put(property.name(), validate(property, ignoredValidators));
propertyByName.put(property.name(), validate(property, validationOptions));
return this;
}

public Form withBooleans(
String propertyName, List<Boolean> value, PropertyValidator... ignoredValidators)
String propertyName, List<Boolean> value, PropertyValidationOption... validationOptions)
throws Exception {
FormProperty<?> property = new FormProperty<>(Boolean.class, propertyName, value, true);
propertyByName.put(property.name(), validate(property, ignoredValidators));
propertyByName.put(property.name(), validate(property, validationOptions));
return this;
}

public Form withIntegers(
String propertyName, List<Integer> value, PropertyValidator... ignoredValidators)
String propertyName, List<Integer> value, PropertyValidationOption... validationOptions)
throws Exception {
FormProperty<?> property = new FormProperty<>(Integer.class, propertyName, value, true);
propertyByName.put(property.name(), validate(property, ignoredValidators));
propertyByName.put(property.name(), validate(property, validationOptions));
return this;
}

public Form withLongs(
String propertyName, List<Long> value, PropertyValidator... ignoredValidators)
String propertyName, List<Long> value, PropertyValidationOption... validationOptions)
throws Exception {
FormProperty<?> property = new FormProperty<>(Long.class, propertyName, value, true);
propertyByName.put(property.name(), validate(property, ignoredValidators));
propertyByName.put(property.name(), validate(property, validationOptions));
return this;
}

public Form withDoubles(
String propertyName, List<Double> value, PropertyValidator... ignoredValidators)
String propertyName, List<Double> value, PropertyValidationOption... validationOptions)
throws Exception {
FormProperty<?> property = new FormProperty<>(Double.class, propertyName, value, true);
propertyByName.put(property.name(), validate(property, ignoredValidators));
propertyByName.put(property.name(), validate(property, validationOptions));
return this;
}

Expand Down Expand Up @@ -184,19 +189,22 @@ public ResultActions submit() throws Exception {
}

private ValidatedFormProperty<?> validate(
FormProperty<?> property, PropertyValidator... ignoredValidators) throws Exception {
Set<PropertyValidator> ignored =
Optional.ofNullable(ignoredValidators).map(Set::of).orElse(Set.of());
FormProperty<?> property, PropertyValidationOption... validationOptions) throws Exception {
Set<PropertyValidationOption> validationOptionSet =
Optional.ofNullable(validationOptions).map(Set::of).orElse(Set.of());
TemplatePropertyRepresentation representation =
template.representation().propertyByName().get(property.name());
if (representation == null) {
if (!ignored.contains(PropertyValidator.EXISTING)) {
if (!validationOptionSet.contains(
PropertyValidationOption.Immediate.DO_NOT_FAIL_IF_NOT_DECLARED)) {
throw new AssertionError("No property '%s' found.".formatted(property.name()));
}
return ValidatedFormProperty.markAsValid(property);
}

if (representation.readOnly() && !ignored.contains(PropertyValidator.READ_ONLY)) {
if (representation.readOnly()
&& !validationOptionSet.contains(
PropertyValidationOption.Immediate.DO_NOT_FAIL_IF_DECLARED_READ_ONLY)) {
throw new AssertionError(
"Cannot set value for read-only property '%s'".formatted(property.name()));
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.cosium.hal_mock_mvc;

/**
* @author Sébastien Le Ray
* @author Réda Housni Alaoui
*/
public sealed interface PropertyValidationOption permits PropertyValidationOption.Immediate {
enum Immediate implements PropertyValidationOption {
/** Do not fail if writing to a property not declared by the template */
DO_NOT_FAIL_IF_NOT_DECLARED,
/** Do not fail if writing to a property declared as read-only by the template */
DO_NOT_FAIL_IF_DECLARED_READ_ONLY
}
}

This file was deleted.

12 changes: 10 additions & 2 deletions core/src/test/java/com/cosium/hal_mock_mvc/FormTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -1793,7 +1793,10 @@ void test38() throws Exception {
.byKey("default")
.createForm();

assertThatCode(() -> form.withString("foo", "foo", PropertyValidator.EXISTING))
assertThatCode(
() ->
form.withString(
"foo", "foo", PropertyValidationOption.Immediate.DO_NOT_FAIL_IF_NOT_DECLARED))
.doesNotThrowAnyException();
}

Expand Down Expand Up @@ -1831,7 +1834,12 @@ void test39() throws Exception {
.templates()
.byKey("default")
.createForm();
assertThatCode(() -> form.withString("foo", "foo", PropertyValidator.READ_ONLY))
assertThatCode(
() ->
form.withString(
"foo",
"foo",
PropertyValidationOption.Immediate.DO_NOT_FAIL_IF_DECLARED_READ_ONLY))
.doesNotThrowAnyException();
}

Expand Down

0 comments on commit d161159

Please sign in to comment.