adding constraint validation example

This commit is contained in:
John Thompson 2019-05-28 08:41:41 -04:00
parent 88e356fa6b
commit 82a0da2627
No known key found for this signature in database
GPG Key ID: 25C80CE5BD1AF258
3 changed files with 44 additions and 13 deletions

View File

@ -5,10 +5,7 @@ import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Null;
import javax.validation.constraints.Positive;
import javax.validation.constraints.*;
import java.math.BigDecimal;
import java.time.OffsetDateTime;
import java.util.UUID;
@ -36,6 +33,7 @@ public class BeerDto {
private OffsetDateTime lastModifiedDate;
@NotBlank
@Size(min = 3, max = 100)
private String beerName;
@NotNull
@ -49,6 +47,7 @@ public class BeerDto {
@NotNull
private BigDecimal price;
@Positive
private Integer quantityOnHand;
}

View File

@ -14,7 +14,10 @@ import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.http.MediaType;
import org.springframework.restdocs.RestDocumentationExtension;
import org.springframework.restdocs.constraints.ConstraintDescriptions;
import org.springframework.restdocs.payload.FieldDescriptor;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.util.StringUtils;
import java.math.BigDecimal;
import java.util.Optional;
@ -26,6 +29,7 @@ import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.docu
import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.*;
import static org.springframework.restdocs.payload.PayloadDocumentation.*;
import static org.springframework.restdocs.request.RequestDocumentation.*;
import static org.springframework.restdocs.snippet.Attributes.key;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
//import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
@ -78,21 +82,23 @@ class BeerControllerTest {
BeerDto beerDto = getValidBeerDto();
String beerDtoJson = objectMapper.writeValueAsString(beerDto);
ConstrainedFields fields = new ConstrainedFields(BeerDto.class);
mockMvc.perform(post("/api/v1/beer/")
.contentType(MediaType.APPLICATION_JSON)
.content(beerDtoJson))
.andExpect(status().isCreated())
.andDo(document("v1/beer",
requestFields(
fieldWithPath("id").ignored(),
fieldWithPath("version").ignored(),
fieldWithPath("createdDate").ignored(),
fieldWithPath("lastModifiedDate").ignored(),
fieldWithPath("beerName").description("Name of the beer"),
fieldWithPath("beerStyle").description("Style of Beer"),
fieldWithPath("upc").description("Beer UPC").attributes(),
fieldWithPath("price").description("Beer Price"),
fieldWithPath("quantityOnHand").ignored()
fields.withPath("id").ignored(),
fields.withPath("version").ignored(),
fields.withPath("createdDate").ignored(),
fields.withPath("lastModifiedDate").ignored(),
fields.withPath("beerName").description("Name of the beer"),
fields.withPath("beerStyle").description("Style of Beer"),
fields.withPath("upc").description("Beer UPC").attributes(),
fields.withPath("price").description("Beer Price"),
fields.withPath("quantityOnHand").ignored()
)));
}
@ -117,4 +123,19 @@ class BeerControllerTest {
}
private static class ConstrainedFields {
private final ConstraintDescriptions constraintDescriptions;
ConstrainedFields(Class<?> input) {
this.constraintDescriptions = new ConstraintDescriptions(input);
}
private FieldDescriptor withPath(String path) {
return fieldWithPath(path).attributes(key("constraints").value(StringUtils
.collectionToDelimitedString(this.constraintDescriptions
.descriptionsForProperty(path), ". ")));
}
}
}

View File

@ -0,0 +1,11 @@
|===
|Path|Type|Description|Constraints
{{#fields}}
|{{path}}
|{{type}}
|{{description}}
|{{constraints}}
{{/fields}}
|===