mirror of
https://github.com/robindhole/sfg-restdocs-example.git
synced 2025-03-16 12:50:09 +00:00
adding constraint validation example
This commit is contained in:
parent
88e356fa6b
commit
82a0da2627
@ -5,10 +5,7 @@ import lombok.Builder;
|
|||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.NoArgsConstructor;
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
import javax.validation.constraints.NotBlank;
|
import javax.validation.constraints.*;
|
||||||
import javax.validation.constraints.NotNull;
|
|
||||||
import javax.validation.constraints.Null;
|
|
||||||
import javax.validation.constraints.Positive;
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.time.OffsetDateTime;
|
import java.time.OffsetDateTime;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
@ -36,6 +33,7 @@ public class BeerDto {
|
|||||||
private OffsetDateTime lastModifiedDate;
|
private OffsetDateTime lastModifiedDate;
|
||||||
|
|
||||||
@NotBlank
|
@NotBlank
|
||||||
|
@Size(min = 3, max = 100)
|
||||||
private String beerName;
|
private String beerName;
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@ -49,6 +47,7 @@ public class BeerDto {
|
|||||||
@NotNull
|
@NotNull
|
||||||
private BigDecimal price;
|
private BigDecimal price;
|
||||||
|
|
||||||
|
@Positive
|
||||||
private Integer quantityOnHand;
|
private Integer quantityOnHand;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -14,7 +14,10 @@ import org.springframework.boot.test.mock.mockito.MockBean;
|
|||||||
import org.springframework.context.annotation.ComponentScan;
|
import org.springframework.context.annotation.ComponentScan;
|
||||||
import org.springframework.http.MediaType;
|
import org.springframework.http.MediaType;
|
||||||
import org.springframework.restdocs.RestDocumentationExtension;
|
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.test.web.servlet.MockMvc;
|
||||||
|
import org.springframework.util.StringUtils;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.util.Optional;
|
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.mockmvc.RestDocumentationRequestBuilders.*;
|
||||||
import static org.springframework.restdocs.payload.PayloadDocumentation.*;
|
import static org.springframework.restdocs.payload.PayloadDocumentation.*;
|
||||||
import static org.springframework.restdocs.request.RequestDocumentation.*;
|
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.result.MockMvcResultMatchers.status;
|
||||||
|
|
||||||
//import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
|
//import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
|
||||||
@ -78,21 +82,23 @@ class BeerControllerTest {
|
|||||||
BeerDto beerDto = getValidBeerDto();
|
BeerDto beerDto = getValidBeerDto();
|
||||||
String beerDtoJson = objectMapper.writeValueAsString(beerDto);
|
String beerDtoJson = objectMapper.writeValueAsString(beerDto);
|
||||||
|
|
||||||
|
ConstrainedFields fields = new ConstrainedFields(BeerDto.class);
|
||||||
|
|
||||||
mockMvc.perform(post("/api/v1/beer/")
|
mockMvc.perform(post("/api/v1/beer/")
|
||||||
.contentType(MediaType.APPLICATION_JSON)
|
.contentType(MediaType.APPLICATION_JSON)
|
||||||
.content(beerDtoJson))
|
.content(beerDtoJson))
|
||||||
.andExpect(status().isCreated())
|
.andExpect(status().isCreated())
|
||||||
.andDo(document("v1/beer",
|
.andDo(document("v1/beer",
|
||||||
requestFields(
|
requestFields(
|
||||||
fieldWithPath("id").ignored(),
|
fields.withPath("id").ignored(),
|
||||||
fieldWithPath("version").ignored(),
|
fields.withPath("version").ignored(),
|
||||||
fieldWithPath("createdDate").ignored(),
|
fields.withPath("createdDate").ignored(),
|
||||||
fieldWithPath("lastModifiedDate").ignored(),
|
fields.withPath("lastModifiedDate").ignored(),
|
||||||
fieldWithPath("beerName").description("Name of the beer"),
|
fields.withPath("beerName").description("Name of the beer"),
|
||||||
fieldWithPath("beerStyle").description("Style of Beer"),
|
fields.withPath("beerStyle").description("Style of Beer"),
|
||||||
fieldWithPath("upc").description("Beer UPC").attributes(),
|
fields.withPath("upc").description("Beer UPC").attributes(),
|
||||||
fieldWithPath("price").description("Beer Price"),
|
fields.withPath("price").description("Beer Price"),
|
||||||
fieldWithPath("quantityOnHand").ignored()
|
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), ". ")));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -0,0 +1,11 @@
|
|||||||
|
|===
|
||||||
|
|Path|Type|Description|Constraints
|
||||||
|
|
||||||
|
{{#fields}}
|
||||||
|
|{{path}}
|
||||||
|
|{{type}}
|
||||||
|
|{{description}}
|
||||||
|
|{{constraints}}
|
||||||
|
|
||||||
|
{{/fields}}
|
||||||
|
|===
|
Loading…
x
Reference in New Issue
Block a user