From d24f10846fcfbb512d8d6a23500f9be7d6ad0ccd Mon Sep 17 00:00:00 2001 From: heninini Date: Fri, 2 Feb 2024 15:46:24 -0500 Subject: [PATCH 1/2] tests for getbyId and listAll for customers and beers worked succesfully --- .../controller/BeerController.java | 2 + .../controller/CustomerController.java | 2 + .../spring6restmvc/model/Beer.java | 23 ++++ .../spring6restmvc/model/BeerStyle.java | 8 ++ .../spring6restmvc/model/Customer.java | 2 + .../spring6restmvc/services/BeerService.java | 20 +++ .../services/BeerServiceImpl.java | 122 ++++++++++++++++++ .../services/CustomerService.java | 19 +++ .../services/CustomerServiceImpl.java | 89 +++++++++++++ .../controller/BeerControllerTest.java | 33 +++++ .../controller/CustomerControllerTest.java | 2 + 11 files changed, 322 insertions(+) create mode 100644 src/main/java/guru/springframework/spring6restmvc/controller/BeerController.java create mode 100644 src/main/java/guru/springframework/spring6restmvc/controller/CustomerController.java create mode 100644 src/main/java/guru/springframework/spring6restmvc/model/Beer.java create mode 100644 src/main/java/guru/springframework/spring6restmvc/model/BeerStyle.java create mode 100644 src/main/java/guru/springframework/spring6restmvc/model/Customer.java create mode 100644 src/main/java/guru/springframework/spring6restmvc/services/BeerService.java create mode 100644 src/main/java/guru/springframework/spring6restmvc/services/BeerServiceImpl.java create mode 100644 src/main/java/guru/springframework/spring6restmvc/services/CustomerService.java create mode 100644 src/main/java/guru/springframework/spring6restmvc/services/CustomerServiceImpl.java create mode 100644 src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java create mode 100644 src/test/java/guru/springframework/spring6restmvc/controller/CustomerControllerTest.java diff --git a/src/main/java/guru/springframework/spring6restmvc/controller/BeerController.java b/src/main/java/guru/springframework/spring6restmvc/controller/BeerController.java new file mode 100644 index 000000000..f82b2e579 --- /dev/null +++ b/src/main/java/guru/springframework/spring6restmvc/controller/BeerController.java @@ -0,0 +1,2 @@ +package guru.springframework.spring6restmvc.controller;public class BeerController { +} \ No newline at end of file diff --git a/src/main/java/guru/springframework/spring6restmvc/controller/CustomerController.java b/src/main/java/guru/springframework/spring6restmvc/controller/CustomerController.java new file mode 100644 index 000000000..b11afaa5c --- /dev/null +++ b/src/main/java/guru/springframework/spring6restmvc/controller/CustomerController.java @@ -0,0 +1,2 @@ +package guru.springframework.spring6restmvc.controller;public class CustomerController { +} \ No newline at end of file diff --git a/src/main/java/guru/springframework/spring6restmvc/model/Beer.java b/src/main/java/guru/springframework/spring6restmvc/model/Beer.java new file mode 100644 index 000000000..d1cc96aae --- /dev/null +++ b/src/main/java/guru/springframework/spring6restmvc/model/Beer.java @@ -0,0 +1,23 @@ +package guru.springframework.spring6restmvc.model; + +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.UUID; + +/** + * Created by jt, Spring Framework Guru. + */ +@Data +public class Beer { + private UUID id; + private Integer version; + private String beerName; + private BeerStyle beerStyle; + private String upc; + private Integer quantityOnHand; + private BigDecimal price; + private LocalDateTime createdDate; + private LocalDateTime updateDate; +} diff --git a/src/main/java/guru/springframework/spring6restmvc/model/BeerStyle.java b/src/main/java/guru/springframework/spring6restmvc/model/BeerStyle.java new file mode 100644 index 000000000..78a1b30df --- /dev/null +++ b/src/main/java/guru/springframework/spring6restmvc/model/BeerStyle.java @@ -0,0 +1,8 @@ +package guru.springframework.spring6restmvc.model; + +/** + * Created by jt, Spring Framework Guru. + */ +public enum BeerStyle { + LAGER, PILSNER, STOUT, GOSE, PORTER, ALE, WHEAT, IPA, PALE_ALE, SAISON +} diff --git a/src/main/java/guru/springframework/spring6restmvc/model/Customer.java b/src/main/java/guru/springframework/spring6restmvc/model/Customer.java new file mode 100644 index 000000000..ef4d3995a --- /dev/null +++ b/src/main/java/guru/springframework/spring6restmvc/model/Customer.java @@ -0,0 +1,2 @@ +package guru.springframework.spring6restmvc.model;public class Customer { +} \ No newline at end of file diff --git a/src/main/java/guru/springframework/spring6restmvc/services/BeerService.java b/src/main/java/guru/springframework/spring6restmvc/services/BeerService.java new file mode 100644 index 000000000..e02fb1d5a --- /dev/null +++ b/src/main/java/guru/springframework/spring6restmvc/services/BeerService.java @@ -0,0 +1,20 @@ +package guru.springframework.spring6restmvc.service; + +import guru.springframework.spring6restmvc.model.Beer; + +import java.util.List; +import java.util.UUID; + +public interface BeerService { + + Beer getById(UUID Id); + List listBeers(); + + Beer save(Beer beer); + + void updateBeer(Beer beer, UUID beerId); + + void deleteBeerById(UUID beerId); + + void patchBeerById(UUID beerId, Beer beer); +} \ No newline at end of file diff --git a/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceImpl.java b/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceImpl.java new file mode 100644 index 000000000..3732c1165 --- /dev/null +++ b/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceImpl.java @@ -0,0 +1,122 @@ +package guru.springframework.spring6restmvc.service; + +import guru.springframework.spring6restmvc.model.Beer; +import guru.springframework.spring6restmvc.model.BeerStyle; +import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.*; + +@Service +public class BeerServiceImpl implements BeerService { + private Map beerMap; + + public BeerServiceImpl(){ + this.beerMap= new HashMap<>(); + + Beer beer1=Beer.builder() + .id(UUID.randomUUID()) + .upc("h") + .price(new BigDecimal(12.3)) + .version(2) + .beerName("asmara beer") + .quantityOnHand(123) + .beerStyle(BeerStyle.ALE) + .createdDate(LocalDateTime.now()) + .updateDate(LocalDateTime.now()) + .build(); + + Beer beer2=Beer.builder() + .id(UUID.randomUUID()) + .upc("h") + .price(new BigDecimal(12.3)) + .version(2) + .beerName("asmara beer") + .quantityOnHand(123) + .beerStyle(BeerStyle.ALE) + .createdDate(LocalDateTime.now()) + .updateDate(LocalDateTime.now()) + .build(); + + Beer beer3=Beer.builder() + .id(UUID.randomUUID()) + .upc("h") + .price(new BigDecimal(12.3)) + .version(2) + .beerName("asmara beer") + .quantityOnHand(123) + .beerStyle(BeerStyle.ALE) + .createdDate(LocalDateTime.now()) + .updateDate(LocalDateTime.now()) + .build(); + beerMap.put(beer1.getId(),beer1); + beerMap.put(beer2.getId(),beer2); + beerMap.put(beer3.getId(),beer3); + } + + @Override + public Beer getById(UUID Id) { + return beerMap.get(Id); + } + + @Override + public List listBeers(){ + return new ArrayList<>(beerMap.values()); + } + + @Override + public Beer save(Beer beer) { + + Beer savedBeer=Beer.builder() + .id(UUID.randomUUID()) + .upc(beer.getUpc()) + .price(new BigDecimal(12.3)) + .version(2) + .beerName(beer.getBeerName()) + .quantityOnHand(123) + .beerStyle(BeerStyle.ALE) + .createdDate(LocalDateTime.now()) + .updateDate(LocalDateTime.now()) + .build(); + beerMap.put(savedBeer.getId(),savedBeer); + return savedBeer; + } + + @Override + public void updateBeer(Beer beer, UUID beerId) { + Beer existingBeer=beerMap.get(beerId); + existingBeer.setBeerName(beer.getBeerName()); + existingBeer.setPrice(beer.getPrice()); + } + + @Override + public void deleteBeerById(UUID beerId) { + beerMap.remove(beerId); + } + + @Override + public void patchBeerById(UUID beerId, Beer beer) { + Beer existing = beerMap.get(beerId); + + if (StringUtils.hasText(beer.getBeerName())) { + existing.setBeerName(beer.getBeerName()); + } + + if (beer.getBeerStyle() != null) { + existing.setBeerStyle(beer.getBeerStyle()); + } + + if (beer.getPrice() != null) { + existing.setPrice(beer.getPrice()); + } + + if (beer.getQuantityOnHand() != null) { + existing.setQuantityOnHand(beer.getQuantityOnHand()); + } + + } + + +} \ No newline at end of file diff --git a/src/main/java/guru/springframework/spring6restmvc/services/CustomerService.java b/src/main/java/guru/springframework/spring6restmvc/services/CustomerService.java new file mode 100644 index 000000000..7e1c09fcb --- /dev/null +++ b/src/main/java/guru/springframework/spring6restmvc/services/CustomerService.java @@ -0,0 +1,19 @@ +package guru.springframework.spring6restmvc.service; + +import guru.springframework.spring6restmvc.model.Customer; + +import java.util.List; +import java.util.UUID; + +public interface CustomerService { + + + List listCustomers(); + Customer getById(UUID Id); + + Customer saveCustomer(Customer customer); + + void deleteCustomerById(UUID customerId); + + void patchCustomerById(UUID customerId, Customer customer); +} \ No newline at end of file diff --git a/src/main/java/guru/springframework/spring6restmvc/services/CustomerServiceImpl.java b/src/main/java/guru/springframework/spring6restmvc/services/CustomerServiceImpl.java new file mode 100644 index 000000000..6dd638ed0 --- /dev/null +++ b/src/main/java/guru/springframework/spring6restmvc/services/CustomerServiceImpl.java @@ -0,0 +1,89 @@ +package guru.springframework.spring6restmvc.service; + +import guru.springframework.spring6restmvc.model.Customer; +import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; + +import java.math.BigDecimal; +import java.time.LocalDate; +import java.util.*; + +@Service +public class CustomerServiceImpl implements CustomerService{ + private Map customerMap; + public CustomerServiceImpl(){ + this.customerMap= new HashMap<>(); + + Customer customer1= Customer.builder() + .customerName("henos") + .Id(UUID.randomUUID()) + .createdDate(LocalDate.now()) + .lastModifiedDate(LocalDate.now()) + .version(new BigDecimal(1)) + .build(); + + Customer customer2= Customer.builder() + .customerName("lidya") + .Id(UUID.randomUUID()) + .createdDate(LocalDate.now()) + .lastModifiedDate(LocalDate.now()) + .version(new BigDecimal(1)) + .build(); + Customer customer3= Customer.builder() + .customerName("ghirmay") + .Id(UUID.randomUUID()) + .createdDate(LocalDate.now()) + .lastModifiedDate(LocalDate.now()) + .version(new BigDecimal(1)) + .build(); + + customerMap.put(customer1.getId(),customer1); + customerMap.put(customer2.getId(),customer2); + customerMap.put(customer3.getId(),customer3); + } + + @Override + public void patchCustomerById(UUID customerId, Customer customer) { + Customer existing = customerMap.get(customerId); + + if (StringUtils.hasText(customer.getCustomerName())) { + existing.setCustomerName(customer.getCustomerName()); + } + } + + @Override + public Customer getById(UUID Id) { + return customerMap.get(Id); + } + + @Override + public Customer saveCustomer(Customer customer) { + Customer customerSaved= Customer.builder() + .customerName(customer.getCustomerName()) + .Id(UUID.randomUUID()) + .createdDate(LocalDate.now()) + .lastModifiedDate(LocalDate.now()) + .version(new BigDecimal(1)) + .build(); + customerMap.put(customerSaved.getId(),customerSaved); + return customerSaved; + } + + + + @Override + public void updateCustomer(Customer customer,UUID customerId) { + Customer existingCustomer= customerMap.get(customerId); + existingCustomer.setCustomerName(customer.getCustomerName()); + existingCustomer.setVersion(customer.getVersion()); + + } + + + @Override + public void deleteById(UUID customerId){ + customerMap.remove(customerId); + } + + +} \ No newline at end of file diff --git a/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java b/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java new file mode 100644 index 000000000..c45f6f6dc --- /dev/null +++ b/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java @@ -0,0 +1,33 @@ +package guru.springframework.spring6restmvc; + + +import guru.springframework.spring6restmvc.services.BeerService; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; + +import java.util.UUID; + +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@WebMvcTest(BeerControllerTest.class) +public class BeerControllerTest { + + @Autowired + MockMvc mockMvc; + + @MockBean + BeerService beerService; + + @Test + void getBeerById() throws Exception{ + mockMvc.perform(get("/api/v1/beers" + UUID.randomUUID()) + .accept(MediaType.APPLICATION_JSON) + .andExpect(status().isOk()); + } + +} \ No newline at end of file diff --git a/src/test/java/guru/springframework/spring6restmvc/controller/CustomerControllerTest.java b/src/test/java/guru/springframework/spring6restmvc/controller/CustomerControllerTest.java new file mode 100644 index 000000000..4342c1463 --- /dev/null +++ b/src/test/java/guru/springframework/spring6restmvc/controller/CustomerControllerTest.java @@ -0,0 +1,2 @@ +package guru.springframework.spring6restmvc.controller;public class CustomerTest { +} \ No newline at end of file From 975d4506b37deeb0c893e79229494d84081d58a4 Mon Sep 17 00:00:00 2001 From: heninini Date: Fri, 2 Feb 2024 21:51:47 -0500 Subject: [PATCH 2/2] spring MockMVC Test with Mockito(done testing the restful API') --- .../controller/BeerController.java | 60 ++++++++- .../controller/CustomerController.java | 51 +++++++- .../spring6restmvc/model/Beer.java | 7 +- .../spring6restmvc/model/BeerStyle.java | 5 +- .../spring6restmvc/model/Customer.java | 22 +++- .../spring6restmvc/services/BeerService.java | 2 +- .../services/BeerServiceImpl.java | 2 +- .../services/CustomerService.java | 8 +- .../services/CustomerServiceImpl.java | 11 +- .../controller/BeerControllerTest.java | 93 ++++++++++++- .../controller/CustomerControllerTest.java | 123 +++++++++++++++++- 11 files changed, 360 insertions(+), 24 deletions(-) diff --git a/src/main/java/guru/springframework/spring6restmvc/controller/BeerController.java b/src/main/java/guru/springframework/spring6restmvc/controller/BeerController.java index f82b2e579..3335c2583 100644 --- a/src/main/java/guru/springframework/spring6restmvc/controller/BeerController.java +++ b/src/main/java/guru/springframework/spring6restmvc/controller/BeerController.java @@ -1,2 +1,60 @@ -package guru.springframework.spring6restmvc.controller;public class BeerController { +package guru.springframework.spring6restmvc.controller; + +import guru.springframework.spring6restmvc.model.Beer; +import guru.springframework.spring6restmvc.services.BeerService; +import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.UUID; + +@RequiredArgsConstructor +@RestController +public class BeerController { + + public static final String BEER_PATH="/api/v1/beer"; + public static final String BEER_PATH_ID=BEER_PATH+ "/{beerId}"; + + private final BeerService beerService; + + @PatchMapping(BEER_PATH_ID) + public ResponseEntity patchBeer(@RequestBody Beer beer,@PathVariable("beerId") UUID beerId) { + beerService.patchBeerById(beerId,beer); + return new ResponseEntity(HttpStatus.NO_CONTENT); + } + + @DeleteMapping(BEER_PATH_ID) + public ResponseEntity DeleteBeer(@PathVariable("beerId") UUID beerId){ + beerService.deleteBeerById(beerId); + return new ResponseEntity(HttpStatus.NO_CONTENT); + } + @PutMapping(BEER_PATH_ID) + public ResponseEntity updateBeer(@RequestBody Beer beer,@PathVariable("beerId") UUID beerId){ + beerService.updateBeer(beer,beerId); + return new ResponseEntity(HttpStatus.NO_CONTENT); + } + + @PostMapping(BEER_PATH) + public ResponseEntity saveNewBeer(@RequestBody Beer beer){ + Beer savedBeer=beerService.save(beer); + HttpHeaders header=new HttpHeaders(); + header.add("Location",BEER_PATH + savedBeer.getId().toString()); + return new ResponseEntity(header,HttpStatus.CREATED); + } + + @GetMapping(BEER_PATH) + public List listBeers(){ + return beerService.listBeers(); + } + + @GetMapping(BEER_PATH_ID) + public Beer getById(@PathVariable("beerId")UUID beerId){ + + return beerService.getById(beerId); + } + } \ No newline at end of file diff --git a/src/main/java/guru/springframework/spring6restmvc/controller/CustomerController.java b/src/main/java/guru/springframework/spring6restmvc/controller/CustomerController.java index b11afaa5c..b735f13ea 100644 --- a/src/main/java/guru/springframework/spring6restmvc/controller/CustomerController.java +++ b/src/main/java/guru/springframework/spring6restmvc/controller/CustomerController.java @@ -1,2 +1,51 @@ -package guru.springframework.spring6restmvc.controller;public class CustomerController { +package guru.springframework.spring6restmvc.controller; + +import guru.springframework.spring6restmvc.model.Customer; +import guru.springframework.spring6restmvc.services.CustomerService; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.UUID; + +@RequiredArgsConstructor +@RestController +public class CustomerController { + + public static final String CUSTOMER_PATH= "/api/v1/customer"; + public static final String CUSTOMER_PATH_ID= CUSTOMER_PATH+ "/{customerId}"; + private final CustomerService customerService; + @DeleteMapping(CUSTOMER_PATH_ID) + public ResponseEntity deleteById(@PathVariable("customerId") UUID customerId){ + customerService.deleteById(customerId); + return new ResponseEntity(HttpStatus.NO_CONTENT); + } + + @PutMapping(CUSTOMER_PATH_ID) + public ResponseEntity updateCustomer(@PathVariable("customerId") UUID customerId, @RequestBody Customer customer){ + customerService.updateCustomerById(customer, customerId); + return new ResponseEntity(HttpStatus.NO_CONTENT); + } + @PostMapping(CUSTOMER_PATH) + public ResponseEntity saveCustomer(@RequestBody Customer customer){ + Customer savedCustomer= customerService.saveCustomer(customer); + HttpHeaders header=new HttpHeaders(); + header.add("Location",CUSTOMER_PATH+ savedCustomer.getId().toString()); + return new ResponseEntity(header, HttpStatus.CREATED); + } + + @GetMapping(CUSTOMER_PATH) + public List listCustomers(){ + return customerService.listCustomers(); + } + @GetMapping(CUSTOMER_PATH_ID) + public Customer getById(@PathVariable("customerId") UUID customerId){ + + return customerService.getById(customerId); + } + + } \ No newline at end of file diff --git a/src/main/java/guru/springframework/spring6restmvc/model/Beer.java b/src/main/java/guru/springframework/spring6restmvc/model/Beer.java index d1cc96aae..5643b84d4 100644 --- a/src/main/java/guru/springframework/spring6restmvc/model/Beer.java +++ b/src/main/java/guru/springframework/spring6restmvc/model/Beer.java @@ -1,14 +1,13 @@ package guru.springframework.spring6restmvc.model; +import lombok.Builder; import lombok.Data; import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.UUID; -/** - * Created by jt, Spring Framework Guru. - */ +@Builder @Data public class Beer { private UUID id; @@ -20,4 +19,4 @@ public class Beer { private BigDecimal price; private LocalDateTime createdDate; private LocalDateTime updateDate; -} +} \ No newline at end of file diff --git a/src/main/java/guru/springframework/spring6restmvc/model/BeerStyle.java b/src/main/java/guru/springframework/spring6restmvc/model/BeerStyle.java index 78a1b30df..7d6bffe26 100644 --- a/src/main/java/guru/springframework/spring6restmvc/model/BeerStyle.java +++ b/src/main/java/guru/springframework/spring6restmvc/model/BeerStyle.java @@ -1,8 +1,5 @@ package guru.springframework.spring6restmvc.model; -/** - * Created by jt, Spring Framework Guru. - */ public enum BeerStyle { LAGER, PILSNER, STOUT, GOSE, PORTER, ALE, WHEAT, IPA, PALE_ALE, SAISON -} +} \ No newline at end of file diff --git a/src/main/java/guru/springframework/spring6restmvc/model/Customer.java b/src/main/java/guru/springframework/spring6restmvc/model/Customer.java index ef4d3995a..1d19af44a 100644 --- a/src/main/java/guru/springframework/spring6restmvc/model/Customer.java +++ b/src/main/java/guru/springframework/spring6restmvc/model/Customer.java @@ -1,2 +1,22 @@ -package guru.springframework.spring6restmvc.model;public class Customer { +package guru.springframework.spring6restmvc.model; + +import lombok.Builder; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDate; +import java.util.UUID; + +@Data +@Builder +public class Customer { + + private UUID Id; + private String customerName; + private BigDecimal version; + private LocalDate createdDate; + private LocalDate lastModifiedDate; + + + } \ No newline at end of file diff --git a/src/main/java/guru/springframework/spring6restmvc/services/BeerService.java b/src/main/java/guru/springframework/spring6restmvc/services/BeerService.java index e02fb1d5a..338e42459 100644 --- a/src/main/java/guru/springframework/spring6restmvc/services/BeerService.java +++ b/src/main/java/guru/springframework/spring6restmvc/services/BeerService.java @@ -1,4 +1,4 @@ -package guru.springframework.spring6restmvc.service; +package guru.springframework.spring6restmvc.services; import guru.springframework.spring6restmvc.model.Beer; diff --git a/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceImpl.java b/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceImpl.java index 3732c1165..ccce7e227 100644 --- a/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceImpl.java +++ b/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceImpl.java @@ -1,4 +1,4 @@ -package guru.springframework.spring6restmvc.service; +package guru.springframework.spring6restmvc.services; import guru.springframework.spring6restmvc.model.Beer; import guru.springframework.spring6restmvc.model.BeerStyle; diff --git a/src/main/java/guru/springframework/spring6restmvc/services/CustomerService.java b/src/main/java/guru/springframework/spring6restmvc/services/CustomerService.java index 7e1c09fcb..e64fda6e3 100644 --- a/src/main/java/guru/springframework/spring6restmvc/services/CustomerService.java +++ b/src/main/java/guru/springframework/spring6restmvc/services/CustomerService.java @@ -1,4 +1,4 @@ -package guru.springframework.spring6restmvc.service; +package guru.springframework.spring6restmvc.services; import guru.springframework.spring6restmvc.model.Customer; @@ -9,11 +9,13 @@ public interface CustomerService { List listCustomers(); - Customer getById(UUID Id); + Customer getById(UUID Id); Customer saveCustomer(Customer customer); - void deleteCustomerById(UUID customerId); + void deleteById(UUID customerId); void patchCustomerById(UUID customerId, Customer customer); + + void updateCustomerById(Customer customer,UUID customerId); } \ No newline at end of file diff --git a/src/main/java/guru/springframework/spring6restmvc/services/CustomerServiceImpl.java b/src/main/java/guru/springframework/spring6restmvc/services/CustomerServiceImpl.java index 6dd638ed0..f12c22aea 100644 --- a/src/main/java/guru/springframework/spring6restmvc/services/CustomerServiceImpl.java +++ b/src/main/java/guru/springframework/spring6restmvc/services/CustomerServiceImpl.java @@ -1,4 +1,4 @@ -package guru.springframework.spring6restmvc.service; +package guru.springframework.spring6restmvc.services; import guru.springframework.spring6restmvc.model.Customer; import org.springframework.stereotype.Service; @@ -51,11 +51,18 @@ public void patchCustomerById(UUID customerId, Customer customer) { } } + @Override + public List listCustomers() { + return new ArrayList<>(customerMap.values()); + } + @Override public Customer getById(UUID Id) { return customerMap.get(Id); } + + @Override public Customer saveCustomer(Customer customer) { Customer customerSaved= Customer.builder() @@ -72,7 +79,7 @@ public Customer saveCustomer(Customer customer) { @Override - public void updateCustomer(Customer customer,UUID customerId) { + public void updateCustomerById(Customer customer,UUID customerId) { Customer existingCustomer= customerMap.get(customerId); existingCustomer.setCustomerName(customer.getCustomerName()); existingCustomer.setVersion(customer.getVersion()); diff --git a/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java b/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java index c45f6f6dc..959f914af 100644 --- a/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java +++ b/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java @@ -1,8 +1,13 @@ -package guru.springframework.spring6restmvc; +package guru.springframework.spring6restmvc.controller; +import com.fasterxml.jackson.databind.ObjectMapper; +import guru.springframework.spring6restmvc.model.Beer; import guru.springframework.spring6restmvc.services.BeerService; +import guru.springframework.spring6restmvc.services.BeerServiceImpl; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.mockito.ArgumentCaptor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.boot.test.mock.mockito.MockBean; @@ -11,23 +16,101 @@ import java.util.UUID; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.assertj.core.api.Assertions.assertThat; +import static org.hamcrest.core.Is.is; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.BDDMockito.given; +import static org.mockito.Mockito.verify; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + + import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -@WebMvcTest(BeerControllerTest.class) + +@WebMvcTest(BeerController.class) public class BeerControllerTest { @Autowired MockMvc mockMvc; + @Autowired + ObjectMapper objectMapper; + @MockBean BeerService beerService; + + BeerServiceImpl beerServiceImpl; + @BeforeEach + void setUp(){ + beerServiceImpl= new BeerServiceImpl(); + } + @Test - void getBeerById() throws Exception{ - mockMvc.perform(get("/api/v1/beers" + UUID.randomUUID()) + void deleteById()throws Exception{ + Beer beer=beerServiceImpl.listBeers().get(0); + + mockMvc.perform(delete("/api/v1/beer/"+beer.getId()) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isNoContent()); + ArgumentCaptor uuidArgumentCaptor= ArgumentCaptor.forClass(UUID.class); + + verify(beerService).deleteBeerById(uuidArgumentCaptor.capture()); + + assertThat(beer.getId()).isEqualTo(uuidArgumentCaptor.getValue()); + + } + @Test + void updateBeer() throws Exception{ + Beer beer=beerServiceImpl.listBeers().get(0); + mockMvc.perform(put("/api/v1/beer/"+beer.getId()) .accept(MediaType.APPLICATION_JSON) + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(beer)) + ).andExpect(status().isNoContent()); + + verify(beerService).updateBeer(any(Beer.class),any(UUID.class)); + + } + @Test + void testCreateNewBeer() throws Exception { + Beer beer = beerServiceImpl.listBeers().get(0); + beer.setVersion(null); + beer.setId(null); + + given(beerService.save(any(Beer.class))).willReturn(beerServiceImpl.listBeers().get(1)); + + mockMvc.perform(post("/api/v1/beer") + .accept(MediaType.APPLICATION_JSON) + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(beer))) + .andExpect(status().isCreated()) + .andExpect(header().exists("Location")); + + + } + @Test + void listBeers() throws Exception{ + + given(beerService.listBeers()).willReturn(beerServiceImpl.listBeers()); + mockMvc.perform(get("/api/v1/beer") + .accept(MediaType.APPLICATION_JSON)) + .andExpect( content().contentType(MediaType.APPLICATION_JSON) ) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.length()",is(3))); + } + @Test + void getById() throws Exception{ + Beer testBeer=beerServiceImpl.listBeers().get(0); + + given(beerService.getById(any(UUID.class))).willReturn(testBeer); + + mockMvc.perform(get("/api/v1/beer/" + UUID.randomUUID()) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(content().contentType(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()); + } } \ No newline at end of file diff --git a/src/test/java/guru/springframework/spring6restmvc/controller/CustomerControllerTest.java b/src/test/java/guru/springframework/spring6restmvc/controller/CustomerControllerTest.java index 4342c1463..95002229c 100644 --- a/src/test/java/guru/springframework/spring6restmvc/controller/CustomerControllerTest.java +++ b/src/test/java/guru/springframework/spring6restmvc/controller/CustomerControllerTest.java @@ -1,2 +1,123 @@ -package guru.springframework.spring6restmvc.controller;public class CustomerTest { +package guru.springframework.spring6restmvc.controller; + + +import com.fasterxml.jackson.databind.ObjectMapper; +import guru.springframework.spring6restmvc.model.Customer; +import guru.springframework.spring6restmvc.services.CustomerService; +import guru.springframework.spring6restmvc.services.CustomerServiceImpl; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.ArgumentCaptor; +import org.mockito.Captor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; + +import java.util.UUID; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.hamcrest.core.Is.is; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.BDDMockito.given; +import static org.mockito.Mockito.verify; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + + +@WebMvcTest(CustomerController.class) +public class CustomerControllerTest { + + @Autowired + MockMvc mockMvc; + + @Autowired + ObjectMapper objectMapper; + + @MockBean + CustomerService customerService; + + CustomerServiceImpl customerServiceImpl; + + @BeforeEach + void setUp() { + customerServiceImpl = new CustomerServiceImpl(); + } + + @Captor + ArgumentCaptor uuidArgumentCaptor; + + @Test + void testDeleteCustomer() throws Exception { + Customer customer = customerServiceImpl.listCustomers().get(0); + + mockMvc.perform(delete("/api/v1/customer/" + customer.getId()) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isNoContent()); + + verify(customerService).deleteById(uuidArgumentCaptor.capture()); + + assertThat(customer.getId()).isEqualTo(uuidArgumentCaptor.getValue()); + } + + @Test + void testUpdateCustomer() throws Exception { + Customer customer = customerServiceImpl.listCustomers().get(0); + + mockMvc.perform(put(CustomerController.CUSTOMER_PATH+ "/" + customer.getId()) + .content(objectMapper.writeValueAsString(customer)) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isNoContent()); + + + + verify(customerService).updateCustomerById(any(Customer.class),uuidArgumentCaptor.capture()); + + assertThat(customer.getId()).isEqualTo(uuidArgumentCaptor.getValue()); + } + + @Test + void testCreateCustomer() throws Exception { + Customer customer = customerServiceImpl.listCustomers().get(0); + customer.setId(null); + customer.setVersion(null); + + given(customerService.saveCustomer(any(Customer.class))) + .willReturn(customerServiceImpl.listCustomers().get(1)); + + mockMvc.perform(post(CustomerController.CUSTOMER_PATH).contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(customer))) + .andExpect(status().isCreated()) + .andExpect(header().exists("Location")); + } + + @Test + void listAllCustomers()throws Exception{ + given(customerService.listCustomers()).willReturn(customerServiceImpl.listCustomers()); + + mockMvc.perform(get("/api/v1/customer") + .accept(MediaType.APPLICATION_JSON)) + .andExpect(content().contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON)) + .andExpect(jsonPath("$.length()", is(3))); + } + + @Test + void getCustomerById() throws Exception { + Customer customer = customerServiceImpl.listCustomers().get(0); + + given(customerService.getById(customer.getId())).willReturn(customer); + + mockMvc.perform(get(CustomerController.CUSTOMER_PATH + "/" + customer.getId()) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON)) + .andExpect(jsonPath("$.customerName", is(customer.getCustomerName()))); + + } + } \ No newline at end of file