From ca31cff26810ce280df03da252d3bbf73b932409 Mon Sep 17 00:00:00 2001
From: Hendrik Jungnitsch <hendrik.jungnitsch@gedoplan.de>
Date: Fr, 02 Sep 2022 15:30:35 +0200
Subject: [PATCH] exercise

---
 src/main/java/de/gedoplan/seminar/jpa/exercise/rest/JunctionResource.java         |   20 ++++++
 src/test/java/de/gedoplan/seminar/jpa/exercise/Exercise04Test.java                |  140 ++++++++++++++++++++++++++++++++++++++++++++++
 src/main/java/de/gedoplan/seminar/jpa/exercise/repository/JunctionRepository.java |    4 +
 3 files changed, 164 insertions(+), 0 deletions(-)

diff --git a/src/main/java/de/gedoplan/seminar/jpa/exercise/repository/JunctionRepository.java b/src/main/java/de/gedoplan/seminar/jpa/exercise/repository/JunctionRepository.java
index 2823448..c37d68e 100644
--- a/src/main/java/de/gedoplan/seminar/jpa/exercise/repository/JunctionRepository.java
+++ b/src/main/java/de/gedoplan/seminar/jpa/exercise/repository/JunctionRepository.java
@@ -1,5 +1,7 @@
 package de.gedoplan.seminar.jpa.exercise.repository;
 
+import java.util.Optional;
+
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.stereotype.Repository;
 
@@ -7,5 +9,7 @@
 
 @Repository
 public interface JunctionRepository extends JpaRepository<Junction, Integer> {
+	
+	Optional<Junction> readByName(String name);
 
 }
diff --git a/src/main/java/de/gedoplan/seminar/jpa/exercise/rest/JunctionResource.java b/src/main/java/de/gedoplan/seminar/jpa/exercise/rest/JunctionResource.java
index 7df8248..cf8969d 100644
--- a/src/main/java/de/gedoplan/seminar/jpa/exercise/rest/JunctionResource.java
+++ b/src/main/java/de/gedoplan/seminar/jpa/exercise/rest/JunctionResource.java
@@ -1,12 +1,19 @@
 package de.gedoplan.seminar.jpa.exercise.rest;
 
+import java.util.Optional;
+
 import org.slf4j.Logger;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
 import org.springframework.http.MediaType;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.server.ResponseStatusException;
 
 import de.gedoplan.seminar.jpa.exercise.domain.Junction;
 import de.gedoplan.seminar.jpa.exercise.repository.JunctionRepository;
@@ -34,4 +41,17 @@
     
     this.logger.debug("Inserted: " + junction);
   }
+  
+  /**
+   * Exercise JPA_BASICS_04
+   */
+  @GetMapping("loadByName")
+  public Junction loadByName(@RequestParam("name") String name) {
+    this.logger.debug("----- loadByName -----");
+
+    Optional<Junction> junction = this.junctionRepository.readByName(name);
+    
+    junction.ifPresent(j -> this.logger.debug(name+": "+j));
+    return junction.orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND));
+  }
 }
diff --git a/src/test/java/de/gedoplan/seminar/jpa/exercise/Exercise04Test.java b/src/test/java/de/gedoplan/seminar/jpa/exercise/Exercise04Test.java
new file mode 100644
index 0000000..1ddbb18
--- /dev/null
+++ b/src/test/java/de/gedoplan/seminar/jpa/exercise/Exercise04Test.java
@@ -0,0 +1,140 @@
+package de.gedoplan.seminar.jpa.exercise;
+
+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.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;
+import org.junit.jupiter.params.provider.MethodSource;
+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;
+
+@TestMethodOrder(MethodOrderer.MethodName.class)
+@AutoConfigureMockMvc
+@SpringBootTest
+public class Exercise04Test {
+
+	@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("getTestData")
+	void test2_findById(String junctionName, String highwayName) throws Exception {
+		mockMvc.perform(get("/junctions/loadByName").param("name", junctionName))
+				.andExpect(jsonPath("$.highway.name").value(highwayName));
+	}
+	
+	
+	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 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() {
+		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"));
+	}
+}

--
Gitblit v1.7.1