From c01c6010231759fc1aa0da058a0a25e0dcbd876b Mon Sep 17 00:00:00 2001 From: oldgit <jon.harvey.uk@gmail.com> Date: Wed, 26 Feb 2020 15:50:19 +0000 Subject: [PATCH] Bump libs to latest versions, improve /owners POST,PUT, add tests - Updated pom.xml dependent libs to latest versions - Added minimum code coverage rules in pom.xml - Added petclinic-ermodel.png and added ref in readme.md - /owners POST: update to ensure no id is given in request body - /owners PUT: update to ensure bodyId (if given) matches pathId - Add bad request tests to /owners POST,PUT - Improve test coverage --- petclinic-ermodel.png | Bin 0 -> 71318 bytes pom.xml | 202 ++++++++++-------- readme.md | 4 + .../petclinic/rest/BindingErrorsResponse.java | 52 ++--- .../rest/JacksonCustomOwnerDeserializer.java | 8 +- .../rest/JacksonCustomOwnerSerializer.java | 6 +- .../petclinic/rest/OwnerRestController.java | 23 +- .../petclinic/rest/PetRestController.java | 12 +- .../petclinic/rest/PetTypeRestController.java | 10 +- .../rest/SpecialtyRestController.java | 10 +- .../petclinic/rest/UserRestController.java | 2 +- .../petclinic/rest/VetRestController.java | 10 +- .../petclinic/rest/VisitRestController.java | 10 +- .../util/ApplicationSwaggerConfig.java | 6 +- .../rest/OwnerRestControllerTests.java | 142 +++++++++--- .../rest/PetRestControllerTests.java | 11 +- .../rest/PetTypeRestControllerTests.java | 12 +- .../rest/SpecialtyRestControllerTests.java | 8 +- .../rest/VetRestControllerTests.java | 8 +- .../rest/VisitRestControllerTests.java | 8 +- 20 files changed, 339 insertions(+), 205 deletions(-) create mode 100644 petclinic-ermodel.png diff --git a/petclinic-ermodel.png b/petclinic-ermodel.png new file mode 100644 index 0000000000000000000000000000000000000000..6c790fb7c45f61ea9526fcf4aae5a6a0a46ec4f1 GIT binary patch literal 71318 zcmeAS@N?(olHy`uVBq!ia0y~yU>0OxU`pU%V_;zTn)hxS0|TQ&rn7T^r?ay{Kv8~L zW=<*tgT}<<gajcE9gP!-i3tfO&T4CN6_p2dbo2xz)E_!<MB(ItlM1I2X3U6*c_1P1 zfH~w4!{We$+p~Fk6n<^eJE0@@@6DxYkN^MTTXOw{4Oi~f10nrPJA#6`CpUhPSMc-F z)6hyxNbq6UH1)JMm%|$|h3F+5FEkXY**fO(C9Y@OI9cHhbAqX&<2i?Kq6*Opmdb{# zC+e6|UaKf}E?3^T@LLl@`|gPoce*Qxtq<hz3exs+*iu~Qm>QT?<<{AxY|s)UYV� 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≧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�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 D%!1)1 literal 0 HcmV?d00001 diff --git a/pom.xml b/pom.xml index 41ee6a0f..ca330d71 100644 --- a/pom.xml +++ b/pom.xml @@ -1,82 +1,82 @@ <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - <modelVersion>4.0.0</modelVersion> + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> - <groupId>org.springframework.samples</groupId> - <artifactId>spring-petclinic-rest</artifactId> - <version>2.2.4</version> + <groupId>org.springframework.samples</groupId> + <artifactId>spring-petclinic-rest</artifactId> + <version>2.2.4</version> - <description>REST version of the Spring Petclinic sample application</description> + <description>REST version of the Spring Petclinic sample application</description> <url>https://spring-petclinic.github.io/</url> - <parent> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-parent</artifactId> - <version>2.2.4.RELEASE</version> - <relativePath/> <!-- lookup parent from Maven repository --> - </parent> + <parent> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-parent</artifactId> + <version>2.2.4.RELEASE</version> + <relativePath/> <!-- lookup parent from Maven repository --> + </parent> - <properties> + <properties> <spring-data-jdbc.version>1.2.1.RELEASE</spring-data-jdbc.version> - <springfox-swagger.version>2.6.1</springfox-swagger.version> - <jacoco.version>0.8.2</jacoco.version> + <springfox-swagger.version>2.9.2</springfox-swagger.version> + <jacoco.version>0.8.5</jacoco.version> <docker.jib-maven-plugin.version>1.3.0</docker.jib-maven-plugin.version> <docker.image.prefix>springcommunity</docker.image.prefix> - </properties> - - <!-- repository for springfox plugin --> - <repositories> - <repository> - <id>jcenter-snapshots</id> - <name>jcenter</name> - <url>https://jcenter.bintray.com/</url> - </repository> - </repositories> - - <dependencies> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-aop</artifactId> - </dependency> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-cache</artifactId> - </dependency> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-data-jpa</artifactId> - </dependency> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-jdbc</artifactId> - </dependency> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-web</artifactId> - </dependency> + </properties> + + <!-- repository for springfox plugin --> + <repositories> + <repository> + <id>jcenter-snapshots</id> + <name>jcenter</name> + <url>https://jcenter.bintray.com/</url> + </repository> + </repositories> + + <dependencies> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-aop</artifactId> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-cache</artifactId> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-data-jpa</artifactId> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-jdbc</artifactId> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-web</artifactId> + </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> - <dependency> - <groupId>org.hsqldb</groupId> - <artifactId>hsqldb</artifactId> - <scope>runtime</scope> - </dependency> - <dependency> - <groupId>mysql</groupId> - <artifactId>mysql-connector-java</artifactId> - <scope>runtime</scope> - </dependency> - <dependency> - <groupId>org.postgresql</groupId> - <artifactId>postgresql</artifactId> - <scope>runtime</scope> - </dependency> - - <dependency> + <dependency> + <groupId>org.hsqldb</groupId> + <artifactId>hsqldb</artifactId> + <scope>runtime</scope> + </dependency> + <dependency> + <groupId>mysql</groupId> + <artifactId>mysql-connector-java</artifactId> + <scope>runtime</scope> + </dependency> + <dependency> + <groupId>org.postgresql</groupId> + <artifactId>postgresql</artifactId> + <scope>runtime</scope> + </dependency> + + <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-jdbc-core</artifactId> <version>${spring-data-jdbc.version}</version> @@ -88,11 +88,11 @@ </exclusions> </dependency> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-test</artifactId> - <scope>test</scope> - </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-test</artifactId> + <scope>test</scope> + </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-test</artifactId> @@ -113,15 +113,15 @@ <scope>test</scope> </dependency> - <dependency> - <groupId>io.springfox</groupId> - <artifactId>springfox-swagger2</artifactId> - <version>${springfox-swagger.version}</version> - </dependency> - <dependency> - <groupId>io.springfox</groupId> - <artifactId>springfox-swagger-ui</artifactId> - <version>${springfox-swagger.version}</version> + <dependency> + <groupId>io.springfox</groupId> + <artifactId>springfox-swagger2</artifactId> + <version>${springfox-swagger.version}</version> + </dependency> + <dependency> + <groupId>io.springfox</groupId> + <artifactId>springfox-swagger-ui</artifactId> + <version>${springfox-swagger.version}</version> </dependency> <dependency> @@ -135,13 +135,13 @@ <artifactId>jaxb-api</artifactId> <version>2.3.0</version> </dependency> - </dependencies> + </dependencies> - <build> - <plugins> - <plugin> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-maven-plugin</artifactId> + <build> + <plugins> + <plugin> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-maven-plugin</artifactId> <executions> <execution> <!-- Spring Boot Actuator displays build-related information @@ -159,7 +159,7 @@ </configuration> </execution> </executions> - </plugin> + </plugin> <plugin> <groupId>org.jacoco</groupId> @@ -171,6 +171,34 @@ <goal>prepare-agent</goal> </goals> </execution> + <execution> + <id>check</id> + <goals> + <goal>check</goal> + </goals> + <configuration> + <rules> + <rule> + <element>BUNDLE</element> + <limits> + <limit> + <counter>LINE</counter> + <value>COVEREDRATIO</value> + <minimum>0.87</minimum> + </limit> + <limit> + <counter>BRANCH</counter> + <value>COVEREDRATIO</value> + <minimum>0.74</minimum> + </limit> + </limits> + <excludes> + <!-- <exclude>com.xyz.ClassToExclude</exclude> --> + </excludes> + </rule> + </rules> + </configuration> + </execution> <execution> <id>report</id> <phase>prepare-package</phase> @@ -195,7 +223,7 @@ </to> </configuration> </plugin> - </plugins> - </build> + </plugins> + </build> </project> diff --git a/readme.md b/readme.md index 3a9243fe..921034a6 100644 --- a/readme.md +++ b/readme.md @@ -7,6 +7,10 @@ The [spring-petclinic-angular project](https://github.com/spring-petclinic/sprin [See the presentation of the Spring Petclinic Framework version](http://fr.slideshare.net/AntoineRey/spring-framework-petclinic-sample-application) +### Petclinic ER Model + + + ## Running petclinic locally ### With maven command line diff --git a/src/main/java/org/springframework/samples/petclinic/rest/BindingErrorsResponse.java b/src/main/java/org/springframework/samples/petclinic/rest/BindingErrorsResponse.java index 73311e26..a52ef833 100644 --- a/src/main/java/org/springframework/samples/petclinic/rest/BindingErrorsResponse.java +++ b/src/main/java/org/springframework/samples/petclinic/rest/BindingErrorsResponse.java @@ -34,15 +34,35 @@ import com.fasterxml.jackson.databind.ObjectMapper; public class BindingErrorsResponse { - private List<BindingError> bindingErrors = new ArrayList<BindingError>(); - - public List<BindingError> getBindingErrors() { - return bindingErrors; - } + public BindingErrorsResponse() { + this(null); + } + + public BindingErrorsResponse(Integer id) { + this(null, id); + } + + public BindingErrorsResponse(Integer pathId, Integer bodyId) { + boolean onlyBodyIdSpecified = pathId == null && bodyId != null; + if (onlyBodyIdSpecified) { + addBodyIdError(bodyId, "must not be specified"); + } + boolean bothIdsSpecified = pathId != null && bodyId != null; + if (bothIdsSpecified && !pathId.equals(bodyId)) { + addBodyIdError(bodyId, String.format("does not match pathId: %d", pathId)); + } + } + + private void addBodyIdError(Integer bodyId, String message) { + BindingError error = new BindingError(); + error.setObjectName("body"); + error.setFieldName("id"); + error.setFieldValue(bodyId.toString()); + error.setErrorMessage(message); + addError(error); + } - public void setBindingErrors(List<BindingError> bindingErrors) { - this.bindingErrors = bindingErrors; - } + private List<BindingError> bindingErrors = new ArrayList<BindingError>(); public void addError(BindingError bindingError) { this.bindingErrors.add(bindingError); @@ -90,34 +110,18 @@ public class BindingErrorsResponse { this.errorMessage = ""; } - protected String getObjectName() { - return objectName; - } - protected void setObjectName(String objectName) { this.objectName = objectName; } - protected String getFieldName() { - return fieldName; - } - protected void setFieldName(String fieldName) { this.fieldName = fieldName; } - protected String getFieldValue() { - return fieldValue; - } - protected void setFieldValue(String fieldValue) { this.fieldValue = fieldValue; } - protected String getErrorMessage() { - return errorMessage; - } - protected void setErrorMessage(String error_message) { this.errorMessage = error_message; } diff --git a/src/main/java/org/springframework/samples/petclinic/rest/JacksonCustomOwnerDeserializer.java b/src/main/java/org/springframework/samples/petclinic/rest/JacksonCustomOwnerDeserializer.java index b63dd422..d629b8b5 100644 --- a/src/main/java/org/springframework/samples/petclinic/rest/JacksonCustomOwnerDeserializer.java +++ b/src/main/java/org/springframework/samples/petclinic/rest/JacksonCustomOwnerDeserializer.java @@ -32,7 +32,7 @@ import com.fasterxml.jackson.databind.deser.std.StdDeserializer; */ public class JacksonCustomOwnerDeserializer extends StdDeserializer<Owner> { - + public JacksonCustomOwnerDeserializer(){ this(null); } @@ -45,15 +45,13 @@ public class JacksonCustomOwnerDeserializer extends StdDeserializer<Owner> { public Owner deserialize(JsonParser parser, DeserializationContext context) throws IOException, JsonProcessingException { JsonNode node = parser.getCodec().readTree(parser); Owner owner = new Owner(); - int id = node.get("id").asInt(); String firstName = node.get("firstName").asText(null); String lastName = node.get("lastName").asText(null); String address = node.get("address").asText(null); String city = node.get("city").asText(null); String telephone = node.get("telephone").asText(null); - - if (!(id == 0)) { - owner.setId(id); + if (node.hasNonNull("id")) { + owner.setId(node.get("id").asInt()); } owner.setFirstName(firstName); owner.setLastName(lastName); diff --git a/src/main/java/org/springframework/samples/petclinic/rest/JacksonCustomOwnerSerializer.java b/src/main/java/org/springframework/samples/petclinic/rest/JacksonCustomOwnerSerializer.java index b106063d..594d82a0 100644 --- a/src/main/java/org/springframework/samples/petclinic/rest/JacksonCustomOwnerSerializer.java +++ b/src/main/java/org/springframework/samples/petclinic/rest/JacksonCustomOwnerSerializer.java @@ -77,7 +77,11 @@ public class JacksonCustomOwnerSerializer extends StdSerializer<Owner> { jgen.writeStringField("name", petType.getName()); jgen.writeEndObject(); // type - jgen.writeNumberField("owner", pet.getOwner().getId()); + if (pet.getOwner().getId() == null) { + jgen.writeNullField("owner"); + } else { + jgen.writeNumberField("owner", pet.getOwner().getId()); + } // write visits array jgen.writeArrayFieldStart("visits"); for (Visit visit : pet.getVisits()) { diff --git a/src/main/java/org/springframework/samples/petclinic/rest/OwnerRestController.java b/src/main/java/org/springframework/samples/petclinic/rest/OwnerRestController.java index ff60a276..4d9cb878 100644 --- a/src/main/java/org/springframework/samples/petclinic/rest/OwnerRestController.java +++ b/src/main/java/org/springframework/samples/petclinic/rest/OwnerRestController.java @@ -52,7 +52,7 @@ public class OwnerRestController { private ClinicService clinicService; @PreAuthorize( "hasRole(@roles.OWNER_ADMIN)" ) - @RequestMapping(value = "/*/lastname/{lastName}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_UTF8_VALUE) + @RequestMapping(value = "/*/lastname/{lastName}", method = RequestMethod.GET, produces = "application/json") public ResponseEntity<Collection<Owner>> getOwnersList(@PathVariable("lastName") String ownerLastName) { if (ownerLastName == null) { ownerLastName = ""; @@ -65,7 +65,7 @@ public class OwnerRestController { } @PreAuthorize( "hasRole(@roles.OWNER_ADMIN)" ) - @RequestMapping(value = "", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_UTF8_VALUE) + @RequestMapping(value = "", method = RequestMethod.GET, produces = "application/json") public ResponseEntity<Collection<Owner>> getOwners() { Collection<Owner> owners = this.clinicService.findAllOwners(); if (owners.isEmpty()) { @@ -75,7 +75,7 @@ public class OwnerRestController { } @PreAuthorize( "hasRole(@roles.OWNER_ADMIN)" ) - @RequestMapping(value = "/{ownerId}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_UTF8_VALUE) + @RequestMapping(value = "/{ownerId}", method = RequestMethod.GET, produces = "application/json") public ResponseEntity<Owner> getOwner(@PathVariable("ownerId") int ownerId) { Owner owner = null; owner = this.clinicService.findOwnerById(ownerId); @@ -86,12 +86,12 @@ public class OwnerRestController { } @PreAuthorize( "hasRole(@roles.OWNER_ADMIN)" ) - @RequestMapping(value = "", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_UTF8_VALUE) + @RequestMapping(value = "", method = RequestMethod.POST, produces = "application/json") public ResponseEntity<Owner> addOwner(@RequestBody @Valid Owner owner, BindingResult bindingResult, UriComponentsBuilder ucBuilder) { - BindingErrorsResponse errors = new BindingErrorsResponse(); HttpHeaders headers = new HttpHeaders(); - if (bindingResult.hasErrors() || (owner == null)) { + if (bindingResult.hasErrors() || owner.getId() != null) { + BindingErrorsResponse errors = new BindingErrorsResponse(owner.getId()); errors.addAllErrors(bindingResult); headers.add("errors", errors.toJSON()); return new ResponseEntity<Owner>(headers, HttpStatus.BAD_REQUEST); @@ -102,13 +102,14 @@ public class OwnerRestController { } @PreAuthorize( "hasRole(@roles.OWNER_ADMIN)" ) - @RequestMapping(value = "/{ownerId}", method = RequestMethod.PUT, produces = MediaType.APPLICATION_JSON_UTF8_VALUE) + @RequestMapping(value = "/{ownerId}", method = RequestMethod.PUT, produces = "application/json") public ResponseEntity<Owner> updateOwner(@PathVariable("ownerId") int ownerId, @RequestBody @Valid Owner owner, BindingResult bindingResult, UriComponentsBuilder ucBuilder) { - BindingErrorsResponse errors = new BindingErrorsResponse(); - HttpHeaders headers = new HttpHeaders(); - if (bindingResult.hasErrors() || (owner == null)) { + boolean bodyIdMatchesPathId = owner.getId() == null || ownerId == owner.getId(); + if (bindingResult.hasErrors() || !bodyIdMatchesPathId) { + BindingErrorsResponse errors = new BindingErrorsResponse(ownerId, owner.getId()); errors.addAllErrors(bindingResult); + HttpHeaders headers = new HttpHeaders(); headers.add("errors", errors.toJSON()); return new ResponseEntity<Owner>(headers, HttpStatus.BAD_REQUEST); } @@ -126,7 +127,7 @@ public class OwnerRestController { } @PreAuthorize( "hasRole(@roles.OWNER_ADMIN)" ) - @RequestMapping(value = "/{ownerId}", method = RequestMethod.DELETE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE) + @RequestMapping(value = "/{ownerId}", method = RequestMethod.DELETE, produces = "application/json") @Transactional public ResponseEntity<Void> deleteOwner(@PathVariable("ownerId") int ownerId) { Owner owner = this.clinicService.findOwnerById(ownerId); diff --git a/src/main/java/org/springframework/samples/petclinic/rest/PetRestController.java b/src/main/java/org/springframework/samples/petclinic/rest/PetRestController.java index 79d971d6..875956b0 100644 --- a/src/main/java/org/springframework/samples/petclinic/rest/PetRestController.java +++ b/src/main/java/org/springframework/samples/petclinic/rest/PetRestController.java @@ -53,7 +53,7 @@ public class PetRestController { private ClinicService clinicService; @PreAuthorize( "hasRole(@roles.OWNER_ADMIN)" ) - @RequestMapping(value = "/{petId}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_UTF8_VALUE) + @RequestMapping(value = "/{petId}", method = RequestMethod.GET, produces = "application/json") public ResponseEntity<Pet> getPet(@PathVariable("petId") int petId){ Pet pet = this.clinicService.findPetById(petId); if(pet == null){ @@ -63,7 +63,7 @@ public class PetRestController { } @PreAuthorize( "hasRole(@roles.OWNER_ADMIN)" ) - @RequestMapping(value = "", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_UTF8_VALUE) + @RequestMapping(value = "", method = RequestMethod.GET, produces = "application/json") public ResponseEntity<Collection<Pet>> getPets(){ Collection<Pet> pets = this.clinicService.findAllPets(); if(pets.isEmpty()){ @@ -73,13 +73,13 @@ public class PetRestController { } @PreAuthorize( "hasRole(@roles.OWNER_ADMIN)" ) - @RequestMapping(value = "/pettypes", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_UTF8_VALUE) + @RequestMapping(value = "/pettypes", method = RequestMethod.GET, produces = "application/json") public ResponseEntity<Collection<PetType>> getPetTypes(){ return new ResponseEntity<Collection<PetType>>(this.clinicService.findPetTypes(), HttpStatus.OK); } @PreAuthorize( "hasRole(@roles.OWNER_ADMIN)" ) - @RequestMapping(value = "", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_UTF8_VALUE) + @RequestMapping(value = "", method = RequestMethod.POST, produces = "application/json") public ResponseEntity<Pet> addPet(@RequestBody @Valid Pet pet, BindingResult bindingResult, UriComponentsBuilder ucBuilder){ BindingErrorsResponse errors = new BindingErrorsResponse(); HttpHeaders headers = new HttpHeaders(); @@ -94,7 +94,7 @@ public class PetRestController { } @PreAuthorize( "hasRole(@roles.OWNER_ADMIN)" ) - @RequestMapping(value = "/{petId}", method = RequestMethod.PUT, produces = MediaType.APPLICATION_JSON_UTF8_VALUE) + @RequestMapping(value = "/{petId}", method = RequestMethod.PUT, produces = "application/json") public ResponseEntity<Pet> updatePet(@PathVariable("petId") int petId, @RequestBody @Valid Pet pet, BindingResult bindingResult){ BindingErrorsResponse errors = new BindingErrorsResponse(); HttpHeaders headers = new HttpHeaders(); @@ -116,7 +116,7 @@ public class PetRestController { } @PreAuthorize( "hasRole(@roles.OWNER_ADMIN)" ) - @RequestMapping(value = "/{petId}", method = RequestMethod.DELETE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE) + @RequestMapping(value = "/{petId}", method = RequestMethod.DELETE, produces = "application/json") @Transactional public ResponseEntity<Void> deletePet(@PathVariable("petId") int petId){ Pet pet = this.clinicService.findPetById(petId); diff --git a/src/main/java/org/springframework/samples/petclinic/rest/PetTypeRestController.java b/src/main/java/org/springframework/samples/petclinic/rest/PetTypeRestController.java index e16f51e8..ff672876 100644 --- a/src/main/java/org/springframework/samples/petclinic/rest/PetTypeRestController.java +++ b/src/main/java/org/springframework/samples/petclinic/rest/PetTypeRestController.java @@ -48,7 +48,7 @@ public class PetTypeRestController { private ClinicService clinicService; @PreAuthorize( "hasAnyRole(@roles.OWNER_ADMIN, @roles.VET_ADMIN)" ) - @RequestMapping(value = "", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_UTF8_VALUE) + @RequestMapping(value = "", method = RequestMethod.GET, produces = "application/json") public ResponseEntity<Collection<PetType>> getAllPetTypes(){ Collection<PetType> petTypes = new ArrayList<PetType>(); petTypes.addAll(this.clinicService.findAllPetTypes()); @@ -59,7 +59,7 @@ public class PetTypeRestController { } @PreAuthorize( "hasAnyRole(@roles.OWNER_ADMIN, @roles.VET_ADMIN)" ) - @RequestMapping(value = "/{petTypeId}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_UTF8_VALUE) + @RequestMapping(value = "/{petTypeId}", method = RequestMethod.GET, produces = "application/json") public ResponseEntity<PetType> getPetType(@PathVariable("petTypeId") int petTypeId){ PetType petType = this.clinicService.findPetTypeById(petTypeId); if(petType == null){ @@ -69,7 +69,7 @@ public class PetTypeRestController { } @PreAuthorize( "hasRole(@roles.VET_ADMIN)" ) - @RequestMapping(value = "", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_UTF8_VALUE) + @RequestMapping(value = "", method = RequestMethod.POST, produces = "application/json") public ResponseEntity<PetType> addPetType(@RequestBody @Valid PetType petType, BindingResult bindingResult, UriComponentsBuilder ucBuilder){ BindingErrorsResponse errors = new BindingErrorsResponse(); HttpHeaders headers = new HttpHeaders(); @@ -84,7 +84,7 @@ public class PetTypeRestController { } @PreAuthorize( "hasRole(@roles.VET_ADMIN)" ) - @RequestMapping(value = "/{petTypeId}", method = RequestMethod.PUT, produces = MediaType.APPLICATION_JSON_UTF8_VALUE) + @RequestMapping(value = "/{petTypeId}", method = RequestMethod.PUT, produces = "application/json") public ResponseEntity<PetType> updatePetType(@PathVariable("petTypeId") int petTypeId, @RequestBody @Valid PetType petType, BindingResult bindingResult){ BindingErrorsResponse errors = new BindingErrorsResponse(); HttpHeaders headers = new HttpHeaders(); @@ -103,7 +103,7 @@ public class PetTypeRestController { } @PreAuthorize( "hasRole(@roles.VET_ADMIN)" ) - @RequestMapping(value = "/{petTypeId}", method = RequestMethod.DELETE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE) + @RequestMapping(value = "/{petTypeId}", method = RequestMethod.DELETE, produces = "application/json") @Transactional public ResponseEntity<Void> deletePetType(@PathVariable("petTypeId") int petTypeId){ PetType petType = this.clinicService.findPetTypeById(petTypeId); diff --git a/src/main/java/org/springframework/samples/petclinic/rest/SpecialtyRestController.java b/src/main/java/org/springframework/samples/petclinic/rest/SpecialtyRestController.java index eb63b706..6680e729 100644 --- a/src/main/java/org/springframework/samples/petclinic/rest/SpecialtyRestController.java +++ b/src/main/java/org/springframework/samples/petclinic/rest/SpecialtyRestController.java @@ -53,7 +53,7 @@ public class SpecialtyRestController { private ClinicService clinicService; @PreAuthorize( "hasRole(@roles.VET_ADMIN)" ) - @RequestMapping(value = "", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_UTF8_VALUE) + @RequestMapping(value = "", method = RequestMethod.GET, produces = "application/json") public ResponseEntity<Collection<Specialty>> getAllSpecialtys(){ Collection<Specialty> specialties = new ArrayList<Specialty>(); specialties.addAll(this.clinicService.findAllSpecialties()); @@ -64,7 +64,7 @@ public class SpecialtyRestController { } @PreAuthorize( "hasRole(@roles.VET_ADMIN)" ) - @RequestMapping(value = "/{specialtyId}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_UTF8_VALUE) + @RequestMapping(value = "/{specialtyId}", method = RequestMethod.GET, produces = "application/json") public ResponseEntity<Specialty> getSpecialty(@PathVariable("specialtyId") int specialtyId){ Specialty specialty = this.clinicService.findSpecialtyById(specialtyId); if(specialty == null){ @@ -74,7 +74,7 @@ public class SpecialtyRestController { } @PreAuthorize( "hasRole(@roles.VET_ADMIN)" ) - @RequestMapping(value = "", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_UTF8_VALUE) + @RequestMapping(value = "", method = RequestMethod.POST, produces = "application/json") public ResponseEntity<Specialty> addSpecialty(@RequestBody @Valid Specialty specialty, BindingResult bindingResult, UriComponentsBuilder ucBuilder){ BindingErrorsResponse errors = new BindingErrorsResponse(); HttpHeaders headers = new HttpHeaders(); @@ -89,7 +89,7 @@ public class SpecialtyRestController { } @PreAuthorize( "hasRole(@roles.VET_ADMIN)" ) - @RequestMapping(value = "/{specialtyId}", method = RequestMethod.PUT, produces = MediaType.APPLICATION_JSON_UTF8_VALUE) + @RequestMapping(value = "/{specialtyId}", method = RequestMethod.PUT, produces = "application/json") public ResponseEntity<Specialty> updateSpecialty(@PathVariable("specialtyId") int specialtyId, @RequestBody @Valid Specialty specialty, BindingResult bindingResult){ BindingErrorsResponse errors = new BindingErrorsResponse(); HttpHeaders headers = new HttpHeaders(); @@ -108,7 +108,7 @@ public class SpecialtyRestController { } @PreAuthorize( "hasRole(@roles.VET_ADMIN)" ) - @RequestMapping(value = "/{specialtyId}", method = RequestMethod.DELETE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE) + @RequestMapping(value = "/{specialtyId}", method = RequestMethod.DELETE, produces = "application/json") @Transactional public ResponseEntity<Void> deleteSpecialty(@PathVariable("specialtyId") int specialtyId){ Specialty specialty = this.clinicService.findSpecialtyById(specialtyId); diff --git a/src/main/java/org/springframework/samples/petclinic/rest/UserRestController.java b/src/main/java/org/springframework/samples/petclinic/rest/UserRestController.java index 7abb07cb..47ad14b7 100644 --- a/src/main/java/org/springframework/samples/petclinic/rest/UserRestController.java +++ b/src/main/java/org/springframework/samples/petclinic/rest/UserRestController.java @@ -42,7 +42,7 @@ public class UserRestController { private UserService userService; @PreAuthorize( "hasRole(@roles.ADMIN)" ) - @RequestMapping(value = "", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_UTF8_VALUE) + @RequestMapping(value = "", method = RequestMethod.POST, produces = "application/json") public ResponseEntity<User> addOwner(@RequestBody @Valid User user, BindingResult bindingResult) throws Exception { BindingErrorsResponse errors = new BindingErrorsResponse(); HttpHeaders headers = new HttpHeaders(); diff --git a/src/main/java/org/springframework/samples/petclinic/rest/VetRestController.java b/src/main/java/org/springframework/samples/petclinic/rest/VetRestController.java index c666976e..7570173a 100644 --- a/src/main/java/org/springframework/samples/petclinic/rest/VetRestController.java +++ b/src/main/java/org/springframework/samples/petclinic/rest/VetRestController.java @@ -53,7 +53,7 @@ public class VetRestController { private ClinicService clinicService; @PreAuthorize( "hasRole(@roles.VET_ADMIN)" ) - @RequestMapping(value = "", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_UTF8_VALUE) + @RequestMapping(value = "", method = RequestMethod.GET, produces = "application/json") public ResponseEntity<Collection<Vet>> getAllVets(){ Collection<Vet> vets = new ArrayList<Vet>(); vets.addAll(this.clinicService.findAllVets()); @@ -64,7 +64,7 @@ public class VetRestController { } @PreAuthorize( "hasRole(@roles.VET_ADMIN)" ) - @RequestMapping(value = "/{vetId}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_UTF8_VALUE) + @RequestMapping(value = "/{vetId}", method = RequestMethod.GET, produces = "application/json") public ResponseEntity<Vet> getVet(@PathVariable("vetId") int vetId){ Vet vet = this.clinicService.findVetById(vetId); if(vet == null){ @@ -74,7 +74,7 @@ public class VetRestController { } @PreAuthorize( "hasRole(@roles.VET_ADMIN)" ) - @RequestMapping(value = "", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_UTF8_VALUE) + @RequestMapping(value = "", method = RequestMethod.POST, produces = "application/json") public ResponseEntity<Vet> addVet(@RequestBody @Valid Vet vet, BindingResult bindingResult, UriComponentsBuilder ucBuilder){ BindingErrorsResponse errors = new BindingErrorsResponse(); HttpHeaders headers = new HttpHeaders(); @@ -89,7 +89,7 @@ public class VetRestController { } @PreAuthorize( "hasRole(@roles.VET_ADMIN)" ) - @RequestMapping(value = "/{vetId}", method = RequestMethod.PUT, produces = MediaType.APPLICATION_JSON_UTF8_VALUE) + @RequestMapping(value = "/{vetId}", method = RequestMethod.PUT, produces = "application/json") public ResponseEntity<Vet> updateVet(@PathVariable("vetId") int vetId, @RequestBody @Valid Vet vet, BindingResult bindingResult){ BindingErrorsResponse errors = new BindingErrorsResponse(); HttpHeaders headers = new HttpHeaders(); @@ -113,7 +113,7 @@ public class VetRestController { } @PreAuthorize( "hasRole(@roles.VET_ADMIN)" ) - @RequestMapping(value = "/{vetId}", method = RequestMethod.DELETE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE) + @RequestMapping(value = "/{vetId}", method = RequestMethod.DELETE, produces = "application/json") @Transactional public ResponseEntity<Void> deleteVet(@PathVariable("vetId") int vetId){ Vet vet = this.clinicService.findVetById(vetId); diff --git a/src/main/java/org/springframework/samples/petclinic/rest/VisitRestController.java b/src/main/java/org/springframework/samples/petclinic/rest/VisitRestController.java index ba1638e6..92fe1531 100644 --- a/src/main/java/org/springframework/samples/petclinic/rest/VisitRestController.java +++ b/src/main/java/org/springframework/samples/petclinic/rest/VisitRestController.java @@ -53,7 +53,7 @@ public class VisitRestController { private ClinicService clinicService; @PreAuthorize( "hasRole(@roles.OWNER_ADMIN)" ) - @RequestMapping(value = "", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_UTF8_VALUE) + @RequestMapping(value = "", method = RequestMethod.GET, produces = "application/json") public ResponseEntity<Collection<Visit>> getAllVisits(){ Collection<Visit> visits = new ArrayList<Visit>(); visits.addAll(this.clinicService.findAllVisits()); @@ -64,7 +64,7 @@ public class VisitRestController { } @PreAuthorize( "hasRole(@roles.OWNER_ADMIN)" ) - @RequestMapping(value = "/{visitId}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_UTF8_VALUE) + @RequestMapping(value = "/{visitId}", method = RequestMethod.GET, produces = "application/json") public ResponseEntity<Visit> getVisit(@PathVariable("visitId") int visitId){ Visit visit = this.clinicService.findVisitById(visitId); if(visit == null){ @@ -74,7 +74,7 @@ public class VisitRestController { } @PreAuthorize( "hasRole(@roles.OWNER_ADMIN)" ) - @RequestMapping(value = "", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_UTF8_VALUE) + @RequestMapping(value = "", method = RequestMethod.POST, produces = "application/json") public ResponseEntity<Visit> addVisit(@RequestBody @Valid Visit visit, BindingResult bindingResult, UriComponentsBuilder ucBuilder){ BindingErrorsResponse errors = new BindingErrorsResponse(); HttpHeaders headers = new HttpHeaders(); @@ -89,7 +89,7 @@ public class VisitRestController { } @PreAuthorize( "hasRole(@roles.OWNER_ADMIN)" ) - @RequestMapping(value = "/{visitId}", method = RequestMethod.PUT, produces = MediaType.APPLICATION_JSON_UTF8_VALUE) + @RequestMapping(value = "/{visitId}", method = RequestMethod.PUT, produces = "application/json") public ResponseEntity<Visit> updateVisit(@PathVariable("visitId") int visitId, @RequestBody @Valid Visit visit, BindingResult bindingResult){ BindingErrorsResponse errors = new BindingErrorsResponse(); HttpHeaders headers = new HttpHeaders(); @@ -110,7 +110,7 @@ public class VisitRestController { } @PreAuthorize( "hasRole(@roles.OWNER_ADMIN)" ) - @RequestMapping(value = "/{visitId}", method = RequestMethod.DELETE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE) + @RequestMapping(value = "/{visitId}", method = RequestMethod.DELETE, produces = "application/json") @Transactional public ResponseEntity<Void> deleteVisit(@PathVariable("visitId") int visitId){ Visit visit = this.clinicService.findVisitById(visitId); diff --git a/src/main/java/org/springframework/samples/petclinic/util/ApplicationSwaggerConfig.java b/src/main/java/org/springframework/samples/petclinic/util/ApplicationSwaggerConfig.java index 0cc4ba68..18df3bd7 100644 --- a/src/main/java/org/springframework/samples/petclinic/util/ApplicationSwaggerConfig.java +++ b/src/main/java/org/springframework/samples/petclinic/util/ApplicationSwaggerConfig.java @@ -29,9 +29,11 @@ import springfox.documentation.spi.DocumentationType; import springfox.documentation.spring.web.plugins.Docket; import springfox.documentation.swagger2.annotations.EnableSwagger2; +import java.util.Collections; + /** * Java config for Springfox swagger documentation plugin - * + * * @author Vitaliy Fedoriv * */ @@ -62,7 +64,7 @@ public class ApplicationSwaggerConfig { "https://github.com/spring-petclinic/spring-petclinic-rest", "vitaliy.fedoriv@gmail.com"), "Apache 2.0", - "http://www.apache.org/licenses/LICENSE-2.0"); + "http://www.apache.org/licenses/LICENSE-2.0", Collections.emptyList()); } diff --git a/src/test/java/org/springframework/samples/petclinic/rest/OwnerRestControllerTests.java b/src/test/java/org/springframework/samples/petclinic/rest/OwnerRestControllerTests.java index 75d8f5f8..57147a55 100644 --- a/src/test/java/org/springframework/samples/petclinic/rest/OwnerRestControllerTests.java +++ b/src/test/java/org/springframework/samples/petclinic/rest/OwnerRestControllerTests.java @@ -21,11 +21,10 @@ import static org.springframework.test.web.servlet.request.MockMvcRequestBuilder import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; import java.util.ArrayList; +import java.util.Date; import java.util.List; import org.junit.Before; @@ -36,6 +35,9 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.http.MediaType; import org.springframework.samples.petclinic.model.Owner; +import org.springframework.samples.petclinic.model.Pet; +import org.springframework.samples.petclinic.model.PetType; +import org.springframework.samples.petclinic.model.Visit; import org.springframework.samples.petclinic.service.clinicService.ApplicationTestConfig; import org.springframework.samples.petclinic.service.ClinicService; import org.springframework.security.test.context.support.WithMockUser; @@ -76,16 +78,17 @@ public class OwnerRestControllerTests { .build(); owners = new ArrayList<Owner>(); - Owner owner = new Owner(); - owner.setId(1); - owner.setFirstName("George"); - owner.setLastName("Franklin"); - owner.setAddress("110 W. Liberty St."); - owner.setCity("Madison"); - owner.setTelephone("6085551023"); - owners.add(owner); - - owner = new Owner(); + Owner ownerWithPet = new Owner(); + ownerWithPet.setId(1); + ownerWithPet.setFirstName("George"); + ownerWithPet.setLastName("Franklin"); + ownerWithPet.setAddress("110 W. Liberty St."); + ownerWithPet.setCity("Madison"); + ownerWithPet.setTelephone("6085551023"); + ownerWithPet.addPet(getTestPetWithIdAndName(ownerWithPet, 1, "Rosy")); + owners.add(ownerWithPet); + + Owner owner = new Owner(); owner.setId(2); owner.setFirstName("Betty"); owner.setLastName("Davis"); @@ -111,8 +114,29 @@ public class OwnerRestControllerTests { owner.setCity("Windsor"); owner.setTelephone("6085553198"); owners.add(owner); + } + private Pet getTestPetWithIdAndName(final Owner owner, final int id, final String name) { + PetType petType = new PetType(); + petType.setId(2); + petType.setName("dog"); + Pet pet = new Pet(); + pet.setId(id); + pet.setName(name); + pet.setBirthDate(new Date()); + pet.setOwner(owner); + pet.setType(petType); + pet.addVisit(getTestVisitForPet(pet, 1)); + return pet; + } + private Visit getTestVisitForPet(final Pet pet, final int id) { + Visit visit = new Visit(); + visit.setId(id); + visit.setPet(pet); + visit.setDate(new Date()); + visit.setDescription("test" + id); + return visit; } @Test @@ -122,7 +146,7 @@ public class OwnerRestControllerTests { this.mockMvc.perform(get("/api/owners/1") .accept(MediaType.APPLICATION_JSON_VALUE)) .andExpect(status().isOk()) - .andExpect(content().contentType("application/json;charset=UTF-8")) + .andExpect(content().contentType("application/json")) .andExpect(jsonPath("$.id").value(1)) .andExpect(jsonPath("$.firstName").value("George")); } @@ -145,7 +169,7 @@ public class OwnerRestControllerTests { this.mockMvc.perform(get("/api/owners/*/lastname/Davis") .accept(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()) - .andExpect(content().contentType("application/json;charset=UTF-8")) + .andExpect(content().contentType("application/json")) .andExpect(jsonPath("$.[0].id").value(2)) .andExpect(jsonPath("$.[0].firstName").value("Betty")) .andExpect(jsonPath("$.[1].id").value(4)) @@ -171,7 +195,7 @@ public class OwnerRestControllerTests { this.mockMvc.perform(get("/api/owners/") .accept(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()) - .andExpect(content().contentType("application/json;charset=UTF-8")) + .andExpect(content().contentType("application/json")) .andExpect(jsonPath("$.[0].id").value(2)) .andExpect(jsonPath("$.[0].firstName").value("Betty")) .andExpect(jsonPath("$.[1].id").value(4)) @@ -192,7 +216,7 @@ public class OwnerRestControllerTests { @WithMockUser(roles="OWNER_ADMIN") public void testCreateOwnerSuccess() throws Exception { Owner newOwner = owners.get(0); - newOwner.setId(999); + newOwner.setId(null); ObjectMapper mapper = new ObjectMapper(); String newOwnerAsJSON = mapper.writeValueAsString(newOwner); this.mockMvc.perform(post("/api/owners/") @@ -200,6 +224,20 @@ public class OwnerRestControllerTests { .andExpect(status().isCreated()); } + @Test + @WithMockUser(roles="OWNER_ADMIN") + public void testCreateOwnerErrorIdSpecified() throws Exception { + Owner newOwner = owners.get(0); + newOwner.setId(999); + ObjectMapper mapper = new ObjectMapper(); + String newOwnerAsJSON = mapper.writeValueAsString(newOwner); + this.mockMvc.perform(post("/api/owners/") + .content(newOwnerAsJSON).accept(MediaType.APPLICATION_JSON_VALUE).contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(status().isBadRequest()) + .andExpect(header().string("errors", + "[{\"objectName\":\"body\",\"fieldName\":\"id\",\"fieldValue\":\"999\",\"errorMessage\":\"must not be specified\"}]")); + } + @Test @WithMockUser(roles="OWNER_ADMIN") public void testCreateOwnerError() throws Exception { @@ -216,25 +254,79 @@ public class OwnerRestControllerTests { @Test @WithMockUser(roles="OWNER_ADMIN") public void testUpdateOwnerSuccess() throws Exception { + given(this.clinicService.findOwnerById(1)).willReturn(owners.get(0)); + int ownerId = owners.get(0).getId(); + Owner updatedOwner = new Owner(); + // body.id = ownerId which is used in url path + updatedOwner.setId(ownerId); + updatedOwner.setFirstName("George I"); + updatedOwner.setLastName("Franklin"); + updatedOwner.setAddress("110 W. Liberty St."); + updatedOwner.setCity("Madison"); + updatedOwner.setTelephone("6085551023"); + ObjectMapper mapper = new ObjectMapper(); + String newOwnerAsJSON = mapper.writeValueAsString(updatedOwner); + this.mockMvc.perform(put("/api/owners/" + ownerId) + .content(newOwnerAsJSON).accept(MediaType.APPLICATION_JSON_VALUE).contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(content().contentType("application/json")) + .andExpect(status().isNoContent()); + + this.mockMvc.perform(get("/api/owners/" + ownerId) + .accept(MediaType.APPLICATION_JSON).contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(status().isOk()) + .andExpect(content().contentType("application/json")) + .andExpect(jsonPath("$.id").value(ownerId)) + .andExpect(jsonPath("$.firstName").value("George I")); + + } + @Test + @WithMockUser(roles="OWNER_ADMIN") + public void testUpdateOwnerSuccessNoBodyId() throws Exception { given(this.clinicService.findOwnerById(1)).willReturn(owners.get(0)); - Owner newOwner = owners.get(0); - newOwner.setFirstName("George I"); + int ownerId = owners.get(0).getId(); + Owner updatedOwner = new Owner(); + updatedOwner.setFirstName("George I"); + updatedOwner.setLastName("Franklin"); + updatedOwner.setAddress("110 W. Liberty St."); + updatedOwner.setCity("Madison"); + updatedOwner.setTelephone("6085551023"); ObjectMapper mapper = new ObjectMapper(); - String newOwnerAsJSON = mapper.writeValueAsString(newOwner); - this.mockMvc.perform(put("/api/owners/1") + String newOwnerAsJSON = mapper.writeValueAsString(updatedOwner); + this.mockMvc.perform(put("/api/owners/" + ownerId) .content(newOwnerAsJSON).accept(MediaType.APPLICATION_JSON_VALUE).contentType(MediaType.APPLICATION_JSON_VALUE)) - .andExpect(content().contentType("application/json;charset=UTF-8")) + .andExpect(content().contentType("application/json")) .andExpect(status().isNoContent()); - this.mockMvc.perform(get("/api/owners/1") + this.mockMvc.perform(get("/api/owners/" + ownerId) .accept(MediaType.APPLICATION_JSON).contentType(MediaType.APPLICATION_JSON_VALUE)) .andExpect(status().isOk()) - .andExpect(content().contentType("application/json;charset=UTF-8")) - .andExpect(jsonPath("$.id").value(1)) + .andExpect(content().contentType("application/json")) + .andExpect(jsonPath("$.id").value(ownerId)) .andExpect(jsonPath("$.firstName").value("George I")); } + @Test + @WithMockUser(roles="OWNER_ADMIN") + public void testUpdateOwnerErrorBodyIdMismatchWithPathId() throws Exception { + int ownerId = owners.get(0).getId(); + Owner updatedOwner = new Owner(); + // body.id != ownerId + updatedOwner.setId(-1); + updatedOwner.setFirstName("George I"); + updatedOwner.setLastName("Franklin"); + updatedOwner.setAddress("110 W. Liberty St."); + updatedOwner.setCity("Madison"); + updatedOwner.setTelephone("6085551023"); + ObjectMapper mapper = new ObjectMapper(); + String newOwnerAsJSON = mapper.writeValueAsString(updatedOwner); + this.mockMvc.perform(put("/api/owners/" + ownerId) + .content(newOwnerAsJSON).accept(MediaType.APPLICATION_JSON_VALUE).contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(status().isBadRequest()) + .andExpect(header().string("errors", + "[{\"objectName\":\"body\",\"fieldName\":\"id\",\"fieldValue\":\"-1\",\"errorMessage\":\"does not match pathId: 1\"}]")); + } + @Test @WithMockUser(roles="OWNER_ADMIN") public void testUpdateOwnerError() throws Exception { diff --git a/src/test/java/org/springframework/samples/petclinic/rest/PetRestControllerTests.java b/src/test/java/org/springframework/samples/petclinic/rest/PetRestControllerTests.java index 1a421170..9513f34b 100644 --- a/src/test/java/org/springframework/samples/petclinic/rest/PetRestControllerTests.java +++ b/src/test/java/org/springframework/samples/petclinic/rest/PetRestControllerTests.java @@ -46,6 +46,7 @@ import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.web.WebAppConfiguration; import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.result.MockMvcResultHandlers; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import com.fasterxml.jackson.databind.ObjectMapper; @@ -116,7 +117,7 @@ public class PetRestControllerTests { this.mockMvc.perform(get("/api/pets/3") .accept(MediaType.APPLICATION_JSON_VALUE)) .andExpect(status().isOk()) - .andExpect(content().contentType("application/json;charset=UTF-8")) + .andExpect(content().contentType("application/json")) .andExpect(jsonPath("$.id").value(3)) .andExpect(jsonPath("$.name").value("Rosy")); } @@ -137,7 +138,7 @@ public class PetRestControllerTests { this.mockMvc.perform(get("/api/pets/") .accept(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()) - .andExpect(content().contentType("application/json;charset=UTF-8")) + .andExpect(content().contentType("application/json")) .andExpect(jsonPath("$.[0].id").value(3)) .andExpect(jsonPath("$.[0].name").value("Rosy")) .andExpect(jsonPath("$.[1].id").value(4)) @@ -176,7 +177,7 @@ public class PetRestControllerTests { String newPetAsJSON = mapper.writeValueAsString(newPet); this.mockMvc.perform(post("/api/pets/") .content(newPetAsJSON).accept(MediaType.APPLICATION_JSON_VALUE).contentType(MediaType.APPLICATION_JSON_VALUE)) - .andExpect(status().isBadRequest()); + .andExpect(status().isBadRequest()).andDo(MockMvcResultHandlers.print()); } @Test @@ -189,13 +190,13 @@ public class PetRestControllerTests { String newPetAsJSON = mapper.writeValueAsString(newPet); this.mockMvc.perform(put("/api/pets/3") .content(newPetAsJSON).accept(MediaType.APPLICATION_JSON_VALUE).contentType(MediaType.APPLICATION_JSON_VALUE)) - .andExpect(content().contentType("application/json;charset=UTF-8")) + .andExpect(content().contentType("application/json")) .andExpect(status().isNoContent()); this.mockMvc.perform(get("/api/pets/3") .accept(MediaType.APPLICATION_JSON).contentType(MediaType.APPLICATION_JSON_VALUE)) .andExpect(status().isOk()) - .andExpect(content().contentType("application/json;charset=UTF-8")) + .andExpect(content().contentType("application/json")) .andExpect(jsonPath("$.id").value(3)) .andExpect(jsonPath("$.name").value("Rosy I")); diff --git a/src/test/java/org/springframework/samples/petclinic/rest/PetTypeRestControllerTests.java b/src/test/java/org/springframework/samples/petclinic/rest/PetTypeRestControllerTests.java index e0a3c7cb..089cebfb 100644 --- a/src/test/java/org/springframework/samples/petclinic/rest/PetTypeRestControllerTests.java +++ b/src/test/java/org/springframework/samples/petclinic/rest/PetTypeRestControllerTests.java @@ -104,7 +104,7 @@ public class PetTypeRestControllerTests { this.mockMvc.perform(get("/api/pettypes/1") .accept(MediaType.APPLICATION_JSON_VALUE)) .andExpect(status().isOk()) - .andExpect(content().contentType("application/json;charset=UTF-8")) + .andExpect(content().contentType("application/json")) .andExpect(jsonPath("$.id").value(1)) .andExpect(jsonPath("$.name").value("cat")); } @@ -116,7 +116,7 @@ public class PetTypeRestControllerTests { this.mockMvc.perform(get("/api/pettypes/1") .accept(MediaType.APPLICATION_JSON_VALUE)) .andExpect(status().isOk()) - .andExpect(content().contentType("application/json;charset=UTF-8")) + .andExpect(content().contentType("application/json")) .andExpect(jsonPath("$.id").value(1)) .andExpect(jsonPath("$.name").value("cat")); } @@ -139,7 +139,7 @@ public class PetTypeRestControllerTests { this.mockMvc.perform(get("/api/pettypes/") .accept(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()) - .andExpect(content().contentType("application/json;charset=UTF-8")) + .andExpect(content().contentType("application/json")) .andExpect(jsonPath("$.[0].id").value(2)) .andExpect(jsonPath("$.[0].name").value("dog")) .andExpect(jsonPath("$.[1].id").value(4)) @@ -155,7 +155,7 @@ public class PetTypeRestControllerTests { this.mockMvc.perform(get("/api/pettypes/") .accept(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()) - .andExpect(content().contentType("application/json;charset=UTF-8")) + .andExpect(content().contentType("application/json")) .andExpect(jsonPath("$.[0].id").value(2)) .andExpect(jsonPath("$.[0].name").value("dog")) .andExpect(jsonPath("$.[1].id").value(4)) @@ -207,13 +207,13 @@ public class PetTypeRestControllerTests { String newPetTypeAsJSON = mapper.writeValueAsString(newPetType); this.mockMvc.perform(put("/api/pettypes/2") .content(newPetTypeAsJSON).accept(MediaType.APPLICATION_JSON_VALUE).contentType(MediaType.APPLICATION_JSON_VALUE)) - .andExpect(content().contentType("application/json;charset=UTF-8")) + .andExpect(content().contentType("application/json")) .andExpect(status().isNoContent()); this.mockMvc.perform(get("/api/pettypes/2") .accept(MediaType.APPLICATION_JSON).contentType(MediaType.APPLICATION_JSON_VALUE)) .andExpect(status().isOk()) - .andExpect(content().contentType("application/json;charset=UTF-8")) + .andExpect(content().contentType("application/json")) .andExpect(jsonPath("$.id").value(2)) .andExpect(jsonPath("$.name").value("dog I")); } diff --git a/src/test/java/org/springframework/samples/petclinic/rest/SpecialtyRestControllerTests.java b/src/test/java/org/springframework/samples/petclinic/rest/SpecialtyRestControllerTests.java index 1f99c1cc..c4592101 100644 --- a/src/test/java/org/springframework/samples/petclinic/rest/SpecialtyRestControllerTests.java +++ b/src/test/java/org/springframework/samples/petclinic/rest/SpecialtyRestControllerTests.java @@ -99,7 +99,7 @@ public class SpecialtyRestControllerTests { this.mockMvc.perform(get("/api/specialties/1") .accept(MediaType.APPLICATION_JSON_VALUE)) .andExpect(status().isOk()) - .andExpect(content().contentType("application/json;charset=UTF-8")) + .andExpect(content().contentType("application/json")) .andExpect(jsonPath("$.id").value(1)) .andExpect(jsonPath("$.name").value("radiology")); } @@ -121,7 +121,7 @@ public class SpecialtyRestControllerTests { this.mockMvc.perform(get("/api/specialties/") .accept(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()) - .andExpect(content().contentType("application/json;charset=UTF-8")) + .andExpect(content().contentType("application/json")) .andExpect(jsonPath("$.[0].id").value(2)) .andExpect(jsonPath("$.[0].name").value("surgery")) .andExpect(jsonPath("$.[1].id").value(3)) @@ -173,13 +173,13 @@ public class SpecialtyRestControllerTests { String newSpecialtyAsJSON = mapper.writeValueAsString(newSpecialty); this.mockMvc.perform(put("/api/specialties/2") .content(newSpecialtyAsJSON).accept(MediaType.APPLICATION_JSON_VALUE).contentType(MediaType.APPLICATION_JSON_VALUE)) - .andExpect(content().contentType("application/json;charset=UTF-8")) + .andExpect(content().contentType("application/json")) .andExpect(status().isNoContent()); this.mockMvc.perform(get("/api/specialties/2") .accept(MediaType.APPLICATION_JSON).contentType(MediaType.APPLICATION_JSON_VALUE)) .andExpect(status().isOk()) - .andExpect(content().contentType("application/json;charset=UTF-8")) + .andExpect(content().contentType("application/json")) .andExpect(jsonPath("$.id").value(2)) .andExpect(jsonPath("$.name").value("surgery I")); } diff --git a/src/test/java/org/springframework/samples/petclinic/rest/VetRestControllerTests.java b/src/test/java/org/springframework/samples/petclinic/rest/VetRestControllerTests.java index 9358b6da..a6ab35ce 100644 --- a/src/test/java/org/springframework/samples/petclinic/rest/VetRestControllerTests.java +++ b/src/test/java/org/springframework/samples/petclinic/rest/VetRestControllerTests.java @@ -102,7 +102,7 @@ public class VetRestControllerTests { this.mockMvc.perform(get("/api/vets/1") .accept(MediaType.APPLICATION_JSON_VALUE)) .andExpect(status().isOk()) - .andExpect(content().contentType("application/json;charset=UTF-8")) + .andExpect(content().contentType("application/json")) .andExpect(jsonPath("$.id").value(1)) .andExpect(jsonPath("$.firstName").value("James")); } @@ -123,7 +123,7 @@ public class VetRestControllerTests { this.mockMvc.perform(get("/api/vets/") .accept(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()) - .andExpect(content().contentType("application/json;charset=UTF-8")) + .andExpect(content().contentType("application/json")) .andExpect(jsonPath("$.[0].id").value(1)) .andExpect(jsonPath("$.[0].firstName").value("James")) .andExpect(jsonPath("$.[1].id").value(2)) @@ -175,13 +175,13 @@ public class VetRestControllerTests { String newVetAsJSON = mapper.writeValueAsString(newVet); this.mockMvc.perform(put("/api/vets/1") .content(newVetAsJSON).accept(MediaType.APPLICATION_JSON_VALUE).contentType(MediaType.APPLICATION_JSON_VALUE)) - .andExpect(content().contentType("application/json;charset=UTF-8")) + .andExpect(content().contentType("application/json")) .andExpect(status().isNoContent()); this.mockMvc.perform(get("/api/vets/1") .accept(MediaType.APPLICATION_JSON).contentType(MediaType.APPLICATION_JSON_VALUE)) .andExpect(status().isOk()) - .andExpect(content().contentType("application/json;charset=UTF-8")) + .andExpect(content().contentType("application/json")) .andExpect(jsonPath("$.id").value(1)) .andExpect(jsonPath("$.firstName").value("James")); diff --git a/src/test/java/org/springframework/samples/petclinic/rest/VisitRestControllerTests.java b/src/test/java/org/springframework/samples/petclinic/rest/VisitRestControllerTests.java index 1d0c1b2a..e318080e 100644 --- a/src/test/java/org/springframework/samples/petclinic/rest/VisitRestControllerTests.java +++ b/src/test/java/org/springframework/samples/petclinic/rest/VisitRestControllerTests.java @@ -125,7 +125,7 @@ public class VisitRestControllerTests { this.mockMvc.perform(get("/api/visits/2") .accept(MediaType.APPLICATION_JSON_VALUE)) .andExpect(status().isOk()) - .andExpect(content().contentType("application/json;charset=UTF-8")) + .andExpect(content().contentType("application/json")) .andExpect(jsonPath("$.id").value(2)) .andExpect(jsonPath("$.description").value("rabies shot")); } @@ -146,7 +146,7 @@ public class VisitRestControllerTests { this.mockMvc.perform(get("/api/visits/") .accept(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()) - .andExpect(content().contentType("application/json;charset=UTF-8")) + .andExpect(content().contentType("application/json")) .andExpect(jsonPath("$.[0].id").value(2)) .andExpect(jsonPath("$.[0].description").value("rabies shot")) .andExpect(jsonPath("$.[1].id").value(3)) @@ -199,13 +199,13 @@ public class VisitRestControllerTests { String newVisitAsJSON = mapper.writeValueAsString(newVisit); this.mockMvc.perform(put("/api/visits/2") .content(newVisitAsJSON).accept(MediaType.APPLICATION_JSON_VALUE).contentType(MediaType.APPLICATION_JSON_VALUE)) - .andExpect(content().contentType("application/json;charset=UTF-8")) + .andExpect(content().contentType("application/json")) .andExpect(status().isNoContent()); this.mockMvc.perform(get("/api/visits/2") .accept(MediaType.APPLICATION_JSON).contentType(MediaType.APPLICATION_JSON_VALUE)) .andExpect(status().isOk()) - .andExpect(content().contentType("application/json;charset=UTF-8")) + .andExpect(content().contentType("application/json")) .andExpect(jsonPath("$.id").value(2)) .andExpect(jsonPath("$.description").value("rabies shot test")); } -- GitLab