From c873dd2cb9b4307bc4ff38d48426dd1fe4f81be4 Mon Sep 17 00:00:00 2001
From: Alexandre Touret <alexandre.touret@free.fr>
Date: Fri, 15 Oct 2021 17:46:28 +0200
Subject: [PATCH] feat: add Owner entity and trying to resolve cyclic
 dependency

---
 .../samples/petclinic/mapper/OwnerMapper.java |  17 +
 .../samples/petclinic/model/Owner.java        |   6 -
 .../samples/petclinic/model/Pet.java          |  21 +-
 .../petclinic/rest/OwnerRestController.java   |  83 ++--
 .../petclinic/rest/PetRestController.java     |  76 +---
 .../rest/OwnerRestControllerTests.java        | 357 +++++++++---------
 6 files changed, 246 insertions(+), 314 deletions(-)
 create mode 100755 src/main/java/org/springframework/samples/petclinic/mapper/OwnerMapper.java

diff --git a/src/main/java/org/springframework/samples/petclinic/mapper/OwnerMapper.java b/src/main/java/org/springframework/samples/petclinic/mapper/OwnerMapper.java
new file mode 100755
index 00000000..52f01626
--- /dev/null
+++ b/src/main/java/org/springframework/samples/petclinic/mapper/OwnerMapper.java
@@ -0,0 +1,17 @@
+package org.springframework.samples.petclinic.mapper;
+
+import org.mapstruct.Mapper;
+import org.springframework.samples.petclinic.dto.OwnerDto;
+import org.springframework.samples.petclinic.model.Owner;
+
+import java.util.Collection;
+import java.util.List;
+
+@Mapper
+public interface OwnerMapper {
+
+    OwnerDto toOwnerDto(Owner owner);
+    Owner toOwner(OwnerDto ownerDto);
+    Collection<OwnerDto> toOwnerDtoCollection(Collection<Owner> ownerCollection);
+    Collection<Owner> toOwners(Collection<OwnerDto> ownerDtos);
+}
diff --git a/src/main/java/org/springframework/samples/petclinic/model/Owner.java b/src/main/java/org/springframework/samples/petclinic/model/Owner.java
index e957e86a..2faa7c57 100644
--- a/src/main/java/org/springframework/samples/petclinic/model/Owner.java
+++ b/src/main/java/org/springframework/samples/petclinic/model/Owner.java
@@ -36,9 +36,6 @@ import org.springframework.core.style.ToStringCreator;
 import org.springframework.samples.petclinic.rest.JacksonCustomOwnerDeserializer;
 import org.springframework.samples.petclinic.rest.JacksonCustomOwnerSerializer;
 
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
-import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 
 /**
  * Simple JavaBean domain object representing an owner.
@@ -50,8 +47,6 @@ import com.fasterxml.jackson.databind.annotation.JsonSerialize;
  */
 @Entity
 @Table(name = "owners")
-@JsonSerialize(using = JacksonCustomOwnerSerializer.class)
-@JsonDeserialize(using = JacksonCustomOwnerDeserializer.class)
 public class Owner extends Person {
     @Column(name = "address")
     @NotEmpty
@@ -93,7 +88,6 @@ public class Owner extends Person {
     public void setTelephone(String telephone) {
         this.telephone = telephone;
     }
-    @JsonIgnore
     protected Set<Pet> getPetsInternal() {
         if (this.pets == null) {
             this.pets = new HashSet<>();
diff --git a/src/main/java/org/springframework/samples/petclinic/model/Pet.java b/src/main/java/org/springframework/samples/petclinic/model/Pet.java
index 929fdf46..9817828d 100644
--- a/src/main/java/org/springframework/samples/petclinic/model/Pet.java
+++ b/src/main/java/org/springframework/samples/petclinic/model/Pet.java
@@ -15,28 +15,13 @@
  */
 package org.springframework.samples.petclinic.model;
 
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Date;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import javax.persistence.CascadeType;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.OneToMany;
-import javax.persistence.Table;
-import javax.persistence.Temporal;
-import javax.persistence.TemporalType;
-
 import org.springframework.beans.support.MutableSortDefinition;
 import org.springframework.beans.support.PropertyComparator;
 import org.springframework.format.annotation.DateTimeFormat;
 
+import javax.persistence.*;
+import java.util.*;
+
 
 /**
  * Simple business object representing a pet.
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 341adc01..03036a30 100644
--- a/src/main/java/org/springframework/samples/petclinic/rest/OwnerRestController.java
+++ b/src/main/java/org/springframework/samples/petclinic/rest/OwnerRestController.java
@@ -24,22 +24,23 @@ import javax.validation.Valid;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpHeaders;
 import org.springframework.http.HttpStatus;
-import org.springframework.http.MediaType;
 import org.springframework.http.ResponseEntity;
+import org.springframework.samples.petclinic.dto.OwnerDto;
+import org.springframework.samples.petclinic.mapper.OwnerMapper;
 import org.springframework.samples.petclinic.model.Owner;
 import org.springframework.samples.petclinic.service.ClinicService;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.validation.BindingResult;
-import org.springframework.web.bind.annotation.CrossOrigin;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 import org.springframework.web.util.UriComponentsBuilder;
 
+import javax.transaction.Transactional;
+import javax.validation.Valid;
+import java.util.Collection;
+
 /**
  * @author Vitaliy Fedoriv
+ *
  */
 
 @RestController
@@ -47,82 +48,90 @@ import org.springframework.web.util.UriComponentsBuilder;
 @RequestMapping("/api/owners")
 public class OwnerRestController {
 
-    @Autowired
-    private ClinicService clinicService;
+    private final ClinicService clinicService;
+    private final OwnerMapper ownerMapper;
+
+    public OwnerRestController(ClinicService clinicService, OwnerMapper ownerMapper) {
+        this.clinicService = clinicService;
+        this.ownerMapper = ownerMapper;
+    }
+
 
     @PreAuthorize("hasRole(@roles.OWNER_ADMIN)")
     @RequestMapping(value = "/*/lastname/{lastName}", method = RequestMethod.GET, produces = "application/json")
-    public ResponseEntity<Collection<Owner>> getOwnersList(@PathVariable("lastName") String ownerLastName) {
+    public ResponseEntity<Collection<OwnerDto>> getOwnersList(@PathVariable("lastName") String ownerLastName) {
         if (ownerLastName == null) {
             ownerLastName = "";
         }
         Collection<Owner> owners = this.clinicService.findOwnerByLastName(ownerLastName);
         if (owners.isEmpty()) {
-            return new ResponseEntity<Collection<Owner>>(HttpStatus.NOT_FOUND);
+            return new ResponseEntity<Collection<OwnerDto>>(HttpStatus.NOT_FOUND);
         }
-        return new ResponseEntity<Collection<Owner>>(owners, HttpStatus.OK);
+        return new ResponseEntity<Collection<OwnerDto>>(ownerMapper.toOwnerDtoCollection(owners), HttpStatus.OK);
     }
 
     @PreAuthorize("hasRole(@roles.OWNER_ADMIN)")
     @RequestMapping(value = "", method = RequestMethod.GET, produces = "application/json")
-    public ResponseEntity<Collection<Owner>> getOwners() {
+    public ResponseEntity<Collection<OwnerDto>> getOwners() {
         Collection<Owner> owners = this.clinicService.findAllOwners();
         if (owners.isEmpty()) {
-            return new ResponseEntity<Collection<Owner>>(HttpStatus.NOT_FOUND);
+            return new ResponseEntity<Collection<OwnerDto>>(HttpStatus.NOT_FOUND);
         }
-        return new ResponseEntity<Collection<Owner>>(owners, HttpStatus.OK);
+        return new ResponseEntity<Collection<OwnerDto>>(ownerMapper.toOwnerDtoCollection(owners), HttpStatus.OK);
     }
 
     @PreAuthorize("hasRole(@roles.OWNER_ADMIN)")
     @RequestMapping(value = "/{ownerId}", method = RequestMethod.GET, produces = "application/json")
-    public ResponseEntity<Owner> getOwner(@PathVariable("ownerId") int ownerId) {
+    public ResponseEntity<OwnerDto> getOwner(@PathVariable("ownerId") int ownerId) {
         Owner owner = null;
         owner = this.clinicService.findOwnerById(ownerId);
         if (owner == null) {
-            return new ResponseEntity<Owner>(HttpStatus.NOT_FOUND);
+            return new ResponseEntity<>(HttpStatus.NOT_FOUND);
         }
-        return new ResponseEntity<Owner>(owner, HttpStatus.OK);
+        return new ResponseEntity<>(ownerMapper.toOwnerDto(owner), HttpStatus.OK);
     }
 
     @PreAuthorize("hasRole(@roles.OWNER_ADMIN)")
     @RequestMapping(value = "", method = RequestMethod.POST, produces = "application/json")
-    public ResponseEntity<Owner> addOwner(@RequestBody @Valid Owner owner, BindingResult bindingResult,
-                                          UriComponentsBuilder ucBuilder) {
+    public ResponseEntity<OwnerDto> addOwner(@RequestBody @Valid OwnerDto ownerDto, BindingResult bindingResult,
+                                             UriComponentsBuilder ucBuilder) {
         HttpHeaders headers = new HttpHeaders();
-        if (bindingResult.hasErrors() || owner.getId() != null) {
-            BindingErrorsResponse errors = new BindingErrorsResponse(owner.getId());
+        if (bindingResult.hasErrors() || ownerDto.getId() != null) {
+            BindingErrorsResponse errors = new BindingErrorsResponse(ownerDto.getId());
             errors.addAllErrors(bindingResult);
             headers.add("errors", errors.toJSON());
-            return new ResponseEntity<Owner>(headers, HttpStatus.BAD_REQUEST);
+            return new ResponseEntity<>(headers, HttpStatus.BAD_REQUEST);
         }
+        Owner owner = ownerMapper.toOwner(ownerDto);
         this.clinicService.saveOwner(owner);
-        headers.setLocation(ucBuilder.path("/api/owners/{id}").buildAndExpand(owner.getId()).toUri());
-        return new ResponseEntity<Owner>(owner, headers, HttpStatus.CREATED);
+        ownerDto.setId(owner.getId());
+        headers.setLocation(ucBuilder.path("/api/owners/{id}").buildAndExpand(ownerDto.getId()).toUri());
+        return new ResponseEntity<>(ownerDto, headers, HttpStatus.CREATED);
     }
 
     @PreAuthorize("hasRole(@roles.OWNER_ADMIN)")
     @RequestMapping(value = "/{ownerId}", method = RequestMethod.PUT, produces = "application/json")
-    public ResponseEntity<Owner> updateOwner(@PathVariable("ownerId") int ownerId, @RequestBody @Valid Owner owner,
+    public ResponseEntity<Owner> updateOwner(@PathVariable("ownerId") int ownerId, @RequestBody @Valid OwnerDto ownerDto,
                                              BindingResult bindingResult, UriComponentsBuilder ucBuilder) {
-        boolean bodyIdMatchesPathId = owner.getId() == null || ownerId == owner.getId();
+        boolean bodyIdMatchesPathId = ownerDto.getId() == null || ownerId == ownerDto.getId();
         if (bindingResult.hasErrors() || !bodyIdMatchesPathId) {
-            BindingErrorsResponse errors = new BindingErrorsResponse(ownerId, owner.getId());
+            BindingErrorsResponse errors = new BindingErrorsResponse(ownerId, ownerDto.getId());
             errors.addAllErrors(bindingResult);
             HttpHeaders headers = new HttpHeaders();
             headers.add("errors", errors.toJSON());
-            return new ResponseEntity<Owner>(headers, HttpStatus.BAD_REQUEST);
+            return new ResponseEntity<>(headers, HttpStatus.BAD_REQUEST);
         }
         Owner currentOwner = this.clinicService.findOwnerById(ownerId);
         if (currentOwner == null) {
-            return new ResponseEntity<Owner>(HttpStatus.NOT_FOUND);
+            return new ResponseEntity<>(HttpStatus.NOT_FOUND);
         }
-        currentOwner.setAddress(owner.getAddress());
-        currentOwner.setCity(owner.getCity());
-        currentOwner.setFirstName(owner.getFirstName());
-        currentOwner.setLastName(owner.getLastName());
-        currentOwner.setTelephone(owner.getTelephone());
+        currentOwner.setAddress(ownerDto.getAddress());
+        currentOwner.setCity(ownerDto.getCity());
+        currentOwner.setFirstName(ownerDto.getFirstName());
+        currentOwner.setLastName(ownerDto.getLastName());
+        currentOwner.setTelephone(ownerDto.getTelephone());
         this.clinicService.saveOwner(currentOwner);
-        return new ResponseEntity<Owner>(currentOwner, HttpStatus.NO_CONTENT);
+        return new ResponseEntity<>(currentOwner, HttpStatus.NO_CONTENT);
     }
 
     @PreAuthorize("hasRole(@roles.OWNER_ADMIN)")
@@ -134,7 +143,7 @@ public class OwnerRestController {
             return new ResponseEntity<Void>(HttpStatus.NOT_FOUND);
         }
         this.clinicService.deleteOwner(owner);
-        return new ResponseEntity<Void>(HttpStatus.NO_CONTENT);
+        return new ResponseEntity<>(HttpStatus.NO_CONTENT);
     }
 
 }
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 b66c2949..9920da38 100644
--- a/src/main/java/org/springframework/samples/petclinic/rest/PetRestController.java
+++ b/src/main/java/org/springframework/samples/petclinic/rest/PetRestController.java
@@ -42,31 +42,6 @@ import java.util.Collection;
 @RequestMapping("api/pets")
 public class PetRestController {
 
-<<<<<<< HEAD
-    @Autowired
-    private ClinicService clinicService;
-
-    @Autowired
-    private PetMapper petMapper;
-
-    @PreAuthorize( "hasRole(@roles.OWNER_ADMIN)" )
-	@RequestMapping(value = "/{petId}", method = RequestMethod.GET, produces = "application/json")
-	public ResponseEntity<PetDto> getPet(@PathVariable("petId") int petId){
-		PetDto pet = petMapper.toPetDto(this.clinicService.findPetById(petId));
-		if(pet == null){
-			return new ResponseEntity<PetDto>(HttpStatus.NOT_FOUND);
-		}
-		return new ResponseEntity<PetDto>(pet, HttpStatus.OK);
-	}
-    @PreAuthorize("hasRole(@roles.OWNER_ADMIN)")
-    @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) {
-            return new ResponseEntity<Pet>(HttpStatus.NOT_FOUND);
-        }
-        return new ResponseEntity<Pet>(pet, HttpStatus.OK);
-=======
     private final ClinicService clinicService;
 
     private final PetMapper petMapper;
@@ -84,54 +59,25 @@ public class PetRestController {
             return new ResponseEntity<PetDto>(HttpStatus.NOT_FOUND);
         }
         return new ResponseEntity<PetDto>(pet, HttpStatus.OK);
->>>>>>> a4ca4b1... feat!: enable dto genertation using openapi generator. First tests done with Pets
     }
 
-    @PreAuthorize("hasRole(@roles.OWNER_ADMIN)")
-    @RequestMapping(value = "", method = RequestMethod.GET, produces = "application/json")
-<<<<<<< HEAD
-    public ResponseEntity<Collection<Pet>> getPets() {
-        Collection<Pet> pets = this.clinicService.findAllPets();
-        if (pets.isEmpty()) {
-            return new ResponseEntity<Collection<Pet>>(HttpStatus.NOT_FOUND);
-        }
-        return new ResponseEntity<Collection<Pet>>(pets, HttpStatus.OK);
-=======
+
     public ResponseEntity<Collection<PetDto>> getPets() {
         Collection<PetDto> pets = petMapper.toPetsDto(this.clinicService.findAllPets());
         if (pets.isEmpty()) {
             return new ResponseEntity<Collection<PetDto>>(HttpStatus.NOT_FOUND);
         }
         return new ResponseEntity<Collection<PetDto>>(pets, HttpStatus.OK);
->>>>>>> a4ca4b1... feat!: enable dto genertation using openapi generator. First tests done with Pets
     }
 
     @PreAuthorize("hasRole(@roles.OWNER_ADMIN)")
     @RequestMapping(value = "/pettypes", method = RequestMethod.GET, produces = "application/json")
-<<<<<<< HEAD
-    public ResponseEntity<Collection<PetType>> getPetTypes() {
-        return new ResponseEntity<Collection<PetType>>(this.clinicService.findPetTypes(), HttpStatus.OK);
-=======
     public ResponseEntity<Collection<PetTypeDto>> getPetTypes() {
         return new ResponseEntity<Collection<PetTypeDto>>(petMapper.toPetTypeDtos(this.clinicService.findPetTypes()), HttpStatus.OK);
->>>>>>> a4ca4b1... feat!: enable dto genertation using openapi generator. First tests done with Pets
     }
 
     @PreAuthorize("hasRole(@roles.OWNER_ADMIN)")
     @RequestMapping(value = "", method = RequestMethod.POST, produces = "application/json")
-<<<<<<< HEAD
-    public ResponseEntity<Pet> addPet(@RequestBody @Valid Pet pet, BindingResult bindingResult, UriComponentsBuilder ucBuilder) {
-        BindingErrorsResponse errors = new BindingErrorsResponse();
-        HttpHeaders headers = new HttpHeaders();
-        if (bindingResult.hasErrors() || (pet == null)) {
-            errors.addAllErrors(bindingResult);
-            headers.add("errors", errors.toJSON());
-            return new ResponseEntity<Pet>(headers, HttpStatus.BAD_REQUEST);
-        }
-        this.clinicService.savePet(pet);
-        headers.setLocation(ucBuilder.path("/api/pets/{id}").buildAndExpand(pet.getId()).toUri());
-        return new ResponseEntity<Pet>(pet, headers, HttpStatus.CREATED);
-=======
     public ResponseEntity<PetDto> addPet(@RequestBody @Valid PetDto petDto, BindingResult bindingResult, UriComponentsBuilder ucBuilder) {
         BindingErrorsResponse errors = new BindingErrorsResponse();
         HttpHeaders headers = new HttpHeaders();
@@ -145,35 +91,16 @@ public class PetRestController {
         petDto.setId(pet.getId());
         headers.setLocation(ucBuilder.path("/api/pets/{id}").buildAndExpand(petDto.getId()).toUri());
         return new ResponseEntity<>(petDto, headers, HttpStatus.CREATED);
->>>>>>> a4ca4b1... feat!: enable dto genertation using openapi generator. First tests done with Pets
     }
 
     @PreAuthorize("hasRole(@roles.OWNER_ADMIN)")
     @RequestMapping(value = "/{petId}", method = RequestMethod.PUT, produces = "application/json")
-<<<<<<< HEAD
-    public ResponseEntity<Pet> updatePet(@PathVariable("petId") int petId, @RequestBody @Valid Pet pet, BindingResult bindingResult) {
-=======
     public ResponseEntity<PetDto> updatePet(@PathVariable("petId") int petId, @RequestBody @Valid PetDto pet, BindingResult bindingResult) {
->>>>>>> a4ca4b1... feat!: enable dto genertation using openapi generator. First tests done with Pets
         BindingErrorsResponse errors = new BindingErrorsResponse();
         HttpHeaders headers = new HttpHeaders();
         if (bindingResult.hasErrors() || (pet == null)) {
             errors.addAllErrors(bindingResult);
             headers.add("errors", errors.toJSON());
-<<<<<<< HEAD
-            return new ResponseEntity<Pet>(headers, HttpStatus.BAD_REQUEST);
-        }
-        Pet currentPet = this.clinicService.findPetById(petId);
-        if (currentPet == null) {
-            return new ResponseEntity<Pet>(HttpStatus.NOT_FOUND);
-        }
-        currentPet.setBirthDate(pet.getBirthDate());
-        currentPet.setName(pet.getName());
-        currentPet.setType(pet.getType());
-        currentPet.setOwner(pet.getOwner());
-        this.clinicService.savePet(currentPet);
-        return new ResponseEntity<Pet>(currentPet, HttpStatus.NO_CONTENT);
-=======
             return new ResponseEntity<>(headers, HttpStatus.BAD_REQUEST);
         }
         Pet currentPet = this.clinicService.findPetById(petId);
@@ -186,7 +113,6 @@ public class PetRestController {
         currentPet.setOwner(petMapper.toOwner(pet.getOwner()));
         this.clinicService.savePet(currentPet);
         return new ResponseEntity<>(petMapper.toPetDto(currentPet), HttpStatus.NO_CONTENT);
->>>>>>> a4ca4b1... feat!: enable dto genertation using openapi generator. First tests done with Pets
     }
 
     @PreAuthorize("hasRole(@roles.OWNER_ADMIN)")
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 57147a55..0b9d7e2f 100644
--- a/src/test/java/org/springframework/samples/petclinic/rest/OwnerRestControllerTests.java
+++ b/src/test/java/org/springframework/samples/petclinic/rest/OwnerRestControllerTests.java
@@ -16,17 +16,7 @@
 
 package org.springframework.samples.petclinic.rest;
 
-import static org.mockito.BDDMockito.given;
-import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete;
-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.*;
-
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-
+import com.fasterxml.jackson.databind.ObjectMapper;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -34,12 +24,13 @@ import org.springframework.beans.factory.annotation.Autowired;
 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.dto.OwnerDto;
+import org.springframework.samples.petclinic.dto.PetDto;
+import org.springframework.samples.petclinic.dto.PetTypeDto;
+import org.springframework.samples.petclinic.dto.VisitDto;
+import org.springframework.samples.petclinic.mapper.OwnerMapper;
 import org.springframework.samples.petclinic.service.ClinicService;
+import org.springframework.samples.petclinic.service.clinicService.ApplicationTestConfig;
 import org.springframework.security.test.context.support.WithMockUser;
 import org.springframework.test.context.ContextConfiguration;
 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@@ -47,7 +38,13 @@ import org.springframework.test.context.web.WebAppConfiguration;
 import org.springframework.test.web.servlet.MockMvc;
 import org.springframework.test.web.servlet.setup.MockMvcBuilders;
 
-import com.fasterxml.jackson.databind.ObjectMapper;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import static org.mockito.BDDMockito.given;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
 
 
 /**
@@ -57,81 +54,84 @@ import com.fasterxml.jackson.databind.ObjectMapper;
  */
 @SpringBootTest
 @RunWith(SpringJUnit4ClassRunner.class)
-@ContextConfiguration(classes=ApplicationTestConfig.class)
+@ContextConfiguration(classes = ApplicationTestConfig.class)
 @WebAppConfiguration
 public class OwnerRestControllerTests {
 
     @Autowired
     private OwnerRestController ownerRestController;
 
+    @Autowired
+    OwnerMapper ownerMapper;
+
     @MockBean
     private ClinicService clinicService;
 
     private MockMvc mockMvc;
 
-    private List<Owner> owners;
+    private List<OwnerDto> owners;
 
     @Before
-    public void initOwners(){
-    	this.mockMvc = MockMvcBuilders.standaloneSetup(ownerRestController)
-    			.setControllerAdvice(new ExceptionControllerAdvice())
-    			.build();
-    	owners = new ArrayList<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");
-    	owner.setAddress("638 Cardinal Ave.");
-    	owner.setCity("Sun Prairie");
-    	owner.setTelephone("6085551749");
-    	owners.add(owner);
-
-    	owner = new Owner();
-    	owner.setId(3);
-    	owner.setFirstName("Eduardo");
-    	owner.setLastName("Rodriquez");
-    	owner.setAddress("2693 Commerce St.");
-    	owner.setCity("McFarland");
-    	owner.setTelephone("6085558763");
-    	owners.add(owner);
-
-    	owner = new Owner();
-    	owner.setId(4);
-    	owner.setFirstName("Harold");
-    	owner.setLastName("Davis");
-    	owner.setAddress("563 Friendly St.");
-    	owner.setCity("Windsor");
-    	owner.setTelephone("6085553198");
-    	owners.add(owner);
+    public void initOwners() {
+        this.mockMvc = MockMvcBuilders.standaloneSetup(ownerRestController)
+            .setControllerAdvice(new ExceptionControllerAdvice())
+            .build();
+        owners = new ArrayList<OwnerDto>();
+
+        OwnerDto ownerWithPet = new OwnerDto();
+        ownerWithPet.setId(1);
+        ownerWithPet.setFirstName("George");
+        ownerWithPet.setLastName("Franklin");
+        ownerWithPet.setAddress("110 W. Liberty St.");
+        ownerWithPet.setCity("Madison");
+        ownerWithPet.setTelephone("6085551023");
+        ownerWithPet.addPetsItem(getTestPetWithIdAndName(ownerWithPet, 1, "Rosy"));
+        owners.add(ownerWithPet);
+
+        OwnerDto owner = new OwnerDto();
+        owner.setId(2);
+        owner.setFirstName("Betty");
+        owner.setLastName("Davis");
+        owner.setAddress("638 Cardinal Ave.");
+        owner.setCity("Sun Prairie");
+        owner.setTelephone("6085551749");
+        owners.add(owner);
+
+        owner = new OwnerDto();
+        owner.setId(3);
+        owner.setFirstName("Eduardo");
+        owner.setLastName("Rodriquez");
+        owner.setAddress("2693 Commerce St.");
+        owner.setCity("McFarland");
+        owner.setTelephone("6085558763");
+        owners.add(owner);
+
+        owner = new OwnerDto();
+        owner.setId(4);
+        owner.setFirstName("Harold");
+        owner.setLastName("Davis");
+        owner.setAddress("563 Friendly St.");
+        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();
+    private PetDto getTestPetWithIdAndName(final OwnerDto owner, final int id, final String name) {
+        PetTypeDto petType = new PetTypeDto();
         petType.setId(2);
         petType.setName("dog");
-        Pet pet = new Pet();
+        PetDto pet = new PetDto();
         pet.setId(id);
         pet.setName(name);
         pet.setBirthDate(new Date());
         pet.setOwner(owner);
         pet.setType(petType);
-        pet.addVisit(getTestVisitForPet(pet, 1));
+        pet.addVisitsItem(getTestVisitForPet(pet, 1));
         return pet;
     }
 
-    private Visit getTestVisitForPet(final Pet pet, final int id) {
-        Visit visit = new Visit();
+    private VisitDto getTestVisitForPet(final PetDto pet, final int id) {
+        VisitDto visit = new VisitDto();
         visit.setId(id);
         visit.setPet(pet);
         visit.setDate(new Date());
@@ -140,11 +140,11 @@ public class OwnerRestControllerTests {
     }
 
     @Test
-    @WithMockUser(roles="OWNER_ADMIN")
+    @WithMockUser(roles = "OWNER_ADMIN")
     public void testGetOwnerSuccess() throws Exception {
-    	given(this.clinicService.findOwnerById(1)).willReturn(owners.get(0));
+        given(this.clinicService.findOwnerById(1)).willReturn(ownerMapper.toOwner(owners.get(0)));
         this.mockMvc.perform(get("/api/owners/1")
-        	.accept(MediaType.APPLICATION_JSON_VALUE))
+                .accept(MediaType.APPLICATION_JSON_VALUE))
             .andExpect(status().isOk())
             .andExpect(content().contentType("application/json"))
             .andExpect(jsonPath("$.id").value(1))
@@ -152,22 +152,22 @@ public class OwnerRestControllerTests {
     }
 
     @Test
-    @WithMockUser(roles="OWNER_ADMIN")
+    @WithMockUser(roles = "OWNER_ADMIN")
     public void testGetOwnerNotFound() throws Exception {
-    	given(this.clinicService.findOwnerById(-1)).willReturn(null);
+        given(this.clinicService.findOwnerById(-1)).willReturn(null);
         this.mockMvc.perform(get("/api/owners/-1")
-        	.accept(MediaType.APPLICATION_JSON))
+                .accept(MediaType.APPLICATION_JSON))
             .andExpect(status().isNotFound());
     }
 
     @Test
-    @WithMockUser(roles="OWNER_ADMIN")
+    @WithMockUser(roles = "OWNER_ADMIN")
     public void testGetOwnersListSuccess() throws Exception {
-    	owners.remove(0);
-    	owners.remove(1);
-    	given(this.clinicService.findOwnerByLastName("Davis")).willReturn(owners);
+        owners.remove(0);
+        owners.remove(1);
+        given(this.clinicService.findOwnerByLastName("Davis")).willReturn(ownerMapper.toOwners(owners));
         this.mockMvc.perform(get("/api/owners/*/lastname/Davis")
-        	.accept(MediaType.APPLICATION_JSON))
+                .accept(MediaType.APPLICATION_JSON))
             .andExpect(status().isOk())
             .andExpect(content().contentType("application/json"))
             .andExpect(jsonPath("$.[0].id").value(2))
@@ -177,23 +177,23 @@ public class OwnerRestControllerTests {
     }
 
     @Test
-    @WithMockUser(roles="OWNER_ADMIN")
+    @WithMockUser(roles = "OWNER_ADMIN")
     public void testGetOwnersListNotFound() throws Exception {
-    	owners.clear();
-    	given(this.clinicService.findOwnerByLastName("0")).willReturn(owners);
+        owners.clear();
+        given(this.clinicService.findOwnerByLastName("0")).willReturn(ownerMapper.toOwners(owners));
         this.mockMvc.perform(get("/api/owners/?lastName=0")
-        	.accept(MediaType.APPLICATION_JSON))
+                .accept(MediaType.APPLICATION_JSON))
             .andExpect(status().isNotFound());
     }
 
     @Test
-    @WithMockUser(roles="OWNER_ADMIN")
+    @WithMockUser(roles = "OWNER_ADMIN")
     public void testGetAllOwnersSuccess() throws Exception {
-    	owners.remove(0);
-    	owners.remove(1);
-    	given(this.clinicService.findAllOwners()).willReturn(owners);
+        owners.remove(0);
+        owners.remove(1);
+        given(this.clinicService.findAllOwners()).willReturn(ownerMapper.toOwners(owners));
         this.mockMvc.perform(get("/api/owners/")
-        	.accept(MediaType.APPLICATION_JSON))
+                .accept(MediaType.APPLICATION_JSON))
             .andExpect(status().isOk())
             .andExpect(content().contentType("application/json"))
             .andExpect(jsonPath("$.[0].id").value(2))
@@ -203,102 +203,103 @@ public class OwnerRestControllerTests {
     }
 
     @Test
-    @WithMockUser(roles="OWNER_ADMIN")
+    @WithMockUser(roles = "OWNER_ADMIN")
     public void testGetAllOwnersNotFound() throws Exception {
-    	owners.clear();
-    	given(this.clinicService.findAllOwners()).willReturn(owners);
+        owners.clear();
+        given(this.clinicService.findAllOwners()).willReturn(ownerMapper.toOwners(owners));
         this.mockMvc.perform(get("/api/owners/")
-        	.accept(MediaType.APPLICATION_JSON))
+                .accept(MediaType.APPLICATION_JSON))
             .andExpect(status().isNotFound());
     }
 
     @Test
-    @WithMockUser(roles="OWNER_ADMIN")
+    @WithMockUser(roles = "OWNER_ADMIN")
     public void testCreateOwnerSuccess() throws Exception {
-    	Owner newOwner = owners.get(0);
-    	newOwner.setId(null);
-    	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().isCreated());
+        OwnerDto newOwnerDto = owners.get(0);
+        newOwnerDto.setId(null);
+        ObjectMapper mapper = new ObjectMapper();
+        String newOwnerAsJSON = mapper.writeValueAsString(newOwnerDto);
+        this.mockMvc.perform(post("/api/owners/")
+                .content(newOwnerAsJSON).accept(MediaType.APPLICATION_JSON_VALUE).contentType(MediaType.APPLICATION_JSON_VALUE))
+            .andExpect(status().isCreated());
     }
 
     @Test
-    @WithMockUser(roles="OWNER_ADMIN")
+    @WithMockUser(roles = "OWNER_ADMIN")
     public void testCreateOwnerErrorIdSpecified() throws Exception {
-        Owner newOwner = owners.get(0);
-        newOwner.setId(999);
+        OwnerDto newOwnerDto = owners.get(0);
+        newOwnerDto.setId(999);
         ObjectMapper mapper = new ObjectMapper();
-        String newOwnerAsJSON = mapper.writeValueAsString(newOwner);
+        String newOwnerAsJSON = mapper.writeValueAsString(newOwnerDto);
         this.mockMvc.perform(post("/api/owners/")
-            .content(newOwnerAsJSON).accept(MediaType.APPLICATION_JSON_VALUE).contentType(MediaType.APPLICATION_JSON_VALUE))
+                .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")
+    @WithMockUser(roles = "OWNER_ADMIN")
     public void testCreateOwnerError() throws Exception {
-    	Owner newOwner = owners.get(0);
-    	newOwner.setId(null);
-    	newOwner.setFirstName(null);
-    	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());
-     }
+        OwnerDto newOwnerDto = owners.get(0);
+        newOwnerDto.setId(null);
+        newOwnerDto.setFirstName(null);
+        ObjectMapper mapper = new ObjectMapper();
+        String newOwnerAsJSON = mapper.writeValueAsString(newOwnerDto);
+        this.mockMvc.perform(post("/api/owners/")
+                .content(newOwnerAsJSON).accept(MediaType.APPLICATION_JSON_VALUE).contentType(MediaType.APPLICATION_JSON_VALUE))
+            .andExpect(status().isBadRequest());
+    }
 
     @Test
-    @WithMockUser(roles="OWNER_ADMIN")
+    @WithMockUser(roles = "OWNER_ADMIN")
     public void testUpdateOwnerSuccess() throws Exception {
-        given(this.clinicService.findOwnerById(1)).willReturn(owners.get(0));
+        given(this.clinicService.findOwnerById(1)).willReturn(ownerMapper.toOwner(owners.get(0)));
         int ownerId = owners.get(0).getId();
-        Owner updatedOwner = new Owner();
+        OwnerDto updatedOwnerDto = new OwnerDto();
         // 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");
+        updatedOwnerDto.setId(ownerId);
+        updatedOwnerDto.setFirstName("George I");
+        updatedOwnerDto.setLastName("Franklin");
+        updatedOwnerDto.setAddress("110 W. Liberty St.");
+        updatedOwnerDto.setCity("Madison");
+        updatedOwnerDto.setTelephone("6085551023");
         ObjectMapper mapper = new ObjectMapper();
-        String newOwnerAsJSON = mapper.writeValueAsString(updatedOwner);
+        String newOwnerAsJSON = mapper.writeValueAsString(updatedOwnerDto);
         this.mockMvc.perform(put("/api/owners/" + ownerId)
-            .content(newOwnerAsJSON).accept(MediaType.APPLICATION_JSON_VALUE).contentType(MediaType.APPLICATION_JSON_VALUE))
+                .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))
+                .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")
+    @WithMockUser(roles = "OWNER_ADMIN")
     public void testUpdateOwnerSuccessNoBodyId() throws Exception {
-    	given(this.clinicService.findOwnerById(1)).willReturn(owners.get(0));
+        given(this.clinicService.findOwnerById(1)).willReturn(ownerMapper.toOwner(owners.get(0)));
         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(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))
+        OwnerDto updatedOwnerDto = new OwnerDto();
+        updatedOwnerDto.setFirstName("George I");
+        updatedOwnerDto.setLastName("Franklin");
+        updatedOwnerDto.setAddress("110 W. Liberty St.");
+        updatedOwnerDto.setCity("Madison");
+        updatedOwnerDto.setTelephone("6085551023");
+        ObjectMapper mapper = new ObjectMapper();
+        String newOwnerAsJSON = mapper.writeValueAsString(updatedOwnerDto);
+        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))
@@ -307,60 +308,60 @@ public class OwnerRestControllerTests {
     }
 
     @Test
-    @WithMockUser(roles="OWNER_ADMIN")
+    @WithMockUser(roles = "OWNER_ADMIN")
     public void testUpdateOwnerErrorBodyIdMismatchWithPathId() throws Exception {
         int ownerId = owners.get(0).getId();
-        Owner updatedOwner = new Owner();
+        OwnerDto updatedOwnerDto = new OwnerDto();
         // 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");
+        updatedOwnerDto.setId(-1);
+        updatedOwnerDto.setFirstName("George I");
+        updatedOwnerDto.setLastName("Franklin");
+        updatedOwnerDto.setAddress("110 W. Liberty St.");
+        updatedOwnerDto.setCity("Madison");
+        updatedOwnerDto.setTelephone("6085551023");
         ObjectMapper mapper = new ObjectMapper();
-        String newOwnerAsJSON = mapper.writeValueAsString(updatedOwner);
+        String newOwnerAsJSON = mapper.writeValueAsString(updatedOwnerDto);
         this.mockMvc.perform(put("/api/owners/" + ownerId)
-            .content(newOwnerAsJSON).accept(MediaType.APPLICATION_JSON_VALUE).contentType(MediaType.APPLICATION_JSON_VALUE))
+                .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")
+    @WithMockUser(roles = "OWNER_ADMIN")
     public void testUpdateOwnerError() throws Exception {
-    	Owner newOwner = owners.get(0);
-    	newOwner.setFirstName("");
-    	ObjectMapper mapper = new ObjectMapper();
-    	String newOwnerAsJSON = mapper.writeValueAsString(newOwner);
-    	this.mockMvc.perform(put("/api/owners/1")
-    		.content(newOwnerAsJSON).accept(MediaType.APPLICATION_JSON_VALUE).contentType(MediaType.APPLICATION_JSON_VALUE))
-        	.andExpect(status().isBadRequest());
-     }
+        OwnerDto newOwnerDto = owners.get(0);
+        newOwnerDto.setFirstName("");
+        ObjectMapper mapper = new ObjectMapper();
+        String newOwnerAsJSON = mapper.writeValueAsString(newOwnerDto);
+        this.mockMvc.perform(put("/api/owners/1")
+                .content(newOwnerAsJSON).accept(MediaType.APPLICATION_JSON_VALUE).contentType(MediaType.APPLICATION_JSON_VALUE))
+            .andExpect(status().isBadRequest());
+    }
 
     @Test
-    @WithMockUser(roles="OWNER_ADMIN")
+    @WithMockUser(roles = "OWNER_ADMIN")
     public void testDeleteOwnerSuccess() throws Exception {
-    	Owner newOwner = owners.get(0);
-    	ObjectMapper mapper = new ObjectMapper();
-    	String newOwnerAsJSON = mapper.writeValueAsString(newOwner);
-    	given(this.clinicService.findOwnerById(1)).willReturn(owners.get(0));
-    	this.mockMvc.perform(delete("/api/owners/1")
-    		.content(newOwnerAsJSON).accept(MediaType.APPLICATION_JSON_VALUE).contentType(MediaType.APPLICATION_JSON_VALUE))
-        	.andExpect(status().isNoContent());
+        OwnerDto newOwnerDto = owners.get(0);
+        ObjectMapper mapper = new ObjectMapper();
+        String newOwnerAsJSON = mapper.writeValueAsString(newOwnerDto);
+        given(this.clinicService.findOwnerById(1)).willReturn(ownerMapper.toOwner(owners.get(0)));
+        this.mockMvc.perform(delete("/api/owners/1")
+                .content(newOwnerAsJSON).accept(MediaType.APPLICATION_JSON_VALUE).contentType(MediaType.APPLICATION_JSON_VALUE))
+            .andExpect(status().isNoContent());
     }
 
     @Test
-    @WithMockUser(roles="OWNER_ADMIN")
+    @WithMockUser(roles = "OWNER_ADMIN")
     public void testDeleteOwnerError() throws Exception {
-    	Owner newOwner = owners.get(0);
-    	ObjectMapper mapper = new ObjectMapper();
-    	String newOwnerAsJSON = mapper.writeValueAsString(newOwner);
-    	given(this.clinicService.findOwnerById(-1)).willReturn(null);
-    	this.mockMvc.perform(delete("/api/owners/-1")
-    		.content(newOwnerAsJSON).accept(MediaType.APPLICATION_JSON_VALUE).contentType(MediaType.APPLICATION_JSON_VALUE))
-        	.andExpect(status().isNotFound());
+        OwnerDto newOwnerDto = owners.get(0);
+        ObjectMapper mapper = new ObjectMapper();
+        String newOwnerAsJSON = mapper.writeValueAsString(newOwnerDto);
+        given(this.clinicService.findOwnerById(-1)).willReturn(null);
+        this.mockMvc.perform(delete("/api/owners/-1")
+                .content(newOwnerAsJSON).accept(MediaType.APPLICATION_JSON_VALUE).contentType(MediaType.APPLICATION_JSON_VALUE))
+            .andExpect(status().isNotFound());
     }
 
 }
-- 
GitLab