From ea29adab4c9a2a8f16413e82b3f2e9df88ef43c1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Andrej=20=C5=A0imurka?= <492781@mail.muni.cz>
Date: Sun, 16 Apr 2023 22:24:05 +0200
Subject: [PATCH] Added CarService tests

---
 .../muni/pa165/car/restemplate/DbGetter.java  |  10 +-
 .../service/CarComponentPairServiceImpl.java  |  11 +-
 .../car/service/CarDriverPairServiceImpl.java |  16 ++-
 .../pa165/car/service/CarServiceImpl.java     |  15 ++-
 .../pa165/car/service/CarServiceTests.java    | 120 +++++++++++++++++-
 5 files changed, 147 insertions(+), 25 deletions(-)

diff --git a/car/src/main/java/cz/muni/pa165/car/restemplate/DbGetter.java b/car/src/main/java/cz/muni/pa165/car/restemplate/DbGetter.java
index 3ee16541..54a6b16b 100644
--- a/car/src/main/java/cz/muni/pa165/car/restemplate/DbGetter.java
+++ b/car/src/main/java/cz/muni/pa165/car/restemplate/DbGetter.java
@@ -12,10 +12,10 @@ import org.springframework.web.client.RestTemplate;
 @Component
 public class DbGetter {
 
-  private static RestTemplate client = new RestTemplate();
+  private RestTemplate client = new RestTemplate();
 
-  private static final String GET_DRIVER_URL = "http://localhost:8083/driver/get/id=";
-  private static final String GET_COMPONENT_URL = "http://localhost:8084/component/id?componentId=";
+  private final String GET_DRIVER_URL = "http://localhost:8083/driver/get/id=";
+  private final String GET_COMPONENT_URL = "http://localhost:8084/component/id?componentId=";
 
   /**
    * Get a driver using RestTemplate client.
@@ -23,7 +23,7 @@ public class DbGetter {
    * @param id driver id
    * @return Driver object
    */
-  public static DriverInsightDto getDriverFromDb(Long id) {
+  public DriverInsightDto getDriverFromDb(Long id) {
     String url = GET_DRIVER_URL + id;
     ResponseEntity<DriverInsightDto> response = client.getForEntity(url, DriverInsightDto.class);
     return response.getBody();
@@ -35,7 +35,7 @@ public class DbGetter {
    * @param id component id
    * @return Component object
    */
-  public static CarComponentDto getComponentFromDb(Long id) {
+  public CarComponentDto getComponentFromDb(Long id) {
     String url = GET_COMPONENT_URL + id;
     ResponseEntity<CarComponentDto> response = client.getForEntity(url, CarComponentDto.class);
     return response.getBody();
diff --git a/car/src/main/java/cz/muni/pa165/car/service/CarComponentPairServiceImpl.java b/car/src/main/java/cz/muni/pa165/car/service/CarComponentPairServiceImpl.java
index 8387e271..f9559211 100644
--- a/car/src/main/java/cz/muni/pa165/car/service/CarComponentPairServiceImpl.java
+++ b/car/src/main/java/cz/muni/pa165/car/service/CarComponentPairServiceImpl.java
@@ -1,6 +1,6 @@
 package cz.muni.pa165.car.service;
 
-import static cz.muni.pa165.car.restemplate.DbGetter.getComponentFromDb;
+import cz.muni.pa165.car.restemplate.DbGetter;
 
 import cz.muni.pa165.car.data.model.Car;
 import cz.muni.pa165.car.data.repository.CarRepository;
@@ -12,6 +12,8 @@ import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Objects;
+
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 /**
@@ -22,6 +24,9 @@ public class CarComponentPairServiceImpl implements CarComponentPairService {
 
   CarRepository carRepository;
 
+  @Autowired
+  DbGetter dbGetter;
+
   /**
    * Constructor for Car - Car Component Service.
    *
@@ -40,7 +45,7 @@ public class CarComponentPairServiceImpl implements CarComponentPairService {
       throw new DatabaseException("Component with id " + componentId + " already in use");
     }
     var components = car.getComponents();
-    CarComponentDto carComponent = getComponentFromDb(componentId);
+    CarComponentDto carComponent = dbGetter.getComponentFromDb(componentId);
     components.add(carComponent.getId());
     car.setComponents(components);
     carRepository.save(car);
@@ -68,7 +73,7 @@ public class CarComponentPairServiceImpl implements CarComponentPairService {
         () -> new DatabaseException("Car not found"));
     var componentDtos = new ArrayList<CarComponentDto>();
     for (Long id : car.getComponents()) {
-      CarComponentDto carComponent = getComponentFromDb(id);
+      CarComponentDto carComponent = dbGetter.getComponentFromDb(id);
       componentDtos.add(
           new CarComponentDto(
               carComponent.getId(),
diff --git a/car/src/main/java/cz/muni/pa165/car/service/CarDriverPairServiceImpl.java b/car/src/main/java/cz/muni/pa165/car/service/CarDriverPairServiceImpl.java
index 543d9dc4..dcfc6401 100644
--- a/car/src/main/java/cz/muni/pa165/car/service/CarDriverPairServiceImpl.java
+++ b/car/src/main/java/cz/muni/pa165/car/service/CarDriverPairServiceImpl.java
@@ -1,18 +1,19 @@
 package cz.muni.pa165.car.service;
 
-import static cz.muni.pa165.car.restemplate.DbGetter.getDriverFromDb;
-
 import cz.muni.pa165.car.data.repository.CarRepository;
 import cz.muni.pa165.car.mapper.CarMapper;
+import cz.muni.pa165.car.restemplate.DbGetter;
 import cz.muni.pa165.common_library.dtos.CarResponseDto;
 import cz.muni.pa165.common_library.dtos.DriverDto;
 import cz.muni.pa165.common_library.dtos.DriverInsightDto;
 import cz.muni.pa165.common_library.exception.DatabaseException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
 import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Objects;
-import org.springframework.stereotype.Service;
 
 /**
  * Service for Driver Manager.
@@ -22,6 +23,9 @@ public class CarDriverPairServiceImpl implements CarDriverPairService {
 
   CarRepository carRepository;
 
+  @Autowired
+  DbGetter dbGetter;
+
   /**
    * Constructor for Car - Driver Service.
    *
@@ -37,7 +41,7 @@ public class CarDriverPairServiceImpl implements CarDriverPairService {
         () -> new DatabaseException("Car not found"));
 
     var drivers = car.getDrivers();
-    var savedDriver = getDriverFromDb(driverId);
+    var savedDriver = dbGetter.getDriverFromDb(driverId);
     drivers.add(savedDriver.id());
     car.setDrivers(drivers);
 
@@ -66,7 +70,7 @@ public class CarDriverPairServiceImpl implements CarDriverPairService {
         () -> new DatabaseException("Car not found"));
     var driverDtos = new ArrayList<DriverDto>();
     for (Long id : car.getDrivers()) {
-      DriverInsightDto driver = getDriverFromDb(id);
+      DriverInsightDto driver = dbGetter.getDriverFromDb(id);
       driverDtos.add(
           new DriverDto(driver.id(),
               driver.name(),
@@ -81,7 +85,7 @@ public class CarDriverPairServiceImpl implements CarDriverPairService {
     var car = carRepository.findById(carId).orElseThrow(
         () -> new DatabaseException("Car not found"));
 
-    var savedDriver = getDriverFromDb(driverId);
+    var savedDriver = dbGetter.getDriverFromDb(driverId);
     car.setMainDriverId(savedDriver.id());
 
     var drivers = car.getDrivers();
diff --git a/car/src/main/java/cz/muni/pa165/car/service/CarServiceImpl.java b/car/src/main/java/cz/muni/pa165/car/service/CarServiceImpl.java
index 38f8d647..1f2d832d 100644
--- a/car/src/main/java/cz/muni/pa165/car/service/CarServiceImpl.java
+++ b/car/src/main/java/cz/muni/pa165/car/service/CarServiceImpl.java
@@ -1,19 +1,19 @@
 package cz.muni.pa165.car.service;
 
-import static cz.muni.pa165.car.mapper.CarMapper.carConverterToDto;
-import static cz.muni.pa165.car.mapper.CarMapper.carDtoConverter;
-
 import cz.muni.pa165.car.data.model.Car;
 import cz.muni.pa165.car.data.repository.CarRepository;
 import cz.muni.pa165.car.mapper.CarMapper;
+import static cz.muni.pa165.car.mapper.CarMapper.carConverterToDto;
+import static cz.muni.pa165.car.mapper.CarMapper.carDtoConverter;
 import cz.muni.pa165.car.restemplate.DbGetter;
 import cz.muni.pa165.common_library.dtos.CarRequestDto;
 import cz.muni.pa165.common_library.dtos.CarResponseDto;
 import cz.muni.pa165.common_library.exception.DatabaseException;
-import java.util.List;
-import java.util.Objects;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
+
 
 /**
  * Service for car management.
@@ -23,6 +23,9 @@ public class CarServiceImpl implements CarService {
 
   CarRepository carRepository;
 
+  @Autowired
+  DbGetter dbGetter;
+
   /**
    * Constructor for Car Service.
    *
@@ -40,7 +43,7 @@ public class CarServiceImpl implements CarService {
       if (isComponentInUse(componentId)) {
         throw new DatabaseException("Component with id " + componentId + " already in use");
       }
-      DbGetter.getComponentFromDb(componentId);
+      dbGetter.getComponentFromDb(componentId);
     }
     return carConverterToDto(carRepository.save(carDtoConverter(carRequestDto)));
   }
diff --git a/car/src/test/java/cz/muni/pa165/car/service/CarServiceTests.java b/car/src/test/java/cz/muni/pa165/car/service/CarServiceTests.java
index 4c0a2ffe..3b0e807c 100644
--- a/car/src/test/java/cz/muni/pa165/car/service/CarServiceTests.java
+++ b/car/src/test/java/cz/muni/pa165/car/service/CarServiceTests.java
@@ -1,14 +1,34 @@
 package cz.muni.pa165.car.service;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
+import cz.muni.pa165.car.data.model.Car;
 import cz.muni.pa165.car.data.repository.CarRepository;
+import cz.muni.pa165.car.restemplate.DbGetter;
+import cz.muni.pa165.common_library.dtos.CarComponentDto;
+import cz.muni.pa165.common_library.dtos.CarRequestDto;
+import cz.muni.pa165.common_library.dtos.CarResponseDto;
+import cz.muni.pa165.common_library.dtos.DriverInsightDto;
+import cz.muni.pa165.common_library.dtos.DriverResponseDto;
+import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
+import static org.mockito.ArgumentMatchers.anyLong;
+import static org.mockito.BDDMockito.given;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.boot.test.mock.mockito.MockBean;
+import org.springframework.http.MediaType;
 import org.springframework.test.web.servlet.MockMvc;
+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.result.MockMvcResultMatchers.status;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
 
 @SpringBootTest
 @AutoConfigureMockMvc
@@ -23,23 +43,113 @@ public class CarServiceTests {
   @MockBean
   private CarRepository carRepository;
 
+  @MockBean
+  private DbGetter dbGetter;
+
+  private static Car car1;
+  private static Car car;
+
+  private static CarResponseDto carResponseDto1;
+  private static CarRequestDto carRequestDto;
+
   @BeforeEach
-  void setUp() {
+  void initialize() {
+    car = Car.builder()
+        .id(null)
+        .components(Set.of(1L, 2L))
+        .drivers(Set.of(1L, 2L))
+        .mainDriverId(1L)
+        .build();
+
+    car1 = Car.builder()
+        .id(1L)
+        .components(Set.of(1L, 2L))
+        .drivers(Set.of(1L, 2L))
+        .mainDriverId(1L)
+        .build();
+
+    carResponseDto1 = CarResponseDto.builder()
+        .id(1L)
+        .componentIdsNames(List.of(1L, 2L))
+        .driverIdsNames(List.of(1L, 2L))
+        .mainDriverId(1L)
+        .build();
+
+    carRequestDto = CarRequestDto.builder()
+        .componentIds(List.of(1L, 2L))
+        .driverIds(List.of(1L, 2L))
+        .mainDriverId(1L)
+        .build();
+
   }
 
   @Test
-  void postCar() {
+  void carAddTest() throws Exception {
+
+    given(carRepository.save(car)).willReturn(car1);
+    given(carRepository.findById(1L)).willReturn(
+        Optional.of(car1));
+    DriverInsightDto driverInsightDto = new DriverInsightDto(1L, "name", "surname", "nationality", Map.of());
+    CarComponentDto carComponentDto = CarComponentDto.builder().build();
+
+    given(dbGetter.getDriverFromDb(anyLong())).willReturn(driverInsightDto);
+    given(dbGetter.getComponentFromDb(anyLong())).willReturn(carComponentDto);
+
+    String response = mockMvc.perform(post("/car/")
+            .contentType(MediaType.APPLICATION_JSON)
+            .content(objectMapper.writeValueAsString(carRequestDto)))
+        .andExpect(status().isOk()).andReturn().getResponse().getContentAsString();
+    var carResponse = objectMapper.readValue(response, CarResponseDto.class);
+    Assertions.assertAll(
+        () -> Assertions.assertEquals(carResponse.getId(), car1.getId()),
+        () -> Assertions.assertEquals(carResponse.getComponentIdsNames(), car1.getComponents().stream().toList()),
+        () -> Assertions.assertEquals(carResponse.getDriverIdsNames(), car1.getDrivers().stream().toList()),
+        () -> Assertions.assertEquals(carResponse.getMainDriverId(), car1.getMainDriverId())
+    );
   }
 
   @Test
-  void getCarById() {
+  void carGetAllTest() throws Exception {
+
+    given(carRepository.findAll()).willReturn(List.of(car1));
+
+    String response = mockMvc.perform(get("/car/all"))
+        .andExpect(status().isOk()).andReturn().getResponse().getContentAsString();
+    var carResponse = List.of(objectMapper.readValue(response, CarResponseDto[].class));
+    Assertions.assertAll(
+        () -> Assertions.assertEquals(carResponse.get(0).getId(), car1.getId()),
+        () -> Assertions.assertEquals(carResponse.get(0).getComponentIdsNames(), car1.getComponents().stream().toList()),
+        () -> Assertions.assertEquals(carResponse.get(0).getDriverIdsNames(), car1.getDrivers().stream().toList()),
+        () -> Assertions.assertEquals(carResponse.get(0).getMainDriverId(), car1.getMainDriverId())
+    );
   }
 
   @Test
-  void getAllCars() {
+  void carGetByIdTest() throws Exception {
+
+    given(carRepository.findById(1L)).willReturn(Optional.of(car1));
+
+    String response = mockMvc.perform(get("/car/")
+            .param("carId", String.valueOf(1L))
+            .contentType(MediaType.APPLICATION_JSON))
+        .andExpect(status().isOk()).andReturn().getResponse().getContentAsString();
+    var carResponse = objectMapper.readValue(response, CarResponseDto.class);
+    Assertions.assertAll(
+        () -> Assertions.assertEquals(carResponse.getId(), car1.getId()),
+        () -> Assertions.assertEquals(carResponse.getComponentIdsNames(), car1.getComponents().stream().toList()),
+        () -> Assertions.assertEquals(carResponse.getDriverIdsNames(), car1.getDrivers().stream().toList()),
+        () -> Assertions.assertEquals(carResponse.getMainDriverId(), car1.getMainDriverId())
+    );
   }
 
   @Test
-  void deleteById() {
+  void carDeleteByIdTest() throws Exception {
+    given(carRepository.findById(1L)).willReturn(Optional.of(car1));
+
+    String response = mockMvc.perform(delete("/car/")
+            .param("carId", String.valueOf(1L))
+            .contentType(MediaType.APPLICATION_JSON))
+        .andExpect(status().isOk()).andReturn().getResponse().getContentAsString();
+    Assertions.assertEquals(response, "Car with id = " + 1L + " deleted!");
   }
 }
-- 
GitLab