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.status; import java.util.List; import java.util.stream.Stream; 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.slf4j.Logger; 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.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.type.CollectionType; import de.gedoplan.seminar.jpa.exercise.domain.Highway; import de.gedoplan.seminar.jpa.exercise.domain.Junction; import de.gedoplan.seminar.jpa.exercise.domain.TrafficJam; import de.gedoplan.seminar.jpa.exercise.domain.TrafficJamCause; import de.gedoplan.seminar.jpa.exercise.domain.TrafficJamKind; @TestMethodOrder(MethodOrderer.MethodName.class) @AutoConfigureMockMvc @SpringBootTest public class Exercise07Test { private static String MESSAGE_FORMAT = "%s from %s to %s: %d km %s between %s and %s caused by %s\n"; @Autowired MockMvc mockMvc; @Autowired private ObjectMapper mapper; @Autowired private Logger logger; @ParameterizedTest @MethodSource("getTestData") void test01_insert(String junctionStart, String junctionEnd, Integer length, TrafficJamKind kind, TrafficJamCause cause) throws Exception { TrafficJam trafficJam = new TrafficJam(loadJunctionId(junctionStart), loadJunctionId(junctionEnd), length, kind, cause); mockMvc.perform(post("/trafficjams").contentType(MediaType.APPLICATION_JSON) .content(mapper.writeValueAsString(trafficJam))).andExpect(status().isOk()); } @Test void test02_outputTrafficJams() throws Exception { parse(mockMvc.perform(get("/trafficjams")).andExpect(status().isOk()).andReturn().getResponse() .getContentAsString(), TrafficJam.class) .stream().map(this::toMessage).forEach(logger::info); } private String toMessage(TrafficJam trafficJam) { Junction start = trafficJam.getStart(); Highway highway = start.getHighway(); Junction end = trafficJam.getEnd(); return String.format(MESSAGE_FORMAT, highway.getName(), highway.getOrigin(), highway.getDestination(), trafficJam.getLength(), trafficJam.getKind(), start.getName(), end.getName(), trafficJam.getCause()); } private static Stream getTestData() { return Stream.of( arguments("Bielefeld-Ost", "Ostwestfalen/Lippe", 2, TrafficJamKind.CONGESTION, TrafficJamCause.ACCIDENT), arguments("Westhofener Kreuz", "Schwerte", 8, TrafficJamKind.SLOW_MOVING_TRAFFIC, TrafficJamCause.ROAD_WORKS)); } private Junction loadJunctionId(String name) throws Exception { return mapper.readValue(mockMvc.perform(get("/junctions/loadByName").param("name", name)) .andExpect(status().isOk()).andReturn().getResponse().getContentAsString(), Junction.class); } private List parse(String json, Class type) { CollectionType javaType = mapper.getTypeFactory().constructCollectionType(List.class, type); try { return mapper.readValue(json, javaType); } catch (JsonProcessingException e) { throw new RuntimeException(e); } } }