diff --git a/core/src/main/java/com/cosium/hal_mock_mvc/Form.java b/core/src/main/java/com/cosium/hal_mock_mvc/Form.java index 59d60f8..487077f 100644 --- a/core/src/main/java/com/cosium/hal_mock_mvc/Form.java +++ b/core/src/main/java/com/cosium/hal_mock_mvc/Form.java @@ -197,6 +197,9 @@ private ValidatedFormProperty validate( FormProperty property, PropertyValidationOption... validationOptions) throws Exception { Set validationOptionSet = Optional.ofNullable(validationOptions).map(Set::of).orElse(Set.of()); + if (validationOptionSet.contains(PropertyValidationOption.Immediate.DO_NOT_FAIL_IF_NOT_VALID)) { + return ValidatedFormProperty.markAsValid(property); + } TemplatePropertyRepresentation representation = template.representation().propertyByName().get(property.name()); if (representation == null) { diff --git a/core/src/main/java/com/cosium/hal_mock_mvc/PropertyValidationOption.java b/core/src/main/java/com/cosium/hal_mock_mvc/PropertyValidationOption.java index bc6341a..15f8d58 100644 --- a/core/src/main/java/com/cosium/hal_mock_mvc/PropertyValidationOption.java +++ b/core/src/main/java/com/cosium/hal_mock_mvc/PropertyValidationOption.java @@ -9,6 +9,8 @@ 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 + DO_NOT_FAIL_IF_DECLARED_READ_ONLY, + /** Do not fail if writing invalid value to a property */ + DO_NOT_FAIL_IF_NOT_VALID, } } diff --git a/core/src/test/java/com/cosium/hal_mock_mvc/FormTest.java b/core/src/test/java/com/cosium/hal_mock_mvc/FormTest.java index bfcc825..58674d2 100644 --- a/core/src/test/java/com/cosium/hal_mock_mvc/FormTest.java +++ b/core/src/test/java/com/cosium/hal_mock_mvc/FormTest.java @@ -7,6 +7,7 @@ import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.methodOn; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import com.cosium.hal_mock_mvc.PropertyValidationOption.Immediate; import com.fasterxml.jackson.jr.ob.JSON; import com.jayway.jsonpath.DocumentContext; import com.jayway.jsonpath.JsonPath; @@ -1843,6 +1844,40 @@ void test39() throws Exception { .doesNotThrowAnyException(); } + @Test + @DisplayName("User can force an invalid property") + void test40() throws Exception { + myController.getResponseToSend = + JSON.std + .composeString() + .startObject() + .startObjectField("_links") + .startObjectField("self") + .put("href", "http://localhost/form-test:put") + .end() + .end() + .startObjectField("_templates") + .startObjectField("default") + .put("method", "PUT") + .startArrayField("properties") + .end() + .end() + .end() + .end() + .finish(); + + Form form = + HalMockMvc.builder(mockMvc) + .baseUri(linkTo(methodOn(MyController.class).get()).toUri()) + .build() + .follow() + .templates() + .byKey("default") + .createForm(); + assertThatCode(() -> form.withString("foo", "foo", Immediate.DO_NOT_FAIL_IF_NOT_VALID)) + .doesNotThrowAnyException(); + } + @Controller public static class MyController {