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