Hendrik Jungnitsch
2022-09-05 4aefdfdd2b3a9864ef488b76b5f9c69ab4c23b9f
src/test/java/de/gedoplan/seminar/jpa/exercise/Exercise04Test.java
@@ -1,16 +1,15 @@
package de.gedoplan.seminar.jpa.exercise;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.jupiter.params.provider.Arguments.arguments;
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.jsonPath;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import java.util.stream.Stream;
import org.hamcrest.MatcherAssert;
import org.junit.jupiter.api.MethodOrderer;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestMethodOrder;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
@@ -18,13 +17,9 @@
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.http.MediaType;
import org.springframework.test.web.servlet.MockMvc;
import com.fasterxml.jackson.databind.ObjectMapper;
import de.gedoplan.seminar.jpa.exercise.domain.Highway;
import de.gedoplan.seminar.jpa.exercise.domain.Junction;
import com.jayway.jsonpath.JsonPath;
@TestMethodOrder(MethodOrderer.MethodName.class)
@AutoConfigureMockMvc
@@ -33,108 +28,51 @@
   @Autowired
   MockMvc mockMvc;
   @Autowired
   private ObjectMapper objectMapper;
   @Test
   void test01_joinJunctionsToHighways() throws Exception {
       /*
        * Read highways and junctions from the database and associate them.
        * Do not use the objects from TestData directly, because they are transient!
        */
       /*
        * Connect highway 4610 with junctions "Schwerte", "Westhofener Kreuz" and "Hagen-Nord"
        */
       Highway highwayA1_DO_K = loadHighway(4610);
       Junction junctionSchwerte = loadJunction("Schwerte");
//       highwayA1_DO_K.getJunctions().add(junctionSchwerte);
//       junctionSchwerte.setHighway(highwayA1_DO_K);
       Junction junctionWesthofen = loadJunction("Westhofener Kreuz");
//       highwayA1_DO_K.getJunctions().add(junctionWesthofen);
//       junctionWesthofen.setHighway(highwayA1_DO_K);
       Junction junctionHagenNord = loadJunction("Hagen-Nord");
//       highwayA1_DO_K.getJunctions().add(junctionHagenNord);
//       junctionHagenNord.setHighway(highwayA1_DO_K);
       updateJunctions(junctionSchwerte,junctionWesthofen,junctionHagenNord);
       /*
        * Connect highway 4711 with junctions "Bielefeld-Ost", "Ostwestfalen/Lippe" and "Herford/Bad Salzuflen"
        */
       Highway highwayA2_DO_H = loadHighway(4711);
       Junction junctionBielefeldOst = loadJunction("Bielefeld-Ost");
//       highwayA2_DO_H.getJunctions().add(junctionBielefeldOst);
//       junctionBielefeldOst.setHighway(highwayA2_DO_H);
       Junction junctionOWL = loadJunction("Ostwestfalen/Lippe");
//       highwayA2_DO_H.getJunctions().add(junctionOWL);
//       junctionOWL.setHighway(highwayA2_DO_H);
       Junction junctionSennestadt = loadJunction("Herford/Bad Salzuflen");
//       highwayA2_DO_H.getJunctions().add(junctionSennestadt);
//       junctionSennestadt.setHighway(highwayA2_DO_H);
       updateJunctions(junctionBielefeldOst,junctionOWL,junctionSennestadt);
       /*
        * Connect highway 4812 with junction "Paderborn-Zentrum"
        */
       Highway highwayA33_BI_PB = loadHighway(4812);
       Junction junctionStukenbrock = loadJunction("Paderborn-Zentrum");
//       highwayA33_BI_PB.getJunctions().add(junctionStukenbrock);
//       junctionStukenbrock.setHighway(highwayA33_BI_PB);
       updateJunctions(junctionStukenbrock);
   @ParameterizedTest
   @MethodSource("getTestDataJunction")
   void test01_joinJunctionsToHighways(String junctionName, Integer highwayId) throws Exception {
      Integer junctionId = loadJunctionId(junctionName);
      mockMvc.perform(
            put("/junctions/{junctionId}/assignToHighway/{highwayId}",junctionId,highwayId))
            .andExpect(status().isOk());
   }
   
   @ParameterizedTest
   @MethodSource("getTestData")
   void test2_findById(String junctionName, String highwayName) throws Exception {
   @MethodSource("getTestDataJunction")
   void test02_checkHighwayAssignedToJunction(String junctionName, Integer highwayId) throws Exception {
      mockMvc.perform(get("/junctions/loadByName").param("name", junctionName))
            .andExpect(jsonPath("$.highway.name").value(highwayName));
            .andExpect(jsonPath("$.highway.id").value(highwayId.toString()));
   }
   @ParameterizedTest
   @MethodSource("getTestDataHighway")
   void test03_checkJunctionsAssignedToHighway(Integer highwayId, Integer countJunctions) throws Exception {
      mockMvc.perform(get("/highways/{id}",highwayId))
         .andExpect(jsonPath("$.name",is(countJunctions)));
   }
   
   
   private void updateJunctions(Junction... junctions) {
      Stream.of(junctions).forEach(junction ->
         {
            try {
               mockMvc.perform(
                  post("/junctions").contentType(MediaType.APPLICATION_JSON).content(objectMapper.writeValueAsString(junction)))
                  .andExpect(status().isOk());
            } catch (Exception e) {
               throw new RuntimeException(e);
            }
         });
   private Integer loadJunctionId(String name) throws Exception {
      return JsonPath.parse(mockMvc.perform(get("/junctions/loadByName").param("name", name)).andExpect(status().isOk())
            .andReturn().getResponse().getContentAsString()).read("$.id", Integer.class);
   }
   
   private Highway loadHighway(Integer id) throws Exception {
      return objectMapper.readValue(mockMvc.perform(get("/highways/{id}", id)).andExpect(status().isOk())
            .andReturn().getResponse().getContentAsString(), Highway.class);
   }
   private Junction loadJunction(String name) throws Exception {
      return objectMapper.readValue(mockMvc.perform(get("/junctions/loadByName").param("name", name)).andExpect(status().isOk())
            .andReturn().getResponse().getContentAsString(), Junction.class);
   }
   private static Stream<Arguments> getTestData() {
   private static Stream<Arguments> getTestDataJunction() {
      return Stream.of(
            arguments("Schwerte","A2"),
            arguments("Westhofener Kreuz", "A1"),
            arguments("Hagen-Nord", "A1"),
            arguments("Bielefeld-Ost", "A2"),
            arguments("Ostwestfalen/Lippe", "A2"),
            arguments("Herford/Bad Salzuflen", "A2"),
            arguments("Paderborn-Zentrum", "A33"));
            arguments("Schwerte", 4610),
            arguments("Westhofener Kreuz", 4610),
            arguments("Hagen-Nord", 4610),
            arguments("Bielefeld-Ost", 4711),
            arguments("Ostwestfalen/Lippe", 4711),
            arguments("Herford/Bad Salzuflen", 4711),
            arguments("Paderborn-Zentrum", 4812));
   }
   private static Stream<Arguments> getTestDataHighway() {
      return Stream.of(
            arguments(4610,3),
            arguments(4711,3),
            arguments(4812,1));
   }
}